Mercurial > code > home > repos > light9
annotate bin/subcomposer @ 351:a6662d61ebcd
SC, KC, CC now run and seem to load and save ok. CC does not have any rdf for its data files
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Sun, 10 Jun 2007 08:09:08 +0000 |
parents | 2c782ca93e73 |
children | a13f2caf6f25 |
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 | |
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) | |
89 self.levels[:]=s.get_dmx_list() | |
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): | |
103 self.levels[:] = levels | |
104 dispatcher.send("levelchanged") | |
105 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
106 class EntryCommand(tk.Frame): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
107 def __init__(self, master, verb="Save", cmd=None): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
108 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
|
109 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
|
110 self.cmd = cmd |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
111 self.entry = tk.Entry(self) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
112 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
|
113 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
114 self.entry.bind("<Return>", self.action) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
115 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
|
116 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
117 def action(self, *args): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
118 subname = self.entry.get() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
119 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
|
120 print "sub", self.cmd, subname |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
121 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
122 def set(self, text): |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
123 self.entry.delete(0, 'end') |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
124 self.entry.insert(0, text) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
125 |
149 | 126 |
127 def open_sub_editing_window(subname, use_mainloop=1, dmxdummy=0): | |
128 if use_mainloop: | |
129 toplevel = tk.Tk() | |
130 else: | |
131 toplevel = tk.Toplevel() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
132 if dmxdummy: |
149 | 133 dummy_str = ' (dummy)' |
134 else: | |
135 dummy_str = '' | |
136 toplevel.title("Subcomposer: %s%s" % (subname, dummy_str)) | |
137 sc = Subcomposer(toplevel, use_persistentlevels=0, dmxdummy=dmxdummy) | |
138 sc.pack(fill='both', expand=1) | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
139 sc.loadsub(subname) |
149 | 140 sc.considersendupdate(use_after_loop=10) |
141 if use_mainloop: | |
142 tk.mainloop() | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
143 |
0 | 144 ############################# |
145 | |
146 if __name__ == "__main__": | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
147 parser = OptionParser(usage="%prog [subname]") |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
148 opts, args = parser.parse_args() |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
149 |
0 | 150 root=tk.Tk() |
151 root.config(bg='black') | |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
152 root.wm_title("subcomposer") |
147 | 153 root.tk_setPalette("#004633") |
0 | 154 |
334
42e4c4728a66
ascoltami, subcomposer, keyboardcomposer use rdf show data; raise channel count to 270
drewp@bigasterisk.com
parents:
228
diff
changeset
|
155 sc = Subcomposer(root, dmxdummy=0, numchannels=276) |
0 | 156 sc.pack() |
157 | |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
158 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
|
159 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
|
160 |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
161 if len(args) == 1: |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
162 sc.loadsub(args[0]) |
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
163 sc.fill_both_boxes(args[0]) |
228
9827df597f86
added help texts to subcomposer, curvecalc
drewp@bigasterisk.com
parents:
209
diff
changeset
|
164 |
0 | 165 while 1: |
342
2c782ca93e73
subcomposer takes sub name on cmdline
Drew Perttula <drewp@bigasterisk.com>
parents:
334
diff
changeset
|
166 root.update() |
0 | 167 sc.considersendupdate() |
168 time.sleep(.01) |