2013-06-12 2 views
0

Я пытаюсь завершить свой сценарий, и у меня возникли некоторые проблемы. Вот мой сценарий:Maya Python Script: Return True или False, если атрибут ключевого кадра в этом конкретном кадре

from maya import cmds 
def correct_value(selection=None, prefix='', suffix=''): 

    newSel = [] 
    if selection is None: 
     selection = cmds.ls ('*_control') 

    if selection and not isinstance(selection, list): 
     newSel = [selection] 

    for each_obj in selection: 
     if each_obj.startswith(prefix) and each_obj.endswith(suffix) : 
     newSel.append(each_obj) 
     return newSel 

def save_pose(selection): 

    pose_dictionary = {} 

    for each_obj in selection: 
      pose_dictionary[each_obj] = {} 
    for each_attribute in cmds.listAttr (each_obj, k=True): 
      pose_dictionary[each_obj][each_attribute] = cmds.getAttr (each_obj + "." + each_attribute) 

    return pose_dictionary 


controller = correct_value(None,'left' ,'control') 


save_pose(controller) 


def save_animation(selection, **keywords): 
    if "framesWithKeys" not in keywords: 
     keywords["framesWithKeys"] = [0,1,2,3] 

    animation_dictionary = {} 
    for each_frame in keywords["framesWithKeys"]: 
      cmds.currentTime(each_frame) 
      animation_dictionary[each_frame] = save_pose(selection) 

    return animation_dictionary 

frames = save_animation (save_pose(controller)) 
print frames 

Теперь, когда я запрашивая атрибут, я хочу, чтобы сохранить значение в словаре, который говорит, что если атрибут имеет ключевой кадр в этом кадре вы проверяете True или False, но только если у него есть ключ в этом фрейме.

Например, скажем, у меня есть ключи в атрибуте tx моего элемента управления в кадрах 1 и 5, и я хочу иметь ключ словаря, который я могу проверить позже, чтобы увидеть, есть ли ключи в этих кадрах: когда есть ключ в этом кадре, возврат true; если нет, возврат false. Если True, я также хочу сохранить касательные типы ключей.

ответ

1

cmds.keyframes предоставит вам все временные рамки ключевого кадра для данной кривой анимации. Так что легко найти все ключи в сцене:

keytimes = {} 
for item in cmds.ls(type = 'animCurve'): 
    keytimes[item] = cmds.keyframe(item, query=True, t=(-10000,100000)) # this will give you the key times # using a big frame range here to make sure we get them all 

# in practice you'd probably pass 'keytimes' as a class member... 
def has_key(item, frame, **keytimes): 
    return frame in keytimes[item] 

Или вы можете просто проверить по одному за раз:

def has_key_at(animcurve, frame): 
    return frame in cmds.keyframe(animcurve, query=True, t=(-10000,100000)) 

Вероятная проблема, вы будете работать в это отстегнул ключи: если вы есть ключ в кадре 30.001, и вы спрашиваете: «Есть ли ключ в 30», ответ будет отрицательным. Вы можете использовать целые ключи следующим образом:

for item in cmds.ls(type = 'animCurve'): 
    keytimes[item] = map (int, cmds.keyframe(item, query=True, t=(-10000,100000))) 

def has_key (item, frame, **keytimes): 
    return int(frame) in keytimes[item]