Узел преобразования Майя не появляется в списке
Приведенный ниже код 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