annotate flax/curvecalc @ 15:c76b62eccdec

put **kw back in, they now go to the scale and can override the defaults. put **kw back in, they now go to the scale and can override the defaults. for our purposes, we probably want to edit the defaults so we don't have them in every call.
author dmcc
date Sun, 07 Jul 2002 06:18:40 +0000
parents 45b12307c695
children 07bac5061d69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 #!/usr/bin/python
45b12307c695 Initial revision
drewp
parents:
diff changeset
2
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 todo: curveview should preserve more objects, for speed maybe
45b12307c695 Initial revision
drewp
parents:
diff changeset
5
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 from __future__ import division
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 import xmlrpclib,time,socket,sys,textwrap,math,glob
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 from bisect import bisect_left,bisect,bisect_right
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 import Tkinter as tk
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 from dispatch import dispatcher
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 from twisted.internet import reactor,tksupport
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 from twisted.web.xmlrpc import Proxy
45b12307c695 Initial revision
drewp
parents:
diff changeset
14
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 sys.path.append("../light8")
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 import dmxclient
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 import Submaster
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 from TLUtility import make_attributes_from_args
45b12307c695 Initial revision
drewp
parents:
diff changeset
19
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 from zoomcontrol import Zoomcontrol
45b12307c695 Initial revision
drewp
parents:
diff changeset
21
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 class Curve:
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 """curve does not know its name. see Curveset"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 points = None # x-sorted list of (x,y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 self.points = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
27
45b12307c695 Initial revision
drewp
parents:
diff changeset
28 def load(self,filename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 for line in file(filename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 self.points.append(tuple([float(a) for a in line.split()]))
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 self.points.sort()
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 dispatcher.send("points changed",sender=self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
33
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 def save(self,filename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 f = file(filename,'w')
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 for p in self.points:
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 f.write("%s %s\n" % p)
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 f.close()
45b12307c695 Initial revision
drewp
parents:
diff changeset
39
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 def eval(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 i = bisect_left(self.points,(t,None))-1
45b12307c695 Initial revision
drewp
parents:
diff changeset
42
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 if self.points[i][0]>t:
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 return self.points[i][1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 if i>=len(self.points)-1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 return self.points[i][1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
47
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 p1,p2 = self.points[i],self.points[i+1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 frac = (t-p1[0])/(p2[0]-p1[0])
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 y = p1[1]+(p2[1]-p1[1])*frac
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 return y
45b12307c695 Initial revision
drewp
parents:
diff changeset
52
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 __call__=eval
45b12307c695 Initial revision
drewp
parents:
diff changeset
54
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 class Curveview(tk.Canvas):
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 def __init__(self,master,curve,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 self.curve=curve
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 tk.Canvas.__init__(self,master,width=10,height=10,
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 relief='sunken',bd=1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 closeenough=5,**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.selected_points=[] # idx of points being dragged
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 self.update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 self.bind("<Enter>",self.focus)
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 dispatcher.connect(self.input_time,"input time")
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 dispatcher.connect(self.update,"zoom changed")
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 dispatcher.connect(self.update,"points changed",sender=self.curve)
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 self.bind("<Configure>",self.update)
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 def screen_from_world(self,p):
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 start,end = self.zoom
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 ht = self.winfo_height()
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 return (p[0]-start)/(end-start)*self.winfo_width(), (ht-5)-p[1]*(ht-10)
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 def world_from_screen(self,x,y):
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 start,end = self.zoom
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 ht = self.winfo_height()
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 return x/self.winfo_width()*(end-start)+start, ((ht-5)-y)/(ht-10)
45b12307c695 Initial revision
drewp
parents:
diff changeset
76
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 def input_time(self,val):
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 t=val
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 pts = self.screen_from_world((val,0))+self.screen_from_world((val,1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 self.delete('timecursor')
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 self.create_line(*pts,**dict(width=2,fill='red',tags=('timecursor',)))
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 def update(self,*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
83
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 self.zoom = dispatcher.send("zoom area")[0][1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 cp = self.curve.points
45b12307c695 Initial revision
drewp
parents:
diff changeset
86
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 visible_x = (self.world_from_screen(0,0)[0],
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 self.world_from_screen(self.winfo_width(),0)[0])
45b12307c695 Initial revision
drewp
parents:
diff changeset
89
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 visleftidx = max(0,bisect_left(cp,(visible_x[0],None))-1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 visrightidx = min(len(cp)-1,bisect_left(cp,(visible_x[1],None))+1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
92
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 visible_points = cp[visleftidx:visrightidx+1]
45b12307c695 Initial revision
drewp
parents:
diff changeset
94
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 self.delete('curve')
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 linepts=[]
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 for p in visible_points:
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 linepts.extend(self.screen_from_world(p))
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 if not linepts:
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 line = self.create_line(*linepts,**{'tags':'curve'})
45b12307c695 Initial revision
drewp
parents:
diff changeset
102
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 # canvas doesnt have keyboard focus, so i can't easily change the
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 # cursor when ctrl is pressed
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 # def curs(ev):
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 # print ev.state
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 # self.bind("<KeyPress>",curs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 # self.bind("<KeyRelease-Control_L>",lambda ev: curs(0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 self.tag_bind(line,"<Control-ButtonPress-1>",self.newpoint)
45b12307c695 Initial revision
drewp
parents:
diff changeset
110
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 self.dots = {} # idx : canvas rectangle
45b12307c695 Initial revision
drewp
parents:
diff changeset
112
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 if len(visible_points)<50:
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 for i,p in enumerate(visible_points):
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 rad=3
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 p = self.screen_from_world(p)
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 dot = self.create_rectangle(p[0]-rad,p[1]-rad,p[0]+rad,p[1]+rad,
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 outline='black',fill='blue',
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 tags=('curve','point'))
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 self.tag_bind(dot,"<ButtonPress-1>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 lambda ev,i=i: self.dotpress(ev,i))
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 self.bind("<Motion>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 lambda ev,i=i: self.dotmotion(ev,i))
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 self.bind("<ButtonRelease-1>",
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 lambda ev,i=i: self.dotrelease(ev,i))
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 self.dots[i]=dot
45b12307c695 Initial revision
drewp
parents:
diff changeset
127
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 self.highlight_selected_dots()
45b12307c695 Initial revision
drewp
parents:
diff changeset
129
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 def newpoint(self,ev):
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 cp = self.curve.points
45b12307c695 Initial revision
drewp
parents:
diff changeset
132
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 p = self.world_from_screen(ev.x,ev.y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 i = bisect(cp,(p[0],None))
45b12307c695 Initial revision
drewp
parents:
diff changeset
135
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 self.unselect()
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 cp.insert(i,p)
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 self.update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
139
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 def highlight_selected_dots(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 for i,d in self.dots.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 if i in self.selected_points:
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 self.itemconfigure(d,fill='red')
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 self.itemconfigure(d,fill='blue')
45b12307c695 Initial revision
drewp
parents:
diff changeset
146
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 def dotpress(self,ev,dotidx):
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 self.selected_points=[dotidx]
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 self.highlight_selected_dots()
45b12307c695 Initial revision
drewp
parents:
diff changeset
150
45b12307c695 Initial revision
drewp
parents:
diff changeset
151 def dotmotion(self,ev,dotidx):
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 cp = self.curve.points
45b12307c695 Initial revision
drewp
parents:
diff changeset
153
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 moved=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 for idx in self.selected_points:
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 x,y = self.world_from_screen(ev.x,ev.y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
157 y = max(0,min(1,y))
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 if idx>0 and x<=cp[idx-1][0]:
45b12307c695 Initial revision
drewp
parents:
diff changeset
159 continue
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 if idx<len(cp)-1 and x>=cp[idx+1][0]:
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 continue
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 moved=1
45b12307c695 Initial revision
drewp
parents:
diff changeset
163 cp[idx] = (x,y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
164 if moved:
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 self.update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
166 def unselect(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
167 self.selected_points=[]
45b12307c695 Initial revision
drewp
parents:
diff changeset
168 self.highlight_selected_dots()
45b12307c695 Initial revision
drewp
parents:
diff changeset
169
45b12307c695 Initial revision
drewp
parents:
diff changeset
170 def dotrelease(self,ev,dotidx):
45b12307c695 Initial revision
drewp
parents:
diff changeset
171 self.unselect()
45b12307c695 Initial revision
drewp
parents:
diff changeset
172
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 class Curveset:
45b12307c695 Initial revision
drewp
parents:
diff changeset
174 curves = None # curvename : curve
45b12307c695 Initial revision
drewp
parents:
diff changeset
175 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 self.curves = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
177 def load(self,basename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 """find all files that look like basename-curvename and add
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 curves with their contents"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 for filename in glob.glob("%s-*"%basename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 curvename = filename[filename.rfind('-')+1:]
45b12307c695 Initial revision
drewp
parents:
diff changeset
182 c=Curve()
45b12307c695 Initial revision
drewp
parents:
diff changeset
183 c.load(filename)
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 self.add_curve(curvename,c)
45b12307c695 Initial revision
drewp
parents:
diff changeset
185 def save(self,basename):
45b12307c695 Initial revision
drewp
parents:
diff changeset
186 """writes a file for each curve with a name
45b12307c695 Initial revision
drewp
parents:
diff changeset
187 like basename-curvename"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 for name,cur in self.curves.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 cur.save("%s-%s" % (basename,name))
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 def add_curve(self,name,curve):
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 self.curves[name] = curve
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 dispatcher.send("add_curve",sender=self,name=name)
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 def globalsdict(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 return self.curves.copy()
45b12307c695 Initial revision
drewp
parents:
diff changeset
195
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 class Curvesetview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 curves = None # curvename : Curveview
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 def __init__(self,master,curveset,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 self.curves = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 self.curveset = curveset
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 tk.Frame.__init__(self,master,**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 dispatcher.connect(self.add_curve,"add_curve",sender=self.curveset)
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 def add_curve(self,name):
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 f = tk.Frame(self,relief='raised',bd=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 f.pack(side='top',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 tk.Label(f,text="curve %r"%name).pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 cv = Curveview(f,self.curveset.curves[name])
45b12307c695 Initial revision
drewp
parents:
diff changeset
208 cv.pack(side='right',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
209 self.curves[name] = cv
45b12307c695 Initial revision
drewp
parents:
diff changeset
210
45b12307c695 Initial revision
drewp
parents:
diff changeset
211 class Music:
45b12307c695 Initial revision
drewp
parents:
diff changeset
212 def __init__(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
213 self.player=None # xmlrpc Proxy to player
45b12307c695 Initial revision
drewp
parents:
diff changeset
214 self.recenttime=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
215
45b12307c695 Initial revision
drewp
parents:
diff changeset
216 def current_time(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
217 """return deferred which gets called with the current time"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
218 if self.player is None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
219 self.player = Proxy("http://spot:8040")
45b12307c695 Initial revision
drewp
parents:
diff changeset
220 d = self.player.callRemote("songlength")
45b12307c695 Initial revision
drewp
parents:
diff changeset
221 d.addCallback(lambda l: dispatcher.send("max time",maxtime=l))
45b12307c695 Initial revision
drewp
parents:
diff changeset
222 d = self.player.callRemote("songname")
45b12307c695 Initial revision
drewp
parents:
diff changeset
223 d.addCallback(lambda n: dispatcher.send("songname",name=n))
45b12307c695 Initial revision
drewp
parents:
diff changeset
224 d = self.player.callRemote('gettime')
45b12307c695 Initial revision
drewp
parents:
diff changeset
225 def sendtime(t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
226 dispatcher.send("input time",val=t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
227 return t # pass along to the real receiver
45b12307c695 Initial revision
drewp
parents:
diff changeset
228 def error(e):
45b12307c695 Initial revision
drewp
parents:
diff changeset
229 pass#self.player=None
45b12307c695 Initial revision
drewp
parents:
diff changeset
230 d.addCallback(sendtime)
45b12307c695 Initial revision
drewp
parents:
diff changeset
231 return d
45b12307c695 Initial revision
drewp
parents:
diff changeset
232
45b12307c695 Initial revision
drewp
parents:
diff changeset
233 class Subexpr:
45b12307c695 Initial revision
drewp
parents:
diff changeset
234 curveset = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
235 def __init__(self,curveset):
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 self.curveset = curveset
45b12307c695 Initial revision
drewp
parents:
diff changeset
237 self.lasteval = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
238 self.expr=""
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 def eval(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
240 if self.expr=="":
45b12307c695 Initial revision
drewp
parents:
diff changeset
241 dispatcher.send("expr_error",sender=self,exc="no expr, using 0")
45b12307c695 Initial revision
drewp
parents:
diff changeset
242 return 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 glo = self.curveset.globalsdict()
45b12307c695 Initial revision
drewp
parents:
diff changeset
244 glo['t'] = t
45b12307c695 Initial revision
drewp
parents:
diff changeset
245 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
246 self.lasteval = eval(self.expr,glo)
45b12307c695 Initial revision
drewp
parents:
diff changeset
247 except Exception,e:
45b12307c695 Initial revision
drewp
parents:
diff changeset
248 dispatcher.send("expr_error",sender=self,exc=e)
45b12307c695 Initial revision
drewp
parents:
diff changeset
249 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
250 dispatcher.send("expr_error",sender=self,exc="no errors")
45b12307c695 Initial revision
drewp
parents:
diff changeset
251 return self.lasteval
45b12307c695 Initial revision
drewp
parents:
diff changeset
252
45b12307c695 Initial revision
drewp
parents:
diff changeset
253 def expr():
45b12307c695 Initial revision
drewp
parents:
diff changeset
254 doc = "python expression for level as a function of t, using curves"
45b12307c695 Initial revision
drewp
parents:
diff changeset
255 def fget(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
256 return self._expr
45b12307c695 Initial revision
drewp
parents:
diff changeset
257 def fset(self, value):
45b12307c695 Initial revision
drewp
parents:
diff changeset
258 self._expr = value
45b12307c695 Initial revision
drewp
parents:
diff changeset
259 dispatcher("expr_changed",sender=self)
45b12307c695 Initial revision
drewp
parents:
diff changeset
260 return locals()
45b12307c695 Initial revision
drewp
parents:
diff changeset
261 expr = property(**expr())
45b12307c695 Initial revision
drewp
parents:
diff changeset
262
45b12307c695 Initial revision
drewp
parents:
diff changeset
263 class Subexprview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
264 def __init__(self,master,se,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
265 self.subexpr=se
45b12307c695 Initial revision
drewp
parents:
diff changeset
266 tk.Frame.__init__(self,master,**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
267 self.evar = tk.StringVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
268 e = self.ent = tk.Entry(master,textvariable=self.evar)
45b12307c695 Initial revision
drewp
parents:
diff changeset
269 e.pack(side='left',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
270 self.expr_changed()
45b12307c695 Initial revision
drewp
parents:
diff changeset
271 self.evar.trace_variable('w',self.evar_changed)
45b12307c695 Initial revision
drewp
parents:
diff changeset
272 dispatcher.connect(self.expr_changed,"expr_changed",
45b12307c695 Initial revision
drewp
parents:
diff changeset
273 sender=self.subexpr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
274 self.error = tk.Label(master)
45b12307c695 Initial revision
drewp
parents:
diff changeset
275 self.error.pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
276 dispatcher.connect(lambda exc: self.error.config(text=str(exc)),
45b12307c695 Initial revision
drewp
parents:
diff changeset
277 "expr_error",sender=self.subexpr,weak=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
278 def expr_changed(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
279 if self.subexpr.expr!=self.evar.get():
45b12307c695 Initial revision
drewp
parents:
diff changeset
280 self.evar.set(self.subexpr.expr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
281 def evar_changed(self,*args):
45b12307c695 Initial revision
drewp
parents:
diff changeset
282 self.subexpr.expr = self.evar.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
283
45b12307c695 Initial revision
drewp
parents:
diff changeset
284 class Subterm:
45b12307c695 Initial revision
drewp
parents:
diff changeset
285 """one Submaster and its Subexpr"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
286 def scaled(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
287 return self.sub * self.subexpr.eval(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
288
45b12307c695 Initial revision
drewp
parents:
diff changeset
289 class Subtermview(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
290 def __init__(self,master,st,**kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
291 self.subterm = st
45b12307c695 Initial revision
drewp
parents:
diff changeset
292 tk.Frame.__init__(self,master,bd=1,relief='raised',**kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
293 tk.Label(self,text="sub %r" % self.subterm.sub.name).pack(side='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
294 sev=Subexprview(self,self.subterm.subexpr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
295 sev.pack(side='left',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
296
45b12307c695 Initial revision
drewp
parents:
diff changeset
297 class Output:
45b12307c695 Initial revision
drewp
parents:
diff changeset
298 def __init__(self,subterms):
45b12307c695 Initial revision
drewp
parents:
diff changeset
299 make_attributes_from_args('subterms')
45b12307c695 Initial revision
drewp
parents:
diff changeset
300 def send_dmx(self,t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
301
45b12307c695 Initial revision
drewp
parents:
diff changeset
302 scaledsubs=[]
45b12307c695 Initial revision
drewp
parents:
diff changeset
303 for st in self.subterms:
45b12307c695 Initial revision
drewp
parents:
diff changeset
304 scl = st.scaled(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
305 scaledsubs.append(scl)
45b12307c695 Initial revision
drewp
parents:
diff changeset
306 out = Submaster.sub_maxes(*scaledsubs)
45b12307c695 Initial revision
drewp
parents:
diff changeset
307 dispatcher.send("output levels",val=out.get_levels())
45b12307c695 Initial revision
drewp
parents:
diff changeset
308 dmxclient.outputlevels(out.get_dmx_list(),twisted=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
309
45b12307c695 Initial revision
drewp
parents:
diff changeset
310 def create_status_lines(master):
45b12307c695 Initial revision
drewp
parents:
diff changeset
311 for signame,textfilter in [
45b12307c695 Initial revision
drewp
parents:
diff changeset
312 ('input time',lambda t: "%.2fs"%t),
45b12307c695 Initial revision
drewp
parents:
diff changeset
313 ('output levels',
45b12307c695 Initial revision
drewp
parents:
diff changeset
314 lambda levels: textwrap.fill("; ".join(["%s:%.2f"%(n,v)
45b12307c695 Initial revision
drewp
parents:
diff changeset
315 for n,v in
45b12307c695 Initial revision
drewp
parents:
diff changeset
316 levels.items()]),70)),
45b12307c695 Initial revision
drewp
parents:
diff changeset
317 ('update period',lambda t: "%.1fms"%(t*1000)),
45b12307c695 Initial revision
drewp
parents:
diff changeset
318 ]:
45b12307c695 Initial revision
drewp
parents:
diff changeset
319 l = tk.Label(master,anchor='w',justify='left')
45b12307c695 Initial revision
drewp
parents:
diff changeset
320 l.pack(side='top',fill='x')
45b12307c695 Initial revision
drewp
parents:
diff changeset
321 dispatcher.connect(lambda val,l=l,sn=signame,tf=textfilter:
45b12307c695 Initial revision
drewp
parents:
diff changeset
322 l.config(text=sn+": "+tf(val)),
45b12307c695 Initial revision
drewp
parents:
diff changeset
323 signame,weak=0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
324
45b12307c695 Initial revision
drewp
parents:
diff changeset
325 def savesubterms(filename,subterms):
45b12307c695 Initial revision
drewp
parents:
diff changeset
326 f = file(filename,'w')
45b12307c695 Initial revision
drewp
parents:
diff changeset
327 for st in subterms:
45b12307c695 Initial revision
drewp
parents:
diff changeset
328 f.write("%s %s\n" % (st.sub.name,st.subexpr.expr))
45b12307c695 Initial revision
drewp
parents:
diff changeset
329 f.close()
45b12307c695 Initial revision
drewp
parents:
diff changeset
330
45b12307c695 Initial revision
drewp
parents:
diff changeset
331 def save(song,subterms,curveset):
45b12307c695 Initial revision
drewp
parents:
diff changeset
332 savesubterms("subterms/"+song,subterms)
45b12307c695 Initial revision
drewp
parents:
diff changeset
333 curveset.save(basename="curves/"+song)
45b12307c695 Initial revision
drewp
parents:
diff changeset
334
45b12307c695 Initial revision
drewp
parents:
diff changeset
335 #######################################################################
45b12307c695 Initial revision
drewp
parents:
diff changeset
336 root=tk.Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
337 root.wm_geometry("790x930")
45b12307c695 Initial revision
drewp
parents:
diff changeset
338 #root.tk_focusFollowsMouse()
45b12307c695 Initial revision
drewp
parents:
diff changeset
339
45b12307c695 Initial revision
drewp
parents:
diff changeset
340 music=Music()
45b12307c695 Initial revision
drewp
parents:
diff changeset
341
45b12307c695 Initial revision
drewp
parents:
diff changeset
342 zc = Zoomcontrol(root)
45b12307c695 Initial revision
drewp
parents:
diff changeset
343 zc.pack(side='top',fill='x')
45b12307c695 Initial revision
drewp
parents:
diff changeset
344
45b12307c695 Initial revision
drewp
parents:
diff changeset
345 curveset = Curveset()
45b12307c695 Initial revision
drewp
parents:
diff changeset
346 csv = Curvesetview(root,curveset)
45b12307c695 Initial revision
drewp
parents:
diff changeset
347 csv.pack(side='top',fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
348
45b12307c695 Initial revision
drewp
parents:
diff changeset
349 song = "16mix.wav"
45b12307c695 Initial revision
drewp
parents:
diff changeset
350
45b12307c695 Initial revision
drewp
parents:
diff changeset
351 curveset.load(basename="curves/"+song)
45b12307c695 Initial revision
drewp
parents:
diff changeset
352
45b12307c695 Initial revision
drewp
parents:
diff changeset
353 subterms = []
45b12307c695 Initial revision
drewp
parents:
diff changeset
354 for line in file("subterms/"+song):
45b12307c695 Initial revision
drewp
parents:
diff changeset
355 subname,expr = line.strip().split(" ",1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
356
45b12307c695 Initial revision
drewp
parents:
diff changeset
357 term = Subterm()
45b12307c695 Initial revision
drewp
parents:
diff changeset
358
45b12307c695 Initial revision
drewp
parents:
diff changeset
359 sexpr = Subexpr(curveset)
45b12307c695 Initial revision
drewp
parents:
diff changeset
360 sexpr.expr = expr
45b12307c695 Initial revision
drewp
parents:
diff changeset
361
45b12307c695 Initial revision
drewp
parents:
diff changeset
362 term.sub = Submaster.Submaster(subname)
45b12307c695 Initial revision
drewp
parents:
diff changeset
363 term.subexpr = sexpr
45b12307c695 Initial revision
drewp
parents:
diff changeset
364 subterms.append(term)
45b12307c695 Initial revision
drewp
parents:
diff changeset
365
45b12307c695 Initial revision
drewp
parents:
diff changeset
366 stv=Subtermview(root,term)
45b12307c695 Initial revision
drewp
parents:
diff changeset
367 stv.pack(side='top',fill='x')
45b12307c695 Initial revision
drewp
parents:
diff changeset
368
45b12307c695 Initial revision
drewp
parents:
diff changeset
369 out = Output(subterms)
45b12307c695 Initial revision
drewp
parents:
diff changeset
370
45b12307c695 Initial revision
drewp
parents:
diff changeset
371 #save(song,subterms,curveset)
45b12307c695 Initial revision
drewp
parents:
diff changeset
372
45b12307c695 Initial revision
drewp
parents:
diff changeset
373 create_status_lines(root)
45b12307c695 Initial revision
drewp
parents:
diff changeset
374
45b12307c695 Initial revision
drewp
parents:
diff changeset
375 recent_t=[]
45b12307c695 Initial revision
drewp
parents:
diff changeset
376 later = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
377 def update():
45b12307c695 Initial revision
drewp
parents:
diff changeset
378 global later
45b12307c695 Initial revision
drewp
parents:
diff changeset
379 d = music.current_time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
380 d.addCallback(update2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
381 d.addErrback(updateerr)
45b12307c695 Initial revision
drewp
parents:
diff changeset
382 def updateerr(e):
45b12307c695 Initial revision
drewp
parents:
diff changeset
383 global later
45b12307c695 Initial revision
drewp
parents:
diff changeset
384 print "err",e
45b12307c695 Initial revision
drewp
parents:
diff changeset
385 if later and not later.cancelled and not later.called: later.cancel()
45b12307c695 Initial revision
drewp
parents:
diff changeset
386 later = reactor.callLater(1,update)
45b12307c695 Initial revision
drewp
parents:
diff changeset
387 def update2(t):
45b12307c695 Initial revision
drewp
parents:
diff changeset
388 global recent_t,later
45b12307c695 Initial revision
drewp
parents:
diff changeset
389
45b12307c695 Initial revision
drewp
parents:
diff changeset
390 if later and not later.cancelled and not later.called: later.cancel()
45b12307c695 Initial revision
drewp
parents:
diff changeset
391 later = reactor.callLater(.01,update)
45b12307c695 Initial revision
drewp
parents:
diff changeset
392
45b12307c695 Initial revision
drewp
parents:
diff changeset
393 recent_t = recent_t[-50:]+[t]
45b12307c695 Initial revision
drewp
parents:
diff changeset
394 period = (recent_t[-1]-recent_t[0])/len(recent_t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
395 dispatcher.send("update period",val=period)
45b12307c695 Initial revision
drewp
parents:
diff changeset
396 out.send_dmx(t)
45b12307c695 Initial revision
drewp
parents:
diff changeset
397 update()
45b12307c695 Initial revision
drewp
parents:
diff changeset
398
45b12307c695 Initial revision
drewp
parents:
diff changeset
399 tksupport.install(root,ms=10)
45b12307c695 Initial revision
drewp
parents:
diff changeset
400 if 0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
401 sys.path.append("/home/drewp/projects/editor/pour")
45b12307c695 Initial revision
drewp
parents:
diff changeset
402 from utils import runstats
45b12307c695 Initial revision
drewp
parents:
diff changeset
403 runstats("reactor.run()")
45b12307c695 Initial revision
drewp
parents:
diff changeset
404 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
405 reactor.run()