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

Using keyframe() to display nested dictionary info using Python in Maya

我在以下方面需要帮助:

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

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

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

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

听起来这个应用程序唯一需要的标志是 -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}}

警告词:这应该适用于普通动画对象,但对共享动画曲线、实例节点、约束或锁定通道没有做任何聪明的事情……仅供参考....