]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/FloatCanvas.py
support for fractional characters widths under Mac
[wxWidgets.git] / wxPython / demo / FloatCanvas.py
1 #!/usr/bin/env python2.3
2
3 import wx
4
5 ##First, make sure Numeric or numarray can be imported.
6 try:
7 import Numeric
8 import RandomArray
9 haveNumeric = True
10 except ImportError:
11 # Numeric isn't there, let's try numarray
12 try:
13 import numarray as Numeric
14 import numarray.random_array as RandomArray
15 haveNumeric = True
16 except ImportError:
17 # numarray isn't there either
18 haveNumeric = False
19 errorText = (
20 "The FloatCanvas requires either the Numeric or numarray module\n\n"
21 "You can get them at:\n"
22 "http://sourceforge.net/projects/numpy\n\n"
23 "NOTE: The Numeric module is substantially faster than numarray for this\n"
24 "purpose, if you have lots of objects\n"
25 )
26
27 #---------------------------------------------------------------------------
28
29 def BuildDrawFrame(): # this gets called when needed, rather than on import
30 try:
31 from floatcanvas import NavCanvas, FloatCanvas
32 except ImportError: # if it's not there locally, try the wxPython lib.
33 from wx.lib.floatcanvas import NavCanvas, FloatCanvas
34
35 import wx.lib.colourdb
36 import time, random
37
38 class DrawFrame(wx.Frame):
39
40 """
41 A frame used for the FloatCanvas Demo
42
43 """
44
45
46 def __init__(self,parent, id,title,position,size):
47 wx.Frame.__init__(self,parent, id,title,position, size)
48
49 ## Set up the MenuBar
50 MenuBar = wx.MenuBar()
51
52 file_menu = wx.Menu()
53 item = file_menu.Append(-1, "&Close","Close this frame")
54 self.Bind(wx.EVT_MENU, self.OnQuit, item)
55 MenuBar.Append(file_menu, "&File")
56
57 draw_menu = wx.Menu()
58
59 item = draw_menu.Append(-1, "&Draw Test","Run a test of drawing random components")
60 self.Bind(wx.EVT_MENU, self.DrawTest, item)
61
62 item = draw_menu.Append(-1, "&Line Test","Run a test of drawing random lines")
63 self.Bind(wx.EVT_MENU, self.LineTest, item)
64
65 item = draw_menu.Append(-1, "Draw &Map","Run a test of drawing a map")
66 self.Bind(wx.EVT_MENU, self.DrawMap, item)
67 item = draw_menu.Append(-1, "&Text Test","Run a test of text drawing")
68 self.Bind(wx.EVT_MENU, self.TestText, item)
69 item = draw_menu.Append(-1, "&ScaledText Test","Run a test of text drawing")
70 self.Bind(wx.EVT_MENU, self.TestScaledText, item)
71 item = draw_menu.Append(-1, "&Clear","Clear the Canvas")
72 self.Bind(wx.EVT_MENU, self.Clear, item)
73 item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code")
74 self.Bind(wx.EVT_MENU, self.TestHitTest, item)
75 item = draw_menu.Append(-1, "Hit Test &Foreground","Run a test of the hit test code with a foreground Object")
76 self.Bind(wx.EVT_MENU, self.TestHitTestForeground, item)
77 item = draw_menu.Append(-1, "&Animation","Run a test of Animation")
78 self.Bind(wx.EVT_MENU, self.TestAnimation, item)
79 item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed")
80 self.Bind(wx.EVT_MENU, self.SpeedTest, item)
81 item = draw_menu.Append(-1, "Change &Properties","Run a test of Changing Object Properties")
82 self.Bind(wx.EVT_MENU, self.PropertiesChangeTest, item)
83 item = draw_menu.Append(-1, "&Arrows","Run a test of Arrows")
84 self.Bind(wx.EVT_MENU, self.ArrowTest, item)
85
86 MenuBar.Append(draw_menu, "&Tests")
87
88 view_menu = wx.Menu()
89 item = view_menu.Append(-1, "Zoom to &Fit","Zoom to fit the window")
90 self.Bind(wx.EVT_MENU, self.ZoomToFit, item)
91 MenuBar.Append(view_menu, "&View")
92
93 help_menu = wx.Menu()
94 item = help_menu.Append(-1, "&About",
95 "More information About this program")
96 self.Bind(wx.EVT_MENU, self.OnAbout, item)
97 MenuBar.Append(help_menu, "&Help")
98
99 self.SetMenuBar(MenuBar)
100
101 self.CreateStatusBar()
102 # Add the Canvas
103 self.Canvas = NavCanvas.NavCanvas(self,
104 -1,
105 (500,500),
106 Debug = 0,
107 BackgroundColor = "DARK SLATE BLUE")
108
109 wx.EVT_CLOSE(self, self.OnCloseWindow)
110
111 FloatCanvas.EVT_MOTION(self.Canvas, self.OnMove )
112 #FloatCanvas.EVT_LEFT_UP(self.Canvas, self.OnLeftUp )
113
114 self.EventsAreBound = False
115
116 ## getting all the colors and linestyles for random objects
117 wx.lib.colourdb.updateColourDB()
118 self.colors = wx.lib.colourdb.getColourList()
119 #self.LineStyles = FloatCanvas.DrawObject.LineStyleList.keys()
120
121
122 return None
123
124 def BindAllMouseEvents(self):
125 if not self.EventsAreBound:
126 ## Here is how you catch FloatCanvas mouse events
127 FloatCanvas.EVT_LEFT_DOWN(self.Canvas, self.OnLeftDown )
128 FloatCanvas.EVT_LEFT_UP(self.Canvas, self.OnLeftUp )
129 FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, self.OnLeftDouble )
130
131 FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, self.OnMiddleDown )
132 FloatCanvas.EVT_MIDDLE_UP(self.Canvas, self.OnMiddleUp )
133 FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, self.OnMiddleDouble )
134
135 FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, self.OnRightDown )
136 FloatCanvas.EVT_RIGHT_UP(self.Canvas, self.OnRightUp )
137 FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, self.OnRightDouble )
138
139 FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, self.OnWheel )
140 self.EventsAreBound = True
141
142 def UnBindAllMouseEvents(self):
143 ## Here is how you unbind FloatCanvas mouse events
144 FloatCanvas.EVT_LEFT_DOWN(self.Canvas, None )
145 FloatCanvas.EVT_LEFT_UP(self.Canvas, None )
146 FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, None)
147
148 FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, None )
149 FloatCanvas.EVT_MIDDLE_UP(self.Canvas, None )
150 FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, None )
151
152 FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, None )
153 FloatCanvas.EVT_RIGHT_UP(self.Canvas, None )
154 FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, None )
155
156 FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, None )
157 FloatCanvas.EVT_LEFT_DOWN(self.Canvas, None )
158 FloatCanvas.EVT_LEFT_UP(self.Canvas, None )
159 FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, None)
160
161 FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, None )
162 FloatCanvas.EVT_MIDDLE_UP(self.Canvas, None )
163 FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, None )
164
165 FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, None )
166 FloatCanvas.EVT_RIGHT_UP(self.Canvas, None )
167 FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, None )
168
169 FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, None )
170
171 self.EventsAreBound = False
172
173 def PrintCoords(self,event):
174 print "coords are: %s"%(event.Coords,)
175 print "pixel coords are: %s\n"%(event.GetPosition(),)
176
177 def OnLeftDown(self, event):
178 print "Left Button has been clicked in DrawFrame"
179 self.PrintCoords(event)
180
181 def OnLeftUp(self, event):
182 print "Left up in DrawFrame"
183 self.PrintCoords(event)
184
185 def OnLeftDouble(self, event):
186 print "Left Double Click in DrawFrame"
187 self.PrintCoords(event)
188
189 def OnMiddleDown(self, event):
190 print "Middle Button clicked in DrawFrame"
191 self.PrintCoords(event)
192
193 def OnMiddleUp(self, event):
194 print "Middle Button Up in DrawFrame"
195 self.PrintCoords(event)
196
197 def OnMiddleDouble(self, event):
198 print "Middle Button Double clicked in DrawFrame"
199 self.PrintCoords(event)
200
201 def OnRightDown(self, event):
202 print "Right Button has been clicked in DrawFrame"
203 self.PrintCoords(event)
204
205 def OnRightUp(self, event):
206 print "Right Button Up in DrawFrame"
207 self.PrintCoords(event)
208
209 def OnRightDouble(self, event):
210 print "Right Button Double clicked in DrawFrame"
211 self.PrintCoords(event)
212
213 def OnWheel(self, event):
214 print "Mouse Wheel Moved in DrawFrame"
215 self.PrintCoords(event)
216 Rot = event.GetWheelRotation()
217 print "Wheel Rotation is:", Rot
218 print "Wheel Delta is:", event.GetWheelDelta()
219 Rot = Rot / abs(Rot) * 0.1
220 if event.ControlDown(): # move left-right
221 self.Canvas.MoveImage( (Rot, 0), "Panel" )
222 else: # move up-down
223 self.Canvas.MoveImage( (0, Rot), "Panel" )
224
225 def OnMove(self, event):
226 """
227 Updates the status bar with the world coordinates
228 """
229 self.SetStatusText("%.2f, %.2f"%tuple(event.Coords))
230
231 def OnAbout(self, event):
232 print "OnAbout called"
233
234 dlg = wx.MessageDialog(self, "This is a small program to demonstrate\n"
235 "the use of the FloatCanvas\n",
236 "About Me", wx.OK | wx.ICON_INFORMATION)
237 dlg.ShowModal()
238 dlg.Destroy()
239
240 def ZoomToFit(self,event):
241 self.Canvas.ZoomToBB()
242
243 def Clear(self,event = None):
244 self.UnBindAllMouseEvents()
245 self.Canvas.ClearAll()
246 self.Canvas.SetProjectionFun(None)
247 self.Canvas.Draw()
248
249 def OnQuit(self,event):
250 self.Close(True)
251
252 def OnCloseWindow(self, event):
253 self.Destroy()
254
255 def DrawTest(self,event=None):
256 wx.GetApp().Yield()
257
258 Range = (-10,10)
259 colors = self.colors
260
261 self.BindAllMouseEvents()
262 Canvas = self.Canvas
263
264 Canvas.ClearAll()
265 Canvas.SetProjectionFun(None)
266
267 ## Random tests of everything:
268
269 # Rectangles
270 for i in range(3):
271 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
272 lw = random.randint(1,5)
273 cf = random.randint(0,len(colors)-1)
274 h = random.randint(1,5)
275 w = random.randint(1,5)
276 Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
277
278 # Ellipses
279 for i in range(3):
280 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
281 lw = random.randint(1,5)
282 cf = random.randint(0,len(colors)-1)
283 h = random.randint(1,5)
284 w = random.randint(1,5)
285 Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
286
287 # Points
288 for i in range(5):
289 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
290 D = random.randint(1,50)
291 cf = random.randint(0,len(colors)-1)
292 Canvas.AddPoint((x,y), Color = colors[cf], Diameter = D)
293 # Circles
294 for i in range(5):
295 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
296 D = random.randint(1,5)
297 lw = random.randint(1,5)
298 cf = random.randint(0,len(colors)-1)
299 cl = random.randint(0,len(colors)-1)
300 Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
301 Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
302 # Lines
303 for i in range(5):
304 points = []
305 for j in range(random.randint(2,10)):
306 point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
307 points.append(point)
308 lw = random.randint(1,10)
309 cf = random.randint(0,len(colors)-1)
310 cl = random.randint(0,len(colors)-1)
311 Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
312 # Polygons
313 for i in range(3):
314 points = []
315 for j in range(random.randint(2,6)):
316 point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
317 points.append(point)
318 lw = random.randint(1,6)
319 cf = random.randint(0,len(colors)-1)
320 cl = random.randint(0,len(colors)-1)
321 Canvas.AddPolygon(points,
322 LineWidth = lw,
323 LineColor = colors[cl],
324 FillColor = colors[cf],
325 FillStyle = 'Solid')
326
327 ## Pointset
328 for i in range(4):
329 points = []
330 points = RandomArray.uniform(Range[0],Range[1],(100,2))
331 cf = random.randint(0,len(colors)-1)
332 D = random.randint(1,4)
333 Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
334
335 # Text
336 String = "Unscaled text"
337 for i in range(3):
338 ts = random.randint(10,40)
339 cf = random.randint(0,len(colors)-1)
340 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
341 Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
342
343 # Scaled Text
344 String = "Scaled text"
345 for i in range(3):
346 ts = random.random()*3 + 0.2
347 cf = random.randint(0,len(colors)-1)
348 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
349 Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
350
351 # Arrows
352 N = 5
353 Points = RandomArray.uniform(Range[0], Range[1], (N,2) )
354 for i in range(N):
355 Canvas.AddArrow(Points[i],
356 random.uniform(20,100),
357 Direction = random.uniform(0,360),
358 LineWidth = random.uniform(1,5),
359 LineColor = colors[random.randint(0,len(colors)-1)],
360 ArrowHeadAngle = random.uniform(20,90))
361
362 Canvas.ZoomToBB()
363
364 def TestAnimation(self,event=None):
365 """
366
367 In this test, a relatively complex background is drawn, and
368 a simple object placed in the foreground is moved over
369 it. This demonstrates how to use the InForeground attribute
370 to make an object in the foregorund draw fast, without
371 having to re-draw the whole background.
372
373 """
374 wx.GetApp().Yield()
375 Range = (-10,10)
376 self.Range = Range
377
378 self.UnBindAllMouseEvents()
379 Canvas = self.Canvas
380
381 Canvas.ClearAll()
382 Canvas.SetProjectionFun(None)
383
384 ## Random tests of everything:
385 colors = self.colors
386 # Rectangles
387 for i in range(3):
388 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
389 lw = random.randint(1,5)
390 cf = random.randint(0,len(colors)-1)
391 h = random.randint(1,5)
392 w = random.randint(1,5)
393 Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
394
395 # Ellipses
396 for i in range(3):
397 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
398 lw = random.randint(1,5)
399 cf = random.randint(0,len(colors)-1)
400 h = random.randint(1,5)
401 w = random.randint(1,5)
402 Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
403
404 # Circles
405 for i in range(5):
406 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
407 D = random.randint(1,5)
408 lw = random.randint(1,5)
409 cf = random.randint(0,len(colors)-1)
410 cl = random.randint(0,len(colors)-1)
411 Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
412 Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
413
414 # Lines
415 for i in range(5):
416 points = []
417 for j in range(random.randint(2,10)):
418 point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
419 points.append(point)
420 lw = random.randint(1,10)
421 cf = random.randint(0,len(colors)-1)
422 cl = random.randint(0,len(colors)-1)
423 Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
424
425 # Polygons
426 for i in range(3):
427 points = []
428 for j in range(random.randint(2,6)):
429 point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
430 points.append(point)
431 lw = random.randint(1,6)
432 cf = random.randint(0,len(colors)-1)
433 cl = random.randint(0,len(colors)-1)
434 Canvas.AddPolygon(points,
435 LineWidth = lw,
436 LineColor = colors[cl],
437 FillColor = colors[cf],
438 FillStyle = 'Solid')
439
440 # Scaled Text
441 String = "Scaled text"
442 for i in range(3):
443 ts = random.random()*3 + 0.2
444 cf = random.randint(0,len(colors)-1)
445 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
446 Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
447
448
449 # Now the Foreground Object:
450 C = Canvas.AddCircle(0,0,7,LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True)
451 T = Canvas.AddScaledText("Click to Move",0,0, Size = 0.6, Position = 'cc', InForeground = True)
452 C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe)
453 C.Text = T
454
455 self.Timer = wx.PyTimer(self.ShowFrame)
456 self.FrameDelay = 50 # milliseconds
457
458 Canvas.ZoomToBB()
459
460 def ShowFrame(self):
461 Object = self.MovingObject
462 Range = self.Range
463 if self.TimeStep < self.NumTimeSteps:
464 x,y = Object.XY
465 if x > Range[1] or x < Range[0]:
466 self.dx = -self.dx
467 if y > Range[1] or y < Range[0]:
468 self.dy = -self.dy
469 Object.Move( (self.dx,self.dy) )
470 Object.Text.Move( (self.dx,self.dy))
471 self.Canvas.Draw()
472 self.TimeStep += 1
473 wx.GetApp().Yield(True)
474 else:
475 self.Timer.Stop()
476
477
478 def MoveMe(self, Object):
479 self.MovingObject = Object
480 Range = self.Range
481 self.dx = random.uniform(Range[0]/4,Range[1]/4)
482 self.dy = random.uniform(Range[0]/4,Range[1]/4)
483 #import time
484 #start = time.time()
485 self.NumTimeSteps = 200
486 self.TimeStep = 1
487 self.Timer.Start(self.FrameDelay)
488 #print "Did %i frames in %f seconds"%(N, (time.time() - start) )
489
490 def TestHitTest(self,event=None):
491 wx.GetApp().Yield()
492
493 self.UnBindAllMouseEvents()
494 Canvas = self.Canvas
495
496 Canvas.ClearAll()
497 Canvas.SetProjectionFun(None)
498
499 #Add a Hit-able rectangle
500 w, h = 60, 20
501
502 dx = 80
503 dy = 40
504 x,y = 20, 20
505 FontSize = 8
506
507 #Add one that is not HitAble
508 Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
509 Canvas.AddText("Not Hit-able", x, y, Size = FontSize, Position = "bl")
510
511
512 x += dx
513 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
514 R.Name = "Line Rectangle"
515 R.HitFill = False
516 R.HitLineWidth = 5 # Makes it a little easier to hit
517 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
518 Canvas.AddText("Left Click Line", x, y, Size = FontSize, Position = "bl")
519 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
520
521 x += dx
522 color = "Red"
523 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
524 R.Name = color + "Rectangle"
525 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
526 Canvas.AddText("Left Click Fill", x, y, Size = FontSize, Position = "bl")
527 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
528
529 x = 20
530 y += dy
531 color = "LightBlue"
532 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
533 R.Name = color + " Rectangle"
534 R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
535 Canvas.AddText("Right Click Fill", x, y, Position = "bl")
536 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
537
538 x += dx
539 color = "Grey"
540 R = Canvas.AddEllipse(x, y, w, h,LineWidth = 2,FillColor = color)
541 R.Name = color +" Ellipse"
542 R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
543 Canvas.AddText("Right Click Fill", x, y, Size = FontSize, Position = "bl")
544 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
545
546 x += dx
547 color = "Brown"
548 R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2, FillColor = color)
549 R.Name = color + " Circle"
550 R.HitFill = True
551 R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit)
552 Canvas.AddText("Left D-Click Fill", x, y, Size = FontSize, Position = "bl")
553 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
554
555 x = 20
556 y += dy
557 color = "Pink"
558 R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2,FillColor = color)
559 R.Name = color + " Circle"
560 R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit)
561 Canvas.AddText("Left Up Fill", x, y, Size = FontSize, Position = "bl")
562 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
563
564 x += dx
565 color = "White"
566 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
567 R.Name = color + " Rectangle"
568 R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit)
569 Canvas.AddText("Middle Down", x, y, Size = FontSize, Position = "bl")
570 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
571
572 x += dx
573 color = "AQUAMARINE"
574 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
575 R.Name = color + " Rectangle"
576 R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit)
577 Canvas.AddText("Middle Up", x, y, Size = FontSize, Position = "bl")
578 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
579
580 x = 20
581 y += dy
582 color = "CORAL"
583 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
584 R.Name = color + " Rectangle"
585 R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit)
586 Canvas.AddText("Middle DoubleClick", x, y, Size = FontSize, Position = "bl")
587 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
588
589 x += dx
590 color = "CYAN"
591 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
592 R.Name = color + " Rectangle"
593 R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit)
594 Canvas.AddText("Right Up", x, y, Size = FontSize, Position = "bl")
595 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
596
597 x += dx
598 color = "LIME GREEN"
599 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
600 R.Name = color + " Rectangle"
601 R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit)
602 Canvas.AddText("Right Double Click", x, y, Size = FontSize, Position = "bl")
603 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
604
605 x = 20
606 y += dy
607 color = "MEDIUM GOLDENROD"
608 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
609 R.Name = color
610 R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
611 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
612 Canvas.AddText("L and R Click", x, y, Size = FontSize, Position = "bl")
613 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
614
615 x += dx
616 color = "SALMON"
617 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
618 R.Name = color + " Rectangle"
619 R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
620 Canvas.AddText("Mouse Enter", x, y, Size = FontSize, Position = "bl")
621 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
622
623 x += dx
624 color = "MEDIUM VIOLET RED"
625 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
626 R.Name = color
627 R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
628 Canvas.AddText("Mouse Leave", x, y, Size = FontSize, Position = "bl")
629 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
630
631 x = 20
632 y += dy
633 color = "SKY BLUE"
634 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
635 R.Name = color
636 R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
637 R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
638 Canvas.AddText("Enter and Leave", x, y, Size = FontSize, Position = "bl")
639 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
640
641 x += dx
642 color = "WHEAT"
643 R = Canvas.AddRectangle(x, y, w+12, h, LineColor = None, FillColor = color)
644 R.Name = color
645 R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
646 R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
647 Canvas.AddText("Mouse Enter&Leave", x, y, Size = FontSize, Position = "bl")
648 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
649
650 x += dx
651 color = "KHAKI"
652 R = Canvas.AddRectangle(x-12, y, w+12, h, LineColor = None, FillColor = color)
653 R.Name = color
654 R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
655 R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
656 Canvas.AddText("Mouse ENter&Leave", x, y, Size = FontSize, Position = "bl")
657 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
658
659 x = 20
660 y += dy
661 L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red")
662 L.Name = "A Line"
663 L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
664 Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
665 Canvas.AddText(L.Name, x, y+h, Size = FontSize, Position = "tl")
666
667 x += dx
668 color = "SEA GREEN"
669 Points = Numeric.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) ), Numeric.Float)
670 R = Canvas.AddPolygon(Points, LineWidth = 2, FillColor = color)
671 R.Name = color + " Polygon"
672 R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
673 Canvas.AddText("RIGHT_DOWN", x, y, Size = FontSize, Position = "bl")
674 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
675
676 x += dx
677 color = "Red"
678 Points = Numeric.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) ), Numeric.Float)
679 R = Canvas.AddPointSet(Points, Diameter = 4, Color = color)
680 R.Name = "PointSet"
681 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit)
682 Canvas.AddText("LEFT_DOWN", x, y, Size = FontSize, Position = "bl")
683 Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
684
685 x = 20
686 y += dy
687 T = Canvas.AddText("Hit-able Text", x, y, Size = 15, Color = "Red", Position = 'tl')
688 T.Name = "Hit-able Text"
689 T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
690 Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
691
692 x += dx
693 T = Canvas.AddScaledText("Scaled Text", x, y, Size = 1./2*h, Color = "Pink", Position = 'bl')
694 Canvas.AddPointSet( (x, y), Diameter = 3)
695 T.Name = "Scaled Text"
696 T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
697 Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "tl")
698
699 self.Canvas.ZoomToBB()
700
701 def TestHitTestForeground(self,event=None):
702 wx.GetApp().Yield()
703
704 self.UnBindAllMouseEvents()
705 Canvas = self.Canvas
706
707 Canvas.ClearAll()
708 Canvas.SetProjectionFun(None)
709
710 #Add a Hitable rectangle
711 w, h = 60, 20
712
713 dx = 80
714 dy = 40
715 x,y = 20, 20
716
717 color = "Red"
718 R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color, InForeground = False)
719 R.Name = color + "Rectangle"
720 R.HitFill = True
721 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
722 Canvas.AddText("Left Click Fill", x, y, Position = "bl")
723 Canvas.AddText(R.Name, x, y+h, Position = "tl")
724
725 ## A set of Rectangles that move together
726
727 ## NOTE: In a real app, it might be better to create a new
728 ## custom FloatCanvas DrawObject
729
730 self.MovingRects = []
731 x += dx
732 color = "LightBlue"
733 R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
734 R.HitFill = True
735 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveLeft)
736 L = Canvas.AddText("Left", x + w/4, y + h/4, Position = "cc", InForeground = True)
737 self.MovingRects.extend( (R,L) )
738
739 x += w/2
740 R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
741 R.HitFill = True
742 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveRight)
743 L = Canvas.AddText("Right", x + w/4, y + h/4, Position = "cc", InForeground = True)
744 self.MovingRects.extend( (R,L) )
745
746 x -= w/2
747 y += h/2
748 R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
749 R.HitFill = True
750 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveUp)
751 L = Canvas.AddText("Up", x + w/4, y + h/4, Position = "cc", InForeground = True)
752 self.MovingRects.extend( (R,L) )
753
754
755 x += w/2
756 R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
757 R.HitFill = True
758 R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveDown)
759 L = Canvas.AddText("Down", x + w/4, y + h/4, Position = "cc", InForeground = True)
760 self.MovingRects.extend( (R,L) )
761
762 self.Canvas.ZoomToBB()
763
764 def RectMoveLeft(self,Object):
765 self.MoveRects("left")
766
767 def RectMoveRight(self,Object):
768 self.MoveRects("right")
769
770 def RectMoveUp(self,Object):
771 self.MoveRects("up")
772
773 def RectMoveDown(self,Object):
774 self.MoveRects("down")
775
776 def MoveRects(self, Dir):
777 for Object in self.MovingRects:
778 X,Y = Object.XY
779 if Dir == "left": X -= 10
780 elif Dir == "right": X += 10
781 elif Dir == "up": Y += 10
782 elif Dir == "down": Y -= 10
783 Object.SetXY(X,Y)
784 self.Canvas.Draw()
785
786
787 def PointSetGotHit(self, Object):
788 print Object.Name, "Got Hit\n"
789
790 def RectGotHit(self, Object):
791 print Object.Name, "Got Hit\n"
792
793 def RectGotHitRight(self, Object):
794 print Object.Name, "Got Hit With Right\n"
795
796 def RectGotHitLeft(self, Object):
797 print Object.Name, "Got Hit with Left\n"
798
799 def RectMouseOver(self, Object):
800 print "Mouse entered:", Object.Name
801
802 def RectMouseLeave(self, Object):
803 print "Mouse left ", Object.Name
804
805
806 def TestText(self, event= None):
807 wx.GetApp().Yield()
808
809 self.BindAllMouseEvents()
810 Canvas = self.Canvas
811 Canvas.ClearAll()
812 Canvas.SetProjectionFun(None)
813
814 x,y = (0, 0)
815
816 ## Add a non-visible rectangle, just to get a Bounding Box
817 ## Text objects have a zero-size bounding box, because it changes with zoom
818 Canvas.AddRectangle(-10,-10,20,20,LineWidth = 1, LineColor = None)
819
820 # Text
821 String = "Some text"
822 self.Canvas.AddText("Top Left",x,y,Size = 14,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
823 self.Canvas.AddText("Bottom Left",x,y,Size = 14,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
824 self.Canvas.AddText("Top Right",x,y,Size = 14,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
825 self.Canvas.AddText("Bottom Right",x,y,Size = 14,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
826 Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
827
828 x,y = (0, 2)
829
830 Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
831 self.Canvas.AddText("Top Center",x,y,Size = 14,Color = "Black",Position = "tc")
832 self.Canvas.AddText("Bottom Center",x,y,Size = 14,Color = "White",Position = "bc")
833
834 x,y = (0, 4)
835
836 Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
837 self.Canvas.AddText("Center Right",x,y,Size = 14,Color = "Black",Position = "cr")
838 self.Canvas.AddText("Center Left",x,y,Size = 14,Color = "Black",Position = "cl")
839
840 x,y = (0, -2)
841
842 Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
843 self.Canvas.AddText("Center Center",x,y,Size = 14,Color = "Black",Position = "cc")
844
845 self.Canvas.AddText("40 Pixels",-10,8,Size = 40)
846 self.Canvas.AddText("20 Pixels",-10,5,Size = 20)
847 self.Canvas.AddText("10 Pixels",-10,3,Size = 10)
848
849 self.Canvas.AddText("MODERN Font", -10, 0, Family = wx.MODERN)
850 self.Canvas.AddText("DECORATIVE Font", -10, -1, Family = wx.DECORATIVE)
851 self.Canvas.AddText("ROMAN Font", -10, -2, Family = wx.ROMAN)
852 self.Canvas.AddText("SCRIPT Font", -10, -3, Family = wx.SCRIPT)
853 self.Canvas.AddText("ROMAN BOLD Font", -10, -4, Family = wx.ROMAN, Weight=wx.BOLD)
854 self.Canvas.AddText("ROMAN ITALIC BOLD Font", -10, -5, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
855
856 # NOTE: this font exists on my Linux box..who knows were else you'll find it!
857 Font = wx.Font(20, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
858 self.Canvas.AddText("zapf chancery Font", -10, -6, Font = Font)
859
860 self.Canvas.ZoomToBB()
861
862 def TestScaledText(self, event= None):
863 wx.GetApp().Yield()
864
865 self.BindAllMouseEvents()
866 Canvas = self.Canvas
867 Canvas.ClearAll()
868 Canvas.SetProjectionFun(None)
869
870 x,y = (0, 0)
871
872 T = Canvas.AddScaledText("Top Left",x,y,Size = 5,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
873 T = Canvas.AddScaledText("Bottom Left",x,y,Size = 5,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
874 T = Canvas.AddScaledText("Top Right",x,y,Size = 5,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
875 T = Canvas.AddScaledText("Bottom Right",x,y,Size = 5,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
876 Canvas.AddPointSet((x,y), Color = "Red", Diameter = 4)
877
878
879 x,y = (0, 20)
880
881 Canvas.AddScaledText("Top Center",x,y,Size = 7,Color = "Black",Position = "tc")
882 Canvas.AddScaledText("Bottom Center",x,y,Size = 7,Color = "White",Position = "bc")
883 Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
884
885 x,y = (0, -20)
886
887 Canvas.AddScaledText("Center Right",x,y,Size = 9,Color = "Black",Position = "cr")
888 Canvas.AddScaledText("Center Left",x,y,Size = 9,Color = "Black",Position = "cl")
889 Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
890
891 x = -200
892
893 self.Canvas.AddScaledText("MODERN Font", x, 0, Size = 7, Family = wx.MODERN, Color = (0,0,0))
894 self.Canvas.AddScaledText("DECORATIVE Font", x, -10, Size = 7, Family = wx.DECORATIVE, Color = (0,0,1))
895 self.Canvas.AddScaledText("ROMAN Font", x, -20, Size = 7, Family = wx.ROMAN)
896 self.Canvas.AddScaledText("SCRIPT Font", x, -30, Size = 7, Family = wx.SCRIPT)
897 self.Canvas.AddScaledText("ROMAN BOLD Font", x, -40, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD)
898 self.Canvas.AddScaledText("ROMAN ITALIC BOLD Font", x, -50, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
899 Canvas.AddPointSet((x,0), Color = "White", Diameter = 4)
900
901
902 # NOTE: this font exists on my Linux box..who knows were else you'll find it!
903 x,y = (-100, 50)
904 Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
905 T = self.Canvas.AddScaledText("zapf chancery Font", x, y, Size = 20, Font = Font, Position = 'bc')
906
907 x,y = (-50, -50)
908 Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "bookman")
909 T = self.Canvas.AddScaledText("Bookman Font", x, y, Size = 8, Font = Font)
910
911 self.Canvas.ZoomToBB()
912
913 def DrawMap(self,event = None):
914 wx.GetApp().Yield()
915 import os, time
916 self.BindAllMouseEvents()
917
918 ## Test of Actual Map Data
919 self.Canvas.ClearAll()
920 self.Canvas.SetProjectionFun("FlatEarth")
921 #start = time.clock()
922 Shorelines = self.Read_MapGen(os.path.join("data",'world.dat'),stats = 0)
923 #print "It took %f seconds to load %i shorelines"%(time.clock() - start,len(Shorelines) )
924 #start = time.clock()
925 for segment in Shorelines:
926 self.Canvas.AddLine(segment)
927 #print "It took %f seconds to add %i shorelines"%(time.clock() - start,len(Shorelines) )
928 #start = time.clock()
929 self.Canvas.ZoomToBB()
930 #print "It took %f seconds to draw %i shorelines"%(time.clock() - start,len(Shorelines) )
931
932
933 def LineTest(self,event = None):
934 wx.GetApp().Yield()
935 import os, time
936 # import random
937 colors = self.colors
938 Range = (-10,10)
939 ## Test of drawing lots of lines
940 Canvas = self.Canvas
941 Canvas.ClearAll()
942 Canvas.SetProjectionFun(None)
943 #start = time.clock()
944 linepoints = []
945 linecolors = []
946 linewidths = []
947 for i in range(2000):
948 points = (random.randint(Range[0],Range[1]),
949 random.randint(Range[0],Range[1]),
950 random.randint(Range[0],Range[1]),
951 random.randint(Range[0],Range[1]))
952 linepoints.append(points)
953 linewidths.append(random.randint(1,10) )
954 linecolors.append(random.randint(0,len(colors)-1) )
955 for (points,color,width) in zip(linepoints,linecolors,linewidths):
956 Canvas.AddLine((points[0:2],points[2:4]), LineWidth = width, LineColor = colors[color])
957 #print "It took %f seconds to add %i lines"%(time.clock() - start,len(linepoints) )
958 #start = time.clock()
959 Canvas.ZoomToBB()
960 #print "It took %f seconds to draw %i lines"%(time.clock() - start,len(linepoints) )
961
962 def SpeedTest(self,event=None):
963 wx.GetApp().Yield()
964 BigRange = (-1000,1000)
965 colors = self.colors
966
967 self.UnBindAllMouseEvents()
968 Canvas = self.Canvas
969
970 Canvas.ClearAll()
971 Canvas.SetProjectionFun(None)
972
973 # Pointset
974 coords = []
975 for i in range(1000):
976 x,y = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1]))
977 coords.append( (x,y) )
978 print "Drawing the Points"
979 start = time.clock()
980 for Point in coords:
981 Canvas.AddPoint(Point, Diameter = 4)
982 print "It took %s seconds to add the points"%(time.clock() - start)
983 Canvas.ZoomToBB()
984
985 def PropertiesChangeTest(self,event=None):
986 wx.GetApp().Yield()
987
988 Range = (-10,10)
989 colors = self.colors
990
991 self.UnBindAllMouseEvents()
992 Canvas = self.Canvas
993
994 Canvas.ClearAll()
995 Canvas.SetProjectionFun(None)
996
997 self.ColorObjectsAll = []
998 self.ColorObjectsLine = []
999 self.ColorObjectsColor = []
1000 self.ColorObjectsText = []
1001 ##One of each object:
1002 # Rectangle
1003 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1004 lw = random.randint(1,5)
1005 cf = random.randint(0,len(colors)-1)
1006 h = random.randint(1,5)
1007 w = random.randint(1,5)
1008 self.Rectangle = Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
1009 self.ColorObjectsAll.append(self.Rectangle)
1010
1011 # Ellipse
1012 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1013 lw = random.randint(1,5)
1014 cf = random.randint(0,len(colors)-1)
1015 h = random.randint(1,5)
1016 w = random.randint(1,5)
1017 self.Ellipse = Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
1018 self.ColorObjectsAll.append(self.Ellipse)
1019
1020 # Point
1021 xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1022 D = random.randint(1,50)
1023 lw = random.randint(1,5)
1024 cf = random.randint(0,len(colors)-1)
1025 cl = random.randint(0,len(colors)-1)
1026 self.ColorObjectsColor.append(Canvas.AddPoint(xy, colors[cf], D))
1027
1028 # Circle
1029 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1030 D = random.randint(1,5)
1031 lw = random.randint(1,5)
1032 cf = random.randint(0,len(colors)-1)
1033 cl = random.randint(0,len(colors)-1)
1034 self.Circle = Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
1035 self.ColorObjectsAll.append(self.Circle)
1036
1037 # Line
1038 points = []
1039 for j in range(random.randint(2,10)):
1040 point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
1041 points.append(point)
1042 lw = random.randint(1,10)
1043 cf = random.randint(0,len(colors)-1)
1044 cl = random.randint(0,len(colors)-1)
1045 self.ColorObjectsLine.append(Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl]))
1046
1047 # Polygon
1048 ## points = []
1049 ## for j in range(random.randint(2,6)):
1050 ## point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1051 ## points.append(point)
1052 points = RandomArray.uniform(Range[0],Range[1],(6,2))
1053 lw = random.randint(1,6)
1054 cf = random.randint(0,len(colors)-1)
1055 cl = random.randint(0,len(colors)-1)
1056 self.ColorObjectsAll.append(Canvas.AddPolygon(points,
1057 LineWidth = lw,
1058 LineColor = colors[cl],
1059 FillColor = colors[cf],
1060 FillStyle = 'Solid'))
1061
1062 ## Pointset
1063 points = RandomArray.uniform(Range[0],Range[1],(100,2))
1064 cf = random.randint(0,len(colors)-1)
1065 D = random.randint(1,4)
1066 self.PointSet = Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
1067 self.ColorObjectsColor.append(self.PointSet)
1068
1069 ## Point
1070 point = RandomArray.uniform(Range[0],Range[1],(2,))
1071 cf = random.randint(0,len(colors)-1)
1072 D = random.randint(1,4)
1073 self.Point = Canvas.AddPoint(point, Color = colors[cf], Diameter = D)
1074 self.ColorObjectsColor.append(self.Point)
1075
1076 # Text
1077 String = "Unscaled text"
1078 ts = random.randint(10,40)
1079 cf = random.randint(0,len(colors)-1)
1080 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1081 self.ColorObjectsText.append(Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
1082
1083 # Scaled Text
1084 String = "Scaled text"
1085 ts = random.random()*3 + 0.2
1086 cf = random.randint(0,len(colors)-1)
1087 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1088 self.ColorObjectsText.append(Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
1089
1090 # A "Button"
1091 Button = Canvas.AddRectangle(-10, -12, 20, 3, LineStyle = None, FillColor = "Red")
1092 Canvas.AddScaledText("Click Here To Change Properties",
1093 0, -10.5,
1094 Size = 0.7,
1095 Color = "Black",
1096 Position = "cc")
1097
1098 Button.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ChangeProperties)
1099
1100 Canvas.ZoomToBB()
1101
1102 def ChangeProperties(self, Object = None):
1103 colors = self.colors
1104 Range = (-10,10)
1105
1106 for Object in self.ColorObjectsAll:
1107 pass
1108 Object.SetFillColor(colors[random.randint(0,len(colors)-1)])
1109 Object.SetLineColor(colors[random.randint(0,len(colors)-1)])
1110 Object.SetLineWidth(random.randint(1,7))
1111 Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)])
1112 for Object in self.ColorObjectsLine:
1113 Object.SetLineColor(colors[random.randint(0,len(colors)-1)])
1114 Object.SetLineWidth(random.randint(1,7))
1115 Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)])
1116 for Object in self.ColorObjectsColor:
1117 Object.SetColor(colors[random.randint(0,len(colors)-1)])
1118 for Object in self.ColorObjectsText:
1119 Object.SetColor(colors[random.randint(0,len(colors)-1)])
1120 Object.SetBackgroundColor(colors[random.randint(0,len(colors)-1)])
1121 self.Circle.SetDiameter(random.randint(1,10))
1122 self.PointSet.SetDiameter(random.randint(1,8))
1123 self.Point.SetDiameter(random.randint(1,8))
1124 for Object in (self.Rectangle, self.Ellipse):
1125 x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1126 w,h = random.randint(1,5), random.randint(1,5)
1127 Object.SetShape(x,y,w,h)
1128 self.Canvas.Draw(Force = True)
1129
1130 def ArrowTest(self,event=None):
1131 wx.GetApp().Yield()
1132 self.UnBindAllMouseEvents()
1133 Canvas = self.Canvas
1134
1135 Canvas.ClearAll()
1136 Canvas.SetProjectionFun(None)
1137
1138 # put in a rectangle to get a bounding box
1139 Canvas.AddRectangle(0,0,20,20,LineColor = None)
1140
1141 # Draw some Arrows
1142 Canvas.AddArrow((10,10),Length = 40, Direction = 0)
1143 Canvas.AddArrow((10,10),Length = 50, Direction = 45 ,LineWidth = 2, LineColor = "Black", ArrowHeadAngle = 20)
1144 Canvas.AddArrow((10,10),Length = 60, Direction = 90 ,LineWidth = 3, LineColor = "Red", ArrowHeadAngle = 30)
1145 Canvas.AddArrow((10,10),Length = 70, Direction = 135,LineWidth = 4, LineColor = "Red", ArrowHeadAngle = 40)
1146 Canvas.AddArrow((10,10),Length = 80, Direction = 180,LineWidth = 5, LineColor = "Blue", ArrowHeadAngle = 50)
1147 Canvas.AddArrow((10,10),Length = 90, Direction = 225,LineWidth = 4, LineColor = "Blue", ArrowHeadAngle = 60)
1148 Canvas.AddArrow((10,10),Length = 100,Direction = 270,LineWidth = 3, LineColor = "Green", ArrowHeadAngle = 70)
1149 Canvas.AddArrow((10,10),Length = 110,Direction = 315,LineWidth = 2, LineColor = "Green", ArrowHeadAngle = 90 )
1150
1151 Canvas.AddText("Clickable Arrow",4,18,Position = "bc")
1152 Arrow = Canvas.AddArrow((4,18), 80, Direction = 90 ,LineWidth = 3, LineColor = "Red", ArrowHeadAngle = 30)
1153 Arrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ArrowClicked)
1154
1155 Canvas.AddText("Changable Arrow",16,4,Position = "cc")
1156 self.RotArrow = Canvas.AddArrow((16,4), 80, Direction = 0 ,LineWidth = 3, LineColor = "Green", ArrowHeadAngle = 30)
1157 self.RotArrow.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RotateArrow)
1158
1159
1160
1161 Canvas.ZoomToBB()
1162
1163 def ArrowClicked(self,event):
1164 print "The Arrow was Clicked"
1165
1166 def RotateArrow(self,event):
1167 print "The Changeable Arrow was Clicked"
1168 ## You can do them either one at a time, or both at once
1169 ## Doing them both at once prevents the arrow points from being calculated twice
1170 #self.RotArrow.SetDirection(self.RotArrow.Direction + random.uniform(-90,90))
1171 #self.RotArrow.SetLength(self.RotArrow.Length + random.randint(-20,20))
1172 self.RotArrow.SetLengthDirection(self.RotArrow.Length + random.randint(-20,20),
1173 self.RotArrow.Direction + random.uniform(-90,90) )
1174
1175 self.Canvas.Draw(Force = True)
1176
1177 def TempTest(self, event= None):
1178 wx.GetApp().Yield()
1179
1180 self.UnBindAllMouseEvents()
1181 Canvas = self.Canvas
1182 Canvas.ClearAll()
1183 Canvas.SetProjectionFun(None)
1184
1185 Range = (-10,10)
1186
1187 # Create a random Polygon
1188 points = []
1189 for j in range(6):
1190 point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
1191 points.append(point)
1192 Poly = Canvas.AddPolygon(points,
1193 LineWidth = 2,
1194 LineColor = "Black",
1195 FillColor = "LightBlue",
1196 FillStyle = 'Solid')
1197
1198 Poly.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPoly)
1199
1200 self.SelectedPoly = None
1201 self.SelectPoints = []
1202 self.SelectedPoint = None
1203
1204 Canvas.ZoomToBB()
1205
1206 def SelectPoly(self, Object):
1207 print "In SelectPoly"
1208 Canvas = self.Canvas
1209 if Object is self.SelectedPoly:
1210 pass
1211 else:
1212 #fixme: Do something to unselect the old one
1213 self.SelectedPoly = Object
1214 Canvas.RemoveObjects(self.SelectPoints)
1215 self.SelectPoints = []
1216 # Draw points on the Vertices of the Selected Poly:
1217 for i, point in enumerate(Object.Points):
1218 P = Canvas.AddPointSet(point, Diameter = 6, Color = "Red")
1219 P.VerticeNum = i
1220 P.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPointHit)
1221 self.SelectPoints.append(P)
1222 #Canvas.ZoomToBB()
1223 Canvas.Draw()
1224
1225 def SelectPointHit(self, Point):
1226 print "Point Num: %i Hit"%Point.VerticeNum
1227 self.SelectedPoint = Point
1228
1229 def Read_MapGen(self, filename, stats = 0,AllLines=0):
1230 """
1231 This function reads a MapGen Format file, and
1232 returns a list of NumPy arrays with the line segments in them.
1233
1234 Each NumPy array in the list is an NX2 array of Python Floats.
1235
1236 The demo should have come with a file, "world.dat" that is the
1237 shorelines of the whole world, in MapGen format.
1238
1239 """
1240 import string
1241 file = open(filename,'rt')
1242 data = file.readlines()
1243 data = map(string.strip,data)
1244
1245 Shorelines = []
1246 segment = []
1247 for line in data:
1248 if line:
1249 if line == "# -b": #New segment beginning
1250 if segment: Shorelines.append(Numeric.array(segment))
1251 segment = []
1252 else:
1253 segment.append(map(float,string.split(line)))
1254 if segment: Shorelines.append(Numeric.array(segment))
1255
1256 if stats:
1257 NumSegments = len(Shorelines)
1258 NumPoints = 0
1259 for segment in Shorelines:
1260 NumPoints = NumPoints + len(segment)
1261 AvgPoints = NumPoints / NumSegments
1262 print "Number of Segments: ", NumSegments
1263 print "Average Number of Points per segment: ",AvgPoints
1264 if AllLines:
1265 Lines = []
1266 for segment in Shorelines:
1267 Lines.append(segment[0])
1268 for point in segment[1:-1]:
1269 Lines.append(point)
1270 Lines.append(point)
1271 Lines.append(segment[-1])
1272 return Lines
1273 else:
1274 return Shorelines
1275 return DrawFrame
1276
1277 #---------------------------------------------------------------------------
1278
1279 if __name__ == "__main__":
1280 # check options:
1281 import sys, getopt
1282 optlist, args = getopt.getopt(sys.argv[1:],'l',["local","all","text","map","stext","hit","hitf","animate","speed","temp","props","arrow"])
1283
1284 if not haveNumeric:
1285 raise ImportError(errorText)
1286 StartUpDemo = "all" # the default
1287 for opt in optlist:
1288 if opt[0] == "--all":
1289 StartUpDemo = "all"
1290 elif opt[0] == "--text":
1291 StartUpDemo = "text"
1292 elif opt[0] == "--map":
1293 StartUpDemo = "map"
1294 elif opt[0] == "--stext":
1295 StartUpDemo = "stext"
1296 elif opt[0] == "--hit":
1297 StartUpDemo = "hit"
1298 elif opt[0] == "--hitf":
1299 StartUpDemo = "hitf"
1300 elif opt[0] == "--animate":
1301 StartUpDemo = "animate"
1302 elif opt[0] == "--speed":
1303 StartUpDemo = "speed"
1304 elif opt[0] == "--temp":
1305 StartUpDemo = "temp"
1306 elif opt[0] == "--props":
1307 StartUpDemo = "props"
1308 elif opt[0] == "--arrow":
1309 StartUpDemo = "arrow"
1310 try:
1311 import fixdc
1312 except ImportError:
1313 print ("\n *************Notice*************\n"
1314 "The fixdc module fixes the DC API for wxPython2.5.1.6 You can get the module from:\n"
1315 "http://prdownloads.sourceforge.net/wxpython/fixdc.py?download\n"
1316 " It will set up the DC methods to match both older and upcoming versions\n")
1317 raise
1318
1319 class DemoApp(wx.App):
1320 """
1321 How the demo works:
1322
1323 Under the Draw menu, there are three options:
1324
1325 *Draw Test: will put up a picture of a bunch of randomly generated
1326 objects, of each kind supported.
1327
1328 *Draw Map: will draw a map of the world. Be patient, it is a big map,
1329 with a lot of data, and will take a while to load and draw (about 10 sec
1330 on my 450Mhz PIII). Redraws take about 2 sec. This demonstrates how the
1331 performance is not very good for large drawings.
1332
1333 *Clear: Clears the Canvas.
1334
1335 Once you have a picture drawn, you can zoom in and out and move about
1336 the picture. There is a tool bar with three tools that can be
1337 selected.
1338
1339 The magnifying glass with the plus is the zoom in tool. Once selected,
1340 if you click the image, it will zoom in, centered on where you
1341 clicked. If you click and drag the mouse, you will get a rubber band
1342 box, and the image will zoom to fit that box when you release it.
1343
1344 The magnifying glass with the minus is the zoom out tool. Once selected,
1345 if you click the image, it will zoom out, centered on where you
1346 clicked. (note that this takes a while when you are looking at the map,
1347 as it has a LOT of lines to be drawn. The image is double buffered, so
1348 you don't see the drawing in progress)
1349
1350 The hand is the move tool. Once selected, if you click and drag on the
1351 image, it will move so that the part you clicked on ends up where you
1352 release the mouse. Nothing is changed while you are dragging. The
1353 drawing is too slow for that.
1354
1355 I'd like the cursor to change as you change tools, but the stock
1356 wxCursors didn't include anything I liked, so I stuck with the
1357 pointer. Please let me know if you have any nice cursor images for me to
1358 use.
1359
1360
1361 Any bugs, comments, feedback, questions, and especially code are welcome:
1362
1363 -Chris Barker
1364
1365 Chris.Barker@noaa.gov
1366
1367 """
1368
1369 def __init__(self, *args, **kwargs):
1370 wx.App.__init__(self, *args, **kwargs)
1371
1372 def OnInit(self):
1373 wx.InitAllImageHandlers()
1374 DrawFrame = BuildDrawFrame()
1375 frame = DrawFrame(None, -1, "FloatCanvas Demo App",wx.DefaultPosition,(700,700))
1376
1377 self.SetTopWindow(frame)
1378 frame.Show()
1379
1380 ## check to see if the demo is set to start in a particular mode.
1381 if StartUpDemo == "text":
1382 frame.TestText()
1383 if StartUpDemo == "stext":
1384 frame.TestScaledText()
1385 elif StartUpDemo == "all":
1386 frame.DrawTest()
1387 elif StartUpDemo == "map":
1388 frame.DrawMap()
1389 elif StartUpDemo == "hit":
1390 frame.TestHitTest()
1391 elif StartUpDemo == "hitf":
1392 "starting TestHitTestForeground"
1393 frame.TestHitTestForeground()
1394 elif StartUpDemo == "animate":
1395 "starting TestAnimation"
1396 frame.TestAnimation()
1397 elif StartUpDemo == "speed":
1398 "starting SpeedTest"
1399 frame.SpeedTest()
1400 elif StartUpDemo == "temp":
1401 "starting temp Test"
1402 frame.TempTest()
1403 elif StartUpDemo == "props":
1404 "starting PropertiesChange Test"
1405 frame.PropertiesChangeTest()
1406 elif StartUpDemo == "arrow":
1407 "starting arrow Test"
1408 frame.ArrowTest()
1409
1410 return True
1411
1412 app = DemoApp(False)# put in True if you want output to go to it's own window.
1413 app.MainLoop()
1414
1415 else:
1416 # It's not running stand-alone, set up for wxPython demo.
1417 if not haveNumeric:
1418 ## TestPanel and runTest used for integration into wxPython Demo
1419 class TestPanel(wx.Panel):
1420 def __init__(self, parent, log):
1421 self.log = log
1422 wx.Panel.__init__(self, parent, -1)
1423
1424 import images
1425
1426 note1 = wx.StaticText(self, -1, errorText)
1427 note2 = wx.StaticText(self, -1, "This is what the FloatCanvas can look like:")
1428 S = wx.BoxSizer(wx.VERTICAL)
1429 S.Add((10, 10), 1)
1430 S.Add(note1, 0, wx.ALIGN_CENTER)
1431 S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 4)
1432 S.Add(wx.StaticBitmap(self,-1,images.getFloatCanvasBitmap()),0,wx.ALIGN_CENTER)
1433 S.Add((10, 10), 1)
1434 self.SetSizer(S)
1435 self.Layout()
1436
1437 else:
1438 ## TestPanel and runTest used for integration into wxPython Demo
1439 class TestPanel(wx.Panel):
1440 def __init__(self, parent, log):
1441 self.log = log
1442 wx.Panel.__init__(self, parent, -1)
1443 note1 = wx.StaticText(self, -1, "The FloatCanvas Demo needs")
1444 note2 = wx.StaticText(self, -1, "a separate frame")
1445 b = wx.Button(self, -1, "Open Demo Frame Now")
1446 b.Bind(wx.EVT_BUTTON, self.OnButton)
1447
1448 S = wx.BoxSizer(wx.VERTICAL)
1449 S.Add((10, 10), 1)
1450 S.Add(note1, 0, wx.ALIGN_CENTER)
1451 S.Add(note2, 0, wx.ALIGN_CENTER | wx.BOTTOM, 5)
1452 S.Add(b, 0, wx.ALIGN_CENTER | wx.ALL, 5)
1453 S.Add((10, 10), 1)
1454 self.SetSizer(S)
1455 self.Layout()
1456
1457 def OnButton(self, evt):
1458 DrawFrame = BuildDrawFrame()
1459 frame = DrawFrame(None, -1, "FloatCanvas Drawing Window",wx.DefaultPosition,(500,500))
1460
1461 #win = wx.lib.plot.TestFrame(self, -1, "PlotCanvas Demo")
1462 frame.Show()
1463 frame.DrawTest()
1464
1465 def runTest(frame, nb, log):
1466 win = TestPanel(nb, log)
1467 return win
1468
1469 # import to get the doc
1470 from wx.lib import floatcanvas
1471 overview = floatcanvas.__doc__
1472
1473
1474
1475
1476
1477
1478
1479