f8a11ef915
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27679 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1323 lines
53 KiB
Python
1323 lines
53 KiB
Python
|
|
try:
|
|
import Numeric
|
|
import RandomArray
|
|
haveNumeric = True
|
|
except ImportError:
|
|
try:
|
|
import numarray as Numeric
|
|
import numarray.random_array as RandomArray
|
|
haveNumeric = True
|
|
except ImportError:
|
|
haveNumeric = False
|
|
|
|
if not haveNumeric:
|
|
errorText = """
|
|
The FloatCanvas requires either the Numeric or Numarray module:
|
|
You can get them at:
|
|
http://sourceforge.net/projects/numpy
|
|
|
|
NOTE: The Numeric module is substantially faster than numarray for this
|
|
purpose, if you have lot's of objects
|
|
"""
|
|
|
|
def runTest(frame, nb, log):
|
|
dlg = wx.MessageDialog(frame, errorText, 'Sorry', wx.OK |
|
|
wx.ICON_INFORMATION)
|
|
dlg.ShowModal()
|
|
dlg.Destroy()
|
|
|
|
overview = ""
|
|
|
|
else:
|
|
StartUpDemo = "all"
|
|
if __name__ == "__main__": # parse options if run stand-alone
|
|
# check options:
|
|
import sys, getopt
|
|
optlist, args = getopt.getopt(sys.argv[1:],'l',["local","all","text","map","stext","hit","hitf","animate","speed","temp"])
|
|
|
|
for opt in optlist:
|
|
if opt[0] == "--all":
|
|
StartUpDemo = "all"
|
|
elif opt[0] == "--text":
|
|
StartUpDemo = "text"
|
|
elif opt[0] == "--map":
|
|
StartUpDemo = "map"
|
|
elif opt[0] == "--stext":
|
|
StartUpDemo = "stext"
|
|
elif opt[0] == "--hit":
|
|
StartUpDemo = "hit"
|
|
elif opt[0] == "--hitf":
|
|
StartUpDemo = "hitf"
|
|
elif opt[0] == "--animate":
|
|
StartUpDemo = "animate"
|
|
elif opt[0] == "--speed":
|
|
StartUpDemo = "speed"
|
|
elif opt[0] == "--temp":
|
|
StartUpDemo = "temp"
|
|
import wx
|
|
import time, random
|
|
|
|
def runTest(frame, nb, log):
|
|
"""
|
|
This method is used by the wxPython Demo Framework for integrating
|
|
this demo with the rest.
|
|
"""
|
|
win = DrawFrame(None, -1, "FloatCanvas Drawing Window",wx.DefaultPosition,(500,500))
|
|
frame.otherWin = win
|
|
win.Show(True)
|
|
win.DrawTest()
|
|
|
|
try:
|
|
from floatcanvas import NavCanvas, FloatCanvas
|
|
except ImportError: # if it's not there locally, try the wxPython lib.
|
|
from wx.lib.floatcanvas import NavCanvas, FloatCanvas
|
|
|
|
import wxPython.lib.colourdb
|
|
|
|
class DrawFrame(wx.Frame):
|
|
|
|
"""
|
|
A frame used for the FloatCanvas Demo
|
|
|
|
"""
|
|
|
|
|
|
def __init__(self,parent, id,title,position,size):
|
|
wx.Frame.__init__(self,parent, id,title,position, size)
|
|
|
|
## Set up the MenuBar
|
|
MenuBar = wx.MenuBar()
|
|
|
|
file_menu = wx.Menu()
|
|
item = file_menu.Append(-1, "&Close","Close this frame")
|
|
self.Bind(wx.EVT_MENU, self.OnQuit, item)
|
|
MenuBar.Append(file_menu, "&File")
|
|
|
|
draw_menu = wx.Menu()
|
|
|
|
item = draw_menu.Append(-1, "&Draw Test","Run a test of drawing random components")
|
|
self.Bind(wx.EVT_MENU, self.DrawTest, item)
|
|
|
|
item = draw_menu.Append(-1, "&Line Test","Run a test of drawing random lines")
|
|
self.Bind(wx.EVT_MENU, self.LineTest, item)
|
|
|
|
item = draw_menu.Append(-1, "Draw &Map","Run a test of drawing a map")
|
|
self.Bind(wx.EVT_MENU, self.DrawMap, item)
|
|
item = draw_menu.Append(-1, "&Text Test","Run a test of text drawing")
|
|
self.Bind(wx.EVT_MENU, self.TestText, item)
|
|
item = draw_menu.Append(-1, "&ScaledText Test","Run a test of text drawing")
|
|
self.Bind(wx.EVT_MENU, self.TestScaledText, item)
|
|
item = draw_menu.Append(-1, "&Clear","Clear the Canvas")
|
|
self.Bind(wx.EVT_MENU, self.Clear, item)
|
|
item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code")
|
|
self.Bind(wx.EVT_MENU, self.TestHitTest, item)
|
|
item = draw_menu.Append(-1, "&Hit Test Foreground","Run a test of the hit test code with a foreground Object")
|
|
self.Bind(wx.EVT_MENU, self.TestHitTestForeground, item)
|
|
item = draw_menu.Append(-1, "&Animation","Run a test of Animation")
|
|
self.Bind(wx.EVT_MENU, self.TestAnimation, item)
|
|
item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed")
|
|
self.Bind(wx.EVT_MENU, self.SpeedTest, item)
|
|
MenuBar.Append(draw_menu, "&Tests")
|
|
|
|
view_menu = wx.Menu()
|
|
item = view_menu.Append(-1, "Zoom to &Fit","Zoom to fit the window")
|
|
self.Bind(wx.EVT_MENU, self.ZoomToFit, item)
|
|
MenuBar.Append(view_menu, "&View")
|
|
|
|
help_menu = wx.Menu()
|
|
item = help_menu.Append(-1, "&About",
|
|
"More information About this program")
|
|
self.Bind(wx.EVT_MENU, self.OnAbout, item)
|
|
MenuBar.Append(help_menu, "&Help")
|
|
|
|
self.SetMenuBar(MenuBar)
|
|
|
|
self.CreateStatusBar()
|
|
# Add the Canvas
|
|
self.Canvas = NavCanvas.NavCanvas(self,
|
|
-1,
|
|
(500,500),
|
|
Debug = 1,
|
|
BackgroundColor = "DARK SLATE BLUE")
|
|
|
|
wx.EVT_CLOSE(self, self.OnCloseWindow)
|
|
|
|
FloatCanvas.EVT_MOTION(self.Canvas, self.OnMove )
|
|
#FloatCanvas.EVT_LEFT_UP(self.Canvas, self.OnLeftUp )
|
|
|
|
self.EventsAreBound = False
|
|
|
|
## getting all the colors and linestyles for random objects
|
|
wxPython.lib.colourdb.updateColourDB()
|
|
self.colors = wxPython.lib.colourdb.getColourList()
|
|
#self.LineStyles = FloatCanvas.DrawObject.LineStyleList.keys()
|
|
|
|
|
|
return None
|
|
|
|
def BindAllMouseEvents(self):
|
|
if not self.EventsAreBound:
|
|
## Here is how you catch FloatCanvas mouse events
|
|
FloatCanvas.EVT_LEFT_DOWN(self.Canvas, self.OnLeftDown )
|
|
FloatCanvas.EVT_LEFT_UP(self.Canvas, self.OnLeftUp )
|
|
FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, self.OnLeftDouble )
|
|
|
|
FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, self.OnMiddleDown )
|
|
FloatCanvas.EVT_MIDDLE_UP(self.Canvas, self.OnMiddleUp )
|
|
FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, self.OnMiddleDouble )
|
|
|
|
FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, self.OnRightDown )
|
|
FloatCanvas.EVT_RIGHT_UP(self.Canvas, self.OnRightUp )
|
|
FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, self.OnRightDouble )
|
|
|
|
FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, self.OnWheel )
|
|
self.EventsAreBound = True
|
|
|
|
def UnBindAllMouseEvents(self):
|
|
## Here is how you catch FloatCanvas mouse events
|
|
FloatCanvas.EVT_LEFT_DOWN(self.Canvas, None )
|
|
FloatCanvas.EVT_LEFT_UP(self.Canvas, None )
|
|
FloatCanvas.EVT_LEFT_DCLICK(self.Canvas, None)
|
|
|
|
FloatCanvas.EVT_MIDDLE_DOWN(self.Canvas, None )
|
|
FloatCanvas.EVT_MIDDLE_UP(self.Canvas, None )
|
|
FloatCanvas.EVT_MIDDLE_DCLICK(self.Canvas, None )
|
|
|
|
FloatCanvas.EVT_RIGHT_DOWN(self.Canvas, None )
|
|
FloatCanvas.EVT_RIGHT_UP(self.Canvas, None )
|
|
FloatCanvas.EVT_RIGHT_DCLICK(self.Canvas, None )
|
|
|
|
FloatCanvas.EVT_MOUSEWHEEL(self.Canvas, None )
|
|
|
|
self.EventsAreBound = False
|
|
|
|
def PrintCoords(self,event):
|
|
print "coords are: %s"%(event.Coords,)
|
|
print "pixel coords are: %s\n"%(event.GetPosition(),)
|
|
|
|
def OnLeftDown(self, event):
|
|
print "Left Button has been clicked in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnLeftUp(self, event):
|
|
print "Left up in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnLeftDouble(self, event):
|
|
print "Left Double Click in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnMiddleDown(self, event):
|
|
print "Middle Button clicked in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnMiddleUp(self, event):
|
|
print "Middle Button Up in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnMiddleDouble(self, event):
|
|
print "Middle Button Double clicked in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnRightDown(self, event):
|
|
print "Right Button has been clicked in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnRightUp(self, event):
|
|
print "Right Button Up in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnRightDouble(self, event):
|
|
print "Right Button Double clicked in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnWheel(self, event):
|
|
print "Mouse Wheel Moved in DrawFrame"
|
|
self.PrintCoords(event)
|
|
|
|
def OnMove(self, event):
|
|
"""
|
|
Updates the staus bar with the world coordinates
|
|
"""
|
|
self.SetStatusText("%.2f, %.2f"%tuple(event.Coords))
|
|
|
|
def OnAbout(self, event):
|
|
print "OnAbout called"
|
|
|
|
dlg = wx.MessageDialog(self, "This is a small program to demonstrate\n"
|
|
"the use of the FloatCanvas\n",
|
|
"About Me", wx.OK | wx.ICON_INFORMATION)
|
|
dlg.ShowModal()
|
|
dlg.Destroy()
|
|
|
|
def ZoomToFit(self,event):
|
|
self.Canvas.ZoomToBB()
|
|
|
|
def Clear(self,event = None):
|
|
self.UnBindAllMouseEvents()
|
|
self.Canvas.ClearAll()
|
|
self.Canvas.SetProjectionFun(None)
|
|
self.Canvas.Draw()
|
|
|
|
def OnQuit(self,event):
|
|
self.Close(True)
|
|
|
|
def OnCloseWindow(self, event):
|
|
self.Destroy()
|
|
|
|
def DrawTest(self,event=None):
|
|
# import random
|
|
# import RandomArray
|
|
Range = (-10,10)
|
|
colors = self.colors
|
|
|
|
self.BindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
## Random tests of everything:
|
|
|
|
# Rectangles
|
|
for i in range(3):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
h = random.randint(1,5)
|
|
w = random.randint(1,5)
|
|
Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
|
|
|
|
# Ellipses
|
|
for i in range(3):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
h = random.randint(1,5)
|
|
w = random.randint(1,5)
|
|
Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
|
|
|
|
## # Dots -- Does anyone need this?
|
|
## for i in range(5):
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## D = random.randint(1,50)
|
|
## lw = random.randint(1,5)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## cl = random.randint(0,len(colors)-1)
|
|
## Canvas.AddDot(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
|
|
|
|
# Circles
|
|
for i in range(5):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
D = random.randint(1,5)
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
|
|
Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
|
|
|
|
# Lines
|
|
for i in range(5):
|
|
points = []
|
|
for j in range(random.randint(2,10)):
|
|
point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
|
|
points.append(point)
|
|
lw = random.randint(1,10)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
|
|
|
|
# Polygons
|
|
for i in range(3):
|
|
points = []
|
|
for j in range(random.randint(2,6)):
|
|
point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
points.append(point)
|
|
lw = random.randint(1,6)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddPolygon(points,
|
|
LineWidth = lw,
|
|
LineColor = colors[cl],
|
|
FillColor = colors[cf],
|
|
FillStyle = 'Solid')
|
|
|
|
## Pointset
|
|
for i in range(4):
|
|
points = []
|
|
points = RandomArray.uniform(Range[0],Range[1],(100,2))
|
|
cf = random.randint(0,len(colors)-1)
|
|
D = random.randint(1,4)
|
|
Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
|
|
|
|
# Text
|
|
String = "Unscaled text"
|
|
for i in range(3):
|
|
ts = random.randint(10,40)
|
|
cf = random.randint(0,len(colors)-1)
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
|
|
|
|
# Scaled Text
|
|
String = "Scaled text"
|
|
for i in range(3):
|
|
ts = random.random()*3 + 0.2
|
|
cf = random.randint(0,len(colors)-1)
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
|
|
|
|
Canvas.ZoomToBB()
|
|
|
|
def TestAnimation(self,event=None):
|
|
"""
|
|
|
|
In this test, a relatively complex background is drawn, and
|
|
a simple object placed in the foreground is moved over
|
|
it. This demonstrates how to use the InForeground attribute
|
|
to make an object in the foregorund draw fast, without
|
|
having to re-draw the whole background.
|
|
|
|
"""
|
|
print "Running TestAnimation"
|
|
Range = (-10,10)
|
|
self.Range = Range
|
|
|
|
self.UnBindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
## Random tests of everything:
|
|
colors = self.colors
|
|
# Rectangles
|
|
for i in range(3):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
h = random.randint(1,5)
|
|
w = random.randint(1,5)
|
|
Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
|
|
|
|
# Ellipses
|
|
for i in range(3):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
h = random.randint(1,5)
|
|
w = random.randint(1,5)
|
|
Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
|
|
|
|
# Circles
|
|
for i in range(5):
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
D = random.randint(1,5)
|
|
lw = random.randint(1,5)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
|
|
Canvas.AddText("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc")
|
|
|
|
# Lines
|
|
for i in range(5):
|
|
points = []
|
|
for j in range(random.randint(2,10)):
|
|
point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
|
|
points.append(point)
|
|
lw = random.randint(1,10)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
|
|
|
|
# Polygons
|
|
for i in range(3):
|
|
points = []
|
|
for j in range(random.randint(2,6)):
|
|
point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
points.append(point)
|
|
lw = random.randint(1,6)
|
|
cf = random.randint(0,len(colors)-1)
|
|
cl = random.randint(0,len(colors)-1)
|
|
Canvas.AddPolygon(points,
|
|
LineWidth = lw,
|
|
LineColor = colors[cl],
|
|
FillColor = colors[cf],
|
|
FillStyle = 'Solid')
|
|
|
|
# Scaled Text
|
|
String = "Scaled text"
|
|
for i in range(3):
|
|
ts = random.random()*3 + 0.2
|
|
cf = random.randint(0,len(colors)-1)
|
|
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
|
|
|
|
|
|
# Now the Foreground Object:
|
|
C = Canvas.AddCircle(0,0,7,LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True)
|
|
T = Canvas.AddScaledText("Click to Move",0,0, Size = 0.8, Position = 'cc', InForeground = True)
|
|
C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe)
|
|
C.Text = T
|
|
|
|
self.Timer = wx.PyTimer(self.ShowFrame)
|
|
self.FrameDelay = 50 # milliseconds
|
|
|
|
Canvas.ZoomToBB()
|
|
|
|
def ShowFrame(self):
|
|
Object = self.MovingObject
|
|
Range = self.Range
|
|
if self.TimeStep < self.NumTimeSteps:
|
|
x,y = Object.XY
|
|
if x > Range[1] or x < Range[0]:
|
|
self.dx = -self.dx
|
|
if y > Range[1] or y < Range[0]:
|
|
self.dy = -self.dy
|
|
Object.Move( (self.dx,self.dy) )
|
|
Object.Text.Move( (self.dx,self.dy))
|
|
self.Canvas.Draw()
|
|
self.TimeStep += 1
|
|
else:
|
|
self.Timer.Stop()
|
|
|
|
|
|
def MoveMe(self, Object):
|
|
self.MovingObject = Object
|
|
Range = self.Range
|
|
self.dx = random.uniform(Range[0]/4,Range[1]/4)
|
|
self.dy = random.uniform(Range[0]/4,Range[1]/4)
|
|
#import time
|
|
#start = time.time()
|
|
self.NumTimeSteps = 500
|
|
self.TimeStep = 1
|
|
self.Timer.Start(self.FrameDelay)
|
|
#print "Did %i frames in %f seconds"%(N, (time.time() - start) )
|
|
|
|
def TestHitTest(self,event=None):
|
|
|
|
self.UnBindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
#Add a HitAble rectangle
|
|
w, h = 60, 20
|
|
|
|
dx = 80
|
|
dy = 40
|
|
x,y = 20, 20
|
|
|
|
#Add one that is not HitAble
|
|
Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
|
|
Canvas.AddText("Not Hit-able", x, y, Position = "bl")
|
|
|
|
|
|
x += dx
|
|
R = Canvas.AddRectangle(x, y, w, h,LineWidth = 2)
|
|
R.Name = "Line Rectangle"
|
|
R.HitFill = False
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Left Click Line", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
|
|
x += dx
|
|
color = "Red"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + "Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Left Click Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
color = "LightBlue"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Right Click Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "Grey"
|
|
R = Canvas.AddEllipse(x, y, w, h,LineWidth = 2,FillColor = color)
|
|
R.Name = color +" Ellipse"
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Right Click Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "Brown"
|
|
R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Circle"
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit)
|
|
Canvas.AddText("Left D-Click Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
color = "Pink"
|
|
R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2,FillColor = color)
|
|
R.Name = color + " Circle"
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit)
|
|
Canvas.AddText("Left Up Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "White"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Middle Down", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "AQUAMARINE"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit)
|
|
Canvas.AddText("Middle Up", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
color = "CORAL"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit)
|
|
Canvas.AddText("Middle DoubleClick", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "CYAN"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit)
|
|
Canvas.AddText("Right Up", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "LIME GREEN"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit)
|
|
Canvas.AddText("Right Double Click", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
color = "MEDIUM GOLDENROD"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
|
|
Canvas.AddText("L and R Click", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "SALMON"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Rectangle"
|
|
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
|
|
Canvas.AddText("Mouse Enter", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "MEDIUM VIOLET RED"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color
|
|
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
|
|
Canvas.AddText("Mouse Leave", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
color = "SKY BLUE"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
|
|
R.Name = color
|
|
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
|
|
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
|
|
Canvas.AddText("Enter and Leave", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "WHEAT"
|
|
R = Canvas.AddRectangle(x, y, w+12, h, LineColor = None, FillColor = color)
|
|
R.Name = color
|
|
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
|
|
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
|
|
Canvas.AddText("Mouse Enter&Leave", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "KHAKI"
|
|
R = Canvas.AddRectangle(x-12, y, w+12, h, LineColor = None, FillColor = color)
|
|
R.Name = color
|
|
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
|
|
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
|
|
Canvas.AddText("Mouse ENter&Leave", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red")
|
|
L.Name = "A Line"
|
|
L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
|
|
Canvas.AddText("Left Down", x, y, Position = "bl")
|
|
Canvas.AddText(L.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "SEA GREEN"
|
|
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)
|
|
R = Canvas.AddPolygon(Points, LineWidth = 2, FillColor = color)
|
|
R.Name = color + " Polygon"
|
|
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
|
|
Canvas.AddText("RIGHT_DOWN", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x += dx
|
|
color = "Red"
|
|
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)
|
|
R = Canvas.AddPointSet(Points, Diameter = 4, Color = color)
|
|
R.Name = "PointSet"
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit)
|
|
Canvas.AddText("LEFT_DOWN", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
x = 20
|
|
y += dy
|
|
T = Canvas.AddText("Hit-able Text", x, y, Size = 15, Color = "Red", Position = 'tl')
|
|
T.Name = "Hit-able Text"
|
|
T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
|
|
Canvas.AddText("Left Down", x, y, Position = "bl")
|
|
|
|
x += dx
|
|
T = Canvas.AddScaledText("Scaled Text", x, y, Size = 1./2*h, Color = "Pink", Position = 'bl')
|
|
Canvas.AddPointSet( (x, y), Diameter = 3)
|
|
T.Name = "Scaled Text"
|
|
T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
|
|
Canvas.AddText("Left Down", x, y, Position = "tl")
|
|
|
|
self.Canvas.ZoomToBB()
|
|
|
|
def TestHitTestForeground(self,event=None):
|
|
print "Running: TestHitTestForeground"
|
|
|
|
self.UnBindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
#Add a Hitable rectangle
|
|
w, h = 60, 20
|
|
|
|
dx = 80
|
|
dy = 40
|
|
x,y = 20, 20
|
|
|
|
color = "Red"
|
|
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color, InForeground = False)
|
|
R.Name = color + "Rectangle"
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
|
|
Canvas.AddText("Left Click Fill", x, y, Position = "bl")
|
|
Canvas.AddText(R.Name, x, y+h, Position = "tl")
|
|
|
|
## A set of Rectangles that move together
|
|
|
|
## NOTE: In a real app, it might be better to create a new
|
|
## custom FloatCanvas DrawObject
|
|
|
|
self.MovingRects = []
|
|
x += dx
|
|
color = "LightBlue"
|
|
R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveLeft)
|
|
L = Canvas.AddText("Left", x + w/4, y + h/4, Position = "cc", InForeground = True)
|
|
self.MovingRects.extend( (R,L) )
|
|
|
|
x += w/2
|
|
R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveRight)
|
|
L = Canvas.AddText("Right", x + w/4, y + h/4, Position = "cc", InForeground = True)
|
|
self.MovingRects.extend( (R,L) )
|
|
|
|
x -= w/2
|
|
y += h/2
|
|
R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveUp)
|
|
L = Canvas.AddText("Up", x + w/4, y + h/4, Position = "cc", InForeground = True)
|
|
self.MovingRects.extend( (R,L) )
|
|
|
|
|
|
x += w/2
|
|
R = Canvas.AddRectangle(x, y, w/2, h/2, LineWidth = 2, FillColor = color, InForeground = True)
|
|
R.HitFill = True
|
|
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectMoveDown)
|
|
L = Canvas.AddText("Down", x + w/4, y + h/4, Position = "cc", InForeground = True)
|
|
self.MovingRects.extend( (R,L) )
|
|
|
|
self.Canvas.ZoomToBB()
|
|
|
|
def RectMoveLeft(self,Object):
|
|
self.MoveRects("left")
|
|
|
|
def RectMoveRight(self,Object):
|
|
self.MoveRects("right")
|
|
|
|
def RectMoveUp(self,Object):
|
|
self.MoveRects("up")
|
|
|
|
def RectMoveDown(self,Object):
|
|
self.MoveRects("down")
|
|
|
|
def MoveRects(self, Dir):
|
|
for Object in self.MovingRects:
|
|
X,Y = Object.XY
|
|
if Dir == "left": X -= 10
|
|
elif Dir == "right": X += 10
|
|
elif Dir == "up": Y += 10
|
|
elif Dir == "down": Y -= 10
|
|
Object.SetXY(X,Y)
|
|
self.Canvas.Draw()
|
|
|
|
|
|
def PointSetGotHit(self, Object):
|
|
print Object.Name, "Got Hit\n"
|
|
|
|
def RectGotHit(self, Object):
|
|
print Object.Name, "Got Hit\n"
|
|
|
|
def RectGotHitRight(self, Object):
|
|
print Object.Name, "Got Hit With Right\n"
|
|
|
|
def RectGotHitLeft(self, Object):
|
|
print Object.Name, "Got Hit with Left\n"
|
|
|
|
def RectMouseOver(self, Object):
|
|
print "Mouse entered:", Object.Name
|
|
|
|
def RectMouseLeave(self, Object):
|
|
print "Mouse left ", Object.Name
|
|
|
|
|
|
def TestText(self, event= None):
|
|
|
|
self.BindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
x,y = (0, 0)
|
|
|
|
## Add a non-visible rectangle, just to get a Bounding Box
|
|
## Text objects have a zero-size bounding box, because it changes with zoom
|
|
Canvas.AddRectangle(-10,-10,20,20,LineWidth = 1, LineColor = None)
|
|
|
|
# Text
|
|
String = "Some text"
|
|
## for i in range(10):
|
|
## ts = random.randint(10,40)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
self.Canvas.AddText("Top Left",x,y,Size = 14,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
|
|
self.Canvas.AddText("Bottom Left",x,y,Size = 14,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
|
|
self.Canvas.AddText("Top Right",x,y,Size = 14,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
|
|
self.Canvas.AddText("Bottom Right",x,y,Size = 14,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
|
|
|
|
x,y = (0, 2)
|
|
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
|
|
self.Canvas.AddText("Top Center",x,y,Size = 14,Color = "Black",Position = "tc")
|
|
self.Canvas.AddText("Bottom Center",x,y,Size = 14,Color = "White",Position = "bc")
|
|
|
|
x,y = (0, 4)
|
|
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
|
|
self.Canvas.AddText("Center Right",x,y,Size = 14,Color = "Black",Position = "cr")
|
|
self.Canvas.AddText("Center Left",x,y,Size = 14,Color = "Black",Position = "cl")
|
|
|
|
x,y = (0, -2)
|
|
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 2)
|
|
self.Canvas.AddText("Center Center",x,y,Size = 14,Color = "Black",Position = "cc")
|
|
|
|
self.Canvas.AddText("40 Pixels",-10,8,Size = 40)
|
|
self.Canvas.AddText("20 Pixels",-10,5,Size = 20)
|
|
self.Canvas.AddText("10 Pixels",-10,3,Size = 10)
|
|
|
|
self.Canvas.AddText("MODERN Font", -10, 0, Family = wx.MODERN)
|
|
self.Canvas.AddText("DECORATIVE Font", -10, -1, Family = wx.DECORATIVE)
|
|
self.Canvas.AddText("ROMAN Font", -10, -2, Family = wx.ROMAN)
|
|
self.Canvas.AddText("SCRIPT Font", -10, -3, Family = wx.SCRIPT)
|
|
self.Canvas.AddText("ROMAN BOLD Font", -10, -4, Family = wx.ROMAN, Weight=wx.BOLD)
|
|
self.Canvas.AddText("ROMAN ITALIC BOLD Font", -10, -5, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
|
|
|
|
# NOTE: this font exists on my Linux box..who knows were else you'll find it!
|
|
Font = wx.Font(20, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
|
|
self.Canvas.AddText("zapf chancery Font", -10, -6, Font = Font)
|
|
|
|
self.Canvas.ZoomToBB()
|
|
|
|
def TestScaledText(self, event= None):
|
|
|
|
self.BindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
x,y = (0, 0)
|
|
|
|
T = Canvas.AddScaledText("Top Left",x,y,Size = 5,Color = "Yellow",BackgroundColor = "Blue", Position = "tl")
|
|
T = Canvas.AddScaledText("Bottom Left",x,y,Size = 5,Color = "Cyan",BackgroundColor = "Black",Position = "bl")
|
|
T = Canvas.AddScaledText("Top Right",x,y,Size = 5,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
|
|
T = Canvas.AddScaledText("Bottom Right",x,y,Size = 5,Color = "Blue",BackgroundColor = "Yellow",Position = "br")
|
|
Canvas.AddPointSet((x,y), Color = "Red", Diameter = 4)
|
|
|
|
|
|
x,y = (0, 20)
|
|
|
|
Canvas.AddScaledText("Top Center",x,y,Size = 7,Color = "Black",Position = "tc")
|
|
Canvas.AddScaledText("Bottom Center",x,y,Size = 7,Color = "White",Position = "bc")
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
|
|
|
|
x,y = (0, -20)
|
|
|
|
Canvas.AddScaledText("Center Right",x,y,Size = 9,Color = "Black",Position = "cr")
|
|
Canvas.AddScaledText("Center Left",x,y,Size = 9,Color = "Black",Position = "cl")
|
|
Canvas.AddPointSet((x,y), Color = "White", Diameter = 4)
|
|
|
|
x = -200
|
|
|
|
self.Canvas.AddScaledText("MODERN Font", x, 0, Size = 7, Family = wx.MODERN, Color = (0,0,0))
|
|
self.Canvas.AddScaledText("DECORATIVE Font", x, -10, Size = 7, Family = wx.DECORATIVE, Color = (0,0,1))
|
|
self.Canvas.AddScaledText("ROMAN Font", x, -20, Size = 7, Family = wx.ROMAN)
|
|
self.Canvas.AddScaledText("SCRIPT Font", x, -30, Size = 7, Family = wx.SCRIPT)
|
|
self.Canvas.AddScaledText("ROMAN BOLD Font", x, -40, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD)
|
|
self.Canvas.AddScaledText("ROMAN ITALIC BOLD Font", x, -50, Size = 7, Family = wx.ROMAN, Weight=wx.BOLD, Style=wx.ITALIC)
|
|
Canvas.AddPointSet((x,0), Color = "White", Diameter = 4)
|
|
|
|
|
|
# NOTE: this font exists on my Linux box..who knows were else you'll find it!
|
|
x,y = (-100, 50)
|
|
Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "zapf chancery")
|
|
T = self.Canvas.AddScaledText("zapf chancery Font", x, y, Size = 20, Font = Font, Position = 'bc')
|
|
|
|
x,y = (-50, -50)
|
|
Font = wx.Font(12, wx.DEFAULT, wx.ITALIC, wx.NORMAL, False, "bookman")
|
|
T = self.Canvas.AddScaledText("Bookman Font", x, y, Size = 8, Font = Font)
|
|
|
|
self.Canvas.ZoomToBB()
|
|
|
|
def DrawMap(self,event = None):
|
|
import os, time
|
|
self.BindAllMouseEvents()
|
|
|
|
## Test of Actual Map Data
|
|
self.Canvas.ClearAll()
|
|
self.Canvas.SetProjectionFun("FlatEarth")
|
|
#start = time.clock()
|
|
Shorelines = Read_MapGen(os.path.join("data",'world.dat'),stats = 0)
|
|
#print "It took %f seconds to load %i shorelines"%(time.clock() - start,len(Shorelines) )
|
|
#start = time.clock()
|
|
for segment in Shorelines:
|
|
self.Canvas.AddLine(segment)
|
|
#print "It took %f seconds to add %i shorelines"%(time.clock() - start,len(Shorelines) )
|
|
#start = time.clock()
|
|
self.Canvas.ZoomToBB()
|
|
#print "It took %f seconds to draw %i shorelines"%(time.clock() - start,len(Shorelines) )
|
|
|
|
|
|
def LineTest(self,event = None):
|
|
import os, time
|
|
# import random
|
|
colors = self.colors
|
|
Range = (-10,10)
|
|
## Test of drawing lots of lines
|
|
Canvas = self.Canvas
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
#start = time.clock()
|
|
linepoints = []
|
|
linecolors = []
|
|
linewidths = []
|
|
for i in range(2000):
|
|
points = (random.randint(Range[0],Range[1]),
|
|
random.randint(Range[0],Range[1]),
|
|
random.randint(Range[0],Range[1]),
|
|
random.randint(Range[0],Range[1]))
|
|
linepoints.append(points)
|
|
linewidths.append(random.randint(1,10) )
|
|
linecolors.append(random.randint(0,len(colors)-1) )
|
|
for (points,color,width) in zip(linepoints,linecolors,linewidths):
|
|
Canvas.AddLine((points[0:2],points[2:4]), LineWidth = width, LineColor = colors[color])
|
|
#print "It took %f seconds to add %i lines"%(time.clock() - start,len(linepoints) )
|
|
#start = time.clock()
|
|
Canvas.ZoomToBB()
|
|
#print "It took %f seconds to draw %i lines"%(time.clock() - start,len(linepoints) )
|
|
|
|
def SpeedTest(self,event=None):
|
|
# import random
|
|
# import RandomArray
|
|
BigRange = (-1000,1000)
|
|
colors = self.colors
|
|
|
|
self.UnBindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
# Lots of Text
|
|
String = "Unscaled text"
|
|
coords = []
|
|
text = []
|
|
for i in range(5000):
|
|
x,y = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1]))
|
|
coords.append( (x,y) )
|
|
print "Drawing the Numbers"
|
|
start = time.clock()
|
|
for i in xrange( len(coords) ):
|
|
Canvas.AddText("%i"%(i),
|
|
coords[i][0],
|
|
coords[i][1],
|
|
Size = 12,
|
|
Position = "cc",
|
|
BackgroundColor = "White")
|
|
print "It took %s seconds to add the numbers"%(time.clock() - start)
|
|
|
|
|
|
## ObjectList = []
|
|
|
|
## print "Building a list of lots of random objects"
|
|
## ## Random tests of everything:
|
|
## def MakeRange():
|
|
## while True:
|
|
## Range = ( random.randint(BigRange[0],BigRange[1]), random.randint(BigRange[0],BigRange[1]) )
|
|
## if abs (Range[0] - Range[1]) < 10:
|
|
## continue
|
|
## if Range[0] > Range[1]:
|
|
## Range = ( Range[1], Range[0] )
|
|
## break
|
|
## return Range
|
|
|
|
## # Rectangles
|
|
## for i in range(300):
|
|
## Range = MakeRange()
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## lw = random.randint(1,5)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## h = random.randint(1, Range[1] - Range[0])
|
|
## w = random.randint(1, Range[1] - Range[0])
|
|
## ObjectList.append(FloatCanvas.Rectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf]))
|
|
|
|
## # Ellipses
|
|
## for i in range(300):
|
|
## Range = MakeRange()
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## lw = random.randint(1,5)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## h = random.randint(1, Range[1] - Range[0])
|
|
## w = random.randint(1, Range[1] - Range[0])
|
|
## ObjectList.append(FloatCanvas.Ellipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf]))
|
|
|
|
|
|
## # Circles
|
|
## for i in range(500):
|
|
## Range = MakeRange()
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## D = random.randint(1, (Range[1] - Range[0]) / 2)
|
|
## lw = random.randint(1,5)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## cl = random.randint(0,len(colors)-1)
|
|
## ObjectList.append(FloatCanvas.Circle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf]))
|
|
## #ObjectList.append(FloatCanvas.Text("Circle # %i"%(i),x,y,Size = 12,BackgroundColor = None,Position = "cc"))
|
|
|
|
## # Lines
|
|
## for i in range(500):
|
|
## Range = MakeRange()
|
|
## points = []
|
|
## for j in range(random.randint(2,100)):
|
|
## point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
|
|
## points.append(point)
|
|
## lw = random.randint(1,10)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## cl = random.randint(0,len(colors)-1)
|
|
## ObjectList.append(FloatCanvas.Line(points, LineWidth = lw, LineColor = colors[cl]) )
|
|
|
|
## # Polygons
|
|
## for i in range(300):
|
|
## Range = MakeRange()
|
|
## points = []
|
|
## for j in range(random.randint(2,60)):
|
|
## point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## points.append(point)
|
|
## lw = random.randint(1,6)
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## cl = random.randint(0,len(colors)-1)
|
|
## ObjectList.append(FloatCanvas.Polygon(points,
|
|
## LineWidth = lw,
|
|
## LineColor = colors[cl],
|
|
## FillColor = colors[cf],
|
|
## FillStyle = 'Solid') )
|
|
## random.shuffle(ObjectList)
|
|
## print "Adding lots of random objects"
|
|
## start = time.clock()
|
|
## for Object in ObjectList:
|
|
## Canvas.AddObject(Object)
|
|
## print "It took %s Seconds to add %i objects "%(time.clock() - start, len(ObjectList) )
|
|
|
|
## ## Pointset
|
|
## for i in range(100):
|
|
## points = []
|
|
## points = RandomArray.uniform(Range[0],Range[1],(100,2))
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## D = random.randint(1,4)
|
|
## Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
|
|
|
|
|
|
## # Scaled Text
|
|
## String = "Scaled text"
|
|
## for i in range(30):
|
|
## ts = random.random()*3 + 0.2
|
|
## cf = random.randint(0,len(colors)-1)
|
|
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
## Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
|
|
|
|
Canvas.ZoomToBB()
|
|
|
|
|
|
def TempTest(self, event= None):
|
|
"Running the Temporary test"
|
|
|
|
self.UnBindAllMouseEvents()
|
|
Canvas = self.Canvas
|
|
Canvas.ClearAll()
|
|
Canvas.SetProjectionFun(None)
|
|
|
|
# import random
|
|
# import RandomArray
|
|
Range = (-10,10)
|
|
|
|
# Create a random Polygon
|
|
points = []
|
|
for j in range(6):
|
|
point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
|
|
points.append(point)
|
|
Poly = Canvas.AddPolygon(points,
|
|
LineWidth = 2,
|
|
LineColor = "Black",
|
|
FillColor = "LightBlue",
|
|
FillStyle = 'Solid')
|
|
|
|
Poly.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPoly)
|
|
|
|
self.SelectedPoly = None
|
|
self.SelectPoints = []
|
|
self.SelectedPoint = None
|
|
|
|
Canvas.ZoomToBB()
|
|
|
|
def SelectPoly(self, Object):
|
|
print "In SelectPoly"
|
|
Canvas = self.Canvas
|
|
if Object is self.SelectedPoly:
|
|
pass
|
|
else:
|
|
#fixme: Do something to unselect the old one
|
|
self.SelectedPoly = Object
|
|
Canvas.RemoveObjects(self.SelectPoints)
|
|
self.SelectPoints = []
|
|
# Draw points on the Vertices of the Selected Poly:
|
|
for i, point in enumerate(Object.Points):
|
|
P = Canvas.AddPointSet(point, Diameter = 6, Color = "Red")
|
|
P.VerticeNum = i
|
|
P.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.SelectPointHit)
|
|
self.SelectPoints.append(P)
|
|
#Canvas.ZoomToBB()
|
|
Canvas.Draw()
|
|
|
|
def SelectPointHit(self, Point):
|
|
print "Point Num: %i Hit"%Point.VerticeNum
|
|
self.SelectedPoint = Point
|
|
|
|
|
|
|
|
class DemoApp(wx.App):
|
|
"""
|
|
How the demo works:
|
|
|
|
Under the Draw menu, there are three options:
|
|
|
|
*Draw Test: will put up a picture of a bunch of randomly generated
|
|
objects, of each kind supported.
|
|
|
|
*Draw Map: will draw a map of the world. Be patient, it is a big map,
|
|
with a lot of data, and will take a while to load and draw (about 10 sec
|
|
on my 450Mhz PIII). Redraws take about 2 sec. This demonstrates how the
|
|
performance is not very good for large drawings.
|
|
|
|
*Clear: Clears the Canvas.
|
|
|
|
Once you have a picture drawn, you can zoom in and out and move about
|
|
the picture. There is a tool bar with three tools that can be
|
|
selected.
|
|
|
|
The magnifying glass with the plus is the zoom in tool. Once selected,
|
|
if you click the image, it will zoom in, centered on where you
|
|
clicked. If you click and drag the mouse, you will get a rubber band
|
|
box, and the image will zoom to fit that box when you release it.
|
|
|
|
The magnifying glass with the minus is the zoom out tool. Once selected,
|
|
if you click the image, it will zoom out, centered on where you
|
|
clicked. (note that this takes a while when you are looking at the map,
|
|
as it has a LOT of lines to be drawn. The image is double buffered, so
|
|
you don't see the drawing in progress)
|
|
|
|
The hand is the move tool. Once selected, if you click and drag on the
|
|
image, it will move so that the part you clicked on ends up where you
|
|
release the mouse. Nothing is changed while you are dragging. The
|
|
drawing is too slow for that.
|
|
|
|
I'd like the cursor to change as you change tools, but the stock
|
|
wxCursors didn't include anything I liked, so I stuck with the
|
|
pointer. Please let me know if you have any nice cursor images for me to
|
|
use.
|
|
|
|
|
|
Any bugs, comments, feedback, questions, and especially code are welcome:
|
|
|
|
-Chris Barker
|
|
|
|
Chris.Barker@noaa.gov
|
|
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
wx.App.__init__(self, *args, **kwargs)
|
|
|
|
def OnInit(self):
|
|
wx.InitAllImageHandlers()
|
|
frame = DrawFrame(None, -1, "FloatCanvas Demo App",wx.DefaultPosition,(700,700))
|
|
|
|
self.SetTopWindow(frame)
|
|
frame.Show()
|
|
|
|
## check to see if the demo is set to start in a particular mode.
|
|
if StartUpDemo == "text":
|
|
frame.TestText()
|
|
if StartUpDemo == "stext":
|
|
frame.TestScaledText()
|
|
elif StartUpDemo == "all":
|
|
frame.DrawTest()
|
|
elif StartUpDemo == "map":
|
|
frame.DrawMap()
|
|
elif StartUpDemo == "hit":
|
|
frame.TestHitTest()
|
|
elif StartUpDemo == "hitf":
|
|
"starting TestHitTestForeground"
|
|
frame.TestHitTestForeground()
|
|
elif StartUpDemo == "animate":
|
|
"starting TestAnimation"
|
|
frame.TestAnimation()
|
|
elif StartUpDemo == "speed":
|
|
"starting SpeedTest"
|
|
frame.SpeedTest()
|
|
elif StartUpDemo == "temp":
|
|
"starting temp Test"
|
|
frame.TempTest()
|
|
|
|
return True
|
|
|
|
def Read_MapGen(filename,stats = 0,AllLines=0):
|
|
"""
|
|
This function reads a MapGen Format file, and
|
|
returns a list of NumPy arrays with the line segments in them.
|
|
|
|
Each NumPy array in the list is an NX2 array of Python Floats.
|
|
|
|
The demo should have come with a file, "world.dat" that is the
|
|
shorelines of the whole world, in MapGen format.
|
|
|
|
"""
|
|
import string
|
|
file = open(filename,'rt')
|
|
data = file.readlines()
|
|
data = map(string.strip,data)
|
|
|
|
Shorelines = []
|
|
segment = []
|
|
for line in data:
|
|
if line:
|
|
if line == "# -b": #New segment beginning
|
|
if segment: Shorelines.append(Numeric.array(segment))
|
|
segment = []
|
|
else:
|
|
segment.append(map(float,string.split(line)))
|
|
if segment: Shorelines.append(Numeric.array(segment))
|
|
|
|
if stats:
|
|
NumSegments = len(Shorelines)
|
|
NumPoints = 0
|
|
for segment in Shorelines:
|
|
NumPoints = NumPoints + len(segment)
|
|
AvgPoints = NumPoints / NumSegments
|
|
print "Number of Segments: ", NumSegments
|
|
print "Average Number of Points per segment: ",AvgPoints
|
|
if AllLines:
|
|
Lines = []
|
|
for segment in Shorelines:
|
|
Lines.append(segment[0])
|
|
for point in segment[1:-1]:
|
|
Lines.append(point)
|
|
Lines.append(point)
|
|
Lines.append(segment[-1])
|
|
return Lines
|
|
else:
|
|
return Shorelines
|
|
|
|
## for the wxPython demo:
|
|
try:
|
|
import floatcanvas
|
|
except ImportError: # if it's not there locally, try the wxPython lib.
|
|
from wx.lib import floatcanvas
|
|
|
|
overview = floatcanvas.__doc__
|
|
|
|
if __name__ == "__main__":
|
|
if not haveNumeric:
|
|
print errorText
|
|
else:
|
|
app = DemoApp(False)# put in True if you want output to go to it's own window.
|
|
app.MainLoop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|