Я только начинаю изучать Maxscript |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Я только начинаю изучать Maxscript |
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, то почему то не работает! Хотя если эту функцию просто ввести в командной строке, то всё нормально, а вот на смену выделения никак не хочет цепляться, и главное - даже не выдаёт никакой ошибки, просто ничего не происходит... |
|
|
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 соседних ребра, а само выделение считается ? я исходил из того что считается, то есть выделяется получается один ринг вокруг ...ну ежели не точно понял, то могу дополнить. Обратил внимание только что на это условие просто :-)
Прикрепленные файлы
|
|
|
30/06/2004, 21:38
Сообщение
#18
|
|
Знаток Группа: Участник Сообщений: 257 Регистрация: 16/05/2003 Из: SPb Пользователь №: 2 235 |
QUOTE(C00PER @ Jun 30 2004, 12:36) А можно-ли каким-нибудь образом сохранить материалы нескольких объектов для того чтобы назначить их им же в дальнейшем? Ну наподобие вот того примера с цветами. берёш нужный материал, создаешь библиотеку материалов, и добавляеш туда нужный, ну а уж с библиотекой проблем не будет, только обрати внимание что ещё можно создавать виртуальную бибилиотеку, то есть в неё и из неё ты сможешь материал добавить/взять, но сохранить её не сможешь, то есть это для работы в одном сеансе. |
|
|
30/06/2004, 21:42
Сообщение
#19
|
|
Take him away! Группа: Модераторы Сообщений: 2 575 Регистрация: 31/10/2002 Из: оттуда Пользователь №: 1 040 |
спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors..
|
|
|
30/06/2004, 21:46
Сообщение
#20
|
|
Take him away! Группа: Модераторы Сообщений: 2 575 Регистрация: 31/10/2002 Из: оттуда Пользователь №: 1 040 |
Ого! Круто! Работает Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе |
|
|
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 $ |
|
|
30/06/2004, 22:53
Сообщение
#22
|
|
Take him away! Группа: Модераторы Сообщений: 2 575 Регистрация: 31/10/2002 Из: оттуда Пользователь №: 1 040 |
о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!
попробую поковырять PainterInterface Сообщение отредактировал C00PER - 30/06/2004, 23:02 |
|
|
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 |
|
|
01/07/2004, 10:55
Сообщение
#24
|
|
Take him away! Группа: Модераторы Сообщений: 2 575 Регистрация: 31/10/2002 Из: оттуда Пользователь №: 1 040 |
Ура! У меня получилось!!!! Я сделал ПОЛИГОНАЛЬНУЮ СИСТЕМУ КООРДИНАТ! Причем, независимую от класса объекта - будь то Меш, Поли, Примитив и даже Нурбс. При старте она запросит сначала выделить объет, а затем выделить на нём Полигон. И всё! готова новая система координат Ну и намучался же я с этим Painterinterface На данный момент, это самое сложное из всего что я сделал за время изучения Максскрипта, а изучаю я его меньше недели
Вот сие творение, прошу любить и жаловать, а также не возмущаться в случае багов, а докладывать сюда http://alexcooper.nm.ru/stuff/Cooper-PolyC...inateSystem.zip Апдейт - теперь, после создания системы координат, возвращает на тот уровень выделения, на котором был до начала функции Сообщение отредактировал C00PER - 01/07/2004, 13:51 |
|
|
01/07/2004, 21:47
Сообщение
#25
|
|
фломастер Группа: Участник Сообщений: 5 701 Регистрация: 19/06/2002 Из: минск Пользователь №: 98 |
ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...
кстати, объясните алгоритм Loop select и ring select |
|
|
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 ребёр то я вообще не работаю - т.е. будет стандартный ринг :-) а с лупом тоже самое думаю, только выбираешь рёбра по совпадающим вершинам , а не по разным, и то же самое изменение от стандартного лупа будет. ну вот собственно и всё :-))) |
|
|
02/07/2004, 14:56
Сообщение
#27
|
|
Наш человек Группа: Участник Сообщений: 415 Регистрация: 10/07/2003 Из: Киев, Украина Пользователь №: 2 786 |
QUOTE $.EditablePoly.ConvertSelection #face #Edge буду знать. спасибо. мой ринг похож на ринг Desead'а: я тоже брал выделенный(е) едж конвертил в полигон затем в эдж. Полученные еджи сравнивал с еджами, полученными через ринг первоначально выделенного(ых) эджей. с лупом(мой вариант):выделенному еджу делаем Grow и сравниваем полученные еджи с еджеми полученными от лупа. |
|
|
02/07/2004, 18:53
Сообщение
#28
|
|
Знаток Группа: Участник Сообщений: 257 Регистрация: 16/05/2003 Из: SPb Пользователь №: 2 235 |
тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)
to 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 дальше буду делать как ты, через стандартные средства, так меньше работы получается :-) Ну и зря. Простой вариант не всегда лучше сложного. Мой алгоритм переберает все эджи полученные от ринга или лупа, т.е. чем больше плотность сетки, тем дольше будет происходить сравнение. В твоем алгоритме сравнивается фиксированное число точек и число сравнений не зависит от сложности сетки модели, что и сказывается(положительно) на производительности |
|
|
03/07/2004, 14:30
Сообщение
#30
|
|
Take him away! Группа: Модераторы Сообщений: 2 575 Регистрация: 31/10/2002 Из: оттуда Пользователь №: 1 040 |
здорово! приятно видеть мастеров за работой %) уже добавил оба скрипта в набор полезных тулзов. Pepper, вставь в начало кода disablesceneredraw() а перед update $ enablesceneredraw()
|
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 26/04/2024 - 01:30 |