2014-10-09 3 views
0

Я пытаюсь сделать while loop в Python, чтобы найти следующий элемент в цепочке в Autodesk Maya. Он циклически перемещается по иерархии объектов, пока не найдет объект с определенным атрибутом. В настоящее время он сначала проверяет, не имеет ли текущий объект родительский элемент, а затем проверяет, имеет ли он атрибут parent, если он не будет входить в while loop и распечатает заявление.Effective 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

Я немного смущен. В чем смысл «listRelative»? Находят ли они «родителя» элемента или что-то еще? Какова связь между этим родителем и атрибутом «parent»? – Blckknght

ответ

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" 

Единственная проблема здесь в том, что она не будет поддерживать multple родителей (т.е. инстансов формы). Это сложнее, потому что вам придется перебирать несколько цепей (которые могут перекрываться) параллельно. Однако его не является общей проблемой

+0

Спасибо !, что сработало. Также, каково ваше мнение о переменных для циклов. Является ли всегда всегда для x в ______, и его просто перезаписывают в следующем цикле, достаточно хорошо? Или я должен всегда делать так, чтобы сустав был в цепи. –

+0

Всегда полезно использовать имена, которые означают что-то: мне нравятся такие вещи, как 'для eachbone в bone_chain:' поэтому ясно, что является переменной итерации. Вы не можете изменить внешнюю переменную во время цикла, поэтому хорошо понять, что это такое – theodox