使用keyframe()在Maya中使用Python显示嵌套字典信息

时间:2015-04-25 18:24:36

标签: python animation scripting maya keyframe

我需要帮助做以下事情:

使用关键帧方法(和标志)从选定的一组键中提取信息,以将它们存储在嵌套字典中。这些关键帧对应于动画,其中复制了所有关键帧以根据需要粘贴到其他关节上。我一直在梳理网络上的文档和不同来源,但我遇到了我不熟悉的动画术语和概念。 我稍后会访问这个词典,在一个格式很好的窗口中显示关键帧信息,这样我写这个的艺术家可以看到粘贴动画之前的效果。

到目前为止我的这部分代码:

else:
    key_list = mc.copyKey()

    # check to see if window exists already
    if mc.window(copyAnim, exists = True):
        mc.deleteUI(copyAnim)

    # create window
    copyAnim = mc.window(title="Transfer Animation Tool", backgroundColor= [0.3,0.3,0.3],sizeable=False,resizeToFitChildren=True)

    #set the layout for UI
    mc.columnLayout(adjustableColumn=True)
    tx_src = mc.textFieldGrp(label="Source Object", editable=False, text=sel[0])
    int_offset = mc.intFieldGrp(label="Frame Offset Amount", value1=0)

    #displaying what info will be transferred - here is where I would use   
    #keyframe() instead -- getting an error because copyKey() returns an
    #int which is not iterable. As you can see the return value for copyKey 
    #is being stored in key_list.
    for key in key_list:
    display_info = mc.textFieldGrp(label="Copy Value", editable=False, text=key_list[item])

文档链接: http://download.autodesk.com/us/maya/2011help/CommandsPython/keyframe.html

1 个答案:

答案 0 :(得分:1)

听起来这个应用程序需要的唯一标志是-vc,它可以获取值-tc,它可以获得时间(与-q标志结合使用时查询。

如果你想要的只是价值键的字典,它基本上只使用dict()zip()

def keys_as_dictionary(channel):
    """return a dictionay of times:values for <channel>"""
    keys = cmds.keyframe(channel, q=True, tc=True) or []
    values = cmds.keyframe(channel, q=True, vc=True) or []
    return dict(zip(keys, values))

def channels(object):
    """return a dictionary of <plug>:<channel_dict> for each animated plug on <object>"""
    keys = cmds.keyframe(object, n=True, q=True)
    result = {}

    for k in keys:
        plugs = cmds.listConnections(k, p=True)[0]
        result[plugs]= keys_as_dictionary(k)
    return result

在对象上调用channels()将返回一个由动画曲线键入的字典,其中的值是时间和值的字典:

import pprint
pprint.pprint(channels('pCube2'))

{u'pCube2.translateX': {4.955: 4.164464499411458,
                        10.89: -0.8212519883789916,
                        15.465: -0.6405074625130949,
                        22.65: -1.7965970091598258},
 u'pCube2.translateY': {4.955: 8.271115169656772,
                        10.89: 0.3862609404272041,
                        15.465: 7.77669517461548,
                        22.65: 0.6892861215369379},
 u'pCube2.translateZ': {4.955: -1.4066258181614297,
                        10.89: -4.891368771063121,
                        15.465: 4.340776804349586,
                        22.65: -3.5676492042261776}}

警告词:这应该适用于简单的动画对象,但是对于共享动画曲线,实例化节点,约束或锁定频道没有做任何明智的事情.... FYI ...... < / p>