Узел преобразования Майя не появляется в списке

Приведенный ниже код Python Maya дает булеву поверхность nurbs, сначала взяв разность двух сфер nurbs, nurbsSphere1 и nurbsSphere2, чтобы получить поверхность nurbs nurbsBooleanSurface1. Затем он берет разницу этой поверхности и третьей сферы, nurbsSphere3. В результате, как видно в outliner, получаются три сферы nurbs, а также SurfaceVarGroup, nurbsBooleanSurface1, которые являются "родительскими" тремя узлами преобразования nurbsBooleanSurface1_1, nurbsBooleanSurface1_2 и nurbsBooleanSurface1_3.

import maya.cmds as cmds

cmds.sphere(nsp=10, r=50)

cmds.sphere(nsp=4, r=5)
cmds.setAttr("nurbsSphere2.translateX",-12.583733)
cmds.setAttr("nurbsSphere2.translateY",-2.2691557)
cmds.setAttr("nurbsSphere2.translateZ",48.33736)

cmds.nurbsBoolean("nurbsSphere1", "nurbsSphere2", nsf=1, op=1)

cmds.sphere(nsp=4, r=5)
cmds.setAttr("nurbsSphere3.translateX",-6.7379503)
cmds.setAttr("nurbsSphere3.translateY",3.6949043)
cmds.setAttr("nurbsSphere3.translateZ",49.40595)

cmds.nurbsBoolean("nurbsBooleanSurface1", "nurbsSphere3", nsf=1, op=1)

print(cmds.ls("nurbsBooleanSurface1_*", type="transform"))

Strangley (для меня), команда list, cmds.ls("nurbsBooleanSurface1_*", type="transform") дает только [u'nurbsBooleanSurface1_1', u'nurbsBooleanSurface1_2']; nurbsBooleanSurface1_3 отсутствует.

Но когда, выполнив вышеуказанный код, команда печати

print(cmds.ls("nurbsBooleanSurface1_*", type="transform"))

повторяется, результат [u'nurbsBooleanSurface1_1', u'nurbsBooleanSurface1_2', u'nurbsBooleanSurface1_3'].

Я пытался отложить выполнение последней команды печати с помощью time.sleep(n), но безрезультатно. Я поиграл с мыслью, что отсутствующий узел мог бы развернуться в другом пространстве имен, а затем снова появиться по завершении блока выполнения (отчаянно, я знаю!). Я экспериментировал с переименованием сфер и поверхностей, используя функции и нити (последние только поверхностно). Причина незарегистрированного nurbsBooleanSurface1_3 при первом выполнении

print(cmds.ls("nurbsBooleanSurface1_*", type="transform"))

остается загадкой Любая помощь приветствуется.

1 ответ

Решение

Грязный способ (но единственный способ, которым я мог найти), это позвонить cmds.refresh() во время сценария.

Я переписал твой сценарий здесь. Обратите внимание, что я сохраняю каждую сферу в переменной, это хорошая практика, чтобы убедиться, что она будет работать, даже если существующий объект уже называется, например, nurbsSphere3.

import maya.cmds as cmds

sphere1 = cmds.sphere(nsp=10, r=50)

sphere2 = cmds.sphere(nsp=4, r=5)
cmds.setAttr(sphere2[0] + ".translateX",-12.583733)
cmds.setAttr(sphere2[0] + ".translateY",-2.2691557)
cmds.setAttr(sphere2[0] + ".translateZ",48.33736)

nurbsBool1 = cmds.nurbsBoolean("nurbsSphere1", "nurbsSphere2", nsf=1, op=1)

sphere3 = cmds.sphere(nsp=4, r=5)
cmds.setAttr(sphere3[0] + ".translateX",-6.7379503)
cmds.setAttr(sphere3[0] + ".translateY",3.6949043)
cmds.setAttr(sphere3[0] + ".translateZ",49.40595)

nurbsBool2 = cmds.nurbsBoolean(nurbsBool1[0], sphere3[0], nsf=1, op=1)

cmds.refresh(currentView=True)  # Force evaluation, of current view only

print(cmds.listRelatives(nurbsBool2[0], children=True, type="transform"))

Когда вы создаете объект, используя cmds.sphere() возвращает список имен объектов и многое другое. Чтобы получить доступ к этому, вы можете использовать

mySphere = cmds.sphere()
print(mySphere)  
# Result: [u'nurbsSphere1', u'makeNurbSphere1']

print(mySphere[0])  # the first element in the list is the object name
# Result: nurbsSphere1

То же самое верно для логической операции. Просмотрите документацию для команды в разделе " Возвращаемое значение" http://help.autodesk.com/cloudhelp/2016/ENU/Maya-Tech-Docs/CommandsPython/index.html

Другие вопросы по тегам