3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

82 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Я только начинаю изучать Maxscript
C00PER
сообщение 30/06/2004, 21:16
Сообщение #16


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



Что за фигня? Или где я туплю?

Пишу функцию, которая бы реагировала на смену выделения на уровне подобъекта. Пользуюсь Change Handler'ом. Функция:
CODE

when select $.Poly_Select change handleAt:#redrawViews do print "shit"

Получаем, что когда к объекту применён модификатор Poly_Select, и в нём меняется выделение, пишется текст. Вроде всё работает.

Но когда вместо print "shit" я пишу getfaceselection $ $.Poly_Select, то почему то не работает! Хотя если эту функцию просто ввести в командной строке, то всё нормально, а вот на смену выделения никак не хочет цепляться, и главное - даже не выдаёт никакой ошибки, просто ничего не происходит...
Go to the top of the page
 
+Quote Post
Desead
сообщение 30/06/2004, 21:30
Сообщение #17


Знаток
Иконка группы

Группа: Участник
Сообщений: 257
Регистрация: 16/05/2003
Из: SPb
Пользователь №: 2 235



QUOTE(Shiva @ Jun 29 2004, 10:46)
У меня другая идея...
Как насчет продолжить доброе дело мешьтулз??
У меня есть идеи инструменов, которых мне не хватает...
например все наверно знаете Grow и Shrink?!
И наверно знаете Ring и Loop?!
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...
Смогете?..
а то у меня всейчас времени нету разбираться и вспоминать максскрипт..

вообщем скрипт вот, размещаю и файлом и в теле, чтоб если у кого вопрос возникнет, не спрашивал, а что ты сделал в 17 строчке :-), а более конкретно

------------------------------------------
macroScript Ring_2
category:"D_script"
toolTip:""
(
if (selection.count==1) and
(classof $ == editable_poly) and
(subobjectlevel==2) then
(--1
edge_s = polyop.getedgeselection $
final_edge=edge_s
i_end = (edge_s as array).count
for i=1 to i_end do
(--2
temp=polyop.getfacesusingedge $ (finditem edge_s (edge_s as array)[i])
vert1=(polyop.getvertsusingedge $ (finditem edge_s (edge_s as array)[i])) as array
temp=(polyop.getedgesusingface $ temp) - edge_s
y_end=(temp as array).count
for y=1 to y_end do
(--3
vert2=(polyop.getvertsusingedge $ (finditem temp (temp as array)[y])) as array

if (vert2[1] != vert1[1]) and
(vert2[1] != vert1[2]) and
(vert2[2] != vert1[1]) and
(vert2[2] != vert1[2]) then
(--4
new_edge=polyop.setedgeselection $ (finditem temp (temp as array)[y])
new_edge=getedgeselection $
final_edge=final_edge+new_edge
)--4
)--3
)--2
polyop.setedgeselection $ final_edge
update $
)--1

)
------------------------------------------
ставить его так - копируем в папочку Х:\3dsmax6\UI\MacroScripts\
после этого он появиться, при перезагрузке макса, в настройке хоткеев, квад меню, это уж куда тебе удобнее, можно и в бар вынести. Вопросы лучше здесь, но можно и в асю.

Пока писал столько идей о возможных выделениях в голову пришло !!!, если когда-нибудь всё-таки напишу модификатор edit_poly, то объязательно всё это туда вставлю, хотя лениво....жуть как :-)))

