将 setAttr 与通道框选择一起使用的正确方法

Proper way to use setAttr with channel box selection

请耐心等待 - 我是新手。我尝试了搜索,但只找到了我要查找的内容的点点滴滴,但没有找到连接它们所需的内容。

基本上,我正在尝试创建一个 Python 脚本,允许用户简单地将 Maya 通道框上的多个选定属性“0”化。

到目前为止我有:

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 - 但这是我稍后会研究的内容,但不介意被告知.

谢谢!

我想出了这个:

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。(目前停留在如何从列表中提取值)

所以这是我最终想出的:

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。