annotate flax/tracker @ 271:97c08a1c4351

gyrocontroller: remap buttons, fix keep mode Also, solo mode is now default, colors are brighter, numeric names for subs are converted to subs with only that channel up, send zeroes when exiting
author David McClosky <dmcc@bigasterisk.com>
date Fri, 17 Jun 2005 04:23:07 +0000
parents 8c7f136120a9
children
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()