]>
Commit | Line | Data |
---|---|---|
0b0849b5 | 1 | #!/usr/bin/env python |
2a0495c9 | 2 | |
8b9a4190 | 3 | try: |
0b0849b5 RD |
4 | import numpy as N |
5 | import numpy.random as RandomArray | |
6 | haveNumpy = True | |
7 | #print "Using numpy, version:", N.__version__ | |
8b9a4190 | 8 | except ImportError: |
0b0849b5 RD |
9 | # numpy isn't there |
10 | haveNumpy = False | |
11 | errorText = ( | |
12 | "The FloatCanvas requires the numpy module, version 1.* \n\n" | |
13 | "You can get info about it at:\n" | |
14 | "http://numpy.scipy.org/\n\n" | |
15 | ) | |
2a0495c9 | 16 | |
2e839e96 | 17 | #--------------------------------------------------------------------------- |
34a544a6 | 18 | |
095315e2 | 19 | |
2a0495c9 | 20 | def BuildDrawFrame(): # this gets called when needed, rather than on import |
42463de2 | 21 | try: |
095315e2 | 22 | from floatcanvas import NavCanvas, FloatCanvas, Resources |
42463de2 | 23 | except ImportError: # if it's not there locally, try the wxPython lib. |
095315e2 | 24 | from wx.lib.floatcanvas import NavCanvas, FloatCanvas, Resources |
2a0495c9 RD |
25 | import wx.lib.colourdb |
26 | import time, random | |
2e839e96 | 27 | |
8fa876ca | 28 | class DrawFrame(wx.Frame): |
2e839e96 | 29 | |
8b9a4190 | 30 | """ |
8b9a4190 | 31 | A frame used for the FloatCanvas Demo |
2e839e96 | 32 | |
8b9a4190 | 33 | """ |
2e839e96 RD |
34 | |
35 | ||
42463de2 | 36 | def __init__(self,parent, id,title,position,size): |
8fa876ca | 37 | wx.Frame.__init__(self,parent, id,title,position, size) |
2e839e96 | 38 | |
42463de2 | 39 | ## Set up the MenuBar |
8fa876ca | 40 | MenuBar = wx.MenuBar() |
2e839e96 | 41 | |
8fa876ca | 42 | file_menu = wx.Menu() |
42463de2 RD |
43 | item = file_menu.Append(-1, "&Close","Close this frame") |
44 | self.Bind(wx.EVT_MENU, self.OnQuit, item) | |
095315e2 RD |
45 | |
46 | item = file_menu.Append(-1, "&SavePNG","Save the current image as a PNG") | |
47 | self.Bind(wx.EVT_MENU, self.OnSavePNG, item) | |
8b9a4190 | 48 | MenuBar.Append(file_menu, "&File") |
2e839e96 | 49 | |
8fa876ca | 50 | draw_menu = wx.Menu() |
8fa876ca | 51 | |
095315e2 RD |
52 | item = draw_menu.Append(-1, "&Clear","Clear the Canvas") |
53 | self.Bind(wx.EVT_MENU, self.Clear, item) | |
54 | ||
42463de2 RD |
55 | item = draw_menu.Append(-1, "&Draw Test","Run a test of drawing random components") |
56 | self.Bind(wx.EVT_MENU, self.DrawTest, item) | |
57 | ||
58 | item = draw_menu.Append(-1, "&Line Test","Run a test of drawing random lines") | |
59 | self.Bind(wx.EVT_MENU, self.LineTest, item) | |
2e839e96 | 60 | |
42463de2 RD |
61 | item = draw_menu.Append(-1, "Draw &Map","Run a test of drawing a map") |
62 | self.Bind(wx.EVT_MENU, self.DrawMap, item) | |
095315e2 | 63 | |
42463de2 RD |
64 | item = draw_menu.Append(-1, "&Text Test","Run a test of text drawing") |
65 | self.Bind(wx.EVT_MENU, self.TestText, item) | |
095315e2 | 66 | |
42463de2 RD |
67 | item = draw_menu.Append(-1, "&ScaledText Test","Run a test of text drawing") |
68 | self.Bind(wx.EVT_MENU, self.TestScaledText, item) | |
095315e2 RD |
69 | |
70 | item = draw_menu.Append(-1, "&ScaledTextBox Test","Run a test of the Scaled Text Box") | |
71 | self.Bind(wx.EVT_MENU, self.TestScaledTextBox, item) | |
72 | ||
73 | item = draw_menu.Append(-1, "&Bitmap Test","Run a test of the Bitmap Object") | |
74 | self.Bind(wx.EVT_MENU, self.TestBitmap, item) | |
75 | ||
42463de2 RD |
76 | item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code") |
77 | self.Bind(wx.EVT_MENU, self.TestHitTest, item) | |
095315e2 | 78 | |
5e1796ef | 79 | item = draw_menu.Append(-1, "Hit Test &Foreground","Run a test of the hit test code with a foreground Object") |
42463de2 | 80 | self.Bind(wx.EVT_MENU, self.TestHitTestForeground, item) |
095315e2 | 81 | |
42463de2 RD |
82 | item = draw_menu.Append(-1, "&Animation","Run a test of Animation") |
83 | self.Bind(wx.EVT_MENU, self.TestAnimation, item) | |
095315e2 RD |
84 | |
85 | #item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed") | |
86 | #self.Bind(wx.EVT_MENU, self.SpeedTest, item) | |
87 | ||
5e1796ef RD |
88 | item = draw_menu.Append(-1, "Change &Properties","Run a test of Changing Object Properties") |
89 | self.Bind(wx.EVT_MENU, self.PropertiesChangeTest, item) | |
095315e2 | 90 | |
2a0495c9 RD |
91 | item = draw_menu.Append(-1, "&Arrows","Run a test of Arrows") |
92 | self.Bind(wx.EVT_MENU, self.ArrowTest, item) | |
93 | ||
0b0849b5 RD |
94 | item = draw_menu.Append(-1, "&ArrowLine Test","Run a test of drawing Arrow Lines") |
95 | self.Bind(wx.EVT_MENU, self.ArrowLineTest, item) | |
96 | ||
97 | item = draw_menu.Append(-1, "&Hide","Run a test of hiding and showing objects") | |
095315e2 RD |
98 | self.Bind(wx.EVT_MENU, self.HideTest, item) |
99 | ||
42463de2 | 100 | MenuBar.Append(draw_menu, "&Tests") |
2e839e96 | 101 | |
8fa876ca | 102 | view_menu = wx.Menu() |
42463de2 RD |
103 | item = view_menu.Append(-1, "Zoom to &Fit","Zoom to fit the window") |
104 | self.Bind(wx.EVT_MENU, self.ZoomToFit, item) | |
8b9a4190 | 105 | MenuBar.Append(view_menu, "&View") |
2e839e96 | 106 | |
8fa876ca | 107 | help_menu = wx.Menu() |
42463de2 | 108 | item = help_menu.Append(-1, "&About", |
8b9a4190 | 109 | "More information About this program") |
42463de2 | 110 | self.Bind(wx.EVT_MENU, self.OnAbout, item) |
8b9a4190 | 111 | MenuBar.Append(help_menu, "&Help") |
2e839e96 | 112 | |
8b9a4190 | 113 | self.SetMenuBar(MenuBar) |
2e839e96 | 114 | |
095315e2 RD |
115 | self.CreateStatusBar() |
116 | ||
117 | ||
8b9a4190 | 118 | # Add the Canvas |
0b0849b5 RD |
119 | NC = NavCanvas.NavCanvas(self, |
120 | Debug = 0, | |
121 | BackgroundColor = "DARK SLATE BLUE") | |
122 | ||
123 | self.Canvas = NC.Canvas # reference the contained FloatCanvas | |
42463de2 | 124 | |
095315e2 RD |
125 | self.MsgWindow = wx.TextCtrl(self, wx.ID_ANY, |
126 | "Look Here for output from events\n", | |
127 | style = (wx.TE_MULTILINE | | |
128 | wx.TE_READONLY | | |
129 | wx.SUNKEN_BORDER) | |
130 | ) | |
131 | ||
132 | ##Create a sizer to manage the Canvas and message window | |
133 | MainSizer = wx.BoxSizer(wx.VERTICAL) | |
0b0849b5 | 134 | MainSizer.Add(NC, 4, wx.EXPAND) |
095315e2 RD |
135 | MainSizer.Add(self.MsgWindow, 1, wx.EXPAND | wx.ALL, 5) |
136 | ||
137 | self.SetSizer(MainSizer) | |
0b0849b5 | 138 | self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) |
42463de2 | 139 | |
0b0849b5 RD |
140 | self.Canvas.Bind(FloatCanvas.EVT_MOTION, self.OnMove) |
141 | self.Canvas.Bind(FloatCanvas.EVT_MOUSEWHEEL, self.OnWheel) | |
42463de2 RD |
142 | |
143 | self.EventsAreBound = False | |
144 | ||
095315e2 | 145 | ## getting all the colors for random objects |
2a0495c9 RD |
146 | wx.lib.colourdb.updateColourDB() |
147 | self.colors = wx.lib.colourdb.getColourList() | |
42463de2 RD |
148 | |
149 | ||
8b9a4190 | 150 | return None |
42463de2 | 151 | |
095315e2 RD |
152 | def Log(self, text): |
153 | self.MsgWindow.AppendText(text) | |
154 | if not text[-1] == "\n": | |
155 | self.MsgWindow.AppendText("\n") | |
156 | ||
157 | ||
42463de2 RD |
158 | def BindAllMouseEvents(self): |
159 | if not self.EventsAreBound: | |
160 | ## Here is how you catch FloatCanvas mouse events | |
0b0849b5 RD |
161 | self.Canvas.Bind(FloatCanvas.EVT_LEFT_DOWN, self.OnLeftDown) |
162 | self.Canvas.Bind(FloatCanvas.EVT_LEFT_UP, self.OnLeftUp) | |
163 | self.Canvas.Bind(FloatCanvas.EVT_LEFT_DCLICK, self.OnLeftDouble) | |
42463de2 | 164 | |
0b0849b5 RD |
165 | self.Canvas.Bind(FloatCanvas.EVT_MIDDLE_DOWN, self.OnMiddleDown) |
166 | self.Canvas.Bind(FloatCanvas.EVT_MIDDLE_UP, self.OnMiddleUp) | |
167 | self.Canvas.Bind(FloatCanvas.EVT_MIDDLE_DCLICK, self.OnMiddleDouble) | |
42463de2 | 168 | |
0b0849b5 RD |
169 | self.Canvas.Bind(FloatCanvas.EVT_RIGHT_DOWN, self.OnRightDown) |
170 | self.Canvas.Bind(FloatCanvas.EVT_RIGHT_UP, self.OnRightUp) | |
171 | self.Canvas.Bind(FloatCanvas.EVT_RIGHT_DCLICK, self.OnRightDouble) | |
42463de2 | 172 | |
42463de2 RD |
173 | self.EventsAreBound = True |
174 | ||
0b0849b5 | 175 | |
42463de2 | 176 | def UnBindAllMouseEvents(self): |
2a0495c9 | 177 | ## Here is how you unbind FloatCanvas mouse events |
0b0849b5 RD |
178 | self.Canvas.Unbind(FloatCanvas.EVT_LEFT_DOWN) |
179 | self.Canvas.Unbind(FloatCanvas.EVT_LEFT_UP) | |
180 | self.Canvas.Unbind(FloatCanvas.EVT_LEFT_DCLICK) | |
42463de2 | 181 | |
0b0849b5 RD |
182 | self.Canvas.Unbind(FloatCanvas.EVT_MIDDLE_DOWN) |
183 | self.Canvas.Unbind(FloatCanvas.EVT_MIDDLE_UP) | |
184 | self.Canvas.Unbind(FloatCanvas.EVT_MIDDLE_DCLICK) | |
42463de2 | 185 | |
0b0849b5 RD |
186 | self.Canvas.Unbind(FloatCanvas.EVT_RIGHT_DOWN) |
187 | self.Canvas.Unbind(FloatCanvas.EVT_RIGHT_UP) | |
188 | self.Canvas.Unbind(FloatCanvas.EVT_RIGHT_DCLICK) | |
42463de2 RD |
189 | |
190 | self.EventsAreBound = False | |
191 | ||
42463de2 | 192 | |
095315e2 | 193 | def PrintCoords(self,event): |
095315e2 RD |
194 | self.Log("coords are: %s"%(event.Coords,)) |
195 | self.Log("pixel coords are: %s\n"%(event.GetPosition(),)) | |
196 | ||
197 | def OnSavePNG(self, event=None): | |
198 | import os | |
199 | dlg = wx.FileDialog( | |
200 | self, message="Save file as ...", defaultDir=os.getcwd(), | |
201 | defaultFile="", wildcard="*.png", style=wx.SAVE | |
202 | ) | |
203 | if dlg.ShowModal() == wx.ID_OK: | |
204 | path = dlg.GetPath() | |
205 | if not(path[-4:].lower() == ".png"): | |
206 | path = path+".png" | |
207 | self.Canvas.SaveAsImage(path) | |
208 | ||
209 | ||
42463de2 | 210 | def OnLeftDown(self, event): |
095315e2 | 211 | self.Log("LeftDown") |
42463de2 RD |
212 | self.PrintCoords(event) |
213 | ||
214 | def OnLeftUp(self, event): | |
095315e2 | 215 | self.Log("LeftUp") |
42463de2 RD |
216 | self.PrintCoords(event) |
217 | ||
218 | def OnLeftDouble(self, event): | |
095315e2 | 219 | self.Log("LeftDouble") |
42463de2 RD |
220 | self.PrintCoords(event) |
221 | ||
222 | def OnMiddleDown(self, event): | |
095315e2 | 223 | self.Log("MiddleDown") |
42463de2 RD |
224 | self.PrintCoords(event) |
225 | ||
226 | def OnMiddleUp(self, event): | |
095315e2 | 227 | self.Log("MiddleUp") |
42463de2 RD |
228 | self.PrintCoords(event) |
229 | ||
230 | def OnMiddleDouble(self, event): | |
095315e2 | 231 | self.Log("MiddleDouble") |
42463de2 RD |
232 | self.PrintCoords(event) |
233 | ||
234 | def OnRightDown(self, event): | |
095315e2 | 235 | self.Log("RightDown") |
42463de2 RD |
236 | self.PrintCoords(event) |
237 | ||
238 | def OnRightUp(self, event): | |
0b0849b5 | 239 | self.Log("RightUp") |
42463de2 RD |
240 | self.PrintCoords(event) |
241 | ||
242 | def OnRightDouble(self, event): | |
095315e2 | 243 | self.Log("RightDouble") |
42463de2 RD |
244 | self.PrintCoords(event) |
245 | ||
246 | def OnWheel(self, event): | |
095315e2 | 247 | self.Log("Mouse Wheel") |
42463de2 | 248 | self.PrintCoords(event) |
2a0495c9 | 249 | Rot = event.GetWheelRotation() |
2a0495c9 RD |
250 | Rot = Rot / abs(Rot) * 0.1 |
251 | if event.ControlDown(): # move left-right | |
252 | self.Canvas.MoveImage( (Rot, 0), "Panel" ) | |
253 | else: # move up-down | |
254 | self.Canvas.MoveImage( (0, Rot), "Panel" ) | |
255 | ||
42463de2 RD |
256 | def OnMove(self, event): |
257 | """ | |
2a0495c9 | 258 | Updates the status bar with the world coordinates |
42463de2 RD |
259 | """ |
260 | self.SetStatusText("%.2f, %.2f"%tuple(event.Coords)) | |
0b0849b5 | 261 | event.Skip() |
42463de2 | 262 | |
8b9a4190 | 263 | def OnAbout(self, event): |
095315e2 RD |
264 | dlg = wx.MessageDialog(self, |
265 | "This is a small program to demonstrate\n" | |
266 | "the use of the FloatCanvas\n", | |
267 | "About Me", | |
268 | wx.OK | wx.ICON_INFORMATION) | |
8b9a4190 RD |
269 | dlg.ShowModal() |
270 | dlg.Destroy() | |
2e839e96 | 271 | |
8b9a4190 RD |
272 | def ZoomToFit(self,event): |
273 | self.Canvas.ZoomToBB() | |
2e839e96 | 274 | |
8b9a4190 | 275 | def Clear(self,event = None): |
42463de2 | 276 | self.UnBindAllMouseEvents() |
0b0849b5 | 277 | self.Canvas.InitAll() |
8b9a4190 | 278 | self.Canvas.Draw() |
2e839e96 | 279 | |
8b9a4190 RD |
280 | def OnQuit(self,event): |
281 | self.Close(True) | |
2e839e96 | 282 | |
8b9a4190 RD |
283 | def OnCloseWindow(self, event): |
284 | self.Destroy() | |
2e839e96 | 285 | |
42463de2 | 286 | def DrawTest(self,event=None): |
0b0849b5 RD |
287 | """ |
288 | This demo draws a few of everything | |
289 | ||
290 | """ | |
291 | ||
292 | wx.GetApp().Yield(True) | |
2a0495c9 | 293 | |
8b9a4190 | 294 | Range = (-10,10) |
42463de2 RD |
295 | colors = self.colors |
296 | ||
297 | self.BindAllMouseEvents() | |
8b9a4190 | 298 | Canvas = self.Canvas |
42463de2 | 299 | |
0b0849b5 RD |
300 | Canvas.InitAll() |
301 | # | |
302 | ## these set the limits for how much you can zoom in and out | |
303 | Canvas.MinScale = 14 | |
304 | Canvas.MaxScale = 500 | |
305 | ||
42463de2 | 306 | |
095315e2 | 307 | ############# Random tests of everything ############## |
2e839e96 | 308 | |
8b9a4190 | 309 | # Rectangles |
42463de2 | 310 | for i in range(3): |
095315e2 | 311 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
8b9a4190 RD |
312 | lw = random.randint(1,5) |
313 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
314 | wh = (random.randint(1,5), random.randint(1,5)) |
315 | Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf]) | |
2e839e96 | 316 | |
42463de2 RD |
317 | # Ellipses |
318 | for i in range(3): | |
095315e2 | 319 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
8b9a4190 RD |
320 | lw = random.randint(1,5) |
321 | cf = random.randint(0,len(colors)-1) | |
322 | h = random.randint(1,5) | |
323 | w = random.randint(1,5) | |
095315e2 | 324 | Canvas.AddEllipse(xy, (h,w), LineWidth = lw,FillColor = colors[cf]) |
2e839e96 | 325 | |
5e1796ef RD |
326 | # Points |
327 | for i in range(5): | |
095315e2 | 328 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
5e1796ef RD |
329 | D = random.randint(1,50) |
330 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
331 | Canvas.AddPoint(xy, Color = colors[cf], Diameter = D) |
332 | ||
333 | # SquarePoints | |
334 | for i in range(500): | |
335 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
336 | S = random.randint(1, 50) | |
337 | cf = random.randint(0,len(colors)-1) | |
338 | Canvas.AddSquarePoint(xy, Color = colors[cf], Size = S) | |
339 | ||
2a0495c9 | 340 | # Circles |
8b9a4190 | 341 | for i in range(5): |
095315e2 | 342 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
8b9a4190 RD |
343 | D = random.randint(1,5) |
344 | lw = random.randint(1,5) | |
345 | cf = random.randint(0,len(colors)-1) | |
346 | cl = random.randint(0,len(colors)-1) | |
095315e2 RD |
347 | Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf]) |
348 | Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc") | |
2a0495c9 | 349 | # Lines |
8b9a4190 RD |
350 | for i in range(5): |
351 | points = [] | |
352 | for j in range(random.randint(2,10)): | |
353 | point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) | |
354 | points.append(point) | |
355 | lw = random.randint(1,10) | |
356 | cf = random.randint(0,len(colors)-1) | |
357 | cl = random.randint(0,len(colors)-1) | |
42463de2 | 358 | Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl]) |
2a0495c9 | 359 | # Polygons |
8b9a4190 RD |
360 | for i in range(3): |
361 | points = [] | |
362 | for j in range(random.randint(2,6)): | |
363 | point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
364 | points.append(point) | |
365 | lw = random.randint(1,6) | |
366 | cf = random.randint(0,len(colors)-1) | |
367 | cl = random.randint(0,len(colors)-1) | |
42463de2 RD |
368 | Canvas.AddPolygon(points, |
369 | LineWidth = lw, | |
370 | LineColor = colors[cl], | |
371 | FillColor = colors[cf], | |
372 | FillStyle = 'Solid') | |
2e839e96 | 373 | |
8b9a4190 RD |
374 | ## Pointset |
375 | for i in range(4): | |
376 | points = [] | |
377 | points = RandomArray.uniform(Range[0],Range[1],(100,2)) | |
378 | cf = random.randint(0,len(colors)-1) | |
379 | D = random.randint(1,4) | |
42463de2 | 380 | Canvas.AddPointSet(points, Color = colors[cf], Diameter = D) |
2e839e96 | 381 | |
8b9a4190 | 382 | # Text |
42463de2 RD |
383 | String = "Unscaled text" |
384 | for i in range(3): | |
8b9a4190 RD |
385 | ts = random.randint(10,40) |
386 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
387 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
388 | Canvas.AddText(String, xy, Size = ts, Color = colors[cf], Position = "cc") | |
42463de2 RD |
389 | |
390 | # Scaled Text | |
391 | String = "Scaled text" | |
392 | for i in range(3): | |
393 | ts = random.random()*3 + 0.2 | |
394 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
395 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
396 | Canvas.AddScaledText(String, Point, Size = ts, Color = colors[cf], Position = "cc") | |
42463de2 | 397 | |
2a0495c9 RD |
398 | # Arrows |
399 | N = 5 | |
400 | Points = RandomArray.uniform(Range[0], Range[1], (N,2) ) | |
401 | for i in range(N): | |
402 | Canvas.AddArrow(Points[i], | |
403 | random.uniform(20,100), | |
404 | Direction = random.uniform(0,360), | |
405 | LineWidth = random.uniform(1,5), | |
406 | LineColor = colors[random.randint(0,len(colors)-1)], | |
407 | ArrowHeadAngle = random.uniform(20,90)) | |
408 | ||
0b0849b5 RD |
409 | # ArrowLines |
410 | for i in range(5): | |
411 | points = [] | |
412 | for j in range(random.randint(2,10)): | |
413 | point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) | |
414 | points.append(point) | |
415 | lw = random.randint(1,10) | |
416 | cf = random.randint(0,len(colors)-1) | |
417 | cl = random.randint(0,len(colors)-1) | |
418 | Canvas.AddArrowLine(points, LineWidth = lw, LineColor = colors[cl], ArrowHeadSize= 16) | |
419 | ||
420 | ||
42463de2 RD |
421 | Canvas.ZoomToBB() |
422 | ||
423 | def TestAnimation(self,event=None): | |
424 | """ | |
425 | ||
426 | In this test, a relatively complex background is drawn, and | |
427 | a simple object placed in the foreground is moved over | |
428 | it. This demonstrates how to use the InForeground attribute | |
429 | to make an object in the foregorund draw fast, without | |
430 | having to re-draw the whole background. | |
431 | ||
432 | """ | |
0b0849b5 | 433 | wx.GetApp().Yield(True) |
42463de2 RD |
434 | Range = (-10,10) |
435 | self.Range = Range | |
436 | ||
437 | self.UnBindAllMouseEvents() | |
438 | Canvas = self.Canvas | |
0b0849b5 | 439 | Canvas.InitAll() |
42463de2 | 440 | |
095315e2 | 441 | ## Random tests of everything: |
42463de2 RD |
442 | colors = self.colors |
443 | # Rectangles | |
444 | for i in range(3): | |
095315e2 | 445 | xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1])) |
42463de2 RD |
446 | lw = random.randint(1,5) |
447 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
448 | wh = (random.randint(1,5), random.randint(1,5) ) |
449 | Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf]) | |
2e839e96 | 450 | |
42463de2 RD |
451 | # Ellipses |
452 | for i in range(3): | |
095315e2 | 453 | xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1])) |
42463de2 RD |
454 | lw = random.randint(1,5) |
455 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
456 | wh = (random.randint(1,5), random.randint(1,5) ) |
457 | Canvas.AddEllipse(xy, wh, LineWidth = lw, FillColor = colors[cf]) | |
2e839e96 | 458 | |
42463de2 RD |
459 | # Circles |
460 | for i in range(5): | |
095315e2 | 461 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
42463de2 RD |
462 | D = random.randint(1,5) |
463 | lw = random.randint(1,5) | |
464 | cf = random.randint(0,len(colors)-1) | |
465 | cl = random.randint(0,len(colors)-1) | |
095315e2 RD |
466 | Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf]) |
467 | Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc") | |
2e839e96 | 468 | |
42463de2 RD |
469 | # Lines |
470 | for i in range(5): | |
471 | points = [] | |
472 | for j in range(random.randint(2,10)): | |
473 | point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) | |
474 | points.append(point) | |
475 | lw = random.randint(1,10) | |
476 | cf = random.randint(0,len(colors)-1) | |
477 | cl = random.randint(0,len(colors)-1) | |
478 | Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl]) | |
2e839e96 | 479 | |
42463de2 RD |
480 | # Polygons |
481 | for i in range(3): | |
482 | points = [] | |
483 | for j in range(random.randint(2,6)): | |
484 | point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
485 | points.append(point) | |
486 | lw = random.randint(1,6) | |
487 | cf = random.randint(0,len(colors)-1) | |
488 | cl = random.randint(0,len(colors)-1) | |
489 | Canvas.AddPolygon(points, | |
490 | LineWidth = lw, | |
491 | LineColor = colors[cl], | |
492 | FillColor = colors[cf], | |
493 | FillStyle = 'Solid') | |
2e839e96 | 494 | |
42463de2 RD |
495 | # Scaled Text |
496 | String = "Scaled text" | |
497 | for i in range(3): | |
498 | ts = random.random()*3 + 0.2 | |
499 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
500 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
501 | Canvas.AddScaledText(String, xy, Size = ts, Color = colors[cf], Position = "cc") | |
42463de2 RD |
502 | |
503 | ||
504 | # Now the Foreground Object: | |
095315e2 RD |
505 | C = Canvas.AddCircle((0,0), 7, LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True) |
506 | T = Canvas.AddScaledText("Click to Move", (0,0), Size = 0.6, Position = 'cc', InForeground = True) | |
42463de2 RD |
507 | C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe) |
508 | C.Text = T | |
509 | ||
510 | self.Timer = wx.PyTimer(self.ShowFrame) | |
511 | self.FrameDelay = 50 # milliseconds | |
2e839e96 | 512 | |
42463de2 RD |
513 | Canvas.ZoomToBB() |
514 | ||
515 | def ShowFrame(self): | |
516 | Object = self.MovingObject | |
517 | Range = self.Range | |
518 | if self.TimeStep < self.NumTimeSteps: | |
519 | x,y = Object.XY | |
520 | if x > Range[1] or x < Range[0]: | |
521 | self.dx = -self.dx | |
522 | if y > Range[1] or y < Range[0]: | |
523 | self.dy = -self.dy | |
524 | Object.Move( (self.dx,self.dy) ) | |
525 | Object.Text.Move( (self.dx,self.dy)) | |
526 | self.Canvas.Draw() | |
527 | self.TimeStep += 1 | |
5e1796ef | 528 | wx.GetApp().Yield(True) |
42463de2 RD |
529 | else: |
530 | self.Timer.Stop() | |
2e839e96 | 531 | |
42463de2 RD |
532 | |
533 | def MoveMe(self, Object): | |
534 | self.MovingObject = Object | |
535 | Range = self.Range | |
536 | self.dx = random.uniform(Range[0]/4,Range[1]/4) | |
537 | self.dy = random.uniform(Range[0]/4,Range[1]/4) | |
538 | #import time | |
539 | #start = time.time() | |
5e1796ef | 540 | self.NumTimeSteps = 200 |
42463de2 RD |
541 | self.TimeStep = 1 |
542 | self.Timer.Start(self.FrameDelay) | |
543 | #print "Did %i frames in %f seconds"%(N, (time.time() - start) ) | |
2e839e96 | 544 | |
0b0849b5 RD |
545 | def TestHitTest(self, event=None): |
546 | wx.GetApp().Yield(True) | |
42463de2 RD |
547 | |
548 | self.UnBindAllMouseEvents() | |
549 | Canvas = self.Canvas | |
550 | ||
0b0849b5 | 551 | Canvas.InitAll() |
42463de2 | 552 | |
2a0495c9 | 553 | #Add a Hit-able rectangle |
42463de2 RD |
554 | w, h = 60, 20 |
555 | ||
556 | dx = 80 | |
557 | dy = 40 | |
095315e2 | 558 | x, y = 20, 20 |
0b0849b5 | 559 | FontSize = 10 |
2e839e96 | 560 | |
42463de2 | 561 | #Add one that is not HitAble |
095315e2 RD |
562 | Canvas.AddRectangle((x,y), (w, h), LineWidth = 2) |
563 | Canvas.AddText("Not Hit-able", (x,y), Size = FontSize, Position = "bl") | |
2e839e96 | 564 | |
42463de2 RD |
565 | |
566 | x += dx | |
095315e2 | 567 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2) |
42463de2 RD |
568 | R.Name = "Line Rectangle" |
569 | R.HitFill = False | |
5e1796ef | 570 | R.HitLineWidth = 5 # Makes it a little easier to hit |
42463de2 | 571 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) |
095315e2 RD |
572 | Canvas.AddText("Left Click Line", (x,y), Size = FontSize, Position = "bl") |
573 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
574 | |
575 | x += dx | |
576 | color = "Red" | |
095315e2 | 577 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
578 | R.Name = color + "Rectangle" |
579 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) | |
095315e2 RD |
580 | Canvas.AddText("Left Click Fill", (x, y), Size = FontSize, Position = "bl") |
581 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
582 | |
583 | x = 20 | |
584 | y += dy | |
585 | color = "LightBlue" | |
095315e2 | 586 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
587 | R.Name = color + " Rectangle" |
588 | R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit) | |
095315e2 RD |
589 | Canvas.AddText("Right Click Fill", (x, y), Size = FontSize, Position = "bl") |
590 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
591 | |
592 | x += dx | |
593 | color = "Grey" | |
095315e2 | 594 | R = Canvas.AddEllipse((x, y), (w, h),LineWidth = 2,FillColor = color) |
42463de2 RD |
595 | R.Name = color +" Ellipse" |
596 | R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit) | |
095315e2 RD |
597 | Canvas.AddText("Right Click Fill", (x, y), Size = FontSize, Position = "bl") |
598 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
599 | |
600 | x += dx | |
601 | color = "Brown" | |
095315e2 | 602 | R = Canvas.AddCircle((x+dx/2, y+dy/2), dx/4, LineWidth = 2, FillColor = color) |
42463de2 RD |
603 | R.Name = color + " Circle" |
604 | R.HitFill = True | |
605 | R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit) | |
095315e2 RD |
606 | Canvas.AddText("Left D-Click Fill", (x, y), Size = FontSize, Position = "bl") |
607 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
608 | |
609 | x = 20 | |
610 | y += dy | |
611 | color = "Pink" | |
095315e2 | 612 | R = Canvas.AddCircle((x+dx/2, y+dy/2), dx/4, LineWidth = 2,FillColor = color) |
42463de2 RD |
613 | R.Name = color + " Circle" |
614 | R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit) | |
095315e2 RD |
615 | Canvas.AddText("Left Up Fill", (x, y), Size = FontSize, Position = "bl") |
616 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
617 | |
618 | x += dx | |
619 | color = "White" | |
095315e2 | 620 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
621 | R.Name = color + " Rectangle" |
622 | R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit) | |
095315e2 RD |
623 | Canvas.AddText("Middle Down", (x, y), Size = FontSize, Position = "bl") |
624 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
625 | |
626 | x += dx | |
627 | color = "AQUAMARINE" | |
095315e2 | 628 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
629 | R.Name = color + " Rectangle" |
630 | R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit) | |
095315e2 RD |
631 | Canvas.AddText("Middle Up", (x, y), Size = FontSize, Position = "bl") |
632 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
633 | |
634 | x = 20 | |
635 | y += dy | |
636 | color = "CORAL" | |
095315e2 | 637 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
638 | R.Name = color + " Rectangle" |
639 | R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit) | |
095315e2 RD |
640 | Canvas.AddText("Middle DoubleClick", (x, y), Size = FontSize, Position = "bl") |
641 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
642 | |
643 | x += dx | |
644 | color = "CYAN" | |
095315e2 | 645 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
646 | R.Name = color + " Rectangle" |
647 | R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit) | |
095315e2 RD |
648 | Canvas.AddText("Right Up", (x, y), Size = FontSize, Position = "bl") |
649 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
650 | |
651 | x += dx | |
652 | color = "LIME GREEN" | |
095315e2 | 653 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
654 | R.Name = color + " Rectangle" |
655 | R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit) | |
095315e2 RD |
656 | Canvas.AddText("Right Double Click", (x, y), Size = FontSize, Position = "bl") |
657 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
658 | |
659 | x = 20 | |
660 | y += dy | |
661 | color = "MEDIUM GOLDENROD" | |
095315e2 | 662 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
663 | R.Name = color |
664 | R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight) | |
665 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) | |
095315e2 RD |
666 | Canvas.AddText("L and R Click", (x, y), Size = FontSize, Position = "bl") |
667 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
668 | |
669 | x += dx | |
670 | color = "SALMON" | |
095315e2 | 671 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
672 | R.Name = color + " Rectangle" |
673 | R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) | |
095315e2 RD |
674 | Canvas.AddText("Mouse Enter", (x, y), Size = FontSize, Position = "bl") |
675 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
676 | |
677 | x += dx | |
678 | color = "MEDIUM VIOLET RED" | |
095315e2 | 679 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
680 | R.Name = color |
681 | R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) | |
095315e2 RD |
682 | Canvas.AddText("Mouse Leave", (x, y), Size = FontSize, Position = "bl") |
683 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
684 | |
685 | x = 20 | |
686 | y += dy | |
687 | color = "SKY BLUE" | |
095315e2 | 688 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color) |
42463de2 RD |
689 | R.Name = color |
690 | R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) | |
691 | R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) | |
095315e2 RD |
692 | Canvas.AddText("Enter and Leave", (x, y), Size = FontSize, Position = "bl") |
693 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
694 | |
695 | x += dx | |
696 | color = "WHEAT" | |
095315e2 | 697 | R = Canvas.AddRectangle((x, y), (w+12, h), LineColor = None, FillColor = color) |
42463de2 RD |
698 | R.Name = color |
699 | R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) | |
700 | R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) | |
095315e2 RD |
701 | Canvas.AddText("Mouse Enter&Leave", (x, y), Size = FontSize, Position = "bl") |
702 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
703 | |
704 | x += dx | |
705 | color = "KHAKI" | |
095315e2 | 706 | R = Canvas.AddRectangle((x-12, y), (w+12, h), LineColor = None, FillColor = color) |
42463de2 RD |
707 | R.Name = color |
708 | R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) | |
709 | R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) | |
0b0849b5 | 710 | Canvas.AddText("Mouse Enter&Leave", (x, y), Size = FontSize, Position = "bl") |
095315e2 | 711 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") |
42463de2 RD |
712 | |
713 | x = 20 | |
714 | y += dy | |
715 | L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red") | |
716 | L.Name = "A Line" | |
717 | L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) | |
095315e2 RD |
718 | Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "bl") |
719 | Canvas.AddText(L.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
720 | |
721 | x += dx | |
722 | color = "SEA GREEN" | |
0b0849b5 | 723 | Points = N.array(( (x, y), (x, y+2.*h/3), (x+w, y+h), (x+w, y+h/2.), (x + 2.*w/3, y+h/2.), (x + 2.*w/3,y) ), N.float_) |
42463de2 RD |
724 | R = Canvas.AddPolygon(Points, LineWidth = 2, FillColor = color) |
725 | R.Name = color + " Polygon" | |
726 | R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight) | |
095315e2 RD |
727 | Canvas.AddText("RIGHT_DOWN", (x, y), Size = FontSize, Position = "bl") |
728 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
729 | |
730 | x += dx | |
731 | color = "Red" | |
0b0849b5 | 732 | Points = N.array(( (x, y), (x, y+2.*h/3), (x+w, y+h), (x+w, y+h/2.), (x + 2.*w/3, y+h/2.), (x + 2.*w/3,y) ), N.float_) |
42463de2 RD |
733 | R = Canvas.AddPointSet(Points, Diameter = 4, Color = color) |
734 | R.Name = "PointSet" | |
735 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit) | |
095315e2 RD |
736 | Canvas.AddText("LEFT_DOWN", (x, y), Size = FontSize, Position = "bl") |
737 | Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl") | |
42463de2 RD |
738 | |
739 | x = 20 | |
740 | y += dy | |
095315e2 | 741 | T = Canvas.AddText("Hit-able Text", (x, y), Size = 15, Color = "Red", Position = 'tl') |
42463de2 RD |
742 | T.Name = "Hit-able Text" |
743 | T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) | |
095315e2 | 744 | Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "bl") |
42463de2 RD |
745 | |
746 | x += dx | |
095315e2 | 747 | T = Canvas.AddScaledText("Scaled Text", (x, y), Size = 1./2*h, Color = "Pink", Position = 'bl') |
42463de2 RD |
748 | Canvas.AddPointSet( (x, y), Diameter = 3) |
749 | T.Name = "Scaled Text" | |
750 | T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) | |
095315e2 RD |
751 | Canvas.AddText("Left Down", (x, y), Size = FontSize, Position = "tl") |
752 | ||
753 | x += dx | |
754 | color = "Cyan" | |
755 | Point = (x + w/2, y) | |
0b0849b5 | 756 | #Points = N.array(( (x, y), (x, y+2.*h/3), (x+w, y+h), (x+w, y+h/2.), (x + 2.*w/3, y+h/2.), (x + 2.*w/3,y) ), N.float_) |
095315e2 RD |
757 | R = Canvas.AddSquarePoint(Point, Size = 8, Color = color) |
758 | R.Name = "SquarePoint" | |
759 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) | |
760 | Canvas.AddText("LEFT_DOWN", (x, y), Size = FontSize, Position = "bl") | |
761 | Canvas.AddText(R.Name, (x, y), Size = FontSize, Position = "tl") | |
762 | ||
42463de2 RD |
763 | |
764 | self.Canvas.ZoomToBB() | |
765 | ||
766 | def TestHitTestForeground(self,event=None): | |
0b0849b5 | 767 | wx.GetApp().Yield(True) |
42463de2 RD |
768 | |
769 | self.UnBindAllMouseEvents() | |
770 | Canvas = self.Canvas | |
771 | ||
0b0849b5 | 772 | Canvas.InitAll() |
42463de2 RD |
773 | |
774 | #Add a Hitable rectangle | |
775 | w, h = 60, 20 | |
776 | ||
777 | dx = 80 | |
778 | dy = 40 | |
779 | x,y = 20, 20 | |
2e839e96 | 780 | |
42463de2 | 781 | color = "Red" |
095315e2 | 782 | R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color, InForeground = False) |
42463de2 RD |
783 | R.Name = color + "Rectangle" |
784 | R.HitFill = True | |
785 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) | |
095315e2 RD |
786 | Canvas.AddText("Left Click Fill", (x, y), Position = "bl") |
787 | Canvas.AddText(R.Name, (x, y+h), Position = "tl") | |
42463de2 RD |
788 | |
789 | ## A set of Rectangles that move together | |
2e839e96 | 790 | |
42463de2 RD |
791 | ## NOTE: In a real app, it might be better to create a new |
792 | ## custom FloatCanvas DrawObject | |
2e839e96 | 793 | |
42463de2 | 794 | self.MovingRects = [] |
095315e2 | 795 | WH = (w/2, h/2) |
42463de2 RD |
796 | x += dx |
797 | color = "LightBlue" | |
095315e2 | 798 | R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True) |
42463de2 RD |
799 | R.HitFill = True |
800 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveLeft) | |
095315e2 | 801 | L = Canvas.AddText("Left", (x + w/4, y + h/4), Position = "cc", InForeground = True) |
42463de2 RD |
802 | self.MovingRects.extend( (R,L) ) |
803 | ||
804 | x += w/2 | |
095315e2 | 805 | R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True) |
42463de2 RD |
806 | R.HitFill = True |
807 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveRight) | |
095315e2 | 808 | L = Canvas.AddText("Right", (x + w/4, y + h/4), Position = "cc", InForeground = True) |
42463de2 RD |
809 | self.MovingRects.extend( (R,L) ) |
810 | ||
811 | x -= w/2 | |
812 | y += h/2 | |
095315e2 | 813 | R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True) |
42463de2 RD |
814 | R.HitFill = True |
815 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveUp) | |
095315e2 | 816 | L = Canvas.AddText("Up", (x + w/4, y + h/4), Position = "cc", InForeground = True) |
42463de2 RD |
817 | self.MovingRects.extend( (R,L) ) |
818 | ||
819 | ||
820 | x += w/2 | |
095315e2 | 821 | R = Canvas.AddRectangle((x, y), WH, LineWidth = 2, FillColor = color, InForeground = True) |
42463de2 RD |
822 | R.HitFill = True |
823 | R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveDown) | |
095315e2 | 824 | L = Canvas.AddText("Down", (x + w/4, y + h/4), Position = "cc", InForeground = True) |
42463de2 RD |
825 | self.MovingRects.extend( (R,L) ) |
826 | ||
827 | self.Canvas.ZoomToBB() | |
828 | ||
829 | def RectMoveLeft(self,Object): | |
830 | self.MoveRects("left") | |
2e839e96 | 831 | |
42463de2 RD |
832 | def RectMoveRight(self,Object): |
833 | self.MoveRects("right") | |
2e839e96 | 834 | |
42463de2 RD |
835 | def RectMoveUp(self,Object): |
836 | self.MoveRects("up") | |
2e839e96 | 837 | |
42463de2 RD |
838 | def RectMoveDown(self,Object): |
839 | self.MoveRects("down") | |
2e839e96 | 840 | |
42463de2 RD |
841 | def MoveRects(self, Dir): |
842 | for Object in self.MovingRects: | |
843 | X,Y = Object.XY | |
844 | if Dir == "left": X -= 10 | |
845 | elif Dir == "right": X += 10 | |
846 | elif Dir == "up": Y += 10 | |
847 | elif Dir == "down": Y -= 10 | |
095315e2 | 848 | Object.SetPoint((X,Y)) |
42463de2 | 849 | self.Canvas.Draw() |
2e839e96 | 850 | |
42463de2 | 851 | def PointSetGotHit(self, Object): |
095315e2 | 852 | self.Log(Object.Name + "Got Hit\n") |
42463de2 RD |
853 | |
854 | def RectGotHit(self, Object): | |
095315e2 | 855 | self.Log(Object.Name + "Got Hit\n") |
42463de2 RD |
856 | |
857 | def RectGotHitRight(self, Object): | |
095315e2 | 858 | self.Log(Object.Name + "Got Hit With Right\n") |
42463de2 RD |
859 | |
860 | def RectGotHitLeft(self, Object): | |
095315e2 | 861 | self.Log(Object.Name + "Got Hit with Left\n") |
42463de2 RD |
862 | |
863 | def RectMouseOver(self, Object): | |
095315e2 | 864 | self.Log("Mouse entered:" + Object.Name) |
42463de2 RD |
865 | |
866 | def RectMouseLeave(self, Object): | |
095315e2 | 867 | self.Log("Mouse left " + Object.Name) |
42463de2 RD |
868 | |
869 | ||
870 | def TestText(self, event= None): | |
0b0849b5 | 871 | wx.GetApp().Yield(True) |
42463de2 RD |
872 | |
873 | self.BindAllMouseEvents() | |
874 | Canvas = self.Canvas | |
0b0849b5 RD |
875 | Canvas.InitAll() |
876 | ||
42463de2 | 877 | |
0b0849b5 | 878 | DefaultSize = 12 |
095315e2 | 879 | Point = (3, 0) |
42463de2 RD |
880 | |
881 | ## Add a non-visible rectangle, just to get a Bounding Box | |
882 | ## Text objects have a zero-size bounding box, because it changes with zoom | |
095315e2 RD |
883 | Canvas.AddRectangle((-10,-10), |
884 | (20,20), | |
885 | LineWidth = 1, | |
886 | LineColor = None) | |
42463de2 RD |
887 | |
888 | # Text | |
889 | String = "Some text" | |
0b0849b5 RD |
890 | self.Canvas.AddText("Top Left",Point,Size = DefaultSize,Color = "Yellow",BackgroundColor = "Blue", Position = "tl") |
891 | self.Canvas.AddText("Bottom Left",Point,Size = DefaultSize,Color = "Cyan",BackgroundColor = "Black",Position = "bl") | |
892 | self.Canvas.AddText("Top Right",Point,Size = DefaultSize,Color = "Black",BackgroundColor = "Cyan",Position = "tr") | |
893 | self.Canvas.AddText("Bottom Right",Point,Size = DefaultSize,Color = "Blue",BackgroundColor = "Yellow",Position = "br") | |
095315e2 | 894 | Canvas.AddPointSet((Point), Color = "White", Diameter = 2) |
42463de2 | 895 | |
095315e2 | 896 | Point = (3, 2) |
2e839e96 | 897 | |
095315e2 | 898 | Canvas.AddPointSet((Point), Color = "White", Diameter = 2) |
0b0849b5 RD |
899 | self.Canvas.AddText("Top Center",Point,Size = DefaultSize,Color = "Black",Position = "tc") |
900 | self.Canvas.AddText("Bottom Center",Point,Size = DefaultSize,Color = "White",Position = "bc") | |
42463de2 | 901 | |
095315e2 | 902 | Point = (3, 4) |
2e839e96 | 903 | |
095315e2 | 904 | Canvas.AddPointSet((Point), Color = "White", Diameter = 2) |
0b0849b5 RD |
905 | self.Canvas.AddText("Center Right",Point,Size = DefaultSize,Color = "Black",Position = "cr") |
906 | self.Canvas.AddText("Center Left",Point,Size = DefaultSize,Color = "Black",Position = "cl") | |
42463de2 | 907 | |
095315e2 | 908 | Point = (3, -2) |
2e839e96 | 909 | |
095315e2 RD |
910 | Canvas.AddPointSet((Point), Color = "White", Diameter = 2) |
911 | self.Canvas.AddText("Center Center", | |
0b0849b5 | 912 | Point, Size = DefaultSize, |
095315e2 RD |
913 | Color = "Black", |
914 | Position = "cc") | |
42463de2 | 915 | |
095315e2 RD |
916 | self.Canvas.AddText("40 Pixels", (-10,8), Size = 40) |
917 | self.Canvas.AddText("20 Pixels", (-10,5), Size = 20) | |
918 | self.Canvas.AddText("10 Pixels", (-10,3), Size = 10) | |
42463de2 | 919 | |
095315e2 RD |
920 | self.Canvas.AddText("MODERN Font", (-10, 0), Family = wx.MODERN) |
921 | self.Canvas.AddText("DECORATIVE Font", (-10, -1), Family = wx.DECORATIVE) | |
922 | self.Canvas.AddText("ROMAN Font", (-10, -2), Family = wx.ROMAN) | |
923 | self.Canvas.AddText("SCRIPT Font", (-10, -3), Family = wx.SCRIPT) | |
924 | self.Canvas.AddText("ROMAN BOLD Font", (-10, -4), Family = wx.ROMAN, Weight=wx.BOLD) | |
925 | self.Canvas.AddText("ROMAN ITALIC BOLD Font", (-10, -5), Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC) | |
42463de2 RD |
926 | |
927 | # NOTE: this font exists on my Linux box..who knows were else you'll find it! | |
0b0849b5 RD |
928 | Font = wx.Font(20, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "helvetica") |
929 | self.Canvas.AddText("Helvetica Italic", (-10, -6), Font = Font) | |
42463de2 RD |
930 | |
931 | self.Canvas.ZoomToBB() | |
932 | ||
933 | def TestScaledText(self, event= None): | |
0b0849b5 | 934 | wx.GetApp().Yield(True) |
42463de2 RD |
935 | |
936 | self.BindAllMouseEvents() | |
937 | Canvas = self.Canvas | |
0b0849b5 | 938 | Canvas.InitAll() |
42463de2 | 939 | |
095315e2 | 940 | Point = (0, 0) |
42463de2 | 941 | |
095315e2 RD |
942 | T = Canvas.AddScaledText("Top Left", |
943 | Point, | |
944 | Size = 5, | |
945 | Color = "Yellow", | |
946 | BackgroundColor = "Blue", | |
947 | Position = "tl") | |
948 | T = Canvas.AddScaledText("Bottom Left",Point,Size = 5,Color = "Cyan",BackgroundColor = "Black",Position = "bl") | |
949 | T = Canvas.AddScaledText("Top Right",Point,Size = 5,Color = "Black",BackgroundColor = "Cyan",Position = "tr") | |
950 | T = Canvas.AddScaledText("Bottom Right",Point,Size = 5,Color = "Blue",BackgroundColor = "Yellow",Position = "br") | |
951 | Canvas.AddPointSet((Point), Color = "Red", Diameter = 4) | |
42463de2 RD |
952 | |
953 | ||
095315e2 | 954 | Point = (0, 20) |
2e839e96 | 955 | |
095315e2 RD |
956 | Canvas.AddScaledText("Top Center",Point,Size = 7,Color = "Black",Position = "tc") |
957 | Canvas.AddScaledText("Bottom Center",Point,Size = 7,Color = "White",Position = "bc") | |
958 | Canvas.AddPointSet((Point), Color = "White", Diameter = 4) | |
42463de2 | 959 | |
095315e2 | 960 | Point = (0, -20) |
2e839e96 | 961 | |
095315e2 RD |
962 | Canvas.AddScaledText("Center Right",Point,Size = 9,Color = "Black",Position = "cr") |
963 | Canvas.AddScaledText("Center Left",Point,Size = 9,Color = "Black",Position = "cl") | |
964 | Canvas.AddPointSet((Point), Color = "White", Diameter = 4) | |
42463de2 RD |
965 | |
966 | x = -200 | |
967 | ||
095315e2 RD |
968 | self.Canvas.AddScaledText("MODERN Font", (x, 0), Size = 7, Family = wx.MODERN, Color = (0,0,0)) |
969 | self.Canvas.AddScaledText("DECORATIVE Font", (x, -10), Size = 7, Family = wx.DECORATIVE, Color = (0,0,1)) | |
970 | self.Canvas.AddScaledText("ROMAN Font", (x, -20), Size = 7, Family = wx.ROMAN) | |
971 | self.Canvas.AddScaledText("SCRIPT Font", (x, -30), Size = 7, Family = wx.SCRIPT) | |
972 | self.Canvas.AddScaledText("ROMAN BOLD Font", (x, -40), Size = 7, Family = wx.ROMAN, Weight=wx.BOLD) | |
973 | self.Canvas.AddScaledText("ROMAN ITALIC BOLD Font", (x, -50), Size = 7, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC) | |
42463de2 RD |
974 | Canvas.AddPointSet((x,0), Color = "White", Diameter = 4) |
975 | ||
976 | ||
0b0849b5 | 977 | # NOTE: this font exists on my OS-X.who knows were else you'll find it! |
095315e2 | 978 | Point = (-100, 50) |
0b0849b5 RD |
979 | Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "helvetica") |
980 | T = self.Canvas.AddScaledText("Helvetica Italic", Point, Size = 20, Font = Font, Position = 'bc') | |
42463de2 | 981 | |
095315e2 | 982 | Point = (-50, -50) |
0b0849b5 RD |
983 | Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "times") |
984 | T = self.Canvas.AddScaledText("Times Font", Point, Size = 8, Font = Font) | |
095315e2 RD |
985 | |
986 | self.Canvas.ZoomToBB() | |
987 | ||
988 | def TestScaledTextBox(self, event= None): | |
0b0849b5 | 989 | wx.GetApp().Yield(True) |
095315e2 RD |
990 | |
991 | self.UnBindAllMouseEvents() | |
992 | Canvas = self.Canvas | |
0b0849b5 | 993 | Canvas.InitAll() |
095315e2 RD |
994 | |
995 | Point = (45,40) | |
996 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
997 | Point, | |
998 | 2, | |
999 | Color = "Black", | |
1000 | BackgroundColor = None, | |
1001 | LineColor = "Red", | |
1002 | LineStyle = "Solid", | |
1003 | LineWidth = 1, | |
1004 | Width = None, | |
1005 | PadSize = 5, | |
1006 | Family = wx.ROMAN, | |
1007 | Style = wx.NORMAL, | |
1008 | Weight = wx.NORMAL, | |
0b0849b5 | 1009 | Underlined = False, |
095315e2 RD |
1010 | Position = 'br', |
1011 | Alignment = "left", | |
1012 | InForeground = False) | |
1013 | ||
1014 | # All defaults | |
1015 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
1016 | Point, | |
1017 | 2) | |
1018 | ||
1019 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
1020 | Point, | |
1021 | 2, | |
1022 | BackgroundColor = "Yellow", | |
1023 | LineColor = "Red", | |
1024 | LineStyle = "Solid", | |
1025 | PadSize = 5, | |
1026 | Family = wx.TELETYPE, | |
1027 | Position = 'bl') | |
1028 | ||
1029 | Box = Canvas.AddScaledTextBox("A String\nThis box is clickable", | |
1030 | Point, | |
1031 | 2, | |
1032 | BackgroundColor = "Yellow", | |
1033 | LineColor = "Red", | |
1034 | LineStyle = "Solid", | |
1035 | PadSize = 5, | |
1036 | Family = wx.TELETYPE, | |
1037 | Position = 'tr') | |
1038 | ||
1039 | Box.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.binding2) | |
1040 | ||
1041 | Canvas.AddPoint(Point, Diameter = 4) | |
1042 | ||
1043 | Point = (45,15) | |
1044 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
1045 | Point, | |
1046 | 2, | |
1047 | Color = "Black", | |
1048 | BackgroundColor = 'Red', | |
1049 | LineColor = "Blue", | |
1050 | LineStyle = "LongDash", | |
1051 | LineWidth = 2, | |
1052 | Width = None, | |
1053 | PadSize = 5, | |
1054 | Family = wx.TELETYPE, | |
1055 | Style = wx.NORMAL, | |
1056 | Weight = wx.NORMAL, | |
0b0849b5 | 1057 | Underlined = False, |
095315e2 RD |
1058 | Position = 'cr', |
1059 | Alignment = "left", | |
1060 | InForeground = False) | |
1061 | ||
1062 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
1063 | Point, | |
1064 | 1.5, | |
1065 | Color = "Black", | |
1066 | BackgroundColor = 'Red', | |
1067 | LineColor = "Blue", | |
1068 | LineStyle = "LongDash", | |
1069 | LineWidth = 2, | |
1070 | Width = None, | |
1071 | PadSize = 5, | |
1072 | Family = wx.TELETYPE, | |
1073 | Style = wx.NORMAL, | |
1074 | Weight = wx.NORMAL, | |
0b0849b5 | 1075 | Underlined = False, |
095315e2 RD |
1076 | Position = 'cl', |
1077 | Alignment = "left", | |
1078 | InForeground = False) | |
1079 | ||
1080 | Canvas.AddPoint(Point, Diameter = 4) | |
1081 | ||
1082 | Point = (45,-10) | |
1083 | Box = Canvas.AddScaledTextBox("A Two Line\nString", | |
1084 | Point, | |
1085 | 2, | |
1086 | Color = "Black", | |
1087 | BackgroundColor = 'Red', | |
1088 | LineColor = "Blue", | |
1089 | LineStyle = "LongDash", | |
1090 | LineWidth = 2, | |
1091 | Width = None, | |
1092 | PadSize = 3, | |
1093 | Family = wx.TELETYPE, | |
1094 | Style = wx.NORMAL, | |
1095 | Weight = wx.NORMAL, | |
0b0849b5 | 1096 | Underlined = False, |
095315e2 RD |
1097 | Position = 'tc', |
1098 | Alignment = "left", | |
1099 | InForeground = False) | |
1100 | ||
1101 | Box = Canvas.AddScaledTextBox("A three\nLine\nString", | |
1102 | Point, | |
1103 | 1.5, | |
1104 | Color = "Black", | |
1105 | BackgroundColor = 'Red', | |
1106 | LineColor = "Blue", | |
1107 | LineStyle = "LongDash", | |
1108 | LineWidth = 2, | |
1109 | Width = None, | |
1110 | PadSize = 0.5, | |
1111 | Family = wx.TELETYPE, | |
1112 | Style = wx.NORMAL, | |
1113 | Weight = wx.NORMAL, | |
0b0849b5 | 1114 | Underlined = False, |
095315e2 RD |
1115 | Position = 'bc', |
1116 | Alignment = "left", | |
1117 | InForeground = False) | |
1118 | ||
1119 | ||
1120 | Canvas.AddPoint(Point, Diameter = 4) | |
1121 | ||
1122 | Box = Canvas.AddScaledTextBox("Some Auto Wrapped Text. There is enough to do.", | |
1123 | (80,40), | |
1124 | 2, | |
1125 | BackgroundColor = 'White', | |
1126 | LineWidth = 2, | |
1127 | Width = 20, | |
1128 | PadSize = 0.5, | |
1129 | Family = wx.TELETYPE, | |
1130 | ) | |
1131 | ||
1132 | Box = Canvas.AddScaledTextBox("Some more auto wrapped text. Wrapped to a different width.\n\nThis is another paragraph.", | |
1133 | (80,20), | |
1134 | 2, | |
1135 | BackgroundColor = 'White', | |
1136 | LineWidth = 2, | |
1137 | Width = 40, | |
1138 | PadSize = 0.5, | |
1139 | Family = wx.ROMAN, | |
1140 | Alignment = "right" | |
1141 | ) | |
0b0849b5 | 1142 | Point = N.array((100, -20), N.float_) |
095315e2 RD |
1143 | Box = Canvas.AddScaledTextBox("Here is even more auto wrapped text. This time the line spacing is set to 0.8. \n\nThe Padding is set to 0.", |
1144 | Point, | |
1145 | Size = 3, | |
1146 | BackgroundColor = 'White', | |
1147 | LineWidth = 1, | |
1148 | Width = 40, | |
1149 | PadSize = 0.0, | |
1150 | Family = wx.ROMAN, | |
1151 | Position = "cc", | |
1152 | LineSpacing = 0.8 | |
1153 | ) | |
1154 | Canvas.AddPoint(Point, "Red", 2) | |
1155 | ||
0b0849b5 RD |
1156 | Point = N.array((0, -40), N.float_) |
1157 | # Point = N.array((0, 0), N.float_) | |
095315e2 RD |
1158 | for Position in ["tl", "bl", "tr", "br"]: |
1159 | # for Position in ["br"]: | |
1160 | Box = Canvas.AddScaledTextBox("Here is a\nfour liner\nanother line\nPosition=%s"%Position, | |
1161 | Point, | |
1162 | Size = 4, | |
1163 | Color = "Red", | |
1164 | BackgroundColor = None,#'LightBlue', | |
1165 | LineWidth = 1, | |
1166 | LineColor = "White", | |
1167 | Width = None, | |
1168 | PadSize = 2, | |
1169 | Family = wx.ROMAN, | |
1170 | Position = Position, | |
1171 | LineSpacing = 0.8 | |
1172 | ) | |
1173 | Canvas.AddPoint(Point, "Red", 4) | |
1174 | ||
0b0849b5 | 1175 | Point = N.array((-20, 60), N.float_) |
095315e2 RD |
1176 | Box = Canvas.AddScaledTextBox("Here is some\ncentered\ntext", |
1177 | Point, | |
1178 | Size = 4, | |
1179 | Color = "Red", | |
1180 | BackgroundColor = 'LightBlue', | |
1181 | LineWidth = 1, | |
1182 | LineColor = "White", | |
1183 | Width = None, | |
1184 | PadSize = 2, | |
1185 | Family = wx.ROMAN, | |
1186 | Position = "tl", | |
1187 | Alignment = "center", | |
1188 | LineSpacing = 0.8 | |
1189 | ) | |
1190 | ||
0b0849b5 | 1191 | Point = N.array((-20, 20), N.float_) |
095315e2 RD |
1192 | Box = Canvas.AddScaledTextBox("Here is some\nright aligned\ntext", |
1193 | Point, | |
1194 | Size = 4, | |
1195 | Color = "Red", | |
1196 | BackgroundColor = 'LightBlue', | |
1197 | LineColor = None, | |
1198 | Width = None, | |
1199 | PadSize = 2, | |
1200 | Family = wx.ROMAN, | |
1201 | Position = "tl", | |
1202 | Alignment = "right", | |
1203 | LineSpacing = 0.8 | |
1204 | ) | |
1205 | ||
0b0849b5 | 1206 | Point = N.array((100, -60), N.float_) |
095315e2 RD |
1207 | Box = Canvas.AddScaledTextBox("Here is some auto wrapped text. This time it is centered, rather than right aligned.\n\nThe Padding is set to 2.", |
1208 | Point, | |
1209 | Size = 3, | |
1210 | BackgroundColor = 'White', | |
1211 | LineWidth = 1, | |
1212 | Width = 40, | |
1213 | PadSize = 2.0, | |
1214 | Family = wx.ROMAN, | |
1215 | Position = "cc", | |
1216 | LineSpacing = 0.8, | |
1217 | Alignment = 'center', | |
1218 | ) | |
1219 | ||
1220 | ||
1221 | ||
1222 | ||
1223 | self.Canvas.ZoomToBB() | |
1224 | ||
1225 | def binding2(self, event): | |
1226 | self.Log("I'm the TextBox") | |
1227 | ||
1228 | def TestBitmap(self, event= None): | |
0b0849b5 | 1229 | wx.GetApp().Yield(True) |
095315e2 RD |
1230 | |
1231 | self.UnBindAllMouseEvents() | |
1232 | Canvas = self.Canvas | |
0b0849b5 RD |
1233 | Canvas.InitAll() |
1234 | ||
095315e2 RD |
1235 | Canvas.AddRectangle((10, 20), |
1236 | (400, 100), | |
1237 | LineWidth = 3, | |
1238 | LineColor = "Blue", | |
1239 | FillColor = "Red") | |
1240 | ||
1241 | bmp = Resources.getMagPlusBitmap() | |
1242 | ||
1243 | Canvas.AddText("These are Unscaled Bitmaps:", (140, 90)) | |
1244 | ||
1245 | Point = (150, 50) | |
1246 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "cc" ) | |
1247 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1248 | ||
1249 | Point = (200, 50) | |
1250 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "br" ) | |
1251 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1252 | ||
1253 | Point = (200, 50) | |
1254 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "bl" ) | |
1255 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1256 | ||
1257 | Point = (200, 50) | |
1258 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "tr" ) | |
1259 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1260 | ||
1261 | Point = (200, 50) | |
1262 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "tl" ) | |
1263 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1264 | ||
1265 | Point = (250, 50) | |
1266 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "cr" ) | |
1267 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1268 | ||
1269 | Point = (250, 50) | |
1270 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "cl" ) | |
1271 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1272 | ||
1273 | Point = (300, 50) | |
1274 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "tc" ) | |
1275 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1276 | ||
1277 | Point = (300, 50) | |
1278 | BitMap = Canvas.AddBitmap(bmp, Point, Position = "bc" ) | |
1279 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1280 | ||
1281 | Canvas.AddScaledText("These are Scaled Bitmaps:", (220, -60), Size = 10, Position = "tr") | |
1282 | Point = (250, -100) | |
1283 | BitMap = Canvas.AddScaledBitmap(bmp, Point, Height = 50, Position = "bc" ) | |
1284 | BitMap = Canvas.AddScaledBitmap(bmp, Point, Height = 50, Position = "tc" ) | |
1285 | Canvas.AddPoint(Point, Diameter=4, Color="Green") | |
1286 | ||
1287 | Point = (300, -100) | |
1288 | BitMap = Canvas.AddScaledBitmap(Resources.getMondrianImage(), Point, Height = 50) | |
42463de2 | 1289 | |
8b9a4190 | 1290 | self.Canvas.ZoomToBB() |
2e839e96 | 1291 | |
8b9a4190 | 1292 | def DrawMap(self,event = None): |
0b0849b5 | 1293 | wx.GetApp().Yield(True) |
8b9a4190 | 1294 | import os, time |
0b0849b5 RD |
1295 | |
1296 | self.Canvas.InitAll() | |
1297 | self.Canvas.SetProjectionFun("FlatEarth") | |
42463de2 | 1298 | self.BindAllMouseEvents() |
2e839e96 | 1299 | |
8b9a4190 | 1300 | ## Test of Actual Map Data |
42463de2 | 1301 | #start = time.clock() |
095315e2 | 1302 | self.Log("Loading Map from a File") |
0b0849b5 | 1303 | wx.GetApp().Yield(True) # so log text will get displayed now. |
2a0495c9 | 1304 | Shorelines = self.Read_MapGen(os.path.join("data",'world.dat'),stats = 0) |
42463de2 RD |
1305 | #print "It took %f seconds to load %i shorelines"%(time.clock() - start,len(Shorelines) ) |
1306 | #start = time.clock() | |
8b9a4190 | 1307 | for segment in Shorelines: |
42463de2 RD |
1308 | self.Canvas.AddLine(segment) |
1309 | #print "It took %f seconds to add %i shorelines"%(time.clock() - start,len(Shorelines) ) | |
1310 | #start = time.clock() | |
8b9a4190 | 1311 | self.Canvas.ZoomToBB() |
42463de2 | 1312 | #print "It took %f seconds to draw %i shorelines"%(time.clock() - start,len(Shorelines) ) |
2e839e96 RD |
1313 | |
1314 | ||
0b0849b5 | 1315 | |
8b9a4190 | 1316 | def LineTest(self,event = None): |
0b0849b5 | 1317 | wx.GetApp().Yield(True) |
8b9a4190 | 1318 | import os, time |
42463de2 RD |
1319 | # import random |
1320 | colors = self.colors | |
8b9a4190 RD |
1321 | Range = (-10,10) |
1322 | ## Test of drawing lots of lines | |
42463de2 | 1323 | Canvas = self.Canvas |
0b0849b5 RD |
1324 | Canvas.InitAll() |
1325 | #start = time.clock() | |
8b9a4190 RD |
1326 | linepoints = [] |
1327 | linecolors = [] | |
1328 | linewidths = [] | |
1329 | for i in range(2000): | |
1330 | points = (random.randint(Range[0],Range[1]), | |
1331 | random.randint(Range[0],Range[1]), | |
1332 | random.randint(Range[0],Range[1]), | |
1333 | random.randint(Range[0],Range[1])) | |
1334 | linepoints.append(points) | |
1335 | linewidths.append(random.randint(1,10) ) | |
1336 | linecolors.append(random.randint(0,len(colors)-1) ) | |
1337 | for (points,color,width) in zip(linepoints,linecolors,linewidths): | |
42463de2 RD |
1338 | Canvas.AddLine((points[0:2],points[2:4]), LineWidth = width, LineColor = colors[color]) |
1339 | #print "It took %f seconds to add %i lines"%(time.clock() - start,len(linepoints) ) | |
1340 | #start = time.clock() | |
1341 | Canvas.ZoomToBB() | |
1342 | #print "It took %f seconds to draw %i lines"%(time.clock() - start,len(linepoints) ) | |
1343 | ||
0b0849b5 RD |
1344 | def ArrowLineTest(self,event = None): |
1345 | wx.GetApp().Yield(True) | |
1346 | Canvas = self.Canvas | |
1347 | Canvas.InitAll() | |
1348 | # import os, time | |
1349 | ## import random | |
1350 | Range = (-100,100) | |
1351 | colors = self.colors | |
1352 | ||
1353 | # Lines | |
1354 | for i in range(5): | |
1355 | points = [] | |
1356 | for j in range(random.randint(2,10)): | |
1357 | point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) | |
1358 | points.append(point) | |
1359 | lw = random.randint(1,4) | |
1360 | cf = random.randint(0,len(colors)-1) | |
1361 | cl = random.randint(0,len(colors)-1) | |
1362 | al = random.randint(8,20) | |
1363 | aa = random.randint(20,90) | |
1364 | Canvas.AddArrowLine(points, | |
1365 | LineWidth = lw, | |
1366 | LineColor = colors[cl], | |
1367 | ArrowHeadSize = al, | |
1368 | ArrowHeadAngle = aa) | |
1369 | ||
1370 | Canvas.ZoomToBB() | |
1371 | ||
42463de2 | 1372 | def SpeedTest(self,event=None): |
0b0849b5 | 1373 | wx.GetApp().Yield(True) |
42463de2 RD |
1374 | BigRange = (-1000,1000) |
1375 | colors = self.colors | |
1376 | ||
1377 | self.UnBindAllMouseEvents() | |
1378 | Canvas = self.Canvas | |
1379 | ||
0b0849b5 RD |
1380 | Canvas.InitAll() |
1381 | ||
5e1796ef | 1382 | # Pointset |
42463de2 | 1383 | coords = [] |
5e1796ef | 1384 | for i in range(1000): |
095315e2 RD |
1385 | Point = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1])) |
1386 | coords.append( (Point) ) | |
5e1796ef | 1387 | print "Drawing the Points" |
8b9a4190 | 1388 | start = time.clock() |
5e1796ef RD |
1389 | for Point in coords: |
1390 | Canvas.AddPoint(Point, Diameter = 4) | |
1391 | print "It took %s seconds to add the points"%(time.clock() - start) | |
1392 | Canvas.ZoomToBB() | |
1393 | ||
1394 | def PropertiesChangeTest(self,event=None): | |
0b0849b5 | 1395 | wx.GetApp().Yield(True) |
5e1796ef RD |
1396 | |
1397 | Range = (-10,10) | |
1398 | colors = self.colors | |
1399 | ||
1400 | self.UnBindAllMouseEvents() | |
1401 | Canvas = self.Canvas | |
1402 | ||
0b0849b5 RD |
1403 | Canvas.InitAll() |
1404 | ||
5e1796ef RD |
1405 | self.ColorObjectsAll = [] |
1406 | self.ColorObjectsLine = [] | |
1407 | self.ColorObjectsColor = [] | |
1408 | self.ColorObjectsText = [] | |
1409 | ##One of each object: | |
1410 | # Rectangle | |
095315e2 | 1411 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
5e1796ef RD |
1412 | lw = random.randint(1,5) |
1413 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
1414 | wh = ( random.randint(1,5), random.randint(1,5) ) |
1415 | self.Rectangle = Canvas.AddRectangle(Point, wh, LineWidth = lw, FillColor = colors[cf]) | |
5e1796ef | 1416 | self.ColorObjectsAll.append(self.Rectangle) |
2e839e96 | 1417 | |
5e1796ef | 1418 | # Ellipse |
095315e2 | 1419 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
5e1796ef RD |
1420 | lw = random.randint(1,5) |
1421 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
1422 | wh = ( random.randint(1,5), random.randint(1,5) ) |
1423 | self.Ellipse = Canvas.AddEllipse(Point, wh, LineWidth = lw, FillColor = colors[cf]) | |
5e1796ef | 1424 | self.ColorObjectsAll.append(self.Ellipse) |
2e839e96 | 1425 | |
5e1796ef RD |
1426 | # Point |
1427 | xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
1428 | D = random.randint(1,50) | |
1429 | lw = random.randint(1,5) | |
1430 | cf = random.randint(0,len(colors)-1) | |
1431 | cl = random.randint(0,len(colors)-1) | |
1432 | self.ColorObjectsColor.append(Canvas.AddPoint(xy, colors[cf], D)) | |
2e839e96 | 1433 | |
5e1796ef | 1434 | # Circle |
095315e2 | 1435 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
5e1796ef RD |
1436 | D = random.randint(1,5) |
1437 | lw = random.randint(1,5) | |
1438 | cf = random.randint(0,len(colors)-1) | |
1439 | cl = random.randint(0,len(colors)-1) | |
095315e2 | 1440 | self.Circle = Canvas.AddCircle(Point, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf]) |
5e1796ef RD |
1441 | self.ColorObjectsAll.append(self.Circle) |
1442 | ||
1443 | # Line | |
1444 | points = [] | |
1445 | for j in range(random.randint(2,10)): | |
1446 | point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1])) | |
1447 | points.append(point) | |
1448 | lw = random.randint(1,10) | |
1449 | cf = random.randint(0,len(colors)-1) | |
1450 | cl = random.randint(0,len(colors)-1) | |
1451 | self.ColorObjectsLine.append(Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])) | |
2e839e96 | 1452 | |
5e1796ef RD |
1453 | # Polygon |
1454 | ## points = [] | |
1455 | ## for j in range(random.randint(2,6)): | |
1456 | ## point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
1457 | ## points.append(point) | |
1458 | points = RandomArray.uniform(Range[0],Range[1],(6,2)) | |
1459 | lw = random.randint(1,6) | |
1460 | cf = random.randint(0,len(colors)-1) | |
1461 | cl = random.randint(0,len(colors)-1) | |
1462 | self.ColorObjectsAll.append(Canvas.AddPolygon(points, | |
1463 | LineWidth = lw, | |
1464 | LineColor = colors[cl], | |
1465 | FillColor = colors[cf], | |
1466 | FillStyle = 'Solid')) | |
2e839e96 | 1467 | |
5e1796ef RD |
1468 | ## Pointset |
1469 | points = RandomArray.uniform(Range[0],Range[1],(100,2)) | |
1470 | cf = random.randint(0,len(colors)-1) | |
1471 | D = random.randint(1,4) | |
1472 | self.PointSet = Canvas.AddPointSet(points, Color = colors[cf], Diameter = D) | |
1473 | self.ColorObjectsColor.append(self.PointSet) | |
2e839e96 | 1474 | |
5e1796ef RD |
1475 | ## Point |
1476 | point = RandomArray.uniform(Range[0],Range[1],(2,)) | |
1477 | cf = random.randint(0,len(colors)-1) | |
1478 | D = random.randint(1,4) | |
1479 | self.Point = Canvas.AddPoint(point, Color = colors[cf], Diameter = D) | |
1480 | self.ColorObjectsColor.append(self.Point) | |
2e839e96 | 1481 | |
5e1796ef RD |
1482 | # Text |
1483 | String = "Unscaled text" | |
1484 | ts = random.randint(10,40) | |
1485 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
1486 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
1487 | self.ColorObjectsText.append(Canvas.AddText(String, Point, Size = ts, Color = colors[cf], Position = "cc")) | |
5e1796ef RD |
1488 | |
1489 | # Scaled Text | |
1490 | String = "Scaled text" | |
1491 | ts = random.random()*3 + 0.2 | |
1492 | cf = random.randint(0,len(colors)-1) | |
095315e2 RD |
1493 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
1494 | self.ColorObjectsText.append(Canvas.AddScaledText(String, Point, Size = ts, Color = colors[cf], Position = "cc")) | |
42463de2 | 1495 | |
5e1796ef | 1496 | # A "Button" |
095315e2 | 1497 | Button = Canvas.AddRectangle((-10, -12), (20, 3), LineStyle = None, FillColor = "Red") |
5e1796ef | 1498 | Canvas.AddScaledText("Click Here To Change Properties", |
095315e2 | 1499 | (0, -10.5), |
5e1796ef RD |
1500 | Size = 0.7, |
1501 | Color = "Black", | |
1502 | Position = "cc") | |
1503 | ||
1504 | Button.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ChangeProperties) | |
42463de2 RD |
1505 | |
1506 | Canvas.ZoomToBB() | |
1507 | ||
5e1796ef RD |
1508 | def ChangeProperties(self, Object = None): |
1509 | colors = self.colors | |
1510 | Range = (-10,10) | |
1511 | ||
1512 | for Object in self.ColorObjectsAll: | |
1513 | pass | |
1514 | Object.SetFillColor(colors[random.randint(0,len(colors)-1)]) | |
1515 | Object.SetLineColor(colors[random.randint(0,len(colors)-1)]) | |
1516 | Object.SetLineWidth(random.randint(1,7)) | |
1517 | Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)]) | |
1518 | for Object in self.ColorObjectsLine: | |
1519 | Object.SetLineColor(colors[random.randint(0,len(colors)-1)]) | |
1520 | Object.SetLineWidth(random.randint(1,7)) | |
1521 | Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)]) | |
1522 | for Object in self.ColorObjectsColor: | |
1523 | Object.SetColor(colors[random.randint(0,len(colors)-1)]) | |
1524 | for Object in self.ColorObjectsText: | |
1525 | Object.SetColor(colors[random.randint(0,len(colors)-1)]) | |
1526 | Object.SetBackgroundColor(colors[random.randint(0,len(colors)-1)]) | |
1527 | self.Circle.SetDiameter(random.randint(1,10)) | |
1528 | self.PointSet.SetDiameter(random.randint(1,8)) | |
1529 | self.Point.SetDiameter(random.randint(1,8)) | |
1530 | for Object in (self.Rectangle, self.Ellipse): | |
095315e2 RD |
1531 | Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) |
1532 | wh = ( random.randint(1,5), random.randint(1,5) ) | |
1533 | Object.SetShape(Point, wh) | |
2a0495c9 RD |
1534 | self.Canvas.Draw(Force = True) |
1535 | ||
1536 | def ArrowTest(self,event=None): | |
0b0849b5 | 1537 | wx.GetApp().Yield(True) |
2a0495c9 RD |
1538 | self.UnBindAllMouseEvents() |
1539 | Canvas = self.Canvas | |
1540 | ||
0b0849b5 RD |
1541 | Canvas.InitAll() |
1542 | Canvas.MinScale = 15 | |
1543 | Canvas.MaxScale = 30 | |
1544 | ||
2a0495c9 | 1545 | # put in a rectangle to get a bounding box |
095315e2 | 1546 | Canvas.AddRectangle((0,0), (20,20), LineColor = None) |
2a0495c9 RD |
1547 | |
1548 | # Draw some Arrows | |
1549 | Canvas.AddArrow((10,10),Length = 40, Direction = 0) | |
1550 | Canvas.AddArrow((10,10),Length = 50, Direction = 45 ,LineWidth = 2, LineColor = "Black", ArrowHeadAngle = 20) | |
1551 | Canvas.AddArrow((10,10),Length = 60, Direction = 90 ,LineWidth = 3, LineColor = "Red", ArrowHeadAngle = 30) | |
1552 | Canvas.AddArrow((10,10),Length = 70, Direction = 135,LineWidth = 4, LineColor = "Red", ArrowHeadAngle = 40) | |
1553 | Canvas.AddArrow((10,10),Length = 80, Direction = 180,LineWidth = 5, LineColor = "Blue", ArrowHeadAngle = 50) | |
1554 | Canvas.AddArrow((10,10),Length = 90, Direction = 225,LineWidth = 4, LineColor = "Blue", ArrowHeadAngle = 60) | |
1555 | Canvas.AddArrow((10,10),Length = 100,Direction = 270,LineWidth = 3, LineColor = "Green", ArrowHeadAngle = 70) | |
1556 | Canvas.AddArrow((10,10),Length = 110,Direction = 315,LineWidth = 2, LineColor = "Green", ArrowHeadAngle = 90 ) | |
1557 | ||
095315e2 | 1558 | Canvas.AddText("Clickable Arrow", (4,18), Position = "bc") |
2a0495c9 | 1559 | Arrow = Canvas.AddArrow((4,18), 80, Direction = 90 ,LineWidth = 3, LineColor = "Red", ArrowHeadAngle = 30) |
0b0849b5 | 1560 | Arrow.HitLineWidth = 6 |
2a0495c9 RD |
1561 | Arrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ArrowClicked) |
1562 | ||
0b0849b5 | 1563 | Canvas.AddText("Changable Arrow: try clicking it", (16,4), Position = "tc") |
2a0495c9 | 1564 | self.RotArrow = Canvas.AddArrow((16,4), 80, Direction = 0 ,LineWidth = 3, LineColor = "Green", ArrowHeadAngle = 30) |
0b0849b5 | 1565 | self.RotArrow.HitLineWidth = 6 |
2a0495c9 RD |
1566 | self.RotArrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RotateArrow) |
1567 | ||
2a0495c9 RD |
1568 | Canvas.ZoomToBB() |
1569 | ||
1570 | def ArrowClicked(self,event): | |
0b0849b5 | 1571 | self.Log("The Arrow was Clicked") |
2a0495c9 RD |
1572 | |
1573 | def RotateArrow(self,event): | |
095315e2 | 1574 | ##print "The Changeable Arrow was Clicked" |
2a0495c9 RD |
1575 | ## You can do them either one at a time, or both at once |
1576 | ## Doing them both at once prevents the arrow points from being calculated twice | |
1577 | #self.RotArrow.SetDirection(self.RotArrow.Direction + random.uniform(-90,90)) | |
1578 | #self.RotArrow.SetLength(self.RotArrow.Length + random.randint(-20,20)) | |
1579 | self.RotArrow.SetLengthDirection(self.RotArrow.Length + random.randint(-20,20), | |
1580 | self.RotArrow.Direction + random.uniform(-90,90) ) | |
2e839e96 | 1581 | |
5e1796ef | 1582 | self.Canvas.Draw(Force = True) |
42463de2 | 1583 | |
095315e2 | 1584 | def HideTest(self, event=None): |
0b0849b5 | 1585 | wx.GetApp().Yield(True) |
095315e2 RD |
1586 | |
1587 | self.UnBindAllMouseEvents() | |
1588 | Canvas = self.Canvas | |
0b0849b5 RD |
1589 | Canvas.InitAll() |
1590 | ||
095315e2 RD |
1591 | Range = (-10,10) |
1592 | ||
1593 | # Create a couple random Polygons | |
1594 | points = [] | |
1595 | for j in range(6): | |
1596 | point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
1597 | points.append(point) | |
1598 | Poly = Canvas.AddPolygon(points, | |
1599 | LineWidth = 2, | |
1600 | LineColor = "Black", | |
1601 | FillColor = "LightBlue", | |
1602 | FillStyle = 'Solid') | |
1603 | ||
1604 | points = [] | |
1605 | for j in range(6): | |
1606 | point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
1607 | points.append(point) | |
1608 | Poly2 = Canvas.AddPolygon(points, | |
1609 | LineWidth = 2, | |
1610 | LineColor = "Black", | |
1611 | FillColor = "Purple", | |
1612 | FillStyle = 'Solid', | |
1613 | InForeground = True) | |
1614 | ||
1615 | HideButton = Canvas.AddScaledTextBox("Click To Hide\nBackground Polygon", | |
1616 | (-10, 0), | |
1617 | .5, | |
1618 | BackgroundColor="Red", | |
1619 | PadSize = 0.5, | |
1620 | Position = 'tr', | |
1621 | Alignment="center", | |
1622 | ) | |
1623 | HideButton.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.HidePoly) | |
1624 | HideButton.HidePoly = Poly | |
1625 | ||
1626 | HideButton2 = Canvas.AddScaledTextBox("Click To Hide\nForeground Polygon", | |
1627 | (-10, 5), | |
1628 | .5, | |
1629 | BackgroundColor="Red", | |
1630 | PadSize = 0.5, | |
1631 | Position = 'tr', | |
1632 | Alignment="center", | |
1633 | ) | |
1634 | # Put a reference to the Polygon in the Button object | |
1635 | HideButton2.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.HidePoly) | |
1636 | HideButton2.HidePoly = Poly2 | |
1637 | ||
1638 | ||
1639 | Canvas.ZoomToBB() | |
1640 | ||
1641 | def HidePoly(self, Button): | |
1642 | Poly = Button.HidePoly | |
0b0849b5 | 1643 | |
095315e2 | 1644 | if Poly.Visible: |
0b0849b5 | 1645 | Poly.Visible = False |
095315e2 RD |
1646 | Button.SetText(Button.String.replace("Hide","Show")) |
1647 | else: | |
0b0849b5 | 1648 | Poly.Visible = True |
095315e2 RD |
1649 | Button.SetText(Button.String.replace("Show", "Hide")) |
1650 | self.Canvas.Draw(True) | |
1651 | ||
0b0849b5 | 1652 | |
42463de2 | 1653 | def TempTest(self, event= None): |
0b0849b5 RD |
1654 | """ |
1655 | ||
1656 | This is the start of a poly editor test, but it's not complete | |
1657 | so you can only run it through a command line flag: | |
1658 | ||
1659 | python FloatCanvasDemo.py --temp | |
1660 | ||
1661 | """ | |
1662 | ||
1663 | wx.GetApp().Yield(True) | |
42463de2 RD |
1664 | |
1665 | self.UnBindAllMouseEvents() | |
1666 | Canvas = self.Canvas | |
0b0849b5 RD |
1667 | Canvas.InitAll() |
1668 | ||
42463de2 RD |
1669 | Range = (-10,10) |
1670 | ||
1671 | # Create a random Polygon | |
1672 | points = [] | |
1673 | for j in range(6): | |
1674 | point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) | |
1675 | points.append(point) | |
1676 | Poly = Canvas.AddPolygon(points, | |
1677 | LineWidth = 2, | |
1678 | LineColor = "Black", | |
1679 | FillColor = "LightBlue", | |
1680 | FillStyle = 'Solid') | |
1681 | ||
1682 | Poly.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPoly) | |
1683 | ||
1684 | self.SelectedPoly = None | |
1685 | self.SelectPoints = [] | |
1686 | self.SelectedPoint = None | |
2e839e96 | 1687 | |
42463de2 RD |
1688 | Canvas.ZoomToBB() |
1689 | ||
1690 | def SelectPoly(self, Object): | |
42463de2 RD |
1691 | Canvas = self.Canvas |
1692 | if Object is self.SelectedPoly: | |
1693 | pass | |
1694 | else: | |
1695 | #fixme: Do something to unselect the old one | |
1696 | self.SelectedPoly = Object | |
1697 | Canvas.RemoveObjects(self.SelectPoints) | |
1698 | self.SelectPoints = [] | |
1699 | # Draw points on the Vertices of the Selected Poly: | |
1700 | for i, point in enumerate(Object.Points): | |
1701 | P = Canvas.AddPointSet(point, Diameter = 6, Color = "Red") | |
1702 | P.VerticeNum = i | |
1703 | P.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPointHit) | |
1704 | self.SelectPoints.append(P) | |
1705 | #Canvas.ZoomToBB() | |
1706 | Canvas.Draw() | |
1707 | ||
1708 | def SelectPointHit(self, Point): | |
0b0849b5 | 1709 | self.Log("Point Num: %i Hit"%Point.VerticeNum) |
42463de2 RD |
1710 | self.SelectedPoint = Point |
1711 | ||
2a0495c9 RD |
1712 | def Read_MapGen(self, filename, stats = 0,AllLines=0): |
1713 | """ | |
1714 | This function reads a MapGen Format file, and | |
1715 | returns a list of NumPy arrays with the line segments in them. | |
1716 | ||
1717 | Each NumPy array in the list is an NX2 array of Python Floats. | |
1718 | ||
1719 | The demo should have come with a file, "world.dat" that is the | |
1720 | shorelines of the whole world, in MapGen format. | |
2e839e96 | 1721 | |
2a0495c9 RD |
1722 | """ |
1723 | import string | |
1724 | file = open(filename,'rt') | |
1725 | data = file.readlines() | |
1726 | data = map(string.strip,data) | |
1727 | ||
1728 | Shorelines = [] | |
1729 | segment = [] | |
1730 | for line in data: | |
1731 | if line: | |
1732 | if line == "# -b": #New segment beginning | |
0b0849b5 | 1733 | if segment: Shorelines.append(N.array(segment)) |
2a0495c9 RD |
1734 | segment = [] |
1735 | else: | |
1736 | segment.append(map(float,string.split(line))) | |
0b0849b5 | 1737 | if segment: Shorelines.append(N.array(segment)) |
2a0495c9 RD |
1738 | |
1739 | if stats: | |
1740 | NumSegments = len(Shorelines) | |
1741 | NumPoints = 0 | |
1742 | for segment in Shorelines: | |
1743 | NumPoints = NumPoints + len(segment) | |
1744 | AvgPoints = NumPoints / NumSegments | |
1745 | print "Number of Segments: ", NumSegments | |
1746 | print "Average Number of Points per segment: ",AvgPoints | |
1747 | if AllLines: | |
1748 | Lines = [] | |
1749 | for segment in Shorelines: | |
1750 | Lines.append(segment[0]) | |
1751 | for point in segment[1:-1]: | |
1752 | Lines.append(point) | |
1753 | Lines.append(point) | |
1754 | Lines.append(segment[-1]) | |
1755 | return Lines | |
1756 | else: | |
1757 | return Shorelines | |
1758 | return DrawFrame | |
1759 | ||
1760 | #--------------------------------------------------------------------------- | |
1761 | ||
1762 | if __name__ == "__main__": | |
095315e2 | 1763 | |
0b0849b5 RD |
1764 | # running stand alone, Use wxversion: |
1765 | # import wxversion | |
1766 | # wxversion.select("2.6") | |
1767 | # wxversion.select("2.8") | |
095315e2 RD |
1768 | import wx |
1769 | ||
1770 | ||
2a0495c9 RD |
1771 | # check options: |
1772 | import sys, getopt | |
0b0849b5 | 1773 | optlist, args = getopt.getopt(sys.argv[1:],'l',["all", |
095315e2 RD |
1774 | "text", |
1775 | "map", | |
1776 | "stext", | |
1777 | "stextbox", | |
1778 | "bitmap", | |
1779 | "hit", | |
1780 | "hitf", | |
1781 | "animate", | |
1782 | "speed", | |
1783 | "temp", | |
1784 | "props", | |
1785 | "arrow", | |
0b0849b5 | 1786 | "arrowline", |
095315e2 | 1787 | "hide"]) |
2a0495c9 | 1788 | |
0b0849b5 | 1789 | if not haveNumpy: |
2a0495c9 RD |
1790 | raise ImportError(errorText) |
1791 | StartUpDemo = "all" # the default | |
0b0849b5 RD |
1792 | if optlist: |
1793 | StartUpDemo = optlist[0][0][2:] | |
1794 | ||
2e839e96 | 1795 | |
8fa876ca | 1796 | class DemoApp(wx.App): |
8b9a4190 RD |
1797 | """ |
1798 | How the demo works: | |
2e839e96 | 1799 | |
8b9a4190 | 1800 | Under the Draw menu, there are three options: |
2e839e96 | 1801 | |
8b9a4190 RD |
1802 | *Draw Test: will put up a picture of a bunch of randomly generated |
1803 | objects, of each kind supported. | |
2e839e96 | 1804 | |
8b9a4190 RD |
1805 | *Draw Map: will draw a map of the world. Be patient, it is a big map, |
1806 | with a lot of data, and will take a while to load and draw (about 10 sec | |
1807 | on my 450Mhz PIII). Redraws take about 2 sec. This demonstrates how the | |
1808 | performance is not very good for large drawings. | |
2e839e96 | 1809 | |
8b9a4190 | 1810 | *Clear: Clears the Canvas. |
2e839e96 | 1811 | |
8b9a4190 RD |
1812 | Once you have a picture drawn, you can zoom in and out and move about |
1813 | the picture. There is a tool bar with three tools that can be | |
1814 | selected. | |
2e839e96 | 1815 | |
8b9a4190 RD |
1816 | The magnifying glass with the plus is the zoom in tool. Once selected, |
1817 | if you click the image, it will zoom in, centered on where you | |
1818 | clicked. If you click and drag the mouse, you will get a rubber band | |
1819 | box, and the image will zoom to fit that box when you release it. | |
2e839e96 | 1820 | |
8b9a4190 RD |
1821 | The magnifying glass with the minus is the zoom out tool. Once selected, |
1822 | if you click the image, it will zoom out, centered on where you | |
1823 | clicked. (note that this takes a while when you are looking at the map, | |
1824 | as it has a LOT of lines to be drawn. The image is double buffered, so | |
1825 | you don't see the drawing in progress) | |
2e839e96 | 1826 | |
8b9a4190 RD |
1827 | The hand is the move tool. Once selected, if you click and drag on the |
1828 | image, it will move so that the part you clicked on ends up where you | |
1829 | release the mouse. Nothing is changed while you are dragging. The | |
1830 | drawing is too slow for that. | |
2e839e96 | 1831 | |
8b9a4190 RD |
1832 | I'd like the cursor to change as you change tools, but the stock |
1833 | wxCursors didn't include anything I liked, so I stuck with the | |
1834 | pointer. Please let me know if you have any nice cursor images for me to | |
1835 | use. | |
2e839e96 RD |
1836 | |
1837 | ||
8b9a4190 | 1838 | Any bugs, comments, feedback, questions, and especially code are welcome: |
2e839e96 | 1839 | |
8b9a4190 | 1840 | -Chris Barker |
2e839e96 | 1841 | |
8b9a4190 | 1842 | Chris.Barker@noaa.gov |
2e839e96 | 1843 | |
8b9a4190 | 1844 | """ |
42463de2 RD |
1845 | |
1846 | def __init__(self, *args, **kwargs): | |
1847 | wx.App.__init__(self, *args, **kwargs) | |
2e839e96 | 1848 | |
8b9a4190 | 1849 | def OnInit(self): |
42463de2 | 1850 | wx.InitAllImageHandlers() |
2a0495c9 | 1851 | DrawFrame = BuildDrawFrame() |
42463de2 | 1852 | frame = DrawFrame(None, -1, "FloatCanvas Demo App",wx.DefaultPosition,(700,700)) |
2e839e96 | 1853 | |
8b9a4190 | 1854 | self.SetTopWindow(frame) |
42463de2 RD |
1855 | frame.Show() |
1856 | ||
1857 | ## check to see if the demo is set to start in a particular mode. | |
0b0849b5 | 1858 | ## fixme: should this be in a dict instead? |
42463de2 RD |
1859 | if StartUpDemo == "text": |
1860 | frame.TestText() | |
095315e2 | 1861 | elif StartUpDemo == "stext": |
42463de2 | 1862 | frame.TestScaledText() |
095315e2 RD |
1863 | elif StartUpDemo == "stextbox": |
1864 | frame.TestScaledTextBox() | |
1865 | elif StartUpDemo == "bitmap": | |
1866 | frame.TestBitmap() | |
42463de2 RD |
1867 | elif StartUpDemo == "all": |
1868 | frame.DrawTest() | |
1869 | elif StartUpDemo == "map": | |
1870 | frame.DrawMap() | |
1871 | elif StartUpDemo == "hit": | |
1872 | frame.TestHitTest() | |
1873 | elif StartUpDemo == "hitf": | |
42463de2 RD |
1874 | frame.TestHitTestForeground() |
1875 | elif StartUpDemo == "animate": | |
42463de2 RD |
1876 | frame.TestAnimation() |
1877 | elif StartUpDemo == "speed": | |
42463de2 RD |
1878 | frame.SpeedTest() |
1879 | elif StartUpDemo == "temp": | |
42463de2 | 1880 | frame.TempTest() |
5e1796ef | 1881 | elif StartUpDemo == "props": |
5e1796ef | 1882 | frame.PropertiesChangeTest() |
2a0495c9 | 1883 | elif StartUpDemo == "arrow": |
2a0495c9 | 1884 | frame.ArrowTest() |
0b0849b5 RD |
1885 | elif StartUpDemo == "arrowline": |
1886 | frame.ArrowLineTest() | |
095315e2 | 1887 | elif StartUpDemo == "hide": |
095315e2 | 1888 | frame.HideTest() |
2e839e96 | 1889 | |
8b9a4190 | 1890 | return True |
2e839e96 | 1891 | |
2a0495c9 RD |
1892 | app = DemoApp(False)# put in True if you want output to go to it's own window. |
1893 | app.MainLoop() | |
2e839e96 RD |
1894 | |
1895 | else: | |
2a0495c9 | 1896 | # It's not running stand-alone, set up for wxPython demo. |
095315e2 RD |
1897 | # don't neeed wxversion here. |
1898 | import wx | |
0b0849b5 | 1899 | if not haveNumpy: |
2a0495c9 RD |
1900 | ## TestPanel and runTest used for integration into wxPython Demo |
1901 | class TestPanel(wx.Panel): | |
1902 | def __init__(self, parent, log): | |
1903 | self.log = log | |
1904 | wx.Panel.__init__(self, parent, -1) | |
1905 | ||
0b0849b5 | 1906 | from wx.lib.floatcanvas.ScreenShot import getScreenShotBitmap |
2a0495c9 RD |
1907 | |
1908 | note1 = wx.StaticText(self, -1, errorText) | |
1909 | note2 = wx.StaticText(self, -1, "This is what the FloatCanvas can look like:") | |
1910 | S = wx.BoxSizer(wx.VERTICAL) | |
1911 | S.Add((10, 10), 1) | |
1912 | S.Add(note1, 0, wx.ALIGN_CENTER) | |
1913 | S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 4) | |
0b0849b5 | 1914 | S.Add(wx.StaticBitmap(self,-1,getScreenShotBitmap()),0,wx.ALIGN_CENTER) |
2a0495c9 RD |
1915 | S.Add((10, 10), 1) |
1916 | self.SetSizer(S) | |
1917 | self.Layout() | |
42463de2 | 1918 | |
2a0495c9 RD |
1919 | else: |
1920 | ## TestPanel and runTest used for integration into wxPython Demo | |
1921 | class TestPanel(wx.Panel): | |
1922 | def __init__(self, parent, log): | |
1923 | self.log = log | |
1924 | wx.Panel.__init__(self, parent, -1) | |
1925 | note1 = wx.StaticText(self, -1, "The FloatCanvas Demo needs") | |
1926 | note2 = wx.StaticText(self, -1, "a separate frame") | |
1927 | b = wx.Button(self, -1, "Open Demo Frame Now") | |
1928 | b.Bind(wx.EVT_BUTTON, self.OnButton) | |
1929 | ||
1930 | S = wx.BoxSizer(wx.VERTICAL) | |
1931 | S.Add((10, 10), 1) | |
1932 | S.Add(note1, 0, wx.ALIGN_CENTER) | |
1933 | S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 5) | |
1934 | S.Add(b, 0, wx.ALIGN_CENTER | wx.ALL, 5) | |
1935 | S.Add((10, 10), 1) | |
1936 | self.SetSizer(S) | |
1937 | self.Layout() | |
1938 | ||
1939 | def OnButton(self, evt): | |
1940 | DrawFrame = BuildDrawFrame() | |
1941 | frame = DrawFrame(None, -1, "FloatCanvas Drawing Window",wx.DefaultPosition,(500,500)) | |
1942 | ||
1943 | #win = wx.lib.plot.TestFrame(self, -1, "PlotCanvas Demo") | |
1944 | frame.Show() | |
1945 | frame.DrawTest() | |
42463de2 | 1946 | |
2a0495c9 RD |
1947 | def runTest(frame, nb, log): |
1948 | win = TestPanel(nb, log) | |
1949 | return win | |
42463de2 | 1950 | |
2a0495c9 RD |
1951 | # import to get the doc |
1952 | from wx.lib import floatcanvas | |
1953 | overview = floatcanvas.__doc__ | |
42463de2 RD |
1954 | |
1955 | ||
1956 | ||
1957 | ||
1958 | ||
1959 | ||
1960 | ||
1961 |