95bfd958bd
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25140 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
454 lines
10 KiB
Python
454 lines
10 KiB
Python
|
|
import random
|
|
import time
|
|
|
|
import wx
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
colours = [
|
|
"BLACK",
|
|
"BLUE",
|
|
"BLUE VIOLET",
|
|
"BROWN",
|
|
"CYAN",
|
|
"DARK GREY",
|
|
"DARK GREEN",
|
|
"GOLD",
|
|
"GREY",
|
|
"GREEN",
|
|
"MAGENTA",
|
|
"NAVY",
|
|
"PINK",
|
|
"RED",
|
|
"SKY BLUE",
|
|
"VIOLET",
|
|
"YELLOW",
|
|
]
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
def makeRandomPoints(num, w, h):
|
|
pnts = []
|
|
|
|
for i in range(num):
|
|
x = random.randint(0, w)
|
|
y = random.randint(0, h)
|
|
pnts.append( (x,y) )
|
|
|
|
return pnts
|
|
|
|
|
|
def makeRandomLines(num, w, h):
|
|
pnts = []
|
|
|
|
for i in range(num):
|
|
x1 = random.randint(0, w)
|
|
y1 = random.randint(0, h)
|
|
x2 = random.randint(0, w)
|
|
y2 = random.randint(0, h)
|
|
pnts.append( (x1,y1, x2,y2) )
|
|
|
|
return pnts
|
|
|
|
|
|
def makeRandomRectangles(num, W, H):
|
|
rects = []
|
|
|
|
for i in range(num):
|
|
w = random.randint(10, W/2)
|
|
h = random.randint(10, H/2)
|
|
x = random.randint(0, W - w)
|
|
y = random.randint(0, H - h)
|
|
rects.append( (x, y, w, h) )
|
|
|
|
return rects
|
|
|
|
|
|
def makeRandomText(num):
|
|
Np = 8 # number of characters in text
|
|
text = []
|
|
|
|
for i in range(num):
|
|
word = []
|
|
|
|
for i in range(Np):
|
|
c = chr( random.randint(48, 122) )
|
|
word.append( c )
|
|
|
|
text.append( "".join(word) )
|
|
|
|
return text
|
|
|
|
|
|
def makeRandomPolygons(num, W, H):
|
|
Np = 8 # number of points per polygon
|
|
polys = []
|
|
|
|
for i in range(num):
|
|
poly = []
|
|
|
|
for i in range(Np):
|
|
x = random.randint(0, W)
|
|
y = random.randint(0, H)
|
|
poly.append( (x,y) )
|
|
|
|
polys.append( poly )
|
|
|
|
return polys
|
|
|
|
|
|
def makeRandomPens(num, cache):
|
|
pens = []
|
|
|
|
for i in range(num):
|
|
c = random.choice(colours)
|
|
t = random.randint(1, 4)
|
|
|
|
if not cache.has_key( (c, t) ):
|
|
cache[(c, t)] = wx.Pen(c, t)
|
|
|
|
pens.append( cache[(c, t)] )
|
|
|
|
return pens
|
|
|
|
|
|
def makeRandomBrushes(num, cache):
|
|
brushes = []
|
|
|
|
for i in range(num):
|
|
c = random.choice(colours)
|
|
|
|
if not cache.has_key(c):
|
|
cache[c] = wx.Brush(c)
|
|
|
|
brushes.append( cache[c] )
|
|
|
|
return brushes
|
|
|
|
|
|
def makeRandomColors(num):
|
|
colors = []
|
|
|
|
for i in range(num):
|
|
c = random.choice(colours)
|
|
colors.append(wx.NamedColour(c))
|
|
return colors
|
|
|
|
|
|
|
|
pencache = {}
|
|
brushcache = {}
|
|
points = None
|
|
lines = None
|
|
rectangles = None
|
|
polygons = None
|
|
text = None
|
|
pens = None
|
|
brushes = None
|
|
colors1 = None
|
|
colors2 = None
|
|
|
|
|
|
def Init(w, h, n):
|
|
global pencache
|
|
global brushcache
|
|
global points
|
|
global lines
|
|
global rectangles
|
|
global polygons
|
|
global text
|
|
global pens
|
|
global brushes
|
|
global colors1
|
|
global colors2
|
|
|
|
# make some lists of random shapes
|
|
points = makeRandomPoints(n, w, h)
|
|
|
|
try:
|
|
import Numeric
|
|
Apoints = Numeric.array(points)
|
|
except:
|
|
pass
|
|
|
|
lines = makeRandomLines(n, w, h)
|
|
rectangles = makeRandomRectangles(n, w, h)
|
|
polygons = makeRandomPolygons(n, w, h)
|
|
text = makeRandomText(n)
|
|
|
|
# make some random pens and brushes
|
|
pens = makeRandomPens(n, pencache)
|
|
brushes = makeRandomBrushes(n, brushcache)
|
|
# make some random color lists
|
|
colors1 = makeRandomColors(n)
|
|
colors2 = makeRandomColors(n)
|
|
|
|
|
|
|
|
def TestPoints(dc,log):
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
dc.SetPen(wx.Pen("BLACK", 4))
|
|
|
|
dc.DrawPointList(points)
|
|
dc.DrawPointList(points, wx.Pen("RED", 2))
|
|
dc.DrawPointList(points, pens)
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawPointList\n" % (time.time() - start))
|
|
|
|
|
|
def TestArrayPoints(dc,log):
|
|
try:
|
|
import Numeric
|
|
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
dc.SetPen(wx.Pen("BLACK", 1))
|
|
|
|
for i in range(1):
|
|
dc.DrawPointList(Apoints)
|
|
|
|
#dc.DrawPointList(Apoints, wx.Pen("RED", 2))
|
|
#dc.DrawPointList(Apoints, pens)
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawPointList an Numpy Array\n" % (time.time() - start))
|
|
except ImportError:
|
|
log.write("Couldn't import Numeric")
|
|
pass
|
|
|
|
|
|
def TestLines(dc,log):
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
|
|
dc.SetPen(wx.Pen("BLACK", 2))
|
|
dc.DrawLineList(lines)
|
|
dc.DrawLineList(lines, wx.Pen("RED", 2))
|
|
dc.DrawLineList(lines, pens)
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawLineList\n" % (time.time() - start))
|
|
|
|
|
|
def TestRectangles(dc,log):
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
|
|
dc.SetPen( wx.Pen("BLACK",1) )
|
|
dc.SetBrush( wx.Brush("RED") )
|
|
|
|
dc.DrawRectangleList(rectangles)
|
|
dc.DrawRectangleList(rectangles,pens)
|
|
dc.DrawRectangleList(rectangles,pens[0],brushes)
|
|
dc.DrawRectangleList(rectangles,pens,brushes[0])
|
|
dc.DrawRectangleList(rectangles,None,brushes)
|
|
## for i in range(10):
|
|
## #dc.DrawRectangleList(rectangles,pens,brushes)
|
|
## dc.DrawRectangleList(rectangles)
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawRectanglesList\n" % (time.time() - start))
|
|
|
|
|
|
def TestEllipses(dc,log):
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
|
|
dc.SetPen( wx.Pen("BLACK",1) )
|
|
dc.SetBrush( wx.Brush("RED") )
|
|
|
|
dc.DrawEllipseList(rectangles)
|
|
dc.DrawEllipseList(rectangles,pens)
|
|
dc.DrawEllipseList(rectangles,pens[0],brushes)
|
|
dc.DrawEllipseList(rectangles,pens,brushes[0])
|
|
dc.DrawEllipseList(rectangles,None,brushes)
|
|
dc.DrawEllipseList(rectangles,pens,brushes)
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawEllipsesList\n" % (time.time() - start))
|
|
|
|
|
|
def TestRectanglesArray(dc,log):
|
|
try:
|
|
import Numeric
|
|
Apoints = Numeric.array(rectangles)
|
|
|
|
dc.BeginDrawing()
|
|
start = time.time()
|
|
dc.SetPen(wx.Pen("BLACK", 1))
|
|
dc.DrawRectangleList(rectangles)
|
|
dc.DrawRectangleList(rectangles,pens)
|
|
dc.DrawRectangleList(rectangles,pens[0],brushes)
|
|
dc.DrawRectangleList(rectangles,pens,brushes[0])
|
|
dc.DrawRectangleList(rectangles,None,brushes)
|
|
## for i in range(10):
|
|
## #dc.DrawRectangleList(rectangles,pens,brushes)
|
|
## dc.DrawRectangleList(rectangles)
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with DrawRectangleList and Numpy Array\n" % (time.time() - start))
|
|
except ImportError:
|
|
log.write("Couldn't import Numeric")
|
|
pass
|
|
|
|
|
|
def TestRectanglesLoop(dc,log):
|
|
dc.BeginDrawing()
|
|
|
|
start = time.time()
|
|
dc.DrawRectangleList(rectangles,pens,brushes)
|
|
log.write("DrawTime: %s seconds with DrawRectanglesList\n" % (time.time() - start))
|
|
|
|
start = time.time()
|
|
|
|
for i in range(len(rectangles)):
|
|
dc.SetPen( pens[i] )
|
|
dc.SetBrush( brushes[i] )
|
|
dc.DrawRectangle(rectangles[i][0],rectangles[i][1],rectangles[i][2],rectangles[i][3])
|
|
|
|
dc.EndDrawing()
|
|
log.write("DrawTime: %s seconds with Python loop\n" % (time.time() - start))
|
|
|
|
|
|
def TestPolygons(dc,log):
|
|
dc.BeginDrawing()
|
|
|
|
start = time.time()
|
|
dc.SetPen(wx.Pen("BLACK", 1))
|
|
dc.DrawPolygonList(polygons)
|
|
dc.DrawPolygonList(polygons,pens)
|
|
dc.DrawPolygonList(polygons,pens[0],brushes)
|
|
dc.DrawPolygonList(polygons,pens,brushes[0])
|
|
dc.DrawPolygonList(polygons,None,brushes)
|
|
log.write("DrawTime: %s seconds with DrawPolygonList\n" % (time.time() - start))
|
|
|
|
dc.EndDrawing()
|
|
|
|
|
|
def TestText(dc,log):
|
|
dc.BeginDrawing()
|
|
|
|
start = time.time()
|
|
|
|
# NOTE: you need to set BackgroundMode for the background colors to be used.
|
|
dc.SetBackgroundMode(wx.SOLID)
|
|
foreground = colors1
|
|
background = colors2
|
|
dc.DrawTextList(text, points, foreground, background)
|
|
|
|
log.write("DrawTime: %s seconds with DrawTextList\n" % (time.time() - start))
|
|
|
|
dc.EndDrawing()
|
|
|
|
|
|
|
|
class TestNB(wx.Notebook):
|
|
def __init__(self, parent, id, log):
|
|
style = wx.NB_BOTTOM
|
|
|
|
if wx.Platform == "__WXMAC__":
|
|
style = 0
|
|
|
|
wx.Notebook.__init__(self, parent, id, style=style)
|
|
self.log = log
|
|
|
|
# Initialize our various samples and add them to the notebook.
|
|
win = DrawPanel(self, TestEllipses, log)
|
|
self.AddPage(win, 'Ellipses')
|
|
|
|
win = DrawPanel(self, TestText, log)
|
|
self.AddPage(win, 'Text')
|
|
|
|
win = DrawPanel(self, TestPolygons, log)
|
|
self.AddPage(win, 'Polygons')
|
|
|
|
win = DrawPanel(self, TestPoints, log)
|
|
self.AddPage(win, 'Points')
|
|
|
|
win = DrawPanel(self, TestLines, log)
|
|
self.AddPage(win, 'Lines')
|
|
|
|
win = DrawPanel(self, TestRectangles, log)
|
|
self.AddPage(win, 'Rectangles')
|
|
|
|
# Class used for all the various sample pages; the mechanics are the same
|
|
# for each one with regards to the notebook. The only difference is
|
|
# the function we use to draw on it.
|
|
class DrawPanel(wx.Panel):
|
|
def __init__(self, parent, drawFun, log):
|
|
wx.Panel.__init__(self, parent, -1)
|
|
self.SetBackgroundColour(wx.WHITE)
|
|
|
|
self.log = log
|
|
self.drawFun = drawFun
|
|
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
|
|
|
|
def OnPaint(self, evt):
|
|
dc = wx.PaintDC(self)
|
|
dc.Clear()
|
|
self.drawFun(dc,self.log)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
def runTest(frame, nb, log):
|
|
w = nb.GetClientSize().width
|
|
h = nb.GetClientSize().height
|
|
if w < 600: w = 600
|
|
if h < 400: h = 400
|
|
Init(w, h, 200)
|
|
win = TestNB(nb, -1, log)
|
|
return win
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
|
|
overview = """\
|
|
|
|
Some methods have been added to wx.DC to help with optimization of
|
|
drawing routines. Currently they are:
|
|
|
|
<pre>
|
|
DrawPointList(sequence, pens=None)
|
|
</pre>
|
|
Where sequence is a tuple, list, whatever of 2 element tuples
|
|
(x, y) and pens is either None, a single pen or a list of pens.
|
|
|
|
<pre>
|
|
DrawLineList(sequence, pens=None)
|
|
</pre>
|
|
Where sequence is a tuple, list, whatever of 4 element tuples
|
|
(x1,y1, x2,y2) and pens is either None, a single pen or a list
|
|
of pens.
|
|
|
|
<pre>
|
|
DrawRectangleList(rectangles, pens=None, brushes=None)
|
|
</pre>
|
|
|
|
|
|
<pre>
|
|
DrawEllipseList(ellipses, pens=None, brushes=None)
|
|
</pre>
|
|
|
|
|
|
<pre>
|
|
DrawPolygonList(polygons, pens=None, brushes=None)
|
|
</pre>
|
|
|
|
|
|
<pre>
|
|
DrawTextList(textList, coords, foregrounds = None, backgrounds = None)
|
|
</pre>
|
|
|
|
"""
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys,os
|
|
import run
|
|
run.main(['', os.path.basename(sys.argv[0])])
|
|
|