Mercurial > code > home > repos > light9
annotate bin/subcomposer @ 342:2c782ca93e73
subcomposer takes sub name on cmdline
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Mon, 19 Jun 2006 02:19:51 +0000 |
parents | 42e4c4728a66 |
children | a6662d61ebcd |
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): | |
149 | 17 def __init__(self, master, levelboxopts=None, dmxdummy=0, numchannels=68, |
18 use_persistentlevels=0): | |
0 | 19 tk.Frame.__init__(self, master, bg='black') |
20 self.dmxdummy = dmxdummy | |
21 self.numchannels = numchannels | |
22 | |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
23 self.levels = [0]*512 # 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 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
34 self.loadbox = EntryCommand(self, verb="Load", |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
35 cmd=lambda x: self.loadsub(self.levels, x)) |
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) | |
173 | 79 def savenewsub(self, levels, 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 |
0 | 85 s=Submaster.Submaster(subname,leveldict) |
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""" |
89 s=Submaster.Submasters().get_sub_by_name(subname) | |
90 self.levels[:]=[0]*68 | |
91 self.levels[:]=s.get_dmx_list() | |
92 dispatcher.send("levelchanged") | |
93 def sendupdate(self): | |
94 if not self.dmxdummy: | |
95 dmxclient.outputlevels(self.levels) | |
96 self.lastupdate = time.time() | |
97 self.lastsent = self.levels[:] | |
98 def considersendupdate(self, use_after_loop=0): | |
99 """If use_after_loop is true, it is the period of the after loop.""" | |
100 if self.lastsent != self.levels or time.time() > self.lastupdate + 1: | |
101 self.sendupdate() | |
102 if use_after_loop: | |
103 self.after(use_after_loop, self.considersendupdate, use_after_loop) | |
104 def set_levels(self, levels): | |
105 self.levels[:] = levels | |
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) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
122 print "sub", verb, subname |
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]") |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
150 opts, args = parser.parse_args() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
151 |
0 | 152 root=tk.Tk() |
153 root.config(bg='black') | |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
154 root.wm_title("subcomposer") |
147 | 155 root.tk_setPalette("#004633") |
0 | 156 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
157 sc = Subcomposer(root, dmxdummy=0, numchannels=276) |
0 | 158 sc.pack() |
159 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
160 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
|
161 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
|
162 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
163 if len(args) == 1: |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
164 sc.loadsub(args[0]) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
165 sc.fill_both_boxes(args[0]) |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
166 |
0 | 167 while 1: |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
168 root.update() |
0 | 169 sc.considersendupdate() |
170 time.sleep(.01) |