2015-12-08 2 views
0

Je suis en train d'écrire un script pour After Effects, dans lequel je dois effacer toutes les images clés. J'ai actuellementComment effacer toutes les images clés d'un script After Effects?

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

qui fonctionne bien, sauf qu'il faut quelques (très remarquables) secondes pour s'exécuter. Dans l'interface graphique, il y a le petit chronomètre à côté de la propriété qui peut effacer toutes les images clés rapidement. La propriété isTimeVarying (bool indiquant s'il y a des images clés) est lu semblent seulement, et je ne peux pas trouver une méthode setTimeVarying ou similaire. Y a-t-il un moyen de faire cette chose?

Répondre

0

Comme il est dit dans la After Effects Scripting Guide la page 140:

Pour supprimer plusieurs images clés, vous doit commencer par le numéro d'index le plus élevé et travailler au plus bas afin d'assurer que les indices restants référence du même image clé après chaque suppression.

Vous ne pouvez pas supprimer plusieurs images clés à un moment qui est vraiment dommage, mais si vous êtes à la recherche d'une plus rapide, je cherchais et je trouve rien que je pense qu'il n'y a pas de meilleure façon. .

mais voici ce que vous pouvez faire, vous ne pouvez pas supprimer les images clés, mais vous pouvez faire l'animation ne change pas pendant tout le temps, il vous suffit d'ajouter l'expression valueAtTime(0) à votre propriété comme ceci:

yourProperty.expression = "valueAtTime(0)"; 

Voir la After Effects Scripting Guide page 12 9.

J'espère que cela vous a aidé :)

1

Vous pouvez le faire en utilisant les commandes de menu, mais vous avez à faire très attention à ce qui est sélectionné et ce n'est pas, et être bien sûr que l'échantillon est ouvert dans une visionneuse, et le spectateur est actif. Pour cela, vous aurez besoin d'au moins 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

oublié de mentionner que l'argument devrait être un ensemble de propriétés. C'est pour éviter de répéter l'openInViewer/deselectAll plusieurs fois, et de pouvoir éventuellement récupérer l'ancienne sélection. –

1

pour cette solution:

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 
} 

Vous avez seulement besoin A ou B, selon que vous voulez faire défiler en avant et se retrouver avec la valeur de la dernière image clé ou le cycle vers l'arrière et finir avec la valeur de la première image clé.

+0

C'est (B) essentiellement le code dans la question. Le point de la question était de réduire au minimum le nombre de 'appels removeKey' (qui prennent beaucoup de temps) et le remplacer par une seule commande qui prend ensuite à zéro le temps (comme cela est possible dans l'interface graphique). –