Maxscript splineOps.startTrim - PullRequest
       92

Maxscript splineOps.startTrim

0 голосов
/ 16 мая 2018

Я пытаюсь создать скрипт для 3ds max, который позволил бы мне автоматически обрезать сплайны.

После поиска в течение последних 4 часов я наткнулся на глобальную структуру splineOps.

Это то, что у меня есть до сих пор:

---- Kustom Trim Lines
try (closerolloutfloater MainFloater) catch()

Rollout Menu01 "Geometry Ops"
(
    button select_trims "Trim all similar"

    on select_trims pressed do
    (
        splineOps.startTrim Shape439
    )
)

MainFloater = NewRolloutFloater "Kustom TrimLines" 300 200
addRollout Menu01 MainFloater

Когда я нажимаю кнопку в новом свитке, я получаю "- Неизвестное системное исключение"

В конечном счете, я хотел бы построитьЭтот скрипт автоматически обрезает все похожие сегменты от определенного сплайна

Любые указатели / идеи приветствуются.

Приветствия!

- Обновление 05-16-2018 2:34PM CT -

Поиграв с ним немного больше, я смог заставить скрипт выбрать фигуру, ввести подуровень и выбрать опцию обрезки.Вот как это выглядит:

---- Kustom Trim Lines
try (closerolloutfloater MainFloater) catch()

Rollout Menu01 "Geometry Ops"
(
    button select_trims "Trim all similar"

    on select_trims pressed do
    (
        select $Shape439
        subobjectlevel = 3
        splineOps.startTrim($)
    )
)

MainFloater = NewRolloutFloater "Kustom TrimLines" 300 200
addRollout Menu01 MainFloater

Теперь ... Как бы я автоматизировал это?Допустим, я бы хотел, чтобы он обрезал все маленькие линии между каждыми 2 параллельными линиями, которые пересекаются, или все сегменты, которые меньше определенной длины (например, <1 "). Можно ли это сделать ????предполагая, что мне нужно сначала обнаружить все пересечения, разбить сегменты и удалить все, что <1 ".Кто-нибудь?Есть идеи? </p>

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Инструмент Spline Trim не полностью доступен в MaxScript, поэтому вы можете только запустить режим пользовательского интерфейса инструмента, но для реальных операций Trim требуется щелчок мыши.

Один из способов, который вы можете рассмотреть, - это эмулировать щелчки мыши вокно просмотра.Например, эмулируйте щелчки в точках узлов, которые вы хотите обрезать, и я предполагаю, что они являются конечными точками всех сплайнов (или определенных сплайнов) в форме.Приведенный ниже код просматривает каждый сплайн в форме и просматривает каждый сегмент в сплайне, чтобы проверить, меньше ли длина некоторого порога.Если это так, он эмулирует щелчок мыши на узле окончания в режиме обрезки.Обратите внимание, что угол перспективы окна просмотра имеет значение.Скрипт должен четко видеть узлы, на которые нужно щелкнуть, без наложения узлов друг на друга.Он пытается выполнить Zoom Extents Selected, но это не является гарантией и, вероятно, потребует руководства художника.

Это, безусловно, взлом, а не идеальное решение.Но такой подход может быть полезен в различных ситуациях.

-- Define the object to operate on
s = $Circle001

-- Spline segment length threshold maximum.  Segments longer than this will NOT be trimmed
cLenMax = 100.0

-- Zoom extents.  Attempts to get all vertices in clear view (not guaranteed)
bnd = nodeGetBoundingBox s (matrix3 1)
viewport.ZoomToBounds false bnd[1] bnd[2]

-- Make sure Modify Panel is open, with object selected
cui.commandPanelOpen = true
SetCommandPanelTaskMode #modify
select s

-- Enter Spline subobject with Trim tool
subobjectlevel = 3
splineOps.startTrim(s)

-- Spline manipulation
for sn = 1 to numSplines s do
(
    cn = numKnots s sn
    if( cn>1 ) do
    (
        -- Lengths of the segments.  There are (cn-1) segments for the spline
        -- List indicates relative lengths, then the absolute lengths, then the total spline length
        -- So the total number of entries is ((cn-1) + (cn-1) + 1)
        -- We're interested in the middle values for absolute lengths
        -- First one has index [cn] and last one has index [cn+cn-2]
        cLenData = getSegLengths s sn
        cLenFirst = cLenData[cn]
        cLenLast = cLenData[cn+cn-2]

        -- If segments are shorter than our threshold lengths, trim them
        -- Trim from highest index to lowest, since indices will change after each trim step
        cRemove = #()
        if cLenLast<cLenMax then append cRemove cn
        if cLenFirst<cLenMax then append cRemove 1

        -- Click the mouse on the first and last knot of each spline
        for kn in cRemove do
        (
            -- Get the location of the knot in world space
            kp = getknotpoint s sn kn
            gw.setTransform(Matrix3 1)

            -- Transform that to window space relative to the current viewport
            wp = gw.wTransPoint kp

            -- Click the mouse on that position in the window
            -- Super sketchy ... Workaround because Trim is not really available in MaxScript
            hvp = viewport.getHWnd()
            btnCode = 1 -- left button
            posCode = (wp.x) + (65536*wp.y) -- packed x and y position
            windows.sendMessage hvp 0x0201 btnCode posCode      -- Send WM_LBUTTONDOWN
            windows.sendMessage hvp 0x0202 btnCode posCode      -- Send WM_LBUTTONUP
        )
    )
)

deselect s
0 голосов
/ 18 мая 2018

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

curveLength $Circle001 1
...