mesh fabrication

fabricating other objects

material slots

animation and fcurves

incorporating python libraries


shape keys

animating curve bevel


UV layers



video sequence editor (VSE)

images and textures

analytic geometry

node trees


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
    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 !=
            continue # it is in a different channel, skip it
        t = strip.frame_start + strip.frame_final_duration
        print("%s in %d ends %d"%(,, 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:]:

    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: = False = True = True = True


    meta = scn.sequence_editor.active_strip = 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:
    rx = re.compile(r"^\d{4}\.png$")
    pngs = []
    for name in os.listdir(dirname):
        if, name) is None:
    print("%s [%d]"%(dirname, len(pngs)))
    if 1> len(pngs):
        return # nothing to build a strip from

    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.