Updates from Chris

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28362 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2004-07-21 19:19:47 +00:00
parent 6077391138
commit 5e1796efd3
4 changed files with 521 additions and 384 deletions

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env python2.3
try: try:
import Numeric import Numeric
import RandomArray import RandomArray
@@ -34,7 +34,7 @@ else:
if __name__ == "__main__": # parse options if run stand-alone if __name__ == "__main__": # parse options if run stand-alone
# check options: # check options:
import sys, getopt import sys, getopt
optlist, args = getopt.getopt(sys.argv[1:],'l',["local","all","text","map","stext","hit","hitf","animate","speed","temp"]) optlist, args = getopt.getopt(sys.argv[1:],'l',["local","all","text","map","stext","hit","hitf","animate","speed","temp","props"])
for opt in optlist: for opt in optlist:
if opt[0] == "--all": if opt[0] == "--all":
@@ -55,6 +55,8 @@ else:
StartUpDemo = "speed" StartUpDemo = "speed"
elif opt[0] == "--temp": elif opt[0] == "--temp":
StartUpDemo = "temp" StartUpDemo = "temp"
elif opt[0] == "--props":
StartUpDemo = "props"
import wx import wx
import time, random import time, random
@@ -112,12 +114,14 @@ else:
self.Bind(wx.EVT_MENU, self.Clear, item) self.Bind(wx.EVT_MENU, self.Clear, item)
item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code") item = draw_menu.Append(-1, "&Hit Test","Run a test of the hit test code")
self.Bind(wx.EVT_MENU, self.TestHitTest, item) 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") 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) self.Bind(wx.EVT_MENU, self.TestHitTestForeground, item)
item = draw_menu.Append(-1, "&Animation","Run a test of Animation") item = draw_menu.Append(-1, "&Animation","Run a test of Animation")
self.Bind(wx.EVT_MENU, self.TestAnimation, item) self.Bind(wx.EVT_MENU, self.TestAnimation, item)
item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed") item = draw_menu.Append(-1, "&Speed","Run a test of Drawing Speed")
self.Bind(wx.EVT_MENU, self.SpeedTest, item) self.Bind(wx.EVT_MENU, self.SpeedTest, item)
item = draw_menu.Append(-1, "Change &Properties","Run a test of Changing Object Properties")
self.Bind(wx.EVT_MENU, self.PropertiesChangeTest, item)
MenuBar.Append(draw_menu, "&Tests") MenuBar.Append(draw_menu, "&Tests")
view_menu = wx.Menu() view_menu = wx.Menu()
@@ -138,7 +142,7 @@ else:
self.Canvas = NavCanvas.NavCanvas(self, self.Canvas = NavCanvas.NavCanvas(self,
-1, -1,
(500,500), (500,500),
Debug = 1, Debug = 0,
BackgroundColor = "DARK SLATE BLUE") BackgroundColor = "DARK SLATE BLUE")
wx.EVT_CLOSE(self, self.OnCloseWindow) wx.EVT_CLOSE(self, self.OnCloseWindow)
@@ -267,6 +271,7 @@ else:
self.Destroy() self.Destroy()
def DrawTest(self,event=None): def DrawTest(self,event=None):
wx.GetApp().Yield()
# import random # import random
# import RandomArray # import RandomArray
Range = (-10,10) Range = (-10,10)
@@ -287,7 +292,7 @@ else:
cf = random.randint(0,len(colors)-1) cf = random.randint(0,len(colors)-1)
h = random.randint(1,5) h = random.randint(1,5)
w = random.randint(1,5) w = random.randint(1,5)
Canvas.AddRectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf]) Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
# Ellipses # Ellipses
for i in range(3): for i in range(3):
@@ -298,14 +303,12 @@ else:
w = random.randint(1,5) w = random.randint(1,5)
Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf]) Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
## # Dots -- Does anyone need this? # Points
## for i in range(5): for i in range(5):
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
## D = random.randint(1,50) D = random.randint(1,50)
## lw = random.randint(1,5) cf = random.randint(0,len(colors)-1)
## cf = random.randint(0,len(colors)-1) Canvas.AddPoint((x,y), Color = colors[cf], Diameter = D)
## cl = random.randint(0,len(colors)-1)
## Canvas.AddDot(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
# Circles # Circles
for i in range(5): for i in range(5):
@@ -379,7 +382,7 @@ else:
having to re-draw the whole background. having to re-draw the whole background.
""" """
print "Running TestAnimation" wx.GetApp().Yield()
Range = (-10,10) Range = (-10,10)
self.Range = Range self.Range = Range
@@ -456,7 +459,7 @@ else:
# Now the Foreground Object: # Now the Foreground Object:
C = Canvas.AddCircle(0,0,7,LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True) 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) T = Canvas.AddScaledText("Click to Move",0,0, Size = 0.6, Position = 'cc', InForeground = True)
C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe) C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe)
C.Text = T C.Text = T
@@ -478,6 +481,7 @@ else:
Object.Text.Move( (self.dx,self.dy)) Object.Text.Move( (self.dx,self.dy))
self.Canvas.Draw() self.Canvas.Draw()
self.TimeStep += 1 self.TimeStep += 1
wx.GetApp().Yield(True)
else: else:
self.Timer.Stop() self.Timer.Stop()
@@ -489,12 +493,13 @@ else:
self.dy = random.uniform(Range[0]/4,Range[1]/4) self.dy = random.uniform(Range[0]/4,Range[1]/4)
#import time #import time
#start = time.time() #start = time.time()
self.NumTimeSteps = 500 self.NumTimeSteps = 200
self.TimeStep = 1 self.TimeStep = 1
self.Timer.Start(self.FrameDelay) self.Timer.Start(self.FrameDelay)
#print "Did %i frames in %f seconds"%(N, (time.time() - start) ) #print "Did %i frames in %f seconds"%(N, (time.time() - start) )
def TestHitTest(self,event=None): def TestHitTest(self,event=None):
wx.GetApp().Yield()
self.UnBindAllMouseEvents() self.UnBindAllMouseEvents()
Canvas = self.Canvas Canvas = self.Canvas
@@ -508,28 +513,29 @@ else:
dx = 80 dx = 80
dy = 40 dy = 40
x,y = 20, 20 x,y = 20, 20
FontSize = 8
#Add one that is not HitAble #Add one that is not HitAble
Canvas.AddRectangle(x, y, w, h, LineWidth = 2) Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
Canvas.AddText("Not Hit-able", x, y, Position = "bl") Canvas.AddText("Not Hit-able", x, y, Size = FontSize, Position = "bl")
x += dx x += dx
R = Canvas.AddRectangle(x, y, w, h,LineWidth = 2) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2)
R.Name = "Line Rectangle" R.Name = "Line Rectangle"
R.HitFill = False R.HitFill = False
R.HitLineWidth = 5 # Makes it a little easier to hit
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
Canvas.AddText("Left Click Line", x, y, Position = "bl") Canvas.AddText("Left Click Line", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "Red" color = "Red"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + "Rectangle" R.Name = color + "Rectangle"
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
Canvas.AddText("Left Click Fill", x, y, Position = "bl") Canvas.AddText("Left Click Fill", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
@@ -538,15 +544,15 @@ else:
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
Canvas.AddText("Right Click Fill", x, y, Position = "bl") Canvas.AddText("Right Click Fill", x, y, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "Grey" color = "Grey"
R = Canvas.AddEllipse(x, y, w, h,LineWidth = 2,FillColor = color) R = Canvas.AddEllipse(x, y, w, h,LineWidth = 2,FillColor = color)
R.Name = color +" Ellipse" R.Name = color +" Ellipse"
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHit)
Canvas.AddText("Right Click Fill", x, y, Position = "bl") Canvas.AddText("Right Click Fill", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "Brown" color = "Brown"
@@ -554,8 +560,8 @@ else:
R.Name = color + " Circle" R.Name = color + " Circle"
R.HitFill = True R.HitFill = True
R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_LEFT_DCLICK, self.RectGotHit)
Canvas.AddText("Left D-Click Fill", x, y, Position = "bl") Canvas.AddText("Left D-Click Fill", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
@@ -563,24 +569,24 @@ else:
R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2,FillColor = color) R = Canvas.AddCircle(x+dx/2, y+dy/2, dx/4, LineWidth = 2,FillColor = color)
R.Name = color + " Circle" R.Name = color + " Circle"
R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.RectGotHit)
Canvas.AddText("Left Up Fill", x, y, Position = "bl") Canvas.AddText("Left Up Fill", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "White" color = "White"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_MIDDLE_DOWN, self.RectGotHit)
Canvas.AddText("Middle Down", x, y, Position = "bl") Canvas.AddText("Middle Down", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "AQUAMARINE" color = "AQUAMARINE"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_MIDDLE_UP, self.RectGotHit)
Canvas.AddText("Middle Up", x, y, Position = "bl") Canvas.AddText("Middle Up", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
@@ -588,24 +594,24 @@ else:
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_MIDDLE_DCLICK, self.RectGotHit)
Canvas.AddText("Middle DoubleClick", x, y, Position = "bl") Canvas.AddText("Middle DoubleClick", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "CYAN" color = "CYAN"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_RIGHT_UP, self.RectGotHit)
Canvas.AddText("Right Up", x, y, Position = "bl") Canvas.AddText("Right Up", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "LIME GREEN" color = "LIME GREEN"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit) R.Bind(FloatCanvas.EVT_FC_RIGHT_DCLICK, self.RectGotHit)
Canvas.AddText("Right Double Click", x, y, Position = "bl") Canvas.AddText("Right Double Click", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
@@ -614,24 +620,24 @@ else:
R.Name = color R.Name = color
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight) R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
Canvas.AddText("L and R Click", x, y, Position = "bl") Canvas.AddText("L and R Click", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "SALMON" color = "SALMON"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color + " Rectangle" R.Name = color + " Rectangle"
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
Canvas.AddText("Mouse Enter", x, y, Position = "bl") Canvas.AddText("Mouse Enter", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "MEDIUM VIOLET RED" color = "MEDIUM VIOLET RED"
R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color) R = Canvas.AddRectangle(x, y, w, h, LineWidth = 2, FillColor = color)
R.Name = color R.Name = color
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
Canvas.AddText("Mouse Leave", x, y, Position = "bl") Canvas.AddText("Mouse Leave", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
@@ -640,8 +646,8 @@ else:
R.Name = color R.Name = color
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
Canvas.AddText("Enter and Leave", x, y, Position = "bl") Canvas.AddText("Enter and Leave", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "WHEAT" color = "WHEAT"
@@ -649,8 +655,8 @@ else:
R.Name = color R.Name = color
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
Canvas.AddText("Mouse Enter&Leave", x, y, Position = "bl") Canvas.AddText("Mouse Enter&Leave", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "KHAKI" color = "KHAKI"
@@ -658,16 +664,16 @@ else:
R.Name = color R.Name = color
R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver) R.Bind(FloatCanvas.EVT_FC_ENTER_OBJECT, self.RectMouseOver)
R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave) R.Bind(FloatCanvas.EVT_FC_LEAVE_OBJECT, self.RectMouseLeave)
Canvas.AddText("Mouse ENter&Leave", x, y, Position = "bl") Canvas.AddText("Mouse ENter&Leave", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red") L = Canvas.AddLine(( (x, y), (x+10, y+10), (x+w, y+h) ), LineWidth = 2, LineColor = "Red")
L.Name = "A Line" L.Name = "A Line"
L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) L.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
Canvas.AddText("Left Down", x, y, Position = "bl") Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(L.Name, x, y+h, Position = "tl") Canvas.AddText(L.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "SEA GREEN" color = "SEA GREEN"
@@ -675,8 +681,8 @@ else:
R = Canvas.AddPolygon(Points, LineWidth = 2, FillColor = color) R = Canvas.AddPolygon(Points, LineWidth = 2, FillColor = color)
R.Name = color + " Polygon" R.Name = color + " Polygon"
R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight) R.Bind(FloatCanvas.EVT_FC_RIGHT_DOWN, self.RectGotHitRight)
Canvas.AddText("RIGHT_DOWN", x, y, Position = "bl") Canvas.AddText("RIGHT_DOWN", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x += dx x += dx
color = "Red" color = "Red"
@@ -684,27 +690,27 @@ else:
R = Canvas.AddPointSet(Points, Diameter = 4, Color = color) R = Canvas.AddPointSet(Points, Diameter = 4, Color = color)
R.Name = "PointSet" R.Name = "PointSet"
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit) R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.PointSetGotHit)
Canvas.AddText("LEFT_DOWN", x, y, Position = "bl") Canvas.AddText("LEFT_DOWN", x, y, Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, x, y+h, Position = "tl") Canvas.AddText(R.Name, x, y+h, Size = FontSize, Position = "tl")
x = 20 x = 20
y += dy y += dy
T = Canvas.AddText("Hit-able Text", x, y, Size = 15, Color = "Red", Position = 'tl') T = Canvas.AddText("Hit-able Text", x, y, Size = 15, Color = "Red", Position = 'tl')
T.Name = "Hit-able Text" T.Name = "Hit-able Text"
T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
Canvas.AddText("Left Down", x, y, Position = "bl") Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "bl")
x += dx x += dx
T = Canvas.AddScaledText("Scaled Text", x, y, Size = 1./2*h, Color = "Pink", Position = 'bl') T = Canvas.AddScaledText("Scaled Text", x, y, Size = 1./2*h, Color = "Pink", Position = 'bl')
Canvas.AddPointSet( (x, y), Diameter = 3) Canvas.AddPointSet( (x, y), Diameter = 3)
T.Name = "Scaled Text" T.Name = "Scaled Text"
T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft) T.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHitLeft)
Canvas.AddText("Left Down", x, y, Position = "tl") Canvas.AddText("Left Down", x, y, Size = FontSize, Position = "tl")
self.Canvas.ZoomToBB() self.Canvas.ZoomToBB()
def TestHitTestForeground(self,event=None): def TestHitTestForeground(self,event=None):
print "Running: TestHitTestForeground" wx.GetApp().Yield()
self.UnBindAllMouseEvents() self.UnBindAllMouseEvents()
Canvas = self.Canvas Canvas = self.Canvas
@@ -809,6 +815,7 @@ else:
def TestText(self, event= None): def TestText(self, event= None):
wx.GetApp().Yield()
self.BindAllMouseEvents() self.BindAllMouseEvents()
Canvas = self.Canvas Canvas = self.Canvas
@@ -823,10 +830,6 @@ else:
# Text # Text
String = "Some 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("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("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("Top Right",x,y,Size = 14,Color = "Black",BackgroundColor = "Cyan",Position = "tr")
@@ -868,6 +871,7 @@ else:
self.Canvas.ZoomToBB() self.Canvas.ZoomToBB()
def TestScaledText(self, event= None): def TestScaledText(self, event= None):
wx.GetApp().Yield()
self.BindAllMouseEvents() self.BindAllMouseEvents()
Canvas = self.Canvas Canvas = self.Canvas
@@ -918,6 +922,7 @@ else:
self.Canvas.ZoomToBB() self.Canvas.ZoomToBB()
def DrawMap(self,event = None): def DrawMap(self,event = None):
wx.GetApp().Yield()
import os, time import os, time
self.BindAllMouseEvents() self.BindAllMouseEvents()
@@ -937,6 +942,7 @@ else:
def LineTest(self,event = None): def LineTest(self,event = None):
wx.GetApp().Yield()
import os, time import os, time
# import random # import random
colors = self.colors colors = self.colors
@@ -965,8 +971,7 @@ else:
#print "It took %f seconds to draw %i lines"%(time.clock() - start,len(linepoints) ) #print "It took %f seconds to draw %i lines"%(time.clock() - start,len(linepoints) )
def SpeedTest(self,event=None): def SpeedTest(self,event=None):
# import random wx.GetApp().Yield()
# import RandomArray
BigRange = (-1000,1000) BigRange = (-1000,1000)
colors = self.colors colors = self.colors
@@ -976,135 +981,172 @@ else:
Canvas.ClearAll() Canvas.ClearAll()
Canvas.SetProjectionFun(None) Canvas.SetProjectionFun(None)
# Lots of Text # Pointset
String = "Unscaled text"
coords = [] coords = []
text = [] for i in range(1000):
for i in range(5000):
x,y = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1])) x,y = (random.uniform(BigRange[0],BigRange[1]),random.uniform(BigRange[0],BigRange[1]))
coords.append( (x,y) ) coords.append( (x,y) )
print "Drawing the Numbers" print "Drawing the Points"
start = time.clock() start = time.clock()
for i in xrange( len(coords) ): for Point in coords:
Canvas.AddText("%i"%(i), Canvas.AddPoint(Point, Diameter = 4)
coords[i][0], print "It took %s seconds to add the points"%(time.clock() - start)
coords[i][1], Canvas.ZoomToBB()
Size = 12,
Position = "cc",
BackgroundColor = "White")
print "It took %s seconds to add the numbers"%(time.clock() - start)
def PropertiesChangeTest(self,event=None):
wx.GetApp().Yield()
## ObjectList = [] Range = (-10,10)
colors = self.colors
## print "Building a list of lots of random objects" self.UnBindAllMouseEvents()
## ## Random tests of everything: Canvas = self.Canvas
## 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 Canvas.ClearAll()
## for i in range(300): Canvas.SetProjectionFun(None)
## Range = MakeRange()
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) self.ColorObjectsAll = []
## lw = random.randint(1,5) self.ColorObjectsLine = []
## cf = random.randint(0,len(colors)-1) self.ColorObjectsColor = []
## h = random.randint(1, Range[1] - Range[0]) self.ColorObjectsText = []
## w = random.randint(1, Range[1] - Range[0]) ##One of each object:
## ObjectList.append(FloatCanvas.Rectangle(x,y,h,w,LineWidth = lw,FillColor = colors[cf])) # Rectangle
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)
self.Rectangle = Canvas.AddRectangle(x,y,w,h,LineWidth = lw,FillColor = colors[cf])
self.ColorObjectsAll.append(self.Rectangle)
## # Ellipses # Ellipse
## for i in range(300): x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
## Range = MakeRange() lw = random.randint(1,5)
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) cf = random.randint(0,len(colors)-1)
## lw = random.randint(1,5) h = random.randint(1,5)
## cf = random.randint(0,len(colors)-1) w = random.randint(1,5)
## h = random.randint(1, Range[1] - Range[0]) self.Ellipse = Canvas.AddEllipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf])
## w = random.randint(1, Range[1] - Range[0]) self.ColorObjectsAll.append(self.Ellipse)
## ObjectList.append(FloatCanvas.Ellipse(x,y,h,w,LineWidth = lw,FillColor = colors[cf]))
# Point
xy = (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)
self.ColorObjectsColor.append(Canvas.AddPoint(xy, colors[cf], D))
# Circle
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)
self.Circle = Canvas.AddCircle(x,y,D,LineWidth = lw,LineColor = colors[cl],FillColor = colors[cf])
self.ColorObjectsAll.append(self.Circle)
# Line
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)
self.ColorObjectsLine.append(Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl]))
# Polygon
## 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)
points = RandomArray.uniform(Range[0],Range[1],(6,2))
lw = random.randint(1,6)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
self.ColorObjectsAll.append(Canvas.AddPolygon(points,
LineWidth = lw,
LineColor = colors[cl],
FillColor = colors[cf],
FillStyle = 'Solid'))
## Pointset
points = RandomArray.uniform(Range[0],Range[1],(100,2))
cf = random.randint(0,len(colors)-1)
D = random.randint(1,4)
self.PointSet = Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
self.ColorObjectsColor.append(self.PointSet)
## # Circles ## Point
## for i in range(500): point = RandomArray.uniform(Range[0],Range[1],(2,))
## Range = MakeRange() cf = random.randint(0,len(colors)-1)
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) D = random.randint(1,4)
## D = random.randint(1, (Range[1] - Range[0]) / 2) self.Point = Canvas.AddPoint(point, Color = colors[cf], Diameter = D)
## lw = random.randint(1,5) self.ColorObjectsColor.append(self.Point)
## 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)
# Text
String = "Unscaled text"
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.ColorObjectsText.append(Canvas.AddText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
## # Scaled Text # Scaled Text
## String = "Scaled text" String = "Scaled text"
## for i in range(30): ts = random.random()*3 + 0.2
## ts = random.random()*3 + 0.2 cf = random.randint(0,len(colors)-1)
## cf = random.randint(0,len(colors)-1) x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
## x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1])) self.ColorObjectsText.append(Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc"))
## Canvas.AddScaledText(String, x, y, Size = ts, Color = colors[cf], Position = "cc")
# A "Button"
Button = Canvas.AddRectangle(-10, -12, 20, 3, LineStyle = None, FillColor = "Red")
Canvas.AddScaledText("Click Here To Change Properties",
0, -10.5,
Size = 0.7,
Color = "Black",
Position = "cc")
Button.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.ChangeProperties)
Canvas.ZoomToBB() Canvas.ZoomToBB()
def ChangeProperties(self, Object = None):
colors = self.colors
Range = (-10,10)
for Object in self.ColorObjectsAll:
pass
Object.SetFillColor(colors[random.randint(0,len(colors)-1)])
Object.SetLineColor(colors[random.randint(0,len(colors)-1)])
Object.SetLineWidth(random.randint(1,7))
Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)])
for Object in self.ColorObjectsLine:
Object.SetLineColor(colors[random.randint(0,len(colors)-1)])
Object.SetLineWidth(random.randint(1,7))
Object.SetLineStyle(FloatCanvas.DrawObject.LineStyleList.keys()[random.randint(0,5)])
for Object in self.ColorObjectsColor:
Object.SetColor(colors[random.randint(0,len(colors)-1)])
for Object in self.ColorObjectsText:
Object.SetColor(colors[random.randint(0,len(colors)-1)])
Object.SetBackgroundColor(colors[random.randint(0,len(colors)-1)])
self.Circle.SetDiameter(random.randint(1,10))
self.PointSet.SetDiameter(random.randint(1,8))
self.Point.SetDiameter(random.randint(1,8))
for Object in (self.Rectangle, self.Ellipse):
x,y = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
w,h = random.randint(1,5), random.randint(1,5)
Object.SetShape(x,y,w,h)
self.Canvas.Draw(Force = True)
def TempTest(self, event= None): def TempTest(self, event= None):
"Running the Temporary test" wx.GetApp().Yield()
self.UnBindAllMouseEvents() self.UnBindAllMouseEvents()
Canvas = self.Canvas Canvas = self.Canvas
Canvas.ClearAll() Canvas.ClearAll()
Canvas.SetProjectionFun(None) Canvas.SetProjectionFun(None)
# import random
# import RandomArray
Range = (-10,10) Range = (-10,10)
# Create a random Polygon # Create a random Polygon
@@ -1234,6 +1276,9 @@ else:
elif StartUpDemo == "temp": elif StartUpDemo == "temp":
"starting temp Test" "starting temp Test"
frame.TempTest() frame.TempTest()
elif StartUpDemo == "props":
"starting PropertiesChange Test"
frame.PropertiesChangeTest()
return True return True

View File

@@ -1,8 +1,7 @@
try: try:
from Numeric import array,asarray,Float,cos,pi,sum,minimum,maximum,Int32,zeros from Numeric import array,asarray,Float,cos,pi,sum,minimum,maximum,Int32,zeros, ones, concatenate, sqrt, argmin, power, absolute
except ImportError: except ImportError:
from numarray import array, asarray, Float, cos, pi, sum, minimum, maximum, Int32, zeros from numarray import array, asarray, Float, cos, pi, sum, minimum, maximum, Int32, zeros, concatenate
from time import clock, sleep from time import clock, sleep
@@ -11,19 +10,17 @@ import wx
import types import types
import os import os
import Resources
## A global variable to hold the Pixels per inch that wxWindows thinks is in use ## A global variable to hold the Pixels per inch that wxWindows thinks is in use
## This is used for scaling fonts. ## This is used for scaling fonts.
## This can't be computed on module __init__, because a wx.App might not have iniitalized yet. ## This can't be computed on module __init__, because a wx.App might not have iniitalized yet.
global ScreenPPI global ScreenPPI
## a custom Exceptions: ## a custom Exceptions:
class FloatCanvasException(Exception): class FloatCanvasException(Exception):
pass pass
## All the mouse events ## Create all the mouse events
#EVT_FC_ENTER_WINDOW = wx.NewEventType() #EVT_FC_ENTER_WINDOW = wx.NewEventType()
#EVT_FC_LEAVE_WINDOW = wx.NewEventType() #EVT_FC_LEAVE_WINDOW = wx.NewEventType()
EVT_FC_LEFT_DOWN = wx.NewEventType() EVT_FC_LEFT_DOWN = wx.NewEventType()
@@ -41,6 +38,7 @@ EVT_FC_MOUSEWHEEL = wx.NewEventType()
EVT_FC_ENTER_OBJECT = wx.NewEventType() EVT_FC_ENTER_OBJECT = wx.NewEventType()
EVT_FC_LEAVE_OBJECT = wx.NewEventType() EVT_FC_LEAVE_OBJECT = wx.NewEventType()
##Create all mouse event binding functions
#def EVT_ENTER_WINDOW( window, function ): #def EVT_ENTER_WINDOW( window, function ):
# window.Connect( -1, -1, EVT_FC_ENTER_WINDOW, function ) # window.Connect( -1, -1, EVT_FC_ENTER_WINDOW, function )
#def EVT_LEAVE_WINDOW( window, function ): #def EVT_LEAVE_WINDOW( window, function ):
@@ -68,7 +66,7 @@ def EVT_MOTION( window, function ):
def EVT_MOUSEWHEEL( window, function ): def EVT_MOUSEWHEEL( window, function ):
window.Connect( -1, -1,EVT_FC_MOUSEWHEEL , function ) window.Connect( -1, -1,EVT_FC_MOUSEWHEEL , function )
class MouseEvent(wx.PyCommandEvent): class _MouseEvent(wx.PyCommandEvent):
""" """
@@ -82,7 +80,7 @@ class MouseEvent(wx.PyCommandEvent):
GetCoords() , which returns and (x,y) tuple in world coordinates. GetCoords() , which returns and (x,y) tuple in world coordinates.
Another differnce is that it is a CommandEvent, which propagates up Another difference is that it is a CommandEvent, which propagates up
the window hierarchy until it is handled. the window hierarchy until it is handled.
""" """
@@ -104,74 +102,27 @@ class MouseEvent(wx.PyCommandEvent):
#return eval(self.NativeEvent.__getattr__(name) ) #return eval(self.NativeEvent.__getattr__(name) )
return getattr(self._NativeEvent, name) return getattr(self._NativeEvent, name)
#### ColorGEnerator class is now obsolete. I'm using a python generator function instead. def _cycleidxs(indexcount, maxvalue, step):
##class ColorGenerator:
## """ """
Utility function used by _colorGenerator
## An instance of this class generates a unique color each time """
## GetNextColor() is called. Someday I will use a proper Python
## generator for this class.
## The point of this generator is for the hit-test bitmap, each object
## needs to be a unique color. Also, each system can be running a
## different number of colors, and it doesn't appear to be possible to
## have a wxMemDC with a different colordepth as the screen so this
## generates colors far enough apart that they can be distinguished on
## a 16bit screen. Anything less than 16bits won't work. It could, but
## I havn't written the code that way. You also wouldn't get many
## distict colors
## """
## def __init__(self):
## import sys
## ## figure out the color depth of the screen
## ## for some bizare reason, thisdoesn't work on OS-X
## if sys.platform == 'darwin':
## depth = 24
## else:
## b = wx.EmptyBitmap(1,1)
## depth = b.GetDepth()
## self.r = 0
## self.g = 0
## self.b = 0
## if depth == 16:
## self.step = 8
## elif depth >= 24:
## self.step = 1
## else:
## raise FloatCanvasException("ColorGenerator does not work with depth = %s"%depth )
## def GetNextColor(self):
## step = self.step
## ##r,g,b = self.r,self.g,self.b
## self.r += step
## if self.r > 255:
## self.r = step
## self.g += step
## if self.g > 255:
## self.g = step
## self.b += step
## if self.b > 255:
## ## fixme: this should be a derived exception
## raise FloatCanvasException("Too many objects in colorgenerator for HitTest")
## return (self.r,self.g,self.b)
## def Reset(self):
## self.r = 0
## self.g = 0
## self.b = 0
def cycleidxs(indexcount, maxvalue, step):
if indexcount == 0: if indexcount == 0:
yield () yield ()
else: else:
for idx in xrange(0, maxvalue, step): for idx in xrange(0, maxvalue, step):
for tail in cycleidxs(indexcount - 1, maxvalue, step): for tail in _cycleidxs(indexcount - 1, maxvalue, step):
yield (idx, ) + tail yield (idx, ) + tail
def colorGenerator(): def _colorGenerator():
"""
Generates a seris of unique colors used to do hit-tests with the HIt
Test bitmap
"""
import sys import sys
if sys.platform == 'darwin': if sys.platform == 'darwin':
depth = 24 depth = 24
@@ -184,12 +135,13 @@ def colorGenerator():
step = 1 step = 1
else: else:
raise "ColorGenerator does not work with depth = %s" % depth raise "ColorGenerator does not work with depth = %s" % depth
return cycleidxs(indexcount=3, maxvalue=256, step=step) return _cycleidxs(indexcount=3, maxvalue=256, step=step)
#### I don't know if the Set objects are useful, beyond the pointset object #### I don't know if the Set objects are useful, beyond the pointset
#### The problem is that when zoomed in, the BB is checked to see whether to draw the object. #### object The problem is that when zoomed in, the BB is checked to see
#### A Set object can defeat this #### whether to draw the object. A Set object can defeat this. ONe day
#### I plan to write some custon C++ code to draw sets of objects
##class ObjectSetMixin: ##class ObjectSetMixin:
## """ ## """
@@ -246,12 +198,13 @@ def colorGenerator():
## if length == 1: ## if length == 1:
## self.Pens = self.Pens[0] ## self.Pens = self.Pens[0]
class DrawObject: class DrawObject:
""" """
This is the base class for all the objects that can be drawn. This is the base class for all the objects that can be drawn.
One must subclass from this (and an assortment of Mixins) to create
a new DrawObject.
""" """
def __init__(self,InForeground = False): def __init__(self,InForeground = False):
@@ -268,6 +221,11 @@ class DrawObject:
self.HitFill = True self.HitFill = True
self.MinHitLineWidth = 3 self.MinHitLineWidth = 3
self.HitLineWidth = 3 ## this gets re-set by the subclasses if necessary self.HitLineWidth = 3 ## this gets re-set by the subclasses if necessary
self.Brush = None
self.Pen = None
self.FillStyle = "Solid"
# I pre-define all these as class variables to provide an easier # I pre-define all these as class variables to provide an easier
# interface, and perhaps speed things up by caching all the Pens # interface, and perhaps speed things up by caching all the Pens
@@ -326,7 +284,7 @@ class DrawObject:
self._Canvas.MakeNewHTdc() self._Canvas.MakeNewHTdc()
if not self.HitColor: if not self.HitColor:
if not self._Canvas.HitColorGenerator: if not self._Canvas.HitColorGenerator:
self._Canvas.HitColorGenerator = colorGenerator() self._Canvas.HitColorGenerator = _colorGenerator()
self._Canvas.HitColorGenerator.next() # first call to prevent the background color from being used. self._Canvas.HitColorGenerator.next() # first call to prevent the background color from being used.
self.HitColor = self._Canvas.HitColorGenerator.next() self.HitColor = self._Canvas.HitColorGenerator.next()
self.SetHitPen(self.HitColor,self.HitLineWidth) self.SetHitPen(self.HitColor,self.HitLineWidth)
@@ -347,6 +305,7 @@ class DrawObject:
pass pass
self.HitAble = False self.HitAble = False
def SetBrush(self,FillColor,FillStyle): def SetBrush(self,FillColor,FillStyle):
if FillColor is None or FillStyle is None: if FillColor is None or FillStyle is None:
self.Brush = wx.TRANSPARENT_BRUSH self.Brush = wx.TRANSPARENT_BRUSH
@@ -371,7 +330,7 @@ class DrawObject:
if not self.HitLine: if not self.HitLine:
self.HitPen = wx.TRANSPARENT_PEN self.HitPen = wx.TRANSPARENT_PEN
else: else:
self.HitPen = self.PenList.setdefault( (HitColor, "solid", LineWidth), wx.Pen(HitColor, LineWidth, self.LineStyleList["Solid"]) ) self.HitPen = self.PenList.setdefault( (HitColor, "solid", self.HitLineWidth), wx.Pen(HitColor, self.HitLineWidth, self.LineStyleList["Solid"]) )
def PutInBackground(self): def PutInBackground(self):
if self._Canvas and self.InForeground: if self._Canvas and self.InForeground:
@@ -387,6 +346,55 @@ class DrawObject:
self._Canvas._BackgroundDirty = True self._Canvas._BackgroundDirty = True
self.InForeground = True self.InForeground = True
class ColorOnlyMixin:
"""
Mixin class for objects that have just one color, rather than a fill
color and line color
"""
def SetColor(self, Color):
self.SetPen(Color,"Solid",1)
self.SetBrush(Color,"Solid")
SetFillColor = SetColor # Just to provide a consistant interface
class LineOnlyMixin:
"""
Mixin class for objects that have just one color, rather than a fill
color and line color
"""
def SetLineColor(self, LineColor):
self.LineColor = LineColor
self.SetPen(LineColor,self.LineStyle,self.LineWidth)
def SetLineStyle(self, LineStyle):
self.LineStyle = LineStyle
self.SetPen(self.LineColor,LineStyle,self.LineWidth)
def SetLineWidth(self, LineWidth):
self.LineWidth = LineWidth
self.SetPen(self.LineColor,self.LineStyle,LineWidth)
class LineAndFillMixin(LineOnlyMixin):
"""
Mixin class for objects that have both a line and a fill color and
style.
"""
def SetFillColor(self, FillColor):
self.FillColor = FillColor
self.SetBrush(FillColor,self.FillStyle)
def SetFillStyle(self, FillStyle):
self.FillStyle = FillStyle
self.SetBrush(self.FillColor,FillStyle)
class XYObjectMixin: class XYObjectMixin:
""" """
@@ -409,6 +417,15 @@ class XYObjectMixin:
if self._Canvas: if self._Canvas:
self._Canvas.BoundingBoxDirty = True self._Canvas.BoundingBoxDirty = True
def SetXY(self, x, y):
self.XY = array( (x, y), Float)
self.CalcBoundingBox()
def SetPoint(self, xy):
self.XY = array( xy, Float)
self.XY.shape = (2,)
self.CalcBoundingBox()
class PointsObjectMixin: class PointsObjectMixin:
""" """
@@ -417,12 +434,15 @@ class PointsObjectMixin:
""" """
## This is code for the XYMixin object, it needs to be adapeted and tested.
## This is code for the PointsObjectMixin object, it needs to be adapted and tested.
## Is the neccesary at all: you can always do:
## Object.SetPoints( Object.Points + delta, copy = False)
## def Move(self, Delta ): ## def Move(self, Delta ):
## """ ## """
## Move(Delta): moves the object by delta, where delta is an (dx, ## Move(Delta): moves the object by delta, where delta is an (dx,
## dy) pair. Ideally a Numpy array or shape (2,) ## dy) pair. Ideally a Numpy array of shape (2,)
## """ ## """
@@ -432,15 +452,38 @@ class PointsObjectMixin:
## if self._Canvas: ## if self._Canvas:
## self._Canvas.BoundingBoxDirty = True ## self._Canvas.BoundingBoxDirty = True
def SetPoints(self,Points): def CalcBoundingBox(self):
self.Points = Points self.BoundingBox = array(((min(self.Points[:,0]),
self.BoundingBox = array(((min(self.Points[:,0]),min(self.Points[:,1])),(max(self.Points[:,0]),max(self.Points[:,1]))),Float) min(self.Points[:,1]) ),
(max(self.Points[:,0]),
max(self.Points[:,1]) ) ), Float )
if self._Canvas: if self._Canvas:
self._Canvas.BoundingBoxDirty = True self._Canvas.BoundingBoxDirty = True
def SetPoints(self, Points, copy = True):
"""
Sets the coordinates of the points of the object to Points (NX2 array).
By default, a copy is made, if copy is set to False, a reference
is used, iff Points is a NumPy array of Floats. This allows you
to change some or all of the points without making any copies.
For example:
Points = Object.Points
Points += (5,10) # shifts the points 5 in the x dir, and 10 in the y dir.
Object.SetPoints(Points, False) # Sets the points to the same array as it was
"""
if copy:
self.Points = array(Points, Float)
self.Points.shape = (-1,2) # Make sure it is a NX2 array, even if there is only one point
else:
self.Points = asarray(Points, Float)
self.CalcBoundingBox()
class Polygon(DrawObject,PointsObjectMixin): class Polygon(DrawObject,PointsObjectMixin,LineAndFillMixin):
""" """
@@ -450,6 +493,9 @@ class Polygon(DrawObject,PointsObjectMixin):
x-coordinate of point N and Points[N,1] is the y-coordinate for x-coordinate of point N and Points[N,1] is the y-coordinate for
arrays. arrays.
The other parameters specify various properties of the Polygon, and
should be self explanatory.
""" """
def __init__(self, def __init__(self,
Points, Points,
@@ -461,7 +507,7 @@ class Polygon(DrawObject,PointsObjectMixin):
InForeground = False): InForeground = False):
DrawObject.__init__(self,InForeground) DrawObject.__init__(self,InForeground)
self.Points = array(Points,Float) # this DOES need to make a copy self.Points = array(Points,Float) # this DOES need to make a copy
self.BoundingBox = array(((min(self.Points[:,0]),min(self.Points[:,1])),(max(self.Points[:,0]),max(self.Points[:,1]))),Float) self.CalcBoundingBox()
self.LineColor = LineColor self.LineColor = LineColor
self.LineStyle = LineStyle self.LineStyle = LineStyle
@@ -517,13 +563,14 @@ class Polygon(DrawObject,PointsObjectMixin):
## dc.DrawLineList(Points,self.Pens) ## dc.DrawLineList(Points,self.Pens)
class Line(DrawObject,PointsObjectMixin): class Line(DrawObject,PointsObjectMixin,LineOnlyMixin):
""" """
The Line class takes a list of 2-tuples, or a NX2 NumPy array of point coordinates.
so that Points[N][0] is the x-coordinate of point N and Points[N][1] is the y-coordinate
or Points[N,0] is the x-coordinate of point N and Points[N,1] is the y-coordinate for arrays.
It will draw a straight line if there are two points, and a polyline if there are more than two. The Line class takes a list of 2-tuples, or a NX2 NumPy Float array
of point coordinates.
It will draw a straight line if there are two points, and a polyline
if there are more than two.
""" """
def __init__(self,Points, def __init__(self,Points,
@@ -535,7 +582,7 @@ class Line(DrawObject,PointsObjectMixin):
self.Points = array(Points,Float) self.Points = array(Points,Float)
self.BoundingBox = array(((min(self.Points[:,0]),min(self.Points[:,1])),(max(self.Points[:,0]),max(self.Points[:,1]))),Float) self.CalcBoundingBox()
self.LineColor = LineColor self.LineColor = LineColor
self.LineStyle = LineStyle self.LineStyle = LineStyle
@@ -585,18 +632,24 @@ class Line(DrawObject,PointsObjectMixin):
## Points.shape = (-1,4) ## Points.shape = (-1,4)
## dc.DrawLineList(Points,self.Pens) ## dc.DrawLineList(Points,self.Pens)
class PointSet(DrawObject): class PointSet(DrawObject,PointsObjectMixin, ColorOnlyMixin):
""" """
The PointSet class takes a list of 2-tuples, or a NX2 NumPy array of point coordinates.
so that Points[N][0] is the x-coordinate of point N and Points[N][1] is the y-coordinate
or Points[N,0] is the x-coordinate of point N and Points[N,1] is the y-coordinate for arrays.
Each point will be drawn the same color and Diameter. The Diameter is in screen points, The PointSet class takes a list of 2-tuples, or a NX2 NumPy array of
not world coordinates. point coordinates.
At this point, the hit-test code does not distingish between the If Points is a sequence of tuples: Points[N][0] is the x-coordinate of
points, you will only know that one of the poins got hit, not which point N and Points[N][1] is the y-coordinate.
one.
If Points is a NumPy array: Points[N,0] is the x-coordinate of point
N and Points[N,1] is the y-coordinate for arrays.
Each point will be drawn the same color and Diameter. The Diameter
is in screen pixels, not world coordinates.
The hit-test code does not distingish between the points, you will
only know that one of the points got hit, not which one. You can use
PointSet.FindClosestPoint(WorldPoint) to find out which one
In the case of points, the HitLineWidth is used as diameter. In the case of points, the HitLineWidth is used as diameter.
@@ -606,27 +659,34 @@ class PointSet(DrawObject):
self.Points = array(Points,Float) self.Points = array(Points,Float)
self.Points.shape = (-1,2) # Make sure it is a NX2 array, even if there is only one point self.Points.shape = (-1,2) # Make sure it is a NX2 array, even if there is only one point
self.BoundingBox = array(((min(self.Points[:,0]), self.CalcBoundingBox()
min(self.Points[:,1])),
(max(self.Points[:,0]),
max(self.Points[:,1]))),Float)
self.Color = Color
self.Diameter = Diameter self.Diameter = Diameter
self.HitLineWidth = self.MinHitLineWidth self.HitLineWidth = self.MinHitLineWidth
self.SetPen(Color,"Solid",1) self.SetColor(Color)
self.SetBrush(Color,"Solid")
def SetPoints(self,Points): def SetDiameter(self,Diameter):
self.Points = array(Points, Float) self.Diameter = Diameter
self.Points.shape = (-1,2) # Make sure it is a NX2 array, even if there is only one point
self.BoundingBox = array(((min(self.Points[:,0]),
min(self.Points[:,1]) ), def FindClosestPoint(self, XY):
(max(self.Points[:,0]), """
max(self.Points[:,1]) ) ) )
if self._Canvas: Returns the index of the closest point to the point, XY, given
self._Canvas.BoundingBoxDirty = True in World coordinates. It's essentially random which you get if
there are more than one that are the same.
This can be used to figure out which point got hit in a mouse
binding callback, for instance. It's a lot faster that using a
lot of separate points.
"""
## kind of ugly to minimize data copying
d = self.Points - XY
d = sum( power(d,2,d), 1 )
d = absolute( d, d ) # don't need the real distance, just which is smallest
#dist = sqrt( sum( (self.Points - XY)**2), 1) )
return argmin(d)
def DrawD2(self, dc, Points): def DrawD2(self, dc, Points):
# A Little optimization for a diameter2 - point # A Little optimization for a diameter2 - point
@@ -645,57 +705,77 @@ class PointSet(DrawObject):
else: else:
dc.SetBrush(self.Brush) dc.SetBrush(self.Brush)
radius = int(round(self.Diameter/2)) radius = int(round(self.Diameter/2))
for xy in Points: if len(Points) > 100:
dc.DrawEllipsePointSize( (xy - radius), (self.Diameter, self.Diameter) ) xy = Points
xywh = concatenate((xy-radius, ones(xy.shape) * self.Diameter ), 1 )
dc.DrawEllipseList(xywh)
else:
for xy in Points:
dc.DrawCircle(xy[0],xy[1], radius)
if HTdc and self.HitAble: if HTdc and self.HitAble:
HTdc.SetPen(self.HitPen) HTdc.SetPen(self.HitPen)
HTdc.SetBrush(self.HitBrush)
if self.Diameter <= 1: if self.Diameter <= 1:
HTdc.DrawPointList(Points) HTdc.DrawPointList(Points)
elif self.Diameter <= 2: elif self.Diameter <= 2:
self.DrawD2(HTdc, Points) self.DrawD2(HTdc, Points)
else:
if len(Points) > 100:
xy = Points
xywh = concatenate((xy-radius, ones(xy.shape) * self.Diameter ), 1 )
HTdc.DrawEllipseList(xywh)
else:
for xy in Points:
HTdc.DrawCircle(xy[0],xy[1], radius)
class Point(DrawObject,XYObjectMixin,ColorOnlyMixin):
"""
The Point class takes a 2-tuple, or a (2,) NumPy array of point
coordinates.
The Diameter is in screen points, not world coordinates, So the
Bounding box is just the point, and doesn't include the Diameter.
The HitLineWidth is used as diameter for the
Hit Test.
"""
def __init__(self, XY, Color = "Black", Diameter = 1, InForeground = False):
DrawObject.__init__(self, InForeground)
self.XY = array(XY, Float)
self.XY.shape = (2,) # Make sure it is a 1X2 array, even if there is only one point
self.CalcBoundingBox()
self.SetColor(Color)
self.Diameter = Diameter
self.HitLineWidth = self.MinHitLineWidth
def SetDiameter(self,Diameter):
self.Diameter = Diameter
def CalcBoundingBox(self):
self.BoundingBox = array( (self.XY, self.XY), Float )
def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None):
dc.SetPen(self.Pen)
xy = WorldToPixel(self.XY)
if self.Diameter <= 1:
dc.DrawPoint(xy[0], xy[1])
else:
dc.SetBrush(self.Brush)
radius = int(round(self.Diameter/2))
dc.DrawCircle(xy[0],xy[1], radius)
if HTdc and self.HitAble:
HTdc.SetPen(self.HitPen)
if self.Diameter <= 1:
HTdc.DrawPoint(xy[0], xy[1])
else: else:
HTdc.SetBrush(self.HitBrush) HTdc.SetBrush(self.HitBrush)
radius = int(round(self.Diameter/2)) HTdc.DrawCircle(xy[0],xy[1], radius)
for xy in Points:
HTdc.DrawEllipsePointSize( (xy - radius), (self.Diameter, self.Diameter) )
#### Does anyone need this?
##class Dot(DrawObject):
## """
## The Dot class takes an x.y coordinate pair, and the Diameter of the circle.
## The Diameter is in pixels, so it won't change with zoom.
## Also Fill and line data class RectEllipse(DrawObject, XYObjectMixin,LineAndFillMixin):
## """
## def __init__(self,x,y,Diameter,LineColor,LineStyle,LineWidth,FillColor,FillStyle,InForeground = False):
## DrawObject.__init__(self,InForeground)
## self.X = x
## self.Y = y
## self.Diameter = Diameter
## # NOTE: the bounding box does not include the diameter of the dot, as that is in pixel coords.
## # If this is a problem, perhaps you should use a circle, instead!
## self.BoundingBox = array(((x,y),(x,y)),Float)
## self.LineColor = LineColor
## self.LineStyle = LineStyle
## self.LineWidth = LineWidth
## self.FillColor = FillColor
## self.FillStyle = FillStyle
## self.SetPen(LineColor,LineStyle,LineWidth)
## self.SetBrush(FillColor,FillStyle)
## def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None):
## #def _Draw(self,dc,WorldToPixel,ScaleWorldToPixel):
## dc.SetPen(self.Pen)
## dc.SetBrush(self.Brush)
## radius = int(round(self.Diameter/2))
## (X,Y) = WorldToPixel((self.X,self.Y))
## dc.DrawEllipse((X - radius), (Y - radius), self.Diameter, self.Diameter)
class RectEllipse(DrawObject, XYObjectMixin):
def __init__(self,x,y,width,height, def __init__(self,x,y,width,height,
LineColor = "Black", LineColor = "Black",
LineStyle = "Solid", LineStyle = "Solid",
@@ -720,6 +800,11 @@ class RectEllipse(DrawObject, XYObjectMixin):
self.SetPen(LineColor,LineStyle,LineWidth) self.SetPen(LineColor,LineStyle,LineWidth)
self.SetBrush(FillColor,FillStyle) self.SetBrush(FillColor,FillStyle)
def SetShape(self,x,y,width,height):
self.XY = array( (x, y), Float)
self.WH = array( (width, height), Float )
self.CalcBoundingBox()
def SetUpDraw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc): def SetUpDraw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc):
dc.SetPen(self.Pen) dc.SetPen(self.Pen)
@@ -730,11 +815,9 @@ class RectEllipse(DrawObject, XYObjectMixin):
return ( WorldToPixel(self.XY), return ( WorldToPixel(self.XY),
ScaleWorldToPixel(self.WH) ) ScaleWorldToPixel(self.WH) )
def SetXY(self, x, y): def CalcBoundingBox(self):
self.XY = array( (x, y), Float)
self.BoundingBox = array((self.XY, (self.XY + self.WH) ), Float) self.BoundingBox = array((self.XY, (self.XY + self.WH) ), Float)
if self._Canvas: self._Canvas.BoundingBoxDirty = True
self._Canvas.BoundingBoxDirty = True
class Rectangle(RectEllipse): class Rectangle(RectEllipse):
@@ -766,14 +849,22 @@ class Ellipse(RectEllipse):
class Circle(Ellipse): class Circle(Ellipse):
def __init__(self, x ,y, Diameter, **kwargs): def __init__(self, x ,y, Diameter, **kwargs):
self.Center = array((x,y),Float)
RectEllipse.__init__(self , RectEllipse.__init__(self ,
x-Diameter/2., x-Diameter/2.,
y-Diameter/2., y-Diameter/2.,
Diameter, Diameter,
Diameter, Diameter,
**kwargs) **kwargs)
def SetDiameter(self, Diameter):
x,y = self.Center - (Diameter/2.)
self.SetShape(x,
y,
Diameter,
Diameter)
class TextObjectMixin: class TextObjectMixin(XYObjectMixin):
""" """
A mix in class that holds attributes and methods that are needed by A mix in class that holds attributes and methods that are needed by
@@ -802,6 +893,12 @@ class TextObjectMixin:
FaceName) ) FaceName) )
return self.Font return self.Font
def SetColor(self, Color):
self.Color = Color
def SetBackgroundColor(self, BackgroundColor):
self.BackgroundColor = BackgroundColor
## store the function that shift the coords for drawing text. The ## store the function that shift the coords for drawing text. The
## "c" parameter is the correction for world coordinates, rather ## "c" parameter is the correction for world coordinates, rather
## than pixel coords as the y axis is reversed ## than pixel coords as the y axis is reversed
@@ -893,20 +990,12 @@ class Text(DrawObject, TextObjectMixin):
self.XY = ( x,y ) self.XY = ( x,y )
# use a memDC -- ScreenDC doesn't work with 2.5.1 and GTK2
#dc = wx.MemoryDC()
#bitmap = wx.EmptyBitmap(1, 1)
#dc.SelectObject(bitmap)
#dc.SetFont(self.Font)
#(self.TextWidth, self.TextHeight) = dc.GetTextExtent(self.String)
(self.TextWidth, self.TextHeight) = (None, None) (self.TextWidth, self.TextHeight) = (None, None)
self.ShiftFun = self.ShiftFunDict[Position] self.ShiftFun = self.ShiftFunDict[Position]
def SetXY(self, x, y): def CalcBoundingBox(self):
self.XY = ( x,y )
self.BoundingBox = array((self.XY, self.XY),Float) self.BoundingBox = array((self.XY, self.XY),Float)
if self._Canvas:
self._Canvas.BoundingBoxDirty = True
def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None): def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None):
XY = WorldToPixel(self.XY) XY = WorldToPixel(self.XY)
@@ -926,7 +1015,7 @@ class Text(DrawObject, TextObjectMixin):
HTdc.SetBrush(self.HitBrush) HTdc.SetBrush(self.HitBrush)
HTdc.DrawRectanglePointSize(XY, (self.TextWidth, self.TextHeight) ) HTdc.DrawRectanglePointSize(XY, (self.TextWidth, self.TextHeight) )
class ScaledText(DrawObject, TextObjectMixin, XYObjectMixin): class ScaledText(DrawObject, TextObjectMixin):
""" """
This class creates a text object that is scaled when zoomed. It is This class creates a text object that is scaled when zoomed. It is
placed at the coordinates, x,y. the "Position" argument is a two placed at the coordinates, x,y. the "Position" argument is a two
@@ -942,22 +1031,18 @@ class ScaledText(DrawObject, TextObjectMixin, XYObjectMixin):
Family: Family:
Font family, a generic way of referring to fonts without Font family, a generic way of referring to fonts without
specifying actual facename. One of:: specifying actual facename. One of:
wx.DEFAULT: Chooses a default font. wx.DEFAULT: Chooses a default font.
wx.DECORATI: A decorative font. wx.DECORATI: A decorative font.
wx.ROMAN: A formal, serif font. wx.ROMAN: A formal, serif font.
wx.SCRIPT: A handwriting font. wx.SCRIPT: A handwriting font.
wx.SWISS: A sans-serif font. wx.SWISS: A sans-serif font.
wx.MODERN: A fixed pitch font. wx.MODERN: A fixed pitch font.
NOTE: these are only as good as the wxWindows defaults, which aren't so good. NOTE: these are only as good as the wxWindows defaults, which aren't so good.
Style: Style:
One of wx.NORMAL, wx.SLANT and wx.ITALIC. One of wx.NORMAL, wx.SLANT and wx.ITALIC.
Weight: Weight:
One of wx.NORMAL, wx.LIGHT and wx.BOLD. One of wx.NORMAL, wx.LIGHT and wx.BOLD.
Underline: Underline:
The value can be True or False. At present this may have an an The value can be True or False. At present this may have an an
effect on Windows only. effect on Windows only.
@@ -1019,31 +1104,36 @@ class ScaledText(DrawObject, TextObjectMixin, XYObjectMixin):
self.Weight = Font.GetWeight() self.Weight = Font.GetWeight()
# Experimental max font size value on wxGTK2: this works OK on # Experimental max font size value on wxGTK2: this works OK on
# my system If it's any larger, there is a crash, with the # my system. If it's a lot larger, there is a crash, with the
# message: The application 'FloatCanvasDemo.py' lost its # message:
#
# The application 'FloatCanvasDemo.py' lost its
# connection to the display :0.0; most likely the X server was # connection to the display :0.0; most likely the X server was
# shut down or you killed/destroyed the application. # shut down or you killed/destroyed the application.
self.MaxSize = 2750 #
# Windows and OS-X seem to be better behaved in this regard.
# They may not draw it, but they don't crash either!
self.MaxFontSize = 1000
self.ShiftFun = self.ShiftFunDict[Position] self.ShiftFun = self.ShiftFunDict[Position]
## Compute the BB self.CalcBoundingBox()
def CalcBoundingBox(self):
## this isn't exact, as fonts don't scale exactly. ## this isn't exact, as fonts don't scale exactly.
dc = wx.MemoryDC() dc = wx.MemoryDC()
bitmap = wx.EmptyBitmap(1, 1) bitmap = wx.EmptyBitmap(1, 1)
dc.SelectObject(bitmap) #wxMac needs a Bitmap selected for GetTextExtent to work. dc.SelectObject(bitmap) #wxMac needs a Bitmap selected for GetTextExtent to work.
DrawingSize = 40 # pts This effectively determines the resolution that the BB is computed to. DrawingSize = 40 # pts This effectively determines the resolution that the BB is computed to.
ScaleFactor = float(Size) / DrawingSize ScaleFactor = float(self.Size) / DrawingSize
dc.SetFont(self.SetFont(DrawingSize, self.Family, self.Style, self.Weight, self.Underline, self.FaceName) ) dc.SetFont(self.SetFont(DrawingSize, self.Family, self.Style, self.Weight, self.Underline, self.FaceName) )
(w,h) = dc.GetTextExtent(self.String) (w,h) = dc.GetTextExtent(self.String)
w = w * ScaleFactor w = w * ScaleFactor
h = h * ScaleFactor h = h * ScaleFactor
x, y = self.ShiftFun(x, y, w, h, world = 1) x, y = self.ShiftFun(self.XY[0], self.XY[1], w, h, world = 1)
self.BoundingBox = array(((x, y-h ),(x + w, y)),Float) self.BoundingBox = array(((x, y-h ),(x + w, y)),Float)
# the new coords are set to the corner of the BB:
#self.X = self.BoundingBox[0,0]
#self.Y = self.BoundingBox[1,1]
def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None): def _Draw(self, dc , WorldToPixel, ScaleWorldToPixel, HTdc=None):
(X,Y) = WorldToPixel( (self.XY) ) (X,Y) = WorldToPixel( (self.XY) )
@@ -1052,8 +1142,7 @@ class ScaledText(DrawObject, TextObjectMixin, XYObjectMixin):
## Check to see if the font size is large enough to blow up the X font server ## Check to see if the font size is large enough to blow up the X font server
## If so, limit it. Would it be better just to not draw it? ## If so, limit it. Would it be better just to not draw it?
## note that this limit is dependent on how much memory you have, etc. ## note that this limit is dependent on how much memory you have, etc.
if Size > self.MaxSize: Size = min(Size, self.MaxFontSize)
Size = self.MaxSize
dc.SetFont(self.SetFont(Size, self.Family, self.Style, self.Weight, self.Underline, self.FaceName)) dc.SetFont(self.SetFont(Size, self.Family, self.Style, self.Weight, self.Underline, self.FaceName))
dc.SetTextForeground(self.Color) dc.SetTextForeground(self.Color)
if self.BackgroundColor: if self.BackgroundColor:
@@ -1258,13 +1347,13 @@ class FloatCanvas(wx.Panel):
EVT_FC_LEAVE_OBJECT: {}, EVT_FC_LEAVE_OBJECT: {},
} }
def RaiseMouseEvent(self, Event, EventType): def _RaiseMouseEvent(self, Event, EventType):
""" """
This is called in various other places to raise a Mouse Event This is called in various other places to raise a Mouse Event
""" """
#print "in Raise Mouse Event", Event #print "in Raise Mouse Event", Event
pt = self.PixelToWorld( Event.GetPosition() ) pt = self.PixelToWorld( Event.GetPosition() )
evt = MouseEvent(EventType, Event, self.GetId(), pt) evt = _MouseEvent(EventType, Event, self.GetId(), pt)
self.GetEventHandler().ProcessEvent(evt) self.GetEventHandler().ProcessEvent(evt)
def HitTest(self, event, HitEvent): def HitTest(self, event, HitEvent):
@@ -1342,42 +1431,42 @@ class FloatCanvas(wx.Panel):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_LEFT_DCLICK EventType = EVT_FC_LEFT_DCLICK
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def MiddleDownEvent(self,event): def MiddleDownEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_MIDDLE_DOWN EventType = EVT_FC_MIDDLE_DOWN
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def MiddleUpEvent(self,event): def MiddleUpEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_MIDDLE_UP EventType = EVT_FC_MIDDLE_UP
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def MiddleDoubleClickEvent(self,event): def MiddleDoubleClickEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_MIDDLE_DCLICK EventType = EVT_FC_MIDDLE_DCLICK
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def RightUpEvent(self,event): def RightUpEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_RIGHT_UP EventType = EVT_FC_RIGHT_UP
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def RightDoubleCLickEvent(self,event): def RightDoubleCLickEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
EventType = EVT_FC_RIGHT_DCLICK EventType = EVT_FC_RIGHT_DCLICK
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
def WheelEvent(self,event): def WheelEvent(self,event):
if self.GUIMode == "Mouse": if self.GUIMode == "Mouse":
self.RaiseMouseEvent(event, EVT_FC_MOUSEWHEEL) self._RaiseMouseEvent(event, EVT_FC_MOUSEWHEEL)
def LeftDownEvent(self,event): def LeftDownEvent(self,event):
@@ -1395,7 +1484,7 @@ class FloatCanvas(wx.Panel):
elif self.GUIMode == "Mouse": elif self.GUIMode == "Mouse":
## check for a hit ## check for a hit
if not self.HitTest(event, EVT_FC_LEFT_DOWN): if not self.HitTest(event, EVT_FC_LEFT_DOWN):
self.RaiseMouseEvent(event,EVT_FC_LEFT_DOWN) self._RaiseMouseEvent(event,EVT_FC_LEFT_DOWN)
else: else:
pass pass
@@ -1432,7 +1521,7 @@ class FloatCanvas(wx.Panel):
elif self.GUIMode == "Mouse": elif self.GUIMode == "Mouse":
EventType = EVT_FC_LEFT_UP EventType = EVT_FC_LEFT_UP
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
else: else:
pass pass
@@ -1515,10 +1604,10 @@ class FloatCanvas(wx.Panel):
## Only do something if there are mouse over events bound ## Only do something if there are mouse over events bound
if self.HitDict and (self.HitDict[ EVT_FC_ENTER_OBJECT ] or self.HitDict[ EVT_FC_LEAVE_OBJECT ] ): if self.HitDict and (self.HitDict[ EVT_FC_ENTER_OBJECT ] or self.HitDict[ EVT_FC_LEAVE_OBJECT ] ):
if not self.MouseOverTest(event): if not self.MouseOverTest(event):
self.RaiseMouseEvent(event,EVT_FC_MOTION) self._RaiseMouseEvent(event,EVT_FC_MOTION)
else: else:
pass pass
self.RaiseMouseEvent(event,EVT_FC_MOTION) self._RaiseMouseEvent(event,EVT_FC_MOTION)
else: else:
pass pass
@@ -1533,7 +1622,7 @@ class FloatCanvas(wx.Panel):
elif self.GUIMode == "Mouse": elif self.GUIMode == "Mouse":
EventType = EVT_FC_RIGHT_DOWN EventType = EVT_FC_RIGHT_DOWN
if not self.HitTest(event, EventType): if not self.HitTest(event, EventType):
self.RaiseMouseEvent(event, EventType) self._RaiseMouseEvent(event, EventType)
else: else:
pass pass
@@ -1606,7 +1695,7 @@ class FloatCanvas(wx.Panel):
""" """
#print "In Draw" #print "In Draw"
if self.PanelSize < (1,1): if self.PanelSize < (1,1): # it's possible for this to get called before being properly initialized.
return return
if self.Debug: start = clock() if self.Debug: start = clock()
ScreenDC = wx.ClientDC(self) ScreenDC = wx.ClientDC(self)
@@ -1868,7 +1957,9 @@ class FloatCanvas(wx.Panel):
a 2-tuple, or sequence of 2-tuples. a 2-tuple, or sequence of 2-tuples.
""" """
#Note: this can be called by users code for various reasons, so asarray is needed. #Note: this can be called by users code for various reasons, so asarray is needed.
return (((asarray(Coordinates,Float) - self.ViewPortCenter)*self.TransformVector)+(self.HalfPanelSize)).astype('i') return (((asarray(Coordinates,Float) -
self.ViewPortCenter)*self.TransformVector)+
(self.HalfPanelSize)).astype('i')
def ScaleWorldToPixel(self,Lengths): def ScaleWorldToPixel(self,Lengths):
""" """
@@ -1944,7 +2035,7 @@ class FloatCanvas(wx.Panel):
def _makeFloatCanvasAddMethods(): ## lrk's code for doing this in module __init__ def _makeFloatCanvasAddMethods(): ## lrk's code for doing this in module __init__
classnames = ["Circle", "Ellipse", "Rectangle", "ScaledText", "Polygon", classnames = ["Circle", "Ellipse", "Rectangle", "ScaledText", "Polygon",
"Line", "Text", "PointSet"] "Line", "Text", "PointSet","Point"]
for classname in classnames: for classname in classnames:
klass = globals()[classname] klass = globals()[classname]
def getaddshapemethod(klass=klass): def getaddshapemethod(klass=klass):
@@ -1956,8 +2047,8 @@ def _makeFloatCanvasAddMethods(): ## lrk's code for doing this in module __init_
addshapemethod = getaddshapemethod() addshapemethod = getaddshapemethod()
methodname = "Add" + classname methodname = "Add" + classname
setattr(FloatCanvas, methodname, addshapemethod) setattr(FloatCanvas, methodname, addshapemethod)
docstring = " Creates %s and adds its reference to the canvas.\n" % classname docstring = "Creates %s and adds its reference to the canvas.\n" % classname
docstring += " Argument protocol same as %s class" % classname docstring += "Argument protocol same as %s class" % classname
if klass.__doc__: if klass.__doc__:
docstring += ", whose docstring is:\n%s" % klass.__doc__ docstring += ", whose docstring is:\n%s" % klass.__doc__
FloatCanvas.__dict__[methodname].__doc__ = docstring FloatCanvas.__dict__[methodname].__doc__ = docstring

View File

@@ -100,7 +100,8 @@ class NavCanvas(wx.Panel):
wx.EVT_BUTTON(self, ID_ZOOM_TO_FIT_BUTTON, self.ZoomToFit) wx.EVT_BUTTON(self, ID_ZOOM_TO_FIT_BUTTON, self.ZoomToFit)
tb.Realize() tb.Realize()
tb.SetSizeHints(tb.GetSize()) S = tb.GetSize()
tb.SetSizeHints(S[0],S[1])
return tb return tb
def SetToolMode(self,event): def SetToolMode(self,event):

View File

@@ -90,6 +90,6 @@ Chris.Barker@noaa.gov
""" """
__version__ = "0.8.3" __version__ = "0.8.5"