Максскрипт с модификаторами

При создании куба следующий код должен выбрать два верхних треугольника, инвертировать этот выбор, а затем удалить эти вновь выбранные грани. Все идет нормально. Однако, похоже, у меня возникают проблемы, когда на базовом кубе есть модификатор (или больше).

(
--clear the listener
 clearListener()

 theObj = $

 -- init. an array to collect faces
 selArray = #{}
 invArray = #{}

 append selArray 3
 append selArray 4

 -- get the number of faces in the object
 theMeshCount = theObj.numfaces

 -- invert the array
 for f = 1 to theMeshCount do
 (
 if (selArray[f] == false) then invArray[f] = true
 else invArray[f] = false 
 )

 -- set the face selection in the EMesh
 setFaceSelection theObj invArray

 -- go to modify mode
 max modify mode

 -- select the mesh
 select theObj

 -- add the Mesh Select modifier
 modPanel.addModToSelection (Mesh_Select ())

 -- go to Face level
 subObjectLevel = 3

 --add a delete mesh, preserving the selection
 modPanel.addModToSelection (deleteMesh())
)

Так где я ошибаюсь?


person Ghoul Fool    schedule 15.05.2013    source источник


Ответы (1)


С какими конкретно неприятностями вы сталкиваетесь? Я только что попробовал, и если нет модификаторов, изменяющих топологию, похоже, он работает так, как ожидалось. Вместо этого может быть лучше получить счетчик граней obj.mesh, чтобы он работал и с примитивными объектами, или, может быть, вы намеревались добавить модификаторы в конец стека — в этом случае раскомментируйте /.. / фрагменты в приведенном ниже коде, чтобы вместо этого он работал с базовым объектом.

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

(
    local theObj = selection[1]
    local theMesh = theObj.mesh
    local theMod = Mesh_Select()

    local selArray = #{3..4}
    selArray.count = theMesh./*baseObject.*/numFaces
    delete theMesh

    addModifier theObj theMod /*before:theObj.modifiers.count*/
    setFaceSelection theObj theMod (-selArray)
    max modify mode
    /*modPanel.setCurrentObject theMod*/
    subObjectLevel = 3
    modPanel.addModToSelection (DeleteMesh())
)
person Swordslayer    schedule 16.05.2013
comment
Получите примитивный куб. Измените его на редактируемую сетку. Добавьте, скажем, модификатор morpher (убедитесь, что в режиме лица не выбраны треугольники, если вы запускали скрипт раньше). Затем запустите скрипт. На этот раз будет выбрано все (обратное тому, что грани не выбраны), поэтому сценарий будет казаться, что куб не изменился, а не оставил две верхние грани сами по себе. Я не знаю, нужно ли мне специально вызывать модификатор выбора (не знаю, как это сделать) и добавлять к нему инвертированный выбор. - person Ghoul Fool; 16.05.2013
comment
Да потому что вы пытаетесь установить выделение на $, что является результатом стека. Код, который я предоставил, этого не делает, он устанавливает выделение непосредственно в модификаторе Mesh Select. - person Swordslayer; 16.05.2013