А нет-ли такого скрипта? |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
А нет-ли такого скрипта? |
01/05/2018, 23:42
Сообщение
#2671
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
для этого есть
сперва смотрим, что вернет theHold.Holding() если false - можем вызвать theHold.Begin() далее делаем все свои скриптовые манипуляции в завершение вызываем theHold.Accept "My MXS Operation" с произвольным именем undo записи. Вполне может так оказаться, что какой-то из макросов или модификаторов перед началом своей работы отменит этот пользовательский theHold.Begin и как результат ничего толкового не получится. Можно еще с другой стороны зайти. Перед выполнением ряда действий совершить что-то что добавит undo запись, например конверт в поли или тп по ситуации. Далее с выключенным undo выполняем все что нужно. При необходимости отката мы откатимся на момент перед этим первоначальным конвертом. |
|
|
02/05/2018, 01:09
Сообщение
#2672
|
|
Продвинутый ученик Группа: Пользователи Сообщений: 59 Регистрация: 19/01/2012 Пользователь №: 85 177 |
Спасибо, первый вариант с hold'ом работает как надо!
А нет ли случаем какого-нибудь доходчивого самоучителя по максскрипту для тупых, ну там в виде раскраски какой или деревянных кубиков с наклеенными буквами, чтоб хотя бы подозревать о существовании таких моментов и фич? |
|
|
02/05/2018, 09:10
Сообщение
#2673
|
|
Рыцарь форума Группа: Участник Сообщений: 2 211 Регистрация: 01/04/2003 Из: Moscow/Russia Пользователь №: 1 802 |
Спасибо, первый вариант с hold'ом работает как надо! А нет ли случаем какого-нибудь доходчивого самоучителя по максскрипту для тупых, ну там в виде раскраски какой или деревянных кубиков с наклеенными буквами, чтоб хотя бы подозревать о существовании таких моментов и фич? |
|
|
02/05/2018, 09:44
Сообщение
#2674
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
Учиться лучше на практической задаче, главное предварительно установить Добавляем вот это в файл настроек редактора MXS_EditorUser.properties С путем к своему браузеру и месту где лежит скаченный html maxscript reference Теперь выделив слово и нажав Ctrl+9 попадаем прямиком в референс CODE command.name.9.*=Find in local Help
command.9.*="C:\Program Files (x86)\Mozilla Firefox\firefox.exe" "file:///C:/files/3D_soft/Autodesk_3ds_Max_2014/maxscript-2014-1-help/index.html?query=$(CurrentWord)" command.subsystem.9.*=2 command.mode.9.*=savebefore:no command.shortcut.9.*=Ctrl+9 Сообщение отредактировал Jahman - 02/05/2018, 09:53
Прикрепленные файлы
|
|
|
02/05/2018, 23:04
Сообщение
#2675
|
|
Продвинутый ученик Группа: Пользователи Сообщений: 59 Регистрация: 19/01/2012 Пользователь №: 85 177 |
Спасибо за ссылки, правда автокомплит че-то не взлетел, потом может разберусь.
У меня тут еще вопросик возник, теперь уже логического характера: каким образом можно представить выделенные эджи в виде массивов лупов, те с примера на картинке должно прийти 4 массива по 2-3 эджа в каждом я так, чисто интуитивно, понимаю, что решение лежит через loop selection, но вот как разбить на массивы еджи лежащие на одном лупе не догоняю, может есть у кого какие идеи? Код all_edges = polyop.getEdgeSelection $ as array edges_USED = #() loop_ARR = #() for i = 1 to all_edges.count where (findItem edges_USED all_edges[i] == 0) do ( polyop.setEdgeSelection $ all_edges[i] $.EditablePoly.SelectEdgeLoop () loop_edges = polyop.getEdgeSelection $ as array loop_S = for l_e in loop_edges where (findItem all_edges l_e != 0) collect l_e appendIfUnique loop_ARR loop_S join edges_USED loop_edges ) print loop_ARR polyop.setEdgeSelection $ all_edges |
|
|
03/05/2018, 11:12
Сообщение
#2676
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
Можно рекурсивно проверять соседние ребра
CODE fn growEdge obj index edges visited:#{} = ( edg = #{ index } edgeVerts = polyop.getVertsUsingEdge obj index vertsEdges = (polyop.getEdgesUsingVert obj edgeVerts) * edges visited[index] = true for ve in vertsEdges where not visited[ve] do ( edg += growEdge obj ve (edges - edg) visited:visited ) edg ) а пользоваться вот как-то так CODE (
es = polyop.getEdgeSelection $ groups = #() tmp = copy es for edgeIndex in tmp where tmp[edgeIndex] do ( edgeGroup = growEdge $ edgeIndex es tmp -= edgeGroup append groups edgeGroup ) format "%\n" groups ) Сообщение отредактировал Jahman - 03/05/2018, 11:48 |
|
|
03/05/2018, 23:25
Сообщение
#2677
|
|
Продвинутый ученик Группа: Пользователи Сообщений: 59 Регистрация: 19/01/2012 Пользователь №: 85 177 |
Не сочтите за издевательство, просто че-то зацепило, но можно ли к этому коду прикрутить деление лупа еще и по углу близкому к 90? Из моей кабины это видится как-то так, но по какой-то причине работает он не так как надо. Связанно ли это с тем что лупы в функцию подаются не по порядку следование на геометрии, а по порядку индекса?
Код fn growEdge obj index edges visited:#{} =
( edg = #{ index } edgeVerts = polyop.getVertsUsingEdge obj index vertsEdges = ((polyop.getEdgesUsingVert obj edgeVerts) * edges as bitarray) as array angle if (vertsEdges.count > 1) do ( verts_Edge_1 = polyop.getVertsUsingEdge obj vertsEdges[1] as array v11 = polyop.getVert obj verts_Edge_1[1] v12 = polyop.getVert obj verts_Edge_1[2] vect1 = normalize (v11-v12) verts_Edge_2 = polyop.getVertsUsingEdge obj vertsEdges[2] as array v21 = polyop.getVert obj verts_Edge_2[1] v22 = polyop.getVert obj verts_Edge_2[2] vect2 = normalize (v21-v22) angle = acos(dot (normalize vect1) (normalize vect2)) ) visited[index] = true for ve in vertsEdges where (not visited[ve] AND angle < 95 AND angle > 85) do ( edg += growEdge obj ve (edges - edg) visited:visited ) edg ) |
|
|
04/05/2018, 07:14
Сообщение
#2678
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
по идее надо просто вернуть из функции #{ index }, если угол выше определенного (т.е. не дать рекурсии идти дальше по индексам)
|
|
|
16/05/2018, 20:29
Сообщение
#2679
|
|
Уважаемый Группа: Участник Сообщений: 862 Регистрация: 05/12/2004 Из: Минск Пользователь №: 8 716 |
|
|
|
16/05/2018, 22:49
Сообщение
#2680
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
1. конвертируем узлы сегмента в bezierCorner
2. делаем refineSegment 0.5 3. сдвигаем новый узел в позицию 3. настраиваем усы InVec OutVec зы. Усы в окружности отстоят от узла на 0.551785 * radius расстояние. Кто-нибудь может объяснить почему? upd. А вот собственно и почему: Сообщение отредактировал Jahman - 16/05/2018, 23:00 |
|
|
17/05/2018, 22:47
Сообщение
#2681
|
|
Уважаемый Группа: Участник Сообщений: 862 Регистрация: 05/12/2004 Из: Минск Пользователь №: 8 716 |
Неплохо! А сторону в которую выгибает, как он узнает? по номерам ? думаю тоггл должен быть какой-то для этого.
Сообщение отредактировал IOG - 17/05/2018, 22:47 |
|
|
18/05/2018, 00:19
Сообщение
#2682
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
строит слева от вектора, хотя может имеет смысл мышкой кликать .
с какой стороны кликнешь с такой и сделает. пример небольшой CODE delete objects delete helpers point pos:[0,0,0] centermarker:on axistripod:off cross:off wirecolor:green point pos:[77,33,0] centermarker:on axistripod:off cross:off wirecolor:green p1 = helpers[1].pos p2 = helpers[2].pos vecX = normalize (p2 - p1) vecY = normalize (cross z_axis vecX) dist = distance p1 p2 R = dist / 2.0 center = (p1+p2)/2.0 TM = matrix3 vecX vecY z_axis center pt = point pos:center centermarker:off cross:off axistripod:on wirecolor:yellow transform:TM pt2 = point pos:(center + vecY * R) centermarker:on cross:off axistripod:off wirecolor:orange |
|
|
18/05/2018, 19:49
Сообщение
#2683
|
|
Уважаемый Группа: Участник Сообщений: 862 Регистрация: 05/12/2004 Из: Минск Пользователь №: 8 716 |
Вот что вышло, без интерфейса, сторону пока задавать вверху меняя side ...но вот вопрос почему не срабатывает undo on ?
Код (
side = true; undo on ( if selection.count == 1 and classof (modPanel.getCurrentObject()) == SplineShape do ( for spl=1 to (numsplines $) do ( segments = getSegSelection $ spl for seg=1 to segments.count do segments[seg] += (seg-1) for seg in segments do ( vert1 = seg vert2 = if seg == (numknots $ spl) and (isClosed $ spl) then 1 else seg+1 SegInVec = getInVec $ spl vert1 SegOutVec = getOutVec $ spl vert2 setKnotType $ spl vert1 #Corner setKnotType $ spl vert2 #Corner updateshape $ setKnotType $ spl vert1 #bezierCorner setKnotType $ spl vert2 #bezierCorner updateshape $ setInVec $ spl vert1 SegInVec setOutVec $ spl vert2 SegOutVec updateshape $ refineSegment $ spl seg .5 vert12 = vert1+1 if vert2 !=1 do vert2 +=1 radius = distance (getKnotPoint $ spl vert1) (getKnotPoint $ spl vert2)/2 vec = 0.552284749831*radius vecX = normalize (getKnotPoint $ spl vert2 - getKnotPoint $ spl vert1) vecY = normalize (cross $.transform[3] vecX) if side then ( setOutVec $ spl vert1 (getKnotPoint $ spl vert1 - vecY *vec ) setInVec $ spl vert2 (getKnotPoint $ spl vert2 - vecY *vec) setKnotPoint $ spl vert12 (getKnotPoint $ spl vert12 - vecY * radius) ) else ( setOutVec $ spl vert1 (getKnotPoint $ spl vert1 + vecY *vec ) setInVec $ spl vert2 (getKnotPoint $ spl vert2 + vecY *vec) setKnotPoint $ spl vert12 (getKnotPoint $ spl vert12 + vecY * radius) ) setInVec $ spl vert12 (getKnotPoint $ spl vert12 - vecX * vec) setOutVec $ spl vert12 (getKnotPoint $ spl vert12 + vecX * vec) ) ) ) ) ) Сообщение отредактировал IOG - 18/05/2018, 20:18 |
|
|
18/05/2018, 20:45
Сообщение
#2684
|
|
Рыцарь форума Группа: Участник Сообщений: 2 211 Регистрация: 01/04/2003 Из: Moscow/Russia Пользователь №: 1 802 |
Насколько я помню, сплайновые операции которые делаются через maxscript в undo не заносятся вообще... Приходится хранить изначальную линию, и делать свое undo... раньше было так, может в последних версиях что то изменилось но думаю что врядли.
|
|
|
19/05/2018, 14:43
Сообщение
#2685
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
CODE (
side = true if selection.count == 1 and classof (modPanel.getCurrentObject()) == SplineShape do ( so = subObjectLevel convertToSplineShape $ for spl=1 to (numsplines $) do ( segments = getSegSelection $ spl for seg = 1 to segments.count do segments[seg] += (seg-1) for i in segments do ( vert1 = i vert2 = refineSegment $ spl i 0.5 vert3 = if vert2 == (numknots $ spl) and (isClosed $ spl) then 1 else vert2+1 p1 = getKnotPoint $ spl vert1 p3 = getKnotPoint $ spl vert3 setKnotType $ spl vert1 #bezierCorner setKnotType $ spl vert3 #bezierCorner radius = (distance p1 p3)/2.0 vec = 0.552284749831 * radius vecX = normalize (p3 - p1) vecY = normalize (cross $.transform[3] vecX) dir = if side then -1 else 1 p2 = (p1+p3)/2.0 + vecY * radius * dir setOutVec $ spl vert1 (p1 + vecY * vec * dir ) setInVec $ spl vert3 (p3 + vecY * vec * dir) setInVec $ spl vert2 (p2 - vecX * vec) setOutVec $ spl vert2 (p2 + vecX * vec) setKnotPoint $ spl vert2 p2 ) ) updateshape $ subObjectLevel = so ) ) |
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 25/04/2024 - 20:39 |