Mercurial > code > home > repos > light9
annotate bin/subcomposer @ 577:7ecde61ebff1
fix SC loading
Ignore-this: 8131e2e09b1561ad042f82d81a5ccfc9
author | drewp@bigasterisk.com |
---|---|
date | Sat, 19 Jun 2010 23:17:47 +0000 |
parents | 4e558643c952 |
children | b5efddd80dad |
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 |
577 | 14 from light9 import dmxclient, Patch, Submaster, showconfig |
455
9dd2baa41cca
subcomposer remembers window position
drewp@bigasterisk.com
parents:
450
diff
changeset
|
15 from light9.uihelpers import toplevelat |
0 | 16 |
17 class Subcomposer(tk.Frame): | |
450 | 18 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=72, |
149 | 19 use_persistentlevels=0): |
0 | 20 tk.Frame.__init__(self, master, bg='black') |
21 self.dmxdummy = dmxdummy | |
22 self.numchannels = numchannels | |
23 | |
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
|
24 self.levels = [0]*numchannels # levels should never get overwritten, just edited |
0 | 25 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
26 self.levelbox = Levelbox(self, num_channels=numchannels) |
0 | 27 self.levelbox.pack(side='top') |
28 # the dmx levels we edit and output, range is 0..1 (dmx chan 1 is | |
29 # the 0 element) | |
30 self.levelbox.setlevels(self.levels) | |
31 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
32 self.savebox = EntryCommand(self, cmd=self.savenewsub) |
0 | 33 self.savebox.pack(side='top') |
34 | |
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
|
35 self.loadbox = EntryCommand(self, verb="Load", cmd=self.loadsub) |
0 | 36 self.loadbox.pack(side='top') |
37 | |
38 def alltozero(): | |
39 self.set_levels([0] * self.numchannels) | |
40 dispatcher.send("levelchanged") | |
41 | |
149 | 42 tk.Button(self, text="all to zero", command=alltozero).pack(side='top') |
0 | 43 |
44 dispatcher.connect(self.levelchanged,"levelchanged") | |
45 dispatcher.connect(self.sendupdate,"levelchanged") | |
46 | |
149 | 47 if use_persistentlevels: |
48 self.persistentlevels() | |
0 | 49 |
50 self.lastupdate=0 # time we last sent to dmx | |
51 | |
52 self.lastsent=[] # copy of levels | |
53 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
54 def fill_both_boxes(self, subname): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
55 for box in [self.savebox, self.loadbox]: |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
56 box.set(subname) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
57 |
0 | 58 def persistentlevels(self): |
59 """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
|
60 arranges to save the levels in that file upon exit""" |
0 | 61 self.load_levels() |
62 atexit.register(self.save_levels) | |
63 def save_levels(self, *args): | |
64 levelfile = file("subcomposer.savedlevels","w") | |
65 levelfile.write(" ".join(map(str, self.levels))) | |
66 def load_levels(self): | |
67 try: | |
68 levelfile = file("subcomposer.savedlevels","r") | |
69 levels = map(float, levelfile.read().split()) | |
70 self.set_levels(levels) | |
71 except IOError: | |
72 pass | |
73 def levelchanged(self, channel=None, newlevel=None): | |
74 if channel is not None and newlevel is not None: | |
75 if channel>len(self.levels): | |
76 return | |
77 self.levels[channel-1]=max(0,min(1,float(newlevel))) | |
78 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
|
79 def savenewsub(self, subname): |
0 | 80 leveldict={} |
81 for i,lev in zip(range(len(self.levels)),self.levels): | |
82 if lev!=0: | |
83 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
|
84 |
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
|
85 s=Submaster.Submaster(subname,leveldict=leveldict) |
0 | 86 s.save() |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
87 def loadsub(self, subname): |
0 | 88 """puts a sub into the levels, replacing old level values""" |
577 | 89 s=Submaster.Submasters(showconfig.getGraph()).get_sub_by_name(subname) |
380
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
90 self.set_levels(s.get_dmx_list()) |
0 | 91 dispatcher.send("levelchanged") |
92 def sendupdate(self): | |
93 if not self.dmxdummy: | |
94 dmxclient.outputlevels(self.levels) | |
95 self.lastupdate = time.time() | |
96 self.lastsent = self.levels[:] | |
97 def considersendupdate(self, use_after_loop=0): | |
98 """If use_after_loop is true, it is the period of the after loop.""" | |
99 if self.lastsent != self.levels or time.time() > self.lastupdate + 1: | |
100 self.sendupdate() | |
101 if use_after_loop: | |
102 self.after(use_after_loop, self.considersendupdate, use_after_loop) | |
103 def set_levels(self, levels): | |
380
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
104 oldLen = len(self.levels) |
a13f2caf6f25
fix SC dragging after you load a sub
Drew Perttula <drewp@bigasterisk.com>
parents:
351
diff
changeset
|
105 self.levels[:] = levels + [0] * (oldLen - len(levels)) |
0 | 106 dispatcher.send("levelchanged") |
107 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
108 class EntryCommand(tk.Frame): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
109 def __init__(self, master, verb="Save", cmd=None): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
110 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
|
111 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
|
112 self.cmd = cmd |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
113 self.entry = tk.Entry(self) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
114 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
|
115 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
116 self.entry.bind("<Return>", self.action) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
117 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
|
118 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
119 def action(self, *args): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
120 subname = self.entry.get() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
121 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
|
122 print "sub", self.cmd, subname |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
123 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
124 def set(self, text): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
125 self.entry.delete(0, 'end') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
126 self.entry.insert(0, text) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
127 |
149 | 128 |
129 def open_sub_editing_window(subname, use_mainloop=1, dmxdummy=0): | |
130 if use_mainloop: | |
131 toplevel = tk.Tk() | |
132 else: | |
133 toplevel = tk.Toplevel() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
134 if dmxdummy: |
149 | 135 dummy_str = ' (dummy)' |
136 else: | |
137 dummy_str = '' | |
138 toplevel.title("Subcomposer: %s%s" % (subname, dummy_str)) | |
139 sc = Subcomposer(toplevel, use_persistentlevels=0, dmxdummy=dmxdummy) | |
140 sc.pack(fill='both', expand=1) | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
141 sc.loadsub(subname) |
149 | 142 sc.considersendupdate(use_after_loop=10) |
143 if use_mainloop: | |
144 tk.mainloop() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
145 |
0 | 146 ############################# |
147 | |
148 if __name__ == "__main__": | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
149 parser = OptionParser(usage="%prog [subname]") |
458
8b307310cc1b
when KC launches SC to edit a sub, don't place the window right on the main SC window
drewp@bigasterisk.com
parents:
455
diff
changeset
|
150 parser.add_option('--no-geometry', action='store_true', |
8b307310cc1b
when KC launches SC to edit a sub, don't place the window right on the main SC window
drewp@bigasterisk.com
parents:
455
diff
changeset
|
151 help="don't save/restore window geometry") |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
152 opts, args = parser.parse_args() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
153 |
0 | 154 root=tk.Tk() |
155 root.config(bg='black') | |
147 | 156 root.tk_setPalette("#004633") |
458
8b307310cc1b
when KC launches SC to edit a sub, don't place the window right on the main SC window
drewp@bigasterisk.com
parents:
455
diff
changeset
|
157 if not opts.no_geometry: |
8b307310cc1b
when KC launches SC to edit a sub, don't place the window right on the main SC window
drewp@bigasterisk.com
parents:
455
diff
changeset
|
158 toplevelat("subcomposer", root) |
0 | 159 |
401 | 160 sc = Subcomposer(root, dmxdummy=0, |
426
cd75a12ad66d
adjust dmx dimmer count back to PHS theater levels
drewp@bigasterisk.com
parents:
401
diff
changeset
|
161 #numchannels=276 # use this to see all the skyline dims |
401 | 162 #numchannels=118 |
163 ) | |
0 | 164 sc.pack() |
165 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
166 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
|
167 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
|
168 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
169 if len(args) == 1: |
458
8b307310cc1b
when KC launches SC to edit a sub, don't place the window right on the main SC window
drewp@bigasterisk.com
parents:
455
diff
changeset
|
170 root.config(bg='green') # trying to make these look distinctive |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
171 sc.loadsub(args[0]) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
172 sc.fill_both_boxes(args[0]) |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
173 |
0 | 174 while 1: |
557
4e558643c952
subcomposer: squelch the exception we got every time we exited
David McClosky <dmcc@bigasterisk.com>
parents:
458
diff
changeset
|
175 try: |
4e558643c952
subcomposer: squelch the exception we got every time we exited
David McClosky <dmcc@bigasterisk.com>
parents:
458
diff
changeset
|
176 root.update() |
4e558643c952
subcomposer: squelch the exception we got every time we exited
David McClosky <dmcc@bigasterisk.com>
parents:
458
diff
changeset
|
177 except tk.TclError: |
4e558643c952
subcomposer: squelch the exception we got every time we exited
David McClosky <dmcc@bigasterisk.com>
parents:
458
diff
changeset
|
178 break |
4e558643c952
subcomposer: squelch the exception we got every time we exited
David McClosky <dmcc@bigasterisk.com>
parents:
458
diff
changeset
|
179 |
0 | 180 sc.considersendupdate() |
181 time.sleep(.01) |