Python'da seçilen şerit için tüm ana kareler nasıl alınır?

Aug 19 2020

VSE'de bir görüntü şeridimiz olduğunu ve opaklığı için 2 anahtar karesi olduğunu varsayalım. Her birinin değerlerini python ile nasıl düzenleyebilirim?

Yanıtlar

6 Leander Aug 19 2020 at 17:02

Blender'ın verilerine erişmek için bpy modülünü içe aktarın.

import bpy

Bağlam Yöntemi

Anahtar kareleri yeni oluşturduysanız ve metin düzenleyicide komut dosyası yazıyorsanız, nesneleri bağlama göre arayabilirsiniz. Şeridin iki ana kareye sahip olduğundan ve sıralayıcıda seçili (aktif) olduğundan emin olmanız gerekir.

Etkin sahneyi bağlama göre alın.

scene = bpy.context.scene

Etkin sıralayıcı şeridini bağlama göre alın.

strip = scene.sequence_editor.active_strip

data_pathAktif şeridin adı ve özelliği ile bağlantılı eğriyi arayın . ( BatFINGER'ın veri yolunu nasıl daha zarif bir şekilde oluşturacağına dair yanıtına bakın 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)

keyframe_pointsF eğrisinde saklanan bazı değerleri atayın .

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

Sıralayıcıyı yenilemeye zorlayın.

bpy.ops.sequencer.refresh_all()

Veri Yöntemi

Bu işlevi bir eklentiden kullanmaya çalışıyorsanız veya etkin bir şeridin seçilip seçilmediğinden emin değilseniz veya anahtar kareler mevcut olsa bile, verileri doğrulamanız gerekir.

Kod parçacığını github'dan görüntüleyin.

Bir ön koşul eksikse, iptal edilebilecek bir yöntemde işlevselliği kapsülleyin. Gerekli parametreler şunlardır:

  • sahnenin adı

  • sıralayıcı şeridin adı

  • mevcut anahtar kare değerlerinin üzerine yazmak için kullanılan değerler

    def modify_strip_keyframes (sahne_adı, şerit_adı, anahtar kare_değerleri = [1.0, 0.0]):

Sahneyi ismiyle alın, ancak yoksa geri dönün.

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

animation_dataVe a olduğunu doğrulayın sequence_editor. Anahtar kare yoksa veya şerit yoksa, bu öğeler olacaktır None. (Özelliklerinin çağrılması Nonekomut dosyasını çökertecektir.)

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

Şeridi isme göre alın ve onun blend_alpha(opaklık) özelliğiyle ilişkilendirilen eğriyi alın .

    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

keyframe_pointsDeğerlerin sağlandığı kadar fcurve'de olduğunu doğrulayın . Ardından noktaların üzerinden dönün ve yeni değerleri keyframe_pointkoordinatlara atayın 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
    

İşlevi yürütmek için, onu çağırın ve değişikliği görselleştirmek için sıralayıcıyı yenileyin.

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

Veri yoluna göre fcurve'yi bulun

Grafik düzenleyiciye geçme ve görünür eğrilere bakma önerisi, grafik düzenleyici ayarlarına bağlı olacaktır.

Bunun yerine, anahtar kareye sahip veri yolunu oluşturun ve bunu eylem fcurves içinde arayın.

VSE şerit animasyonları sahne nesnesine aittir.

Aşağıdaki komut dosyası

  • aktif şeridi alır

  • Etkin şeridin yolunu ID nesnesinden, sahneden, "Foo" adlı etkin film şeridi örneğinden bulur

     'sequence_editor.sequences_all["Foo"].blend_alpha'
    
  • Bunu sahne eylemleri fcurve koleksiyonu içinde arar

Not: Yukarıdaki özelliklerin çoğu veya tümü None, sıra düzenleyici, etkin şerit, animasyon verileri ve eylem dahil değere sahip olabilir . Her biri için test etmeniz gerekir.

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'

Yanlış anlamam Grafik> Anahtar Kareler idi. Gerçek şu ki Grafik> FCurves> Anahtar Kareler.