ps. кстати про выделять 2 соседних ребра, а само выделение считается ? я исходил из того что считается, то есть выделяется получается один ринг вокруг
...ну ежели не точно понял, то могу дополнить. Обратил внимание только что на это условие просто :-)
Прикрепленные файлы
Прикрепленный файл  Ring_2.mcr ( 1,03 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
Desead
сообщение 30/06/2004, 21:38
Сообщение #18


Знаток
Иконка группы

Группа: Участник
Сообщений: 257
Регистрация: 16/05/2003
Из: SPb
Пользователь №: 2 235



QUOTE(C00PER @ Jun 30 2004, 12:36)
А можно-ли каким-нибудь образом сохранить материалы нескольких объектов для того чтобы назначить их им же в дальнейшем? Ну наподобие вот того примера с цветами.

берёш нужный материал, создаешь библиотеку материалов, и добавляеш туда нужный, ну а уж с библиотекой проблем не будет, только обрати внимание что ещё можно создавать виртуальную бибилиотеку, то есть в неё и из неё ты сможешь материал добавить/взять, но сохранить её не сможешь, то есть это для работы в одном сеансе.
Go to the top of the page
 
+Quote Post
C00PER
сообщение 30/06/2004, 21:42
Сообщение #19


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors..
Go to the top of the page
 
+Quote Post
C00PER
сообщение 30/06/2004, 21:46
Сообщение #20


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



Ого! Круто! Работает smile.gif Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе wink.gif
Go to the top of the page
 
+Quote Post
pepper
сообщение 30/06/2004, 21:51
Сообщение #21


Наш человек
Иконка группы

Группа: Участник
Сообщений: 415
Регистрация: 10/07/2003
Из: Киев, Украина
Пользователь №: 2 786



QUOTE
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...

Вот мой скриптик:

ind1=polyop.getedgeselection $ as array
$.SelectEdgeRing()
ind_a=polyop.getedgeselection $ as array

polyop.setedgeselection $ ind1

$.EditablePoly.ConvertSelection subobjectLevel #Face
subobjectLevel = 4
$.EditablePoly.ConvertSelection subobjectLevel #Edge
subobjectLevel = 2

zz=polyop.getedgeselection $ as array
sel_ar=#()

i=1
for i=1 to ind_a.count do
(
for j=1 to zz.count do
(
if zz[j]==ind_a[i] then append sel_ar zz[j]
)
)
polyop.setedgeselection $ sel_ar
update $
Go to the top of the page
 
+Quote Post
C00PER
сообщение 30/06/2004, 22:53
Сообщение #22


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!

попробую поковырять PainterInterface rolleyes.gif

Сообщение отредактировал C00PER - 30/06/2004, 23:02
Go to the top of the page
 
+Quote Post
Desead
сообщение 01/07/2004, 09:02
Сообщение #23


Знаток
Иконка группы

Группа: Участник
Сообщений: 257
Регистрация: 16/05/2003
Из: SPb
Пользователь №: 2 235



to pepper
QUOTE(pepper @ Jun 30 2004, 22:51)
QUOTE
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...

Вот мой скриптик:

попроще у тебя скрипт будет, чё то наверное я намудрил у себя, надо твой попробовать :-)

в двух словах об используемом алгоритме можно ?
тоже изначально пробовал реализовать через стандартный Shrink, но при крестообразном выделении работало некорректно, пришлось напрямую всё прописывать.
я смотрю ты вообще не стал использовать bitarray, а мне пришлось конвертить то его в аррэй, то интеджер в битаррэй, намучился с этим.

QUOTE
о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!

не было необходимости сталкиваться, поэтому как помочь не в курсе

QUOTE
Ого! Круто! Работает  Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе


ээээ..поподробней тогда, а то не понял, то есть нужен такой же вариант, то есть на выделение только двух соседних рёбер, но лооп, так ?

ну всё, если поли наконец то будет в 7 максе, то теперь я себя уж точно не заставлю сесть за его написание :-)


QUOTE
спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors.


ну почему, в принципе там всё понятно, только вот доступ есть не ко всем функциям, допустим простецкая вроде кнопочка - Put material to scene, а через скрипт этого не так просто реализовать, прямой функции нет.

Сообщение отредактировал Desead - 01/07/2004, 09:24
Go to the top of the page
 
+Quote Post
C00PER
сообщение 01/07/2004, 10:55
Сообщение #24


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



Ура! У меня получилось!!!! Я сделал ПОЛИГОНАЛЬНУЮ СИСТЕМУ КООРДИНАТ! Причем, независимую от класса объекта - будь то Меш, Поли, Примитив и даже Нурбс. При старте она запросит сначала выделить объет, а затем выделить на нём Полигон. И всё! готова новая система координат smile.gif Ну и намучался же я с этим Painterinterface smile.gif На данный момент, это самое сложное из всего что я сделал за время изучения Максскрипта, а изучаю я его меньше недели rolleyes.gif

Вот сие творение, прошу любить и жаловать, а также не возмущаться в случае багов, а докладывать сюда

http://alexcooper.nm.ru/stuff/Cooper-PolyC...inateSystem.zip

Апдейт - теперь, после создания системы координат, возвращает на тот уровень выделения, на котором был до начала функции cool.gif

Сообщение отредактировал C00PER - 01/07/2004, 13:51
Go to the top of the page
 
+Quote Post
111
сообщение 01/07/2004, 21:47
Сообщение #25


фломастер
Иконка группы

Группа: Участник
Сообщений: 5 701
Регистрация: 19/06/2002
Из: минск
Пользователь №: 98



ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...

кстати, объясните алгоритм Loop select и ring select
Go to the top of the page
 
+Quote Post
Desead
сообщение 02/07/2004, 12:08
Сообщение #26


Знаток
Иконка группы

Группа: Участник
Сообщений: 257
Регистрация: 16/05/2003
Из: SPb
Пользователь №: 2 235



to pepper: посмотрел скрипт, всё просто и понятно, и чего спрашивается я не стал использовать готовое решение - ring, а написал его заново, не понятно.
кстати здесь :
$.EditablePoly.ConvertSelection subobjectLevel #Face
subobjectLevel = 4
$.EditablePoly.ConvertSelection subobjectLevel #Edge
subobjectLevel = 2
можно было и не ходить по уровням, убрать их вообще и во второй строчке написать $.EditablePoly.ConvertSelection #face #Edge
ну это я так, мысли вслух :-)))

QUOTE
ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...
кстати, объясните алгоритм Loop select и ring select


я ринг реализовал так:
текущее выделение рёбер преобразовал в фейсы а их опять в рёбра,
получился контур рёбер вокруг выделения. Этот контур и начальное выделение пораздельности преобразовал в вертексы ,т.е. каждому ребру соответствовало 2 вершины, и вот их то и сравнивал. Если одна из вершин первого ребра совпадает с любой из вершин начального выделенного ребра, значит первое ребро нам не подходит, иначе - оно нужное, и.т.д, перебирая все рёбра и сравнивая вершины с начальным выделением. правда есть маленькое отличие от стандартного ринга, при работе с фейсам имеющими 5 и более рёбер ,стандартный ринг ничего не выделяет, а этот алгоритм выделит те рёбра которые не соприкасаються с выделенным, но это скорее расширение чем недостаток, т.к. можно сделать просто ещё одно условие работы скрипта- если у фейса более 4 ребёр то я вообще не работаю - т.е. будет стандартный ринг :-)

а с лупом тоже самое думаю, только выбираешь рёбра по совпадающим вершинам , а не по разным, и то же самое изменение от стандартного лупа будет.
ну вот собственно и всё :-)))
Go to the top of the page
 
+Quote Post
pepper
сообщение 02/07/2004, 14:56
Сообщение #27


Наш человек
Иконка группы

Группа: Участник
Сообщений: 415
Регистрация: 10/07/2003
Из: Киев, Украина
Пользователь №: 2 786



QUOTE
$.EditablePoly.ConvertSelection #face #Edge

буду знать. спасибо.

мой ринг похож на ринг Desead'а: я тоже брал выделенный(е) едж конвертил в полигон затем в эдж. Полученные еджи сравнивал с еджами, полученными через ринг первоначально выделенного(ых) эджей.

с лупом(мой вариант):выделенному еджу делаем Grow и сравниваем полученные еджи с еджеми полученными от лупа.
Go to the top of the page
 
+Quote Post
Desead
сообщение 02/07/2004, 18:53
Сообщение #28


Знаток
Иконка группы

Группа: Участник
Сообщений: 257
Регистрация: 16/05/2003
Из: SPb
Пользователь №: 2 235



тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)

to pepper:
дальше буду делать как ты, через стандартные средства, так меньше работы получается :-)
Go to the top of the page
 
+Quote Post
pepper
сообщение 03/07/2004, 12:08
Сообщение #29


Наш человек
Иконка группы

Группа: Участник
Сообщений: 415
Регистрация: 10/07/2003
Из: Киев, Украина
Пользователь №: 2 786



QUOTE
тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)


вот луп:

ind1=polyop.getedgeselection $ as array
$.SelectEdgeLoop()
ind_a=polyop.getedgeselection $ as array

polyop.setedgeselection $ ind1
$.EditablePoly.growselection()
zz=polyop.getedgeselection $ as array
sel_ar=#()

i=1
for i=1 to ind_a.count do
(
for j=1 to zz.count do
(
if zz[j]==ind_a[i] then append sel_ar zz[j]
)
)
polyop.setedgeselection $ sel_ar

update $

QUOTE
дальше буду делать как ты, через стандартные средства, так меньше работы получается :-)


Ну и зря. Простой вариант не всегда лучше сложного. Мой алгоритм переберает все эджи полученные от ринга или лупа, т.е. чем больше плотность сетки, тем дольше будет происходить сравнение. В твоем алгоритме сравнивается фиксированное число точек и число сравнений не зависит от сложности сетки модели, что и сказывается(положительно) на производительности wink.gif
Go to the top of the page
 
+Quote Post
C00PER
сообщение 03/07/2004, 14:30
Сообщение #30


Take him away!
Иконка группы

Группа: Модераторы
Сообщений: 2 575
Регистрация: 31/10/2002
Из: оттуда
Пользователь №: 1 040



здорово! приятно видеть мастеров за работой %) уже добавил оба скрипта в набор полезных тулзов. Pepper, вставь в начало кода disablesceneredraw() а перед update $ enablesceneredraw()
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






82 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28/03/2024 - 16:10