0

我正在尝试while loop在 Python 中创建一个在 Autodesk Maya 中查找链中的下一个项目。它循环遍历对象的层次结构,直到找到具有特定属性的对象。目前它首先检查当前对象是否没有父对象,然后检查它是否有属性parent,如果有,它不会进入while loop,并打印一条语句。

如果对象确实有父对象while loop,只要对象有父对象,它就会运行 a 。以下代码列出了该选定对象的父级:

while pm.listRelatives( pm.ls( sl = True ), p = True ):

然后它将检查当前对象是否具有该属性,如果没有,它将选择层次结构中的下一个对象,直到有,如果到达下一个结束,它将跳出循环。我想知道,有没有更有效的方法来做到这一点?最好是一种方法,while loop即使它无法在链中找到下一个对象,它也能工作。

import pymel.core as pm

if not pm.listRelatives( pm.ls( sl = True )[ 0 ], p = True ):

    if pm.attributeQuery( 'parent', n = pm.ls( sl = True, tl = True )[ 0 ], ex = True ) == 1:
        print 'found parent on no parent ' + pm.ls( sl = True, tl = True )[ 0 ]

    else:
        while pm.listRelatives( pm.ls( sl = True ), p = True ):

            if pm.attributeQuery( 'parent', n = pm.ls( sl = True, tl = True )[ 0 ], ex = True ) == 1:
                print 'found parent on selected ' + pm.ls( sl = True, tl = True )[ 0 ]
                break
            else:
                print 'parent not found'
                pm.select( pm.listRelatives( pm.ls( sl = True, tl = True ), p = True ) )
4

1 回答 1

1

对于循环链:

def loop_up(item):
    current = [item]
    while current:
        yield current[0]
        current = cmds.listRelatives(current[0], p=True)

这将返回链中的所有项目,从您传入的第一个项目开始。由于它是一个生成器(感谢yield),您可以随时中断:

for each_bone in loop_up(startbone):
    if is_what_youre_looking_for(each_bone):
       # do something
       break
# if you get here you didn't find what you're looking for
print "parent attribute not found"

这里唯一的问题是它不支持多个父对象(即实例形状)。这更棘手,因为您必须并行迭代多个链(可能重叠)。然而它不是一个常见的问题

于 2014-10-09T21:20:40.007 回答