我试图在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 ) )
答案 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"
这里唯一的问题是它不支持多个父项(即实例形状)。这更棘手,因为您必须并行迭代多个链(可能重叠)。然而,这不是一个常见的问题