<p>您需要指定</p>
<pre><code>cmds.getAttr(item + attribute, lock=True)
</code></pre>
<p>即使您正在检查您希望被锁定的属性:“lock=true”显示“tell me the lock state”,<em>not</em>“tell me if lock is true”。在</p>
<p>只需使用三种常见的python技巧(也可以不添加额外的选择,这只会复制传入的列表)就可以做到这一点</p>
<p>第一种方法是使用foreach循环直接从列表中获取值,而不是使用数组索引。这是在python中执行循环的标准方法。所以不是</p>
^{pr2}$
<p>你就是这样</p>
<pre><code>for item in list_of_things:
do_something(item)
</code></pre>
<p>第二种方法是使用<code>zip()</code>来匹配列表并将它们作为对循环:这使得在保持值同步的同时编写干净的循环变得更加容易。在</p>
<p>最后一件事是使用<code>try...except</code>并允许某些类型的错误发生,而不是预先检查。这是一个常见的python技巧,因为异常并不昂贵,并且生成的代码通常更可读。在</p>
<p>将这些放在一起,您可以执行以下相同的代码:</p>
<pre><code>sources = ('arm_lf_FK_ctrl1', 'arm_lf_FK_ctrl2', 'arm_lf_FK_ctrl3')
targets = ('arm_rt_FK_ctrl1', 'arm_rt_FK_ctrl2', 'arm_rt_FK_ctrl3')
attr = ('.translateX', '.translateY', '.translateZ', '.rotateX', '.rotateY', '.rotateZ', '.IK' )
for source, target in zip(sources, targets):
for attrib in attr:
try:
val = cmds.getAttr(source + attrib)
cmds.setAttr(target + attrib, val)
except Exception as e:
print 'skipped', source + attrib, target + attrib
</code></pre>
<p>在这种情况下,如果向Maya传递错误对象、错误属性或尝试设置锁定属性,Maya将抛出<code>RuntimeError</code>。你真的需要比我在这里更仔细地检查,这取决于当系统试图做一些不可能的事情时你想要做什么。在</p>
<p>最后一个让你的生活更轻松的诀窍是把你的条件检查从逻辑中分离出来。而不是</p>
<pre><code> if (cmds.attributeQuery(attr[i], node = baseOBJ[x], exists = True) \
and cmds.getAttr(baseOBJ[x] + '.' + attr[i], lock = False)):
</code></pre>
<p>从长远来看,您可能会发现:</p>
<pre><code> exists, locked = False
try:
exists = cmds.ls(object + attrib) is not None
locked = cmds.getAttr(object + attrib, lock = True)
except:
pass # if the object or attrib is missing, both vals will still be false
if exists and not locked:
#do something
</code></pre>
<p>以这种方式编写它可以更容易地在出错时插入调试打印输出。在</p>