2015-12-08 3 views
0

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

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

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

ответ

0

Как говорится в After Effects Scripting Guide страницы 140:

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

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

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

yourProperty.expression = "valueAtTime(0)"; 

См. After Effects Scripting Guide страница 12 9.

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

1

Вы можете сделать это с помощью команды меню, но вы должны быть очень осторожны, о том, что выбран, а что нет, и быть очень уверен, что комп открыт в средстве просмотра, и зритель активен. Для этого вам понадобится как минимум 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); 
+0

Забыл упомянуть, что аргумент должен быть массивом свойств. Это необходимо, чтобы не повторять openInViewer/deselectAll несколько раз и иметь возможность в конечном итоге восстановить старый выбор. –

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 
} 

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

+0

Это (B) по существу код в вопросе. Суть вопроса заключалась в том, чтобы свести к минимуму количество вызовов 'removeKey' (которые занимают много времени) и заменить их одной командой, которая занимает около нуля (как это возможно в графическом интерфейсе). –

Смежные вопросы