Я ищу решение, которое позволяет установить список значений

[0,1,2]

По данному списку раз

[0,1,2]

Сразу, без петли, вот так:

for frame, value in zip([0,1,2], [0,1,2]):
    cmds.keyframe(node, e=True, vc=value, t=frame)

Есть команды

cmds.setKeyframe()

И

cmds.keyframe()

Которые позволяют устанавливать анимационные ключи в данный момент времени, но ни один из них не позволяет устанавливать диапазон значений во временном интервале (кадры).

То же значение может быть указано в диапазоне времени, но это не так.

mel.eval("setKeyframe -e -v %s -t 0 -t 1 -t 2 %s" % (value, node))

Я попытался получить атрибуты узла кривой анимации, который хранит ключи внутри, но получил пустой вывод.

node = '...'
types = cmds.listAttr(node)

for t in types:
    if cmds.objExists(node+t):
        try:
            print t, cmds.getAttr(node+t)
        except:
            print 'failed with', t
            continue

...
keyTimeValue [()]
...
0
Andrey Sibiryakov 19 Сен 2018 в 14:51

2 ответа

Лучший ответ

Последний подход не работает в 2019 году майя. Для тех, кто наткнется, вот правильный код.

def add_keys(plugName, times, values, changeCache=None):
    # Get the plug to be animated.
    sel = om.MSelectionList()
    sel.add(plugName)
    plug = om.MPlug()
    sel.getPlug(0, plug)
    # Create the animCurve.
    animfn = oma.MFnAnimCurve(plug)
    timeArray = om.MTimeArray()
    valueArray = om.MDoubleArray()

    for i in range(len(times)):
        timeArray.append(om.MTime(times[i], om.MTime.uiUnit()))
        valueArray.append(values[i])
    # Add the keys to the animCurve.
    animfn.addKeys(
        timeArray,
        valueArray,
        oma.MFnAnimCurve.kTangentGlobal,
        oma.MFnAnimCurve.kTangentGlobal,
        False,
        changeCache)
0
Andrey Sibiryakov 13 Ноя 2019 в 18:05

Разобрался. Вот документация об узле кривой анимации. https://download.autodesk.com/us/maya/2011help/ Узлы / animCurveUU.html

Как видите, атрибут keyTimeValue сам по себе не хранит никаких данных. Но его атрибуты keyTimeValue.keyTime и keyTimeValue.keyValue делают.

Эта команда работала как я ожидал:

def keyframe_range(node, values, id_range):

    eval("cmds.setAttr('%s.ktv[%s].kv', %s, size=%s)" % (
        node, id_range, ','.join([str(v) for v in values]), str(len(values))))

selected_id = cmds.keyframe(sl=True, query=True, iv=True)
index_range = '%s:%s' % (str(selected_id[0]), str(selected_id[-1]))
selected_curve = cmds.keyframe(query=True, name=True)
keyframe_range(selected_curve[0], values, index_range)

Но в Python 2.7 есть ограничение до 255 аргументов, которое может получить функция. Как только значения передаются непосредственно в функцию, одновременно может обрабатываться не более 255 клавиш.

0
Andrey Sibiryakov 19 Сен 2018 в 15:43