changeset 138:304152488ed7

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
author dmcc
date Sat, 14 Jun 2003 16:01:31 +0000
parents 7d768d04b9f0
children 83e2c4ceb79a
files flax/KeyboardComposer.py flax/Submaster.py flax/Timeline.py
diffstat 3 files changed, 50 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/flax/KeyboardComposer.py	Sat Jun 14 15:11:10 2003 +0000
+++ b/flax/KeyboardComposer.py	Sat Jun 14 16:01:31 2003 +0000
@@ -188,9 +188,9 @@
             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)
--- a/flax/Submaster.py	Sat Jun 14 15:11:10 2003 +0000
+++ b/flax/Submaster.py	Sat Jun 14 16:01:31 2003 +0000
@@ -57,15 +57,20 @@
     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 @@
         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 @@
 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
--- a/flax/Timeline.py	Sat Jun 14 15:11:10 2003 +0000
+++ b/flax/Timeline.py	Sat Jun 14 16:01:31 2003 +0000
@@ -137,7 +137,7 @@
 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 @@
         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