Files @ b7a3dff5514d
Branch filter:

Location: light9/flax/Show.py

drewp@bigasterisk.com
rough and untested port of asco from jquery to vanilla
from Timeline import *
from Submaster import Submasters, sub_maxes

class Show:
    def __init__(self, timelines, submasters):
        self.timelines = dict([(timeline.name, timeline)
            for timeline in timelines])
        self.submasters = submasters
        self.current_timeline = None
        self.current_time = 0
    def calc_active_submaster(self):
        "get levels from the current timeline at the current time"
        if not (self.current_timeline or self.current_time):
            return {}
        tl = self.current_timeline
        tl.set_time(self.current_time)
        levels = tl.get_levels()
        scaledsubs = [self.submasters.get_sub_by_name(sub) * level \
            for sub, level in levels.items()]
        maxes = sub_maxes(*scaledsubs)

        return maxes
    def set_timeline(self, name):
        "select a timeline"
        self.current_timeline = self.timelines.get(name)
        if not self.current_timeline:
            print "Show: '%s' is not the name of a timeline." % name
        else:
            self.set_time(0)
    def set_time(self, time):
        "set time of current timeline"
        self.current_time = time
        if not self.current_timeline:
            return
        self.current_timeline.set_time(time)
    def get_timelines(self):
        "Get names of all timelines"
        return self.timelines.keys()

# this is the default blender
linear = LinearBlender()
def T(time, level, **kw):
    """This used to be a synonym for TimedEvent:

    T = TimedEvent

    It now acts in a similar way, except that it will fill in a default 
    blender if you don't.  The default blender is a LinearBlender.  It also
    sets frame to MISSING so the track can fill it in."""
    if 'blender' not in kw:
        global linear
        kw['blender'] = linear

    return TimedEvent(time, level=level, frame=MISSING, **kw)

def translate_tracks_from_file(timelinename):
    try:
        f = open('timelines/' + timelinename)
    except IOError:
        return []

    events = {}
    current_sub = None
    current_time = None
    lines = f.readlines()
    alltext = ' '.join(lines)

    for token in alltext.split():
        # print 't', token
        if token.endswith(':'):
            # print 'sub'
            current_sub = token[:-1]
            current_time = None
        else:
            if not current_sub:
                raise "invalid file format", line
            if current_time is not None: # we now have a level
                # print 'level'
                try:
                    level = float(token)
                except:
                    print "bad level token", token
                    level = 0
                # time to write
                events.setdefault(current_sub, [])
                events[current_sub].append((current_time, level))
                current_time = None
            else:
                # print 'time'
                try:
                    current_time = float(token)
                except ValueError:
                    print "bad time token", token
                    current_time = 0

    tracks = []
    for sub, timelevels in events.items():
        tracks.append(TimelineTrack(sub, default_frame=sub,
            *[T(time, level) for time, level in timelevels]))

    return tracks