annotate bin/tracker @ 1437:d149a2c2236c

always send trailing zeros to dmx Ignore-this: 973ae36ba571f865150710d304e255c8
author drewp@bigasterisk.com
date Sat, 11 Jun 2016 20:41:04 +0000
parents d434a74fc068
children 7772cc48e016
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
154
e3a92ccea4be add cuisine path
dmcc
parents: 152
diff changeset
2 from __future__ import division,nested_scopes
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
3
154
e3a92ccea4be add cuisine path
dmcc
parents: 152
diff changeset
4 import sys
e3a92ccea4be add cuisine path
dmcc
parents: 152
diff changeset
5 sys.path.append("../../editor/pour")
159
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
6 sys.path.append("../light8")
154
e3a92ccea4be add cuisine path
dmcc
parents: 152
diff changeset
7
159
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
8 from Submaster import Submaster
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 from skim.zooming import Zooming,Pair
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 from math import sqrt,sin,cos
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 from pygame.rect import Rect
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
12 from xmlnodebase import xmlnodeclass,collectiveelement,xmldocfile
195
8c7f136120a9 update dispatcher import
drewp
parents: 193
diff changeset
13 from dispatch import dispatcher
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
14
159
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
15 import dmxclient
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
16
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 import Tkinter as tk
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
18
156
224505b0c21e smaller text
drewp
parents: 154
diff changeset
19 defaultfont="arial 8"
224505b0c21e smaller text
drewp
parents: 154
diff changeset
20
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
21 def pairdist(pair1,pair2):
193
e16b8ca470d8 distance calc change
drewp
parents: 159
diff changeset
22 return pair1.dist(pair2)
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
23
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
24 def canvashighlighter(canvas,obj,attribute,normalval,highlightval):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
25 """creates bindings on a canvas obj that make attribute go
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
26 from normal to highlight when the mouse is over the obj"""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
27 canvas.tag_bind(obj,"<Enter>",
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
28 lambda ev: canvas.itemconfig(obj,**{attribute:highlightval}))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
29 canvas.tag_bind(obj,"<Leave>",
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
30 lambda ev: canvas.itemconfig(obj,**{attribute:normalval}))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
31
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
32 class Field(xmlnodeclass):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
33
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 """one light has a field of influence. for any point on the
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 canvas, you can ask this field how strong it is. """
45b12307c695 Initial revision
drewp
parents:
diff changeset
36
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
37 def name(self,newval=None):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
38 """light/sub name"""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
39 return self._getorsetattr("name",newval)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
40 def center(self,x=None,y=None):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
41 """x,y float coords for the center of this light in the field. returns
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
42 a Pair, although it accepts x,y"""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
43 return Pair(self._getorsettypedattr("x",float,x),
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
44 self._getorsettypedattr("y",float,y))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
45
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
46 def falloff(self,dist=None):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
47
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 """linear falloff from 1 at center, to 0 at dist pixels away
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 from center"""
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
50 return self._getorsettypedattr("falloff",float,dist)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
51
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 def getdistforintensity(self,intens):
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 """returns the distance you'd have to be for the given intensity (0..1)"""
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
54 return (1-intens)*self.falloff()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
55
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 def calc(self,x,y):
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 """returns field strength at point x,y"""
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
58 dist=pairdist(Pair(x,y),self.center())
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
59 return max(0,(self.falloff()-dist)/self.falloff())
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
60
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
61 class Fieldset(collectiveelement):
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 """group of fields. persistent."""
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
63 def childtype(self): return Field
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
64
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
65 def version(self):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
66 """read-only version attribute on fieldset tag"""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
67 return self._getorsetattr("version",None)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
68
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 def report(self,x,y):
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 """reports active fields and their intensities"""
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
71 active=0
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
72 for f in self.getall():
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
73 name=f.name()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 intens=f.calc(x,y)
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 if intens>0:
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 print name,intens,
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
77 active+=1
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
78 if active>0:
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
79 print
159
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
80 self.dmxsend(x,y)
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
81 def dmxsend(self,x,y):
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
82 """output lights to dmx"""
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
83 levels=dict([(f.name(),f.calc(x,y)) for f in self.getall()])
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
84 dmxlist=Submaster(None,levels).get_dmx_list()
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
85 dmxclient.outputlevels(dmxlist)
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
86
5aa7cffe68d0 talks dmx
drewp
parents: 156
diff changeset
87
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 def getbounds(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 """returns xmin,xmax,ymin,ymax for the non-zero areas of this field"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 r=None
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
91 for f in self.getall():
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 rad=f.getdistforintensity(0)
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
93 fx,fy=f.center()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 fieldrect=Rect(fx-rad,fy-rad,rad*2,rad*2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 if r is None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 r=fieldrect
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 r=r.union(fieldrect)
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 return r.left,r.right,r.top,r.bottom
45b12307c695 Initial revision
drewp
parents:
diff changeset
100
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
101 class Fieldsetfile(xmldocfile):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
102 def __init__(self,filename):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
103 self._openornew(filename,topleveltype=Fieldset)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
104 def fieldset(self):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
105 return self._gettoplevel()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
106
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
107 ########################################################################
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
108 ########################################################################
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
109
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 class FieldDisplay:
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 """the view for a Field."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 def __init__(self,canvas,field):
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 self.canvas=canvas
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 self.field=field
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 self.tags=[str(id(self))] # canvas tag to id our objects
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
116
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
117 def setcoords(self):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
118 """adjust canvas obj coords to match the field"""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
119 # this uses the canvas object ids saved by makeobjs
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
120 f=self.field
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
121 c=self.canvas
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
122 w2c=self.canvas.world2canvas
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
123
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
124 # rings
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
125 for intens,ring in self.rings.items():
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
126 rad=f.getdistforintensity(intens)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
127 p1=w2c(*(f.center()-Pair(rad,rad)))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
128 p2=w2c(*(f.center()+Pair(rad,rad)))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
129 c.coords(ring,p1[0],p1[1],p2[0],p2[1])
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
130
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
131 # text
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
132 p1=w2c(*f.center())
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
133 c.coords(self.txt,*p1)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
134
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
135 def makeobjs(self):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
136 """(re)create the canvas objs (null coords) and make their bindings"""
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 c=self.canvas
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 f=self.field
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 c.delete(self.tags)
45b12307c695 Initial revision
drewp
parents:
diff changeset
140
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 w2c=self.canvas.world2canvas
45b12307c695 Initial revision
drewp
parents:
diff changeset
142
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
143 # make rings
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
144 self.rings={} # rad,canvasobj
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
145 for intens,color in (#(1,'white'),
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 (.8,'gray90'),(.6,'gray80'),(.4,'gray60'),(.2,'gray50'),
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 (0,'#000080')):
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
148 self.rings[intens]=c.create_oval(0,0,0,0,
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
149 outline=color,width=2,tags=self.tags,
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
150 outlinestipple='gray50')
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
151
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
152 # make text
156
224505b0c21e smaller text
drewp
parents: 154
diff changeset
153 self.txt=c.create_text(0,0,text=f.name(),font=defaultfont+" bold",
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
154 fill='white',anchor='c',
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
155 tags=self.tags)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
156
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
157 # highlight text bindings
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
158 canvashighlighter(c,self.txt,'fill',normalval='white',highlightval='red')
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
159
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
160 # position drag bindings
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
161 def press(ev):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
162 self._lastmouse=ev.x,ev.y
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
163 def motion(ev):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
164 dcan=Pair(*[a-b for a,b in zip((ev.x,ev.y),self._lastmouse)])
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
165 dworld=c.canvas2world_vector(*dcan)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
166 self.field.center(*(self.field.center()+dworld))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
167 self._lastmouse=ev.x,ev.y
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
168 self.setcoords() # redraw
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
169 def release(ev):
156
224505b0c21e smaller text
drewp
parents: 154
diff changeset
170 if hasattr(self,'_lastmouse'):
224505b0c21e smaller text
drewp
parents: 154
diff changeset
171 del self._lastmouse
224505b0c21e smaller text
drewp
parents: 154
diff changeset
172 dispatcher.send("field coord changed") # updates bounds
224505b0c21e smaller text
drewp
parents: 154
diff changeset
173
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
174 c.tag_bind(self.txt,"<ButtonPress-1>",press)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
175 c.tag_bind(self.txt,"<B1-Motion>",motion)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
176 c.tag_bind(self.txt,"<B1-ButtonRelease>",release)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
177
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
178 # radius drag bindings
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
179 outerring=self.rings[0]
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
180 canvashighlighter(c,outerring,
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
181 'outline',normalval='#000080',highlightval='#4040ff')
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
182 def motion(ev):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
183 worldmouse=self.canvas.canvas2world(ev.x,ev.y)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
184 currentdist=pairdist(worldmouse,self.field.center())
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
185 self.field.falloff(currentdist)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
186 self.setcoords()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
187 c.tag_bind(outerring,"<B1-Motion>",motion)
156
224505b0c21e smaller text
drewp
parents: 154
diff changeset
188 c.tag_bind(outerring,"<B1-ButtonRelease>",release) # from above
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
189
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
190 self.setcoords()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
191
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 class Tracker(tk.Frame):
45b12307c695 Initial revision
drewp
parents:
diff changeset
193
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 """whole tracker widget, which is mostly a view for a
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
195 Fieldset. tracker makes its own fieldset"""
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
196
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 # world coords of the visible canvas (preserved even in window resizes)
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 xmin=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 xmax=100
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 ymin=0
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 ymax=100
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
202
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
203 fieldsetfile=None
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
204 displays=None # Field : FieldDisplay. we keep these in sync with the fieldset
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
205
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 def __init__(self,master):
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 tk.Frame.__init__(self,master)
45b12307c695 Initial revision
drewp
parents:
diff changeset
208
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
209 self.displays={}
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
210
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
211 c=self.canvas=Zooming(self,bg='black',closeenough=5)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
212 c.pack(fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
213
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
214 # preserve edge coords over window resize
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
215 c.bind("<Configure>",self.configcoords)
45b12307c695 Initial revision
drewp
parents:
diff changeset
216
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
217 c.bind("<Motion>",
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
218 lambda ev: self._fieldset().report(*c.canvas2world(ev.x,ev.y)))
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
219 def save(ev):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
220 print "saving"
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
221 self.fieldsetfile.save()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
222 master.bind("<Key-s>",save)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
223 dispatcher.connect(self.autobounds,"field coord changed")
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
224
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
225 def _fieldset(self):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
226 return self.fieldsetfile.fieldset()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
227
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
228 def load(self,filename):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
229 self.fieldsetfile=Fieldsetfile(filename)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
230 self.displays.clear()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
231 for f in self.fieldsetfile.fieldset().getall():
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
232 self.displays[f]=FieldDisplay(self.canvas,f)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
233 self.displays[f].makeobjs()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
234 self.autobounds()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
235
45b12307c695 Initial revision
drewp
parents:
diff changeset
236 def configcoords(self,*args):
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
237 # force our canvas coords to stay at the edges of the window
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
238 c=self.canvas
45b12307c695 Initial revision
drewp
parents:
diff changeset
239 cornerx,cornery=c.canvas2world(0,0)
45b12307c695 Initial revision
drewp
parents:
diff changeset
240 c.move(cornerx-self.xmin,
45b12307c695 Initial revision
drewp
parents:
diff changeset
241 cornery-self.ymin)
45b12307c695 Initial revision
drewp
parents:
diff changeset
242 c.setscale(0,0,
45b12307c695 Initial revision
drewp
parents:
diff changeset
243 c.winfo_width()/(self.xmax-self.xmin),
45b12307c695 Initial revision
drewp
parents:
diff changeset
244 c.winfo_height()/(self.ymax-self.ymin))
45b12307c695 Initial revision
drewp
parents:
diff changeset
245
45b12307c695 Initial revision
drewp
parents:
diff changeset
246 def autobounds(self):
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
247 """figure out our bounds from the fieldset, and adjust the display zooms.
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
248 writes the corner coords onto the canvas."""
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
249 self.xmin,self.xmax,self.ymin,self.ymax=self._fieldset().getbounds()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
250
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
251 self.configcoords()
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
252
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
253 c=self.canvas
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
254 c.delete('cornercoords')
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
255 for x,anc2 in ((self.xmin,'w'),(self.xmax,'e')):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
256 for y,anc1 in ((self.ymin,'n'),(self.ymax,'s')):
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
257 pos=c.world2canvas(x,y)
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
258 c.create_text(pos[0],pos[1],text="%s,%s"%(x,y),
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
259 fill='white',anchor=anc1+anc2,
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
260 tags='cornercoords')
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
261 [d.setcoords() for d in self.displays.values()]
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
262
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
263 ########################################################################
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
264 ########################################################################
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
265
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
266 root=tk.Tk()
156
224505b0c21e smaller text
drewp
parents: 154
diff changeset
267 root.wm_geometry('700x350')
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
268 tra=Tracker(root)
45b12307c695 Initial revision
drewp
parents:
diff changeset
269 tra.pack(fill='both',exp=1)
45b12307c695 Initial revision
drewp
parents:
diff changeset
270
152
e6ca7c1f0b1e loads and saves as xml now
drewp
parents: 150
diff changeset
271 tra.load("fieldsets/demo")
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
272
45b12307c695 Initial revision
drewp
parents:
diff changeset
273 root.mainloop()