import bpy
import os
import os.path
import re
def build_directory_dictionary(scn):
"""
:param scn:
:return: a dictionary mapping from image sequence directory to the strip that references the directory
"""
rval = {}
for strip in scn.sequence_editor.sequences_all:
if strip.type == 'IMAGE':
rval[strip.directory] = strip
return rval
def end_of_channel(channel, scn):
"""
:param channel:
:param scn:
:return: the frame number after the last strip in channel
"""
rval = 1
for strip in scn.sequence_editor.sequences:
if channel != strip.channel:
continue # it is in a different channel, skip it
t = strip.frame_start + strip.frame_final_duration
print("%s in %d ends %d"%(strip.name, strip.channel, t))
if (t>rval):
rval = t
return rval
def make_strip_from(dirname, pngs, scn):
name = os.path.basename(dirname)
channel = 3
t = end_of_channel(channel, scn)
# make a beginning still to give the viewer's eyeballs a break.
strip0 = scn.sequence_editor.sequences.new_image(name+" pre", os.path.join(dirname, pngs[0]), channel, t)
strip0.frame_final_duration = scn.render.fps
t = t + strip0.frame_final_duration
# now we go into the animation
strip = scn.sequence_editor.sequences.new_image(name, os.path.join(dirname, pngs[0]), channel, t)
for str in pngs[1:]:
strip.elements.append(str)
t = t + strip.frame_final_duration
# and finish by holding on the final image.
strip9 =scn.sequence_editor.sequences.new_image(name+" post", os.path.join(dirname, pngs[-1]), channel, t)
strip9.frame_final_duration = scn.render.fps
# I hate bpy.ops. It requires me to futz with editor state
for s2 in scn.sequence_editor.sequences_all:
s2.select = False
strip0.select = True
strip.select = True
strip9.select = True
bpy.ops.sequencer.meta_make()
meta = scn.sequence_editor.active_strip
meta.name = name
# strip.update()
def make_strip_for(dirname, scn):
"""
if dirname has some blender rendered PNGs in it, make an image strip from them
:param dirname:
:param scn:
:return:
"""
rx = re.compile(r"^\d{4}\.png$")
pngs = []
for name in os.listdir(dirname):
if re.search(rx, name) is None:
continue
pngs.append(name)
print("%s [%d]"%(dirname, len(pngs)))
if 1> len(pngs):
return # nothing to build a strip from
pngs.sort()
make_strip_from(dirname, pngs, scn)
def make_strips_for_all_in(dirname, scn, preexisting=None, predicate = lambda name: True):
"""iterate through all the subdirectories of dirname
and make VSE strips for them if we don't have them in the scene already
"""
if preexisting is None:
preexisting = build_directory_dictionary(scn)
for name in os.listdir(dirname):
full = os.path.join(dirname, name)
if preexisting.get(full+"/") is None:
print("no strip for %s"%full)
if (os.path.isdir(full)):
make_strip_for(full, scn)
#
|
Blender python API quick-start
Syntax highlighting by Pygments.