Python'da seçilen şerit için tüm ana kareler nasıl alınır?
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
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_path
Aktif ş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_points
F 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_data
Ve a olduğunu doğrulayın sequence_editor
. Anahtar kare yoksa veya şerit yoksa, bu öğeler olacaktır None
. (Özelliklerinin çağrılması None
komut 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_points
Değerlerin sağlandığı kadar fcurve'de olduğunu doğrulayın . Ardından noktaların üzerinden dönün ve yeni değerleri keyframe_point
koordinatlara 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()
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)
#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.