annotate flax/Subcomposer.py @ 124:8de8a2f467db

The "T" function now creates TimedEvents with LinearBlenders for you The "T" function now creates TimedEvents with LinearBlenders for you (using the same LinearBlender). Thus, we don't need to specify linear anymore. The timeline seek bar was reading the length of track1 instead of the whole timeline. This is fixed.
author dmcc
date Fri, 13 Jun 2003 15:55:54 +0000
parents 45b12307c695
children f433e95f2e42
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 #!/usr/bin/python
45b12307c695 Initial revision
drewp
parents:
diff changeset
2
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 from __future__ import division, nested_scopes
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 import Tkinter as tk
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 from dmxchanedit import Levelbox
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 import sys,os,time,atexit
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 sys.path.append("../light8")
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 import dmxclient
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 import Patch
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 import Submaster
45b12307c695 Initial revision
drewp
parents:
diff changeset
11
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 from dispatch import dispatcher
45b12307c695 Initial revision
drewp
parents:
diff changeset
13
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 class Subcomposer(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=68,
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 use_persistentlevels=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 tk.Frame.__init__(self, master, bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 self.dmxdummy = dmxdummy
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 self.numchannels = numchannels
45b12307c695 Initial revision
drewp
parents:
diff changeset
20
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 self.levels = [0]*68 # levels should never get overwritten, just edited
45b12307c695 Initial revision
drewp
parents:
diff changeset
22
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 self.levelbox = Levelbox(self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 self.levelbox.pack(side='top')
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 # the 0 element)
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 self.levelbox.setlevels(self.levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 self.savebox = Savebox(self, self.levels, cmd=self.savenewsub)
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 self.savebox.pack(side='top')
45b12307c695 Initial revision
drewp
parents:
diff changeset
31
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 self.loadbox = Savebox(self, self.levels, verb="Load", cmd=self.loadsub)
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 self.loadbox.pack(side='top')
45b12307c695 Initial revision
drewp
parents:
diff changeset
34
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 def alltozero():
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 self.set_levels([0] * self.numchannels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 dispatcher.send("levelchanged")
45b12307c695 Initial revision
drewp
parents:
diff changeset
38
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 tk.Button(self, text="all to zero", command=alltozero).pack(side='top')
45b12307c695 Initial revision
drewp
parents:
diff changeset
40
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 dispatcher.connect(self.levelchanged,"levelchanged")
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 dispatcher.connect(self.sendupdate,"levelchanged")
45b12307c695 Initial revision
drewp
parents:
diff changeset
43
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 if use_persistentlevels:
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 self.persistentlevels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
46
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 self.lastupdate=0 # time we last sent to dmx
45b12307c695 Initial revision
drewp
parents:
diff changeset
48
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 self.lastsent=[] # copy of levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
50
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 def persistentlevels(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 """adjusts levels from subcomposer.savedlevels, if possible; and
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 arranges to save the levels in that file upon exit"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 self.load_levels()
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 atexit.register(self.save_levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 def save_levels(self, *args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 levelfile = file("subcomposer.savedlevels","w")
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 levelfile.write(" ".join(map(str, self.levels)))
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 def load_levels(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 levelfile = file("subcomposer.savedlevels","r")
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 levels = map(float, levelfile.read().split())
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 self.set_levels(levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 except IOError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 def levelchanged(self, channel=None, newlevel=None):
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 if channel is not None and newlevel is not None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 if channel>len(self.levels):
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 self.levels[channel-1]=max(0,min(1,float(newlevel)))
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 self.levelbox.setlevels(self.levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 def savenewsub(self, levels, subname):
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 leveldict={}
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 for i,lev in zip(range(len(self.levels)),self.levels):
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 if lev!=0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 leveldict[Patch.get_channel_name(i+1)]=lev
45b12307c695 Initial revision
drewp
parents:
diff changeset
77
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 s=Submaster.Submaster(subname,leveldict)
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 s.save()
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 def loadsub(self, levels, subname):
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 """puts a sub into the levels, replacing old level values"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 s=Submaster.Submasters().get_sub_by_name(subname)
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 self.levels[:]=[0]*68
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 self.levels[:]=s.get_dmx_list()
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 dispatcher.send("levelchanged")
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 def sendupdate(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 if not self.dmxdummy:
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 dmxclient.outputlevels(self.levels)
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 self.lastupdate = time.time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 self.lastsent = self.levels[:]
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 def considersendupdate(self, use_after_loop=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 """If use_after_loop is true, it is the period of the after loop."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 if self.lastsent != self.levels or time.time() > self.lastupdate + 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 self.sendupdate()
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 if use_after_loop:
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 self.after(use_after_loop, self.considersendupdate, use_after_loop)
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 def set_levels(self, levels):
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 self.levels[:] = levels
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 dispatcher.send("levelchanged")
45b12307c695 Initial revision
drewp
parents:
diff changeset
100
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 def Savebox(master, levels, verb="Save", cmd=None):
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 f=tk.Frame(master,bd=2,relief='raised')
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 tk.Label(f,text="Sub name:").pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 e=tk.Entry(f)
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 e.pack(side='left',exp=1,fill='x')
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 def cb(*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 subname=e.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 cmd(levels,subname)
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 print "sub",verb,subname
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 e.bind("<Return>",cb)
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 tk.Button(f,text=verb,command=cb).pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 return f
45b12307c695 Initial revision
drewp
parents:
diff changeset
113
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 def open_sub_editing_window(subname, use_mainloop=1, dmxdummy=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 if use_mainloop:
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 toplevel = tk.Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 toplevel = tk.Toplevel()
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 if dmxdummy:
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 dummy_str = ' (dummy)'
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 dummy_str = ''
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 toplevel.title("Subcomposer: %s%s" % (subname, dummy_str))
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 sc = Subcomposer(toplevel, use_persistentlevels=0, dmxdummy=dmxdummy)
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 sc.pack(fill='both', expand=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 sc.loadsub(None, subname) # don't ask
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 sc.considersendupdate(use_after_loop=10)
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 if use_mainloop:
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 tk.mainloop()
45b12307c695 Initial revision
drewp
parents:
diff changeset
130
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 #############################
45b12307c695 Initial revision
drewp
parents:
diff changeset
132
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 if __name__ == "__main__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 root=tk.Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 root.config(bg='black')
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 root.tk_setPalette("#004633")
45b12307c695 Initial revision
drewp
parents:
diff changeset
137
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 sc = Subcomposer(root, dmxdummy=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 sc.pack()
45b12307c695 Initial revision
drewp
parents:
diff changeset
140
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 while 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 if 0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 for i in range(20): # don't let Tk take all the time
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 tk._tkinter.dooneevent()
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 print "loop"
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 root.update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
148
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 sc.considersendupdate()
45b12307c695 Initial revision
drewp
parents:
diff changeset
150 time.sleep(.01)