Comment obtenir toutes les images clés pour la bande sélectionnée en python?

Aug 19 2020

Supposons que nous ayons une bande d'image dans VSE et qu'elle ait 2 images clés pour son opacité. Comment puis-je modifier les valeurs de chacun d'entre eux via python?

Réponses

6 Leander Aug 19 2020 at 17:02

Importez le module bpy pour accéder aux données de Blender.

import bpy

Méthode de contexte

Si vous venez de créer les images clés et que vous créez simplement des scripts dans l'éditeur de texte, vous pouvez rechercher les objets par contexte. Vous devez être certain que la bande comporte deux images clés et qu'elle est sélectionnée (active) dans le séquenceur.

Obtenez la scène active par contexte.

scene = bpy.context.scene

Obtenez la bande de séquenceur active par contexte.

strip = scene.sequence_editor.active_strip

Recherchez la courbe fcurve connectée à la data_pathbande active avec son nom et sa propriété. (Regardez la réponse de batFINGER sur la façon de construire le data_path plus élégamment avec strip.path_from_id("blend_alpha").)

data_path = 'sequence_editor.sequences_all["' + strip.name + '"].blend_alpha'
fcrv = scene.animation_data.action.fcurves.find(data_path)

Attribuez des valeurs au keyframe_pointsstocké dans la fcurve.

for i, y in [[0, 0.0], [1, 1.0]]:
    fcrv.keyframe_points[i].co.y = y
    fcrv.keyframe_points[i].handle_left.y = y
    fcrv.keyframe_points[i].handle_right.y = y

Forcer l'actualisation du séquenceur.

bpy.ops.sequencer.refresh_all()

Méthode de données

Si vous essayez d'utiliser cette fonctionnalité à partir d'un module complémentaire ou si vous ne savez pas si une bande active est sélectionnée ou même si des images clés sont présentes, vous devez valider les données.

Afficher l'extrait de code de github.

Encapsulez la fonctionnalité dans une méthode, qui peut être abandonnée, si une condition préalable est manquante. Les paramètres requis sont:

  • le nom de la scène

  • le nom de la bande de séquenceur

  • les valeurs utilisées pour écraser les valeurs des images clés existantes

    def modify_strip_keyframes (nom_scène, nom de bande, valeurs_image-clé = [1.0, 0.0]):

Obtenez la scène par son nom, mais renvoyez-la si elle n'existe pas.

    scene = bpy.data.scenes.get(scene_name)
    if scene == None:
        print("Scene not found.")
        return

Vérifiez qu'il existe animation_dataet a sequence_editor. S'il n'y a pas d'images clés ou de bandes, ces éléments le seront None. (L'appel des propriétés de Nonefera planter le script.)

    if (scene.animation_data == None or scene.sequence_editor == None):
        print("No strips with keyframes.")
        return
    

Obtenez la bande par nom et obtenez la fcurve associée à sa blend_alphapropriété (l'opacité).

    strip = scene.sequence_editor.sequences.get(strip_name)
    if strip == None:
        print("Strip not found.")
        return
    
    data_path = 'sequence_editor.sequences_all["' + strip_name + '"].blend_alpha'
    fcrv = scene.animation_data.action.fcurves.find(data_path)
    
    if fcrv == None:
        print("No opacity keyframes found.")
        return

Vérifiez qu'il y en a autant keyframe_pointssur la fcurve que les valeurs ont été fournies. Puis bouclez sur les points et attribuez les nouvelles valeurs aux keyframe_pointcoordonnées co.

    if len(fcrv.keyframe_points) != len(keyframe_values):
        print("The strip has " + str(len(fcrv.keyframe_points)) +
            " keys, but " + str(len(keyframe_values)) + " values were supplied.")
        return
    
    for i in range(len(fcrv.keyframe_points)):
        key = fcrv.keyframe_points[i]
        key.co.y = keyframe_values[i]
        key.handle_left.y = keyframe_values[i]
        key.handle_right.y = keyframe_values[i]
        key.handle_left.x = key.co.x
        key.handle_right.x = key.co.x
    

Pour exécuter la fonction, appelez-la et actualisez le séquenceur pour visualiser le changement.

modify_strip_keyframes("Scene", "cat", keyframe_values = [1, 0.5])
bpy.ops.sequencer.refresh_all()
6 batFINGER Aug 19 2020 at 17:17

Trouvez la fcurve en fonction de son chemin de données

La suggestion de basculer dans l'éditeur de graphiques et de regarder les courbes visibles dépendra des paramètres de l'éditeur de graphiques.

Au lieu de cela, créez le chemin de données qui contient des images clés et recherchez-le dans l'action fcurves.

Les animations de bande VSE appartiennent à l'objet scène.

Script ci-dessous

  • obtient la bande active

  • trouve le chemin de la bande active à partir de son objet ID, la scène, un exemple de bande de film active nommée "Foo"

     'sequence_editor.sequences_all["Foo"].blend_alpha'
    
  • Le recherche dans la collection d'actions de scène fcurve

Remarque: la plupart ou toutes les propriétés ci-dessus peuvent avoir une valeur, Noney compris l'éditeur de séquence, la bande active, les données d'animation et l'action. Aurait besoin de tester pour chacun.

import bpy
from bpy import context

scene = context.scene
seq = scene.sequence_editor
active_strip = seq.active_strip
datapath = active_strip.path_from_id("blend_alpha")
action = scene.animation_data.action

fc = action.fcurves.find(datapath)
1 Noname Aug 19 2020 at 16:52
#Assuming you are at VSE with your strip selected
context.area.type = 'GRAPH_EDITOR'
for fcurve in context.visible_fcurves:
    for keyframe in fcurve.keyframe_points:
        #Do w/e you want with the keyframe
        pass
#We switch back to VSE
context.area.type = 'SEQUENCE_EDITOR'

Mon idée fausse était que Graph> Keyframes. Alors que la réalité est Graph> FCurves> Keyframes.