Mercurial > code > home > repos > light9
annotate bin/subcomposer @ 450:f6ca2b2fa154
72 dimmers, split up house lights
author | drewp@bigasterisk.com |
---|---|
date | Sat, 14 Jun 2008 16:34:57 +0000 |
parents | cd75a12ad66d |
children | 9dd2baa41cca |
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 |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
5 from optparse import OptionParser |
0 | 6 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
|
7 try: |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
8 from dispatch import dispatcher |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
9 except ImportError: |
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
10 import louie as dispatcher |
0 | 11 |
209
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
12 import run_local |
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
13 from light9.dmxchanedit import Levelbox |
1a84c5e83d3e
dmxserver and subcomposer work in new layout
drewp@bigasterisk.com
parents:
201
diff
changeset
|
14 from light9 import dmxclient, Patch, Submaster |
0 | 15 |
16 class Subcomposer(tk.Frame): | |
450 | 17 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=72, |
149 | 18 use_persistentlevels=0): |
0 | 19 tk.Frame.__init__(self, master, bg='black') |
20 self.dmxdummy = dmxdummy | |
21 self.numchannels = numchannels | |
22 | |
351
a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
Drew Perttula <drewp@bigasterisk.com>
parents:
342
diff
changeset
|
23 self.levels = [0]*numchannels # levels should never get overwritten, just edited |
0 | 24 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
25 self.levelbox = Levelbox(self, num_channels=numchannels) |
0 | 26 self.levelbox.pack(side='top') |
27 # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is | |
28 # the 0 element) | |
29 self.levelbox.setlevels(self.levels) | |
30 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
31 self.savebox = EntryCommand(self, cmd=self.savenewsub) |
0 | 32 self.savebox.pack(side='top') |
33 | |
351
a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
Drew Perttula <drewp@bigasterisk.com>
parents:
342
diff
changeset
|
34 self.loadbox = EntryCommand(self, verb="Load", cmd=self.loadsub) |
0 | 35 self.loadbox.pack(side='top') |
36 | |
37 def alltozero(): | |
38 self.set_levels([0] * self.numchannels) | |
39 dispatcher.send("levelchanged") | |
40 | |
149 | 41 tk.Button(self, text="all to zero", command=alltozero).pack(side='top') |
0 | 42 |
43 dispatcher.connect(self.levelchanged,"levelchanged") | |
44 dispatcher.connect(self.sendupdate,"levelchanged") | |
45 | |
149 | 46 if use_persistentlevels: |
47 self.persistentlevels() | |
0 | 48 |
49 self.lastupdate=0 # time we last sent to dmx | |
50 | |
51 self.lastsent=[] # copy of levels | |
52 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
53 def fill_both_boxes(self, subname): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
54 for box in [self.savebox, self.loadbox]: |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
55 box.set(subname) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
56 |
0 | 57 def persistentlevels(self): |
58 """adjusts levels from subcomposer.savedlevels, if possible; and | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
59 arranges to save the levels in that file upon exit""" |
0 | 60 self.load_levels() |
61 atexit.register(self.save_levels) | |
62 def save_levels(self, *args): | |
63 levelfile = file("subcomposer.savedlevels","w") | |
64 levelfile.write(" ".join(map(str, self.levels))) | |
65 def load_levels(self): | |
66 try: | |
67 levelfile = file("subcomposer.savedlevels","r") | |
68 levels = map(float, levelfile.read().split()) | |
69 self.set_levels(levels) | |
70 except IOError: | |
71 pass | |
72 def levelchanged(self, channel=None, newlevel=None): | |
73 if channel is not None and newlevel is not None: | |
74 if channel>len(self.levels): | |
75 return | |
76 self.levels[channel-1]=max(0,min(1,float(newlevel))) | |
77 self.levelbox.setlevels(self.levels) | |
351
a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
Drew Perttula <drewp@bigasterisk.com>
parents:
342
diff
changeset
|
78 def savenewsub(self, subname): |
0 | 79 leveldict={} |
80 for i,lev in zip(range(len(self.levels)),self.levels): | |
81 if lev!=0: | |
82 leveldict[Patch.get_channel_name(i+1)]=lev | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
83 |
351
a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
Drew Perttula <drewp@bigasterisk.com>
parents:
342
diff
changeset
|
84 s=Submaster.Submaster(subname,leveldict=leveldict) |
0 | 85 s.save() |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
86 def loadsub(self, subname): |
0 | 87 """puts a sub into the levels, replacing old level values""" |
88 s=Submaster.Submasters().get_sub_by_name(subname) | |
380
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
89 self.set_levels(s.get_dmx_list()) |
0 | 90 dispatcher.send("levelchanged") |
91 def sendupdate(self): | |
92 if not self.dmxdummy: | |
93 dmxclient.outputlevels(self.levels) | |
94 self.lastupdate = time.time() | |
95 self.lastsent = self.levels[:] | |
96 def considersendupdate(self, use_after_loop=0): | |
97 """If use_after_loop is true, it is the period of the after loop.""" | |
98 if self.lastsent != self.levels or time.time() > self.lastupdate + 1: | |
99 self.sendupdate() | |
100 if use_after_loop: | |
101 self.after(use_after_loop, self.considersendupdate, use_after_loop) | |
102 def set_levels(self, levels): | |
380
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
103 oldLen = len(self.levels) |
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
104 self.levels[:] = levels + [0] * (oldLen - len(levels)) |
0 | 105 dispatcher.send("levelchanged") |
106 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
107 class EntryCommand(tk.Frame): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
108 def __init__(self, master, verb="Save", cmd=None): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
109 tk.Frame.__init__(self, master, bd=2, relief='raised') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
110 tk.Label(self, text="Sub name:").pack(side='left') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
111 self.cmd = cmd |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
112 self.entry = tk.Entry(self) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
113 self.entry.pack(side='left', expand=True, fill='x') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
114 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
115 self.entry.bind("<Return>", self.action) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
116 tk.Button(self, text=verb, command=self.action).pack(side='left') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
117 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
118 def action(self, *args): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
119 subname = self.entry.get() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
120 self.cmd(subname) |
351
a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
Drew Perttula <drewp@bigasterisk.com>
parents:
342
diff
changeset
|
121 print "sub", self.cmd, subname |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
122 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
123 def set(self, text): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
124 self.entry.delete(0, 'end') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
125 self.entry.insert(0, text) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
126 |
149 | 127 |
128 def open_sub_editing_window(subname, use_mainloop=1, dmxdummy=0): | |
129 if use_mainloop: | |
130 toplevel = tk.Tk() | |
131 else: | |
132 toplevel = tk.Toplevel() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
133 if dmxdummy: |
149 | 134 dummy_str = ' (dummy)' |
135 else: | |
136 dummy_str = '' | |
137 toplevel.title("Subcomposer: %s%s" % (subname, dummy_str)) | |
138 sc = Subcomposer(toplevel, use_persistentlevels=0, dmxdummy=dmxdummy) | |
139 sc.pack(fill='both', expand=1) | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
140 sc.loadsub(subname) |
149 | 141 sc.considersendupdate(use_after_loop=10) |
142 if use_mainloop: | |
143 tk.mainloop() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
144 |
0 | 145 ############################# |
146 | |
147 if __name__ == "__main__": | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
148 parser = OptionParser(usage="%prog [subname]") |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
149 opts, args = parser.parse_args() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
150 |
0 | 151 root=tk.Tk() |
152 root.config(bg='black') | |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
153 root.wm_title("subcomposer") |
147 | 154 root.tk_setPalette("#004633") |
0 | 155 |
401 | 156 sc = Subcomposer(root, dmxdummy=0, |
426
cd75a12ad66d
adjust dmx dimmer count back to PHS theater levels
drewp@bigasterisk.com
parents:
401
diff
changeset
|
157 #numchannels=276 # use this to see all the skyline dims |
401 | 158 #numchannels=118 |
159 ) | |
0 | 160 sc.pack() |
161 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
162 tk.Label(root,text="Bindings: B1 adjust level; B2 set full; B3 instant bump", |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
163 font="Helvetica -12 italic",anchor='w').pack(side='top',fill='x') |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
164 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
165 if len(args) == 1: |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
166 sc.loadsub(args[0]) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
167 sc.fill_both_boxes(args[0]) |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
168 |
0 | 169 while 1: |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
170 root.update() |
0 | 171 sc.considersendupdate() |
172 time.sleep(.01) |