Changeset - 304152488ed7
[Not reviewed]
default
0 3 0
dmcc - 22 years ago 2003-06-14 16:01:31

Timeline: new methods to make editing easier
Timeline: new methods to make editing easier
Submaster: fix level-clobbering bug, skip CVS files, better __repr__
KeyboardClient: tiny cleanups
3 files changed with 50 insertions and 11 deletions:
0 comments (0 inline, 0 general)
flax/KeyboardComposer.py
Show inline comments
 
@@ -188,9 +188,9 @@ class KeyboardComposer(Frame):
 
            self.send_levels()
 
            self.after(10, self.send_frequent_updates)
 
    def send_levels(self):
 
        print self.submasters.get_sub_by_name('frontwhite')
 
        levels = self.get_dmx_list()
 
        dmxclient.outputlevels(levels)
 
        # dmxclient.outputlevels(levels)
 
        # print "sending levels", levels
 
    def send_levels_loop(self):
 
        self.send_levels()
 
        self.after(1000, self.send_levels_loop)
flax/Submaster.py
Show inline comments
 
@@ -57,15 +57,20 @@ class Submaster:
 
    def max(self, *othersubs):
 
        return sub_maxes(self, *othersubs)
 
    def __repr__(self):
 
        return "<%s: %r>" % (self.name, self.levels)
 
        levels = ' '.join(["%s:%.2f" % item for item in self.levels.items()])
 
        return "<'%s': [%s]>" % (self.name, levels)
 
    def get_dmx_list(self):
 
        leveldict = self.get_levels() # gets levels of sub contents
 

	
 
        levels = [0] * 68
 
        for k, v in leveldict.items():
 
            levels[Patch.get_dmx_channel(k) - 1] = v
 
            dmxchan = Patch.get_dmx_channel(k) - 1
 
            levels[dmxchan] = max(v, levels[dmxchan])
 

	
 
        return levels
 
    def normalize_patch_names(self):
 
        # possibly busted -- don't use unless you know what you're doing
 
        self.set_all_levels(self.levels.copy())
 

	
 
def sub_maxes(*subs):
 
    return Submaster("max(%r)" % (subs,),
 
@@ -80,7 +85,9 @@ class Submasters:
 
        files = os.listdir('subs')
 

	
 
        for filename in files:
 
            if filename.startswith('.') or filename.endswith('~'):
 
            # we don't want these files
 
            if filename.startswith('.') or filename.endswith('~') or \
 
               filename.startswith('CVS'):
 
                continue
 
            self.submasters[filename] = Submaster(filename)
 
    def get_all_subs(self):
 
@@ -94,6 +101,10 @@ class Submasters:
 
if __name__ == "__main__":
 
    Patch.reload_data()
 
    s = Submasters()
 
    newsub = s['newsub']
 
    newsub.set_all_levels({'5' : 1, '7': 0.2})
 
    print s.get_all_subs()
 
    if 0: # turn this on to normalize all subs
 
        for sub in s.get_all_subs():
 
            print "before", sub
 
            sub.normalize_patch_names()
 
            sub.save()
 
            print "after", sub
flax/Timeline.py
Show inline comments
 
@@ -137,7 +137,7 @@ class SmoothBlender(Blender):
 
class Strobe(Blender):
 
    "Strobes the frame on the right side between offlevel and onlevel."
 
    def __init__(self, ontime, offtime, onlevel=1, offlevel=0):
 
        "times are in seconds"
 
        "times are in seconds (floats)"
 
        make_attributes_from_args('ontime', 'offtime', 'onlevel', 'offlevel')
 
        self.cycletime = ontime + offtime
 
    def __call__(self, startframe, endframe, blendtime, time_since_startframe):
 
@@ -159,10 +159,38 @@ class TimelineTrack:
 
        else:
 
            self.default_frame = None
 
        self.name = name
 
        self.events = list(timedevents)
 
        self.set_events(list(timedevents))
 
    def set_events(self, events):
 
        """This is given a list of TimedEvents.  They need not be sorted."""
 
        self.events = events
 
        self._cleaup_events()
 
    def _cleaup_events(self):
 
        """This makes sure all events are in the right order and have defaults
 
        filled in if they have missing frames."""
 
        self.events.sort()
 
        self.fill_in_missing_subs()
 
    def fill_in_missing_subs(self):
 
        self.fill_in_missing frames()
 
    def add_event(self, event):
 
        """Add a TimedEvent object to this TimelineTrack"""
 
        self.events.append(event)
 
        self._cleaup_events(self.events)
 
    def delete_event(self, event):
 
        """Delete event by TimedEvent object"""
 
        self.events.remove(event)
 
        self._cleaup_events(self.events)
 
    def delete_event_by_name(self, name):
 
        """Deletes all events matching a certain name"""
 
        self.events = [e for e in self.events if e.name is not name]
 
        self._cleaup_events(self.events)
 
    def delete_event_by_time(self, starttime, endtime=None):
 
        """Deletes all events within a certain time range, inclusive.  endtime
 
        is optional."""
 
        endtime = endtime or starttime
 
        self.events = [e for e in self.events
 
            if e.time >= starttime and e.time <= endtime]
 
        self._cleaup_events(self.events)
 
    def fill_in_missing frames(self):
 
        """Runs through all events and sets TimedEvent with missing frames to
 
        the default frame."""
 
        for event in self.events:
 
            if event.frame == MISSING:
 
                event.frame = self.default_frame
0 comments (0 inline, 0 general)