如何清除After Effects脚本中的所有关键帧?

时间:2015-12-08 10:03:42

标签: javascript after-effects

我正在为After Effects编写一个脚本,作为清除所有关键帧所需的步骤之一。我目前有

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

工作正常,但需要几个(非常明显的)秒才能运行。在GUI中,该属性旁边有一个小秒表,可以快速清除所有关键帧。属性isTimeVarying(bool指示是否存在任何关键帧)是只读的,我似乎无法找到setTimeVarying或类似的方法。有办法做这件事吗?

3 个答案:

答案 0 :(得分:1)

您可以使用菜单命令来执行此操作,但您必须非常小心选择的内容和不选择的内容,并确保在查看器中打开comp,并且查看器处于活动状态。为此,你至少需要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);

答案 1 :(得分:1)

尝试一下:

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,具体取决于您是要向前循环还是以最后一个关键帧的值结束或向后循环,最后得到第一个关键帧的值。

答案 2 :(得分:0)

正如After Effects Scripting Guide页面140中所述:

  

要删除多个关键帧,请执行此操作   必须从最高索引号开始,然后降低到最低值以确保剩余索引   每次删除后引用相同的关键帧。

所以你不能一次删除多个关键帧,这真是一种耻辱,但如果你正在寻找一种最快的方式,我搜索了一下,我什么都没找到,所以我认为没有更好的方法..

但是你可以做的就是你可以删除关键帧,但是你可以在任何时候都不改变动画,你只需添加表达式valueAtTime(0)  对你的财产这样:

yourProperty.expression = "valueAtTime(0)";

请参阅After Effects Scripting Guide第129页。

我希望它能帮到你:)。