Mercurial > code > home > repos > light9
annotate bin/subcomposer @ 334:42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
author | drewp@bigasterisk.com |
---|---|
date | Mon, 02 Apr 2007 14:34:14 +0000 |
parents | 9827df597f86 |
children | 2c782ca93e73 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 | |
3 from __future__ import division, nested_scopes | |
209
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
4 import sys,os,time,atexit |
0 | 5 import Tkinter as tk |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
6 try: |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
7 from dispatch import dispatcher |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
8 except ImportError: |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
9 import louie as dispatcher |
0 | 10 |
209
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
11 import run_local |
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
12 from light9.dmxchanedit import Levelbox |
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
13 from light9 import dmxclient, Patch, Submaster |
0 | 14 |
15 class Subcomposer(tk.Frame): | |
149 | 16 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=68, |
17 use_persistentlevels=0): | |
0 | 18 tk.Frame.__init__(self, master, bg='black') |
19 self.dmxdummy = dmxdummy | |
20 self.numchannels = numchannels | |
21 | |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
22 self.levels = [0]*512 # levels should never get overwritten, just edited |
0 | 23 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
24 self.levelbox = Levelbox(self, num_channels=numchannels) |
0 | 25 self.levelbox.pack(side='top') |
26 # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is | |
27 # the 0 element) | |
28 self.levelbox.setlevels(self.levels) | |
29 | |
30 self.savebox = Savebox(self, self.levels, cmd=self.savenewsub) | |
31 self.savebox.pack(side='top') | |
32 | |
33 self.loadbox = Savebox(self, self.levels, verb="Load", cmd=self.loadsub) | |
34 self.loadbox.pack(side='top') | |
35 | |
36 def alltozero(): | |
37 self.set_levels([0] * self.numchannels) | |
38 dispatcher.send("levelchanged") | |
39 | |
149 | 40 tk.Button(self, text="all to zero", command=alltozero).pack(side='top') |
0 | 41 |
42 dispatcher.connect(self.levelchanged,"levelchanged") | |
43 dispatcher.connect(self.sendupdate,"levelchanged") | |
44 | |
149 | 45 if use_persistentlevels: |
46 self.persistentlevels() | |
0 | 47 |
48 self.lastupdate=0 # time we last sent to dmx | |
49 | |
50 self.lastsent=[] # copy of levels | |
51 | |
52 def persistentlevels(self): | |
53 """adjusts levels from subcomposer.savedlevels, if possible; and | |
54 arranges to save the levels in that file upon exit""" | |
55 self.load_levels() | |
56 atexit.register(self.save_levels) | |
57 def save_levels(self, *args): | |
58 levelfile = file("subcomposer.savedlevels","w") | |
59 levelfile.write(" ".join(map(str, self.levels))) | |
60 def load_levels(self): | |
61 try: | |
62 levelfile = file("subcomposer.savedlevels","r") | |
63 levels = map(float, levelfile.read().split()) | |
64 self.set_levels(levels) | |
65 except IOError: | |
66 pass | |
67 def levelchanged(self, channel=None, newlevel=None): | |
68 if channel is not None and newlevel is not None: | |
69 if channel>len(self.levels): | |
70 return | |
71 self.levels[channel-1]=max(0,min(1,float(newlevel))) | |
72 self.levelbox.setlevels(self.levels) | |
173 | 73 def savenewsub(self, levels, subname): |
0 | 74 leveldict={} |
75 for i,lev in zip(range(len(self.levels)),self.levels): | |
76 if lev!=0: | |
77 leveldict[Patch.get_channel_name(i+1)]=lev | |
78 | |
79 s=Submaster.Submaster(subname,leveldict) | |
80 s.save() | |
173 | 81 def loadsub(self, levels, subname): |
0 | 82 """puts a sub into the levels, replacing old level values""" |
83 s=Submaster.Submasters().get_sub_by_name(subname) | |
84 self.levels[:]=[0]*68 | |
85 self.levels[:]=s.get_dmx_list() | |
86 dispatcher.send("levelchanged") | |
87 def sendupdate(self): | |
88 if not self.dmxdummy: | |
89 dmxclient.outputlevels(self.levels) | |
90 self.lastupdate = time.time() | |
91 self.lastsent = self.levels[:] | |
92 def considersendupdate(self, use_after_loop=0): | |
93 """If use_after_loop is true, it is the period of the after loop.""" | |
94 if self.lastsent != self.levels or time.time() > self.lastupdate + 1: | |
95 self.sendupdate() | |
96 if use_after_loop: | |
97 self.after(use_after_loop, self.considersendupdate, use_after_loop) | |
98 def set_levels(self, levels): | |
99 self.levels[:] = levels | |
100 dispatcher.send("levelchanged") | |
101 | |
102 def Savebox(master, levels, verb="Save", cmd=None): | |
103 f=tk.Frame(master,bd=2,relief='raised') | |
149 | 104 tk.Label(f,text="Sub name:").pack(side='left') |
105 e=tk.Entry(f) | |
0 | 106 e.pack(side='left',exp=1,fill='x') |
107 def cb(*args): | |
108 subname=e.get() | |
109 cmd(levels,subname) | |
110 print "sub",verb,subname | |
111 e.bind("<Return>",cb) | |
149 | 112 tk.Button(f,text=verb,command=cb).pack(side='left') |
0 | 113 return f |
149 | 114 |
115 def open_sub_editing_window(subname, use_mainloop=1, dmxdummy=0): | |
116 if use_mainloop: | |
117 toplevel = tk.Tk() | |
118 else: | |
119 toplevel = tk.Toplevel() | |
120 if dmxdummy: | |
121 dummy_str = ' (dummy)' | |
122 else: | |
123 dummy_str = '' | |
124 toplevel.title("Subcomposer: %s%s" % (subname, dummy_str)) | |
125 sc = Subcomposer(toplevel, use_persistentlevels=0, dmxdummy=dmxdummy) | |
126 sc.pack(fill='both', expand=1) | |
173 | 127 sc.loadsub(None, subname) # don't ask |
149 | 128 sc.considersendupdate(use_after_loop=10) |
129 if use_mainloop: | |
130 tk.mainloop() | |
0 | 131 |
132 ############################# | |
133 | |
134 if __name__ == "__main__": | |
135 root=tk.Tk() | |
136 root.config(bg='black') | |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
137 root.wm_title("subcomposer") |
147 | 138 root.tk_setPalette("#004633") |
0 | 139 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
140 sc = Subcomposer(root, dmxdummy=0, numchannels=276) |
0 | 141 sc.pack() |
142 | |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
143 tk.Label(root,text="Bindings: B1 adjust level; B3 instant bump", |
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
144 font="Helvetica -12 italic",anchor='w').pack(side='top',fill='x') |
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
145 |
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
146 |
0 | 147 while 1: |
148 if 0: | |
149 for i in range(20): # don't let Tk take all the time | |
150 tk._tkinter.dooneevent() | |
151 print "loop" | |
152 else: | |
153 root.update() | |
154 | |
155 sc.considersendupdate() | |
156 time.sleep(.01) |