有效While While循环链中的下一个对象

时间:2014-10-09 21:00:29

标签: python loops while-loop maya pymel

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

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

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 ) )

1 个答案:

答案 0 :(得分: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"

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