Любой способ установить несколько ключей и значений в Maya, используя Python? - PullRequest
0 голосов
/ 19 сентября 2018

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

[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 [()]
...

1 Ответ

0 голосов
/ 19 сентября 2018

разобрался.Вот документация об аниме кривой узла.https://download.autodesk.com/us/maya/2011help/Nodes/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 клавиш.

...