Как очистить все ключевые кадры в сценарии After Effects?

Я пишу сценарий для After Effects, где в качестве одного из шагов мне нужно очистить все ключевые кадры в . в настоящее время у меня есть

for (highestIndex = prop.numKeys; highestIndex > 0; highestIndex--) {
    prop.removeKey(highestIndex);
}

который отлично работает, за исключением того, что для запуска требуется несколько (очень заметных) секунд. В графическом интерфейсе рядом со свойством есть маленький секундомер, который может быстро очистить все ключевые кадры. Свойство isTimeVarying (логическое значение, указывающее, есть ли какие-либо ключевые кадры) доступно только для чтения, и я не могу найти setTimeVarying или аналогичный метод. Есть ли способ сделать это?


person Avi Ginsburg    schedule 08.12.2015    source источник


Ответы (3)


Вы можете сделать это с помощью команд меню, но вы должны быть очень осторожны с тем, что выбрано, а что нет, и быть очень уверенным, что композиция открыта в программе просмотра, и программа просмотра активна. Для этого вам понадобится как минимум CS6.

function removeAllKeys(props){

    var deselectAllId = app.findMenuCommandId("Deselect All");
    var clearId = app.findMenuCommandId("Clear");
    var comp, oldSelection, i;

    // assumed: all props belong to the same comp
    if (props.length===0) return;

    comp = props[0].propertyGroup(props[0].propertyDepth).containingComp;
    oldSelection = comp.selectedProperties;

    app.beginUndoGroup("Remove All Keys");
    // make sure that the comp is open in a viewer (essential, otherwise: catastrophy)
    comp.openInViewer();
    // deselect everything:
    app.executeCommand(deselectAllId);
    for (i=0; i<props.length; i++){
        if (props[i].numKeys>0){
            props[i].selected = true;
            app.executeCommand(clearId);
            app.executeCommand(deselectAllId);
            };
        };
    for (i=0; i<oldSelection.length; i++){
        oldSelection[i].selected = true;
        };
    app.endUndoGroup();
    return;
    };

removeAllKeys(app.project.activeItem.selectedProperties);
person Xavier Gomez    schedule 09.12.2015
comment
Забыл упомянуть, что аргумент должен быть массивом свойств. Это делается для того, чтобы избежать повторения openInViewer/deselectAll несколько раз и иметь возможность в конечном итоге восстановить старый выбор. - person Xavier Gomez; 09.12.2015

Попробуйте это:

var targetComp = app.project.activeItem; // Collect the active composition
var selectedLayer = targetComp.selectedLayers; // Collect the selected layers

// Identify the target parameter to be deleted
var targetParam = selectedLayer[0].transform.position; // Target the Position paramter of the first selected layer

// A. Delete the Keyframes forward from FIRST frame to LAST frame
while (targetParam.numKeys != 0) { // While there are still Keyframes, continue looping
    targetParam.removeKey(1); // Delete the first Keyframe
}

// B. Delete the Keyframes backward from LAST frame to FIRST frame
for (i = targetParam.numKeys; i != 0; i--) { // Cycle through the Keyframes
    targetParam.removeKey(i); // Remove the current Keyframe
}

Вам нужен либо A, либо B, в зависимости от того, хотите ли вы выполнить цикл вперед и получить значение последнего ключевого кадра или цикл назад и получить значение первого ключевого кадра.

person Mike Sevigny    schedule 04.07.2016
comment
Это (B) по существу код в вопросе. Суть вопроса заключалась в том, чтобы свести к минимуму количество вызовов removeKey (которые занимают много времени) и заменить их одной командой, которая занимает почти нулевое время (как это возможно в графическом интерфейсе). - person Avi Ginsburg; 05.07.2016

Как сказано в Руководстве по созданию сценариев After Effects стр. 140:

Чтобы удалить более одного ключевого кадра, вы должны начать с наивысшего номера индекса и двигаться вниз к наименьшему, чтобы гарантировать, что оставшиеся индексы ссылаются на один и тот же ключевой кадр после каждого удаления.

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

Но вот что вы можете сделать, вы не можете удалить ключевые кадры, но вы можете сделать так, чтобы анимация не менялась все время, вам просто нужно добавить выражение valueAtTime(0) к вашему свойству следующим образом:

yourProperty.expression = "valueAtTime(0)";

См. Руководство по созданию сценариев After Effects стр. 129.

Я надеюсь, что это помогло вам :)

person oktomus    schedule 08.12.2015