Правильный способ использования setAttr с выбором канала
Пожалуйста, потерпите меня - я новичок во всем этом. Я попробовал поиск и нашел только кусочки того, что я ищу, но не то, что мне нужно, чтобы соединить их.
По сути, я пытаюсь создать скрипт Python, который позволяет пользователю просто "0" из нескольких выбранных атрибутов в окне канала Maya.
Пока что у меня есть:
import maya.cmds as cmds
selObjs = cmds.ls(sl=1)
selAttrs = cmds.channelBox("mainChannelBox", q=1, sma=1)
print selObjs # returns [u'pCube1']
print selAttrs # returns [u'ty']
Если бы я хотел установить атрибуты:
cmds.setAttr(selObjs + "." + selAttrs, '0')
конечно, это неправильно, так как мне правильно выполнить команду setAttr в этом сценарии? (Намерение включает в себя необходимость их установки, если у меня есть несколько выбранных атрибутов в окне канала).
Я обнаружил, что в MEL это работает так. Так что на самом деле мне просто нужна помощь, чтобы выяснить, как создать аналог Python из этого:
string $object[] = `ls -sl`;
string $attribute[] = `channelBox -q -sma mainChannelBox`;
for ($item in $object)
for($attr in $attribute)
setAttr ($item + "." + $attr) 0;
Двигаясь после этого, мне нужен цикл if, где, если выбранный атрибут является атрибутом масштаба, значение должно быть 1 - но это то, что я рассмотрю позже, но не буду возражать, если мне посоветуют.
Спасибо!
2 ответа
Итак, вот что я наконец-то придумал:
import maya.cmds as cmds
selObjs = cmds.ls(sl=1)
selAttrs = cmds.channelBox("mainChannelBox", q=1, sma=1)
scales = ['sy','sx','sz','v']
if not selObjs:
print "no object and attribute is selected!"
elif not selAttrs:
print "no attribute is selected!"
else:
for eachObj in selObjs:
for eachAttr in selAttrs:
if any(scaleVizItem in eachAttr for scaleVizItem in scales):
cmds.setAttr (eachObj+"."+eachAttr, 1)
else:
cmds.setAttr (eachObj+"."+eachAttr, 0)
Это сбросит базовые преобразования к их значениям по умолчанию. Включая if для значений масштаба и видимости.
Мне удалось придумать это:
import maya.cmds as cmds
selObjs = cmds.ls(sl=1)
selAttrs = cmds.channelBox("mainChannelBox", q=1, sma=1)
for each in selObjs:
for eachAttr in selAttrs:
cmds.setAttr (each+"."+eachAttr, 0)
И это работает, чтобы обнулить выбранные атрибуты идеально. Сейчас я нахожусь на этапе выяснения, как заставить скрипт распознавать, если он содержит атрибуты масштаба, - чтобы изменить это значение на 1 вместо 0. (в данный момент застрял в том, как извлечь значения из списка)