3DCenter.ru

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

179 страниц V  « < 177 178 179  
Reply to this topicStart new topic
> А нет-ли такого скрипта?
Jahman
сообщение 01/05/2018, 23:42
Сообщение #2671


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



для этого есть theHold
сперва смотрим, что вернет theHold.Holding()
если false - можем вызвать theHold.Begin()
далее делаем все свои скриптовые манипуляции
в завершение вызываем theHold.Accept "My MXS Operation" с произвольным именем undo записи.

Вполне может так оказаться, что какой-то из макросов или модификаторов перед началом своей работы отменит этот пользовательский theHold.Begin и как результат ничего толкового не получится.
Можно еще с другой стороны зайти.
Перед выполнением ряда действий совершить что-то что добавит undo запись, например конверт в поли или тп по ситуации. Далее с выключенным undo выполняем все что нужно.
При необходимости отката мы откатимся на момент перед этим первоначальным конвертом.


Go to the top of the page
 
+Quote Post
YevSA
сообщение 02/05/2018, 01:09
Сообщение #2672


Продвинутый ученик
Иконка группы

Группа: Пользователи
Сообщений: 58
Регистрация: 19/01/2012
Пользователь №: 85 177



Спасибо, первый вариант с hold'ом работает как надо!
А нет ли случаем какого-нибудь доходчивого самоучителя по максскрипту для тупых, ну там в виде раскраски какой или деревянных кубиков с наклеенными буквами, чтоб хотя бы подозревать о существовании таких моментов и фич?
Go to the top of the page
 
+Quote Post
RGhost
сообщение 02/05/2018, 09:10
Сообщение #2673


Рыцарь форума
Иконка группы

Группа: Участник
Сообщений: 2 124
Регистрация: 01/04/2003
Из: Moscow/Russia
Пользователь №: 1 802



Цитата(YevSA @ 02/05/2018, 01:09) *
Спасибо, первый вариант с hold'ом работает как надо!
А нет ли случаем какого-нибудь доходчивого самоучителя по максскрипту для тупых, ну там в виде раскраски какой или деревянных кубиков с наклеенными буквами, чтоб хотя бы подозревать о существовании таких моментов и фич?

http://www.scriptattack.com/theory/theory.html вот это можно попробовать
Go to the top of the page
 
+Quote Post
Jahman
сообщение 02/05/2018, 09:44
Сообщение #2674


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



MAXScript 101
форум по maxscript
Учиться лучше на практической задаче, главное предварительно установить автокомплит для максскрипта чтоб на синтаксис не отвлекаться


Добавляем вот это в файл настроек редактора 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
Прикрепленные файлы
Прикрепленный файл  maxscript_api_file.zip ( 53,21 килобайт ) Кол-во скачиваний: 6
 
Go to the top of the page
 
+Quote Post
YevSA
сообщение 02/05/2018, 23:04
Сообщение #2675


Продвинутый ученик
Иконка группы

Группа: Пользователи
Сообщений: 58
Регистрация: 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

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Jahman
сообщение 03/05/2018, 11:12
Сообщение #2676


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 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
Go to the top of the page
 
+Quote Post
YevSA
сообщение 03/05/2018, 23:25
Сообщение #2677


Продвинутый ученик
Иконка группы

Группа: Пользователи
Сообщений: 58
Регистрация: 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
                
            )
Go to the top of the page
 
+Quote Post
Jahman
сообщение 04/05/2018, 07:14
Сообщение #2678


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



по идее надо просто вернуть из функции #{ index }, если угол выше определенного (т.е. не дать рекурсии идти дальше по индексам)
Go to the top of the page
 
+Quote Post
IOG
сообщение 16/05/2018, 20:29
Сообщение #2679


Уважаемый
Иконка группы

Группа: Участник
Сообщений: 861
Регистрация: 05/12/2004
Из: Минск
Пользователь №: 8 716



Есть ли скрипт, который из выделенного сегмента сплайна делает полукруг?
Прикрепленное изображение


Сообщение отредактировал IOG - 16/05/2018, 20:29
Go to the top of the page
 
+Quote Post
Jahman
сообщение 16/05/2018, 22:49
Сообщение #2680


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 01/06/2005
Из: z3л3№гр@d
Пользователь №: 13 838



1. конвертируем узлы сегмента в bezierCorner
2. делаем refineSegment 0.5
3. сдвигаем новый узел в позицию
3. настраиваем усы InVec OutVec

зы. Усы в окружности отстоят от узла на 0.551785 * radius расстояние.
Кто-нибудь может объяснить почему?
upd. А вот собственно и почему: https://stackoverflow.com/a/27863181

Прикрепленное изображение

Сообщение отредактировал Jahman - 16/05/2018, 23:00
Go to the top of the page
 
+Quote Post
IOG
сообщение 17/05/2018, 22:47
Сообщение #2681


Уважаемый
Иконка группы

Группа: Участник
Сообщений: 861
Регистрация: 05/12/2004
Из: Минск
Пользователь №: 8 716



Неплохо! А сторону в которую выгибает, как он узнает? по номерам ? думаю тоггл должен быть какой-то для этого.

Сообщение отредактировал IOG - 17/05/2018, 22:47
Go to the top of the page
 
+Quote Post
Jahman
сообщение 18/05/2018, 00:19
Сообщение #2682


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 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

Go to the top of the page
 
+Quote Post
IOG
сообщение 18/05/2018, 19:49
Сообщение #2683


Уважаемый
Иконка группы

Группа: Участник
Сообщений: 861
Регистрация: 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
Go to the top of the page
 
+Quote Post
RGhost
сообщение 18/05/2018, 20:45
Сообщение #2684


Рыцарь форума
Иконка группы

Группа: Участник
Сообщений: 2 124
Регистрация: 01/04/2003
Из: Moscow/Russia
Пользователь №: 1 802



Насколько я помню, сплайновые операции которые делаются через maxscript в undo не заносятся вообще... Приходится хранить изначальную линию, и делать свое undo... раньше было так, может в последних версиях что то изменилось но думаю что врядли.
Go to the top of the page
 
+Quote Post
Jahman
сообщение 19/05/2018, 14:43
Сообщение #2685


уже всё сделал
Иконка группы

Группа: Пользователи
Сообщений: 2 296
Регистрация: 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
    )

)
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






179 страниц V  « < 177 178 179
Reply to this topicStart new topic

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

 



RSS Текстовая версия Сейчас: 24/05/2018 - 22:25