python忽略了5月份的两个条件之一

2024-03-29 06:50:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python还很陌生(20天),但我已经在maya中创建了一些东西,例如pickers、ik fk snap和其他一些东西。现在我尝试创建一个按钮来镜像这个姿势。在

问题是,我必须为if循环提供2个条件,但maya忽略了第二个条件

import maya.cmds as cmds

cmds.select('arm_lf_FK_ctrl1', 'arm_lf_FK_ctrl2', 'arm_lf_FK_ctrl3')
baseOBJ = cmds.ls(sl=True)
cmds.select('arm_rt_FK_ctrl1', 'arm_rt_FK_ctrl2', 'arm_rt_FK_ctrl3')
targetOBJ = cmds.ls(sl=True)
attr = ['translateX', 'translateY', 'translateZ', 'rotateX', 'rotateY', 'rotateZ', 'IK' ]



for i in range(len (attr) ):

    for x in range(len (targetOBJ) ):
        if (cmds.attributeQuery(attr[i], node = targetOBJ[x], exists = True) \
        and cmds.getAttr(targetOBJ[x] + '.' + attr[i], lock = False)): 
            newValue = cmds.getAttr(baseOBJ[x] + '.' + attr[i])
            cmds.setAttr(baseOBJ[x] + '.' + attr[i], newValue)
        else:
            pass

错误是: {cd1>错误^

但是在if循环中我写了:cmds.getAttr(targetOBJ[x] + '.' + attr[i], lock = False)

有什么提示吗?在

编辑解决方案:

这是修正的代码

^{pr2}$

Tags: trueif条件selectarmattrfkrt
2条回答

我不认识玛雅,但看起来问题是在第一种情况下发生的,因此第二种情况被忽略了。此外,在运行setAttr时,异常会显示问题。当您运行attributeQuery时,将调用此函数,表示exists=True,这实际上意味着如果属性不存在,您将最终添加该属性。在

您需要指定

cmds.getAttr(item + attribute, lock=True)

即使您正在检查您希望被锁定的属性:“lock=true”显示“tell me the lock state”,not“tell me if lock is true”。在

只需使用三种常见的python技巧(也可以不添加额外的选择,这只会复制传入的列表)就可以做到这一点

第一种方法是使用foreach循环直接从列表中获取值,而不是使用数组索引。这是在python中执行循环的标准方法。所以不是

^{pr2}$

你就是这样

for item in list_of_things:
   do_something(item)

第二种方法是使用zip()来匹配列表并将它们作为对循环:这使得在保持值同步的同时编写干净的循环变得更加容易。在

最后一件事是使用try...except并允许某些类型的错误发生,而不是预先检查。这是一个常见的python技巧,因为异常并不昂贵,并且生成的代码通常更可读。在

将这些放在一起,您可以执行以下相同的代码:

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

在这种情况下,如果向Maya传递错误对象、错误属性或尝试设置锁定属性,Maya将抛出RuntimeError。你真的需要比我在这里更仔细地检查,这取决于当系统试图做一些不可能的事情时你想要做什么。在

最后一个让你的生活更轻松的诀窍是把你的条件检查从逻辑中分离出来。而不是

 if (cmds.attributeQuery(attr[i], node = baseOBJ[x], exists = True) \
        and cmds.getAttr(baseOBJ[x] + '.' + attr[i], lock = False)): 

从长远来看,您可能会发现:

  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

以这种方式编写它可以更容易地在出错时插入调试打印输出。在

相关问题 更多 >