294 lines
9.2 KiB
Python
294 lines
9.2 KiB
Python
#!/bin/env python
|
|
#Copyright ReportLab Europe Ltd. 2000-2004
|
|
#see license.txt for license details
|
|
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py
|
|
__version__=''' $Id $ '''
|
|
"""This contains a number of routines to generate test drawings
|
|
for reportlab/graphics. For now they are contrived, but we will expand them
|
|
to try and trip up any parser. Feel free to add more.
|
|
|
|
"""
|
|
|
|
from reportlab.graphics.shapes import *
|
|
from reportlab.lib import colors
|
|
|
|
def getDrawing1():
|
|
"""Hello World, on a rectangular background"""
|
|
|
|
D = Drawing(400, 200)
|
|
D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow)) #round corners
|
|
D.add(String(180,100, 'Hello World', fillColor=colors.red))
|
|
|
|
|
|
return D
|
|
|
|
|
|
def getDrawing2():
|
|
"""This demonstrates the basic shapes. There are
|
|
no groups or references. Each solid shape should have
|
|
a purple fill."""
|
|
D = Drawing(400, 200) #, fillColor=colors.purple)
|
|
|
|
D.add(Line(10,10,390,190))
|
|
D.add(Circle(100,100,20, fillColor=colors.purple))
|
|
D.add(Circle(200,100,20, fillColor=colors.purple))
|
|
D.add(Circle(300,100,20, fillColor=colors.purple))
|
|
|
|
D.add(Wedge(330,100,40, -10,40, fillColor=colors.purple))
|
|
|
|
D.add(PolyLine([120,10,130,20,140,10,150,20,160,10,
|
|
170,20,180,10,190,20,200,10]))
|
|
|
|
D.add(Polygon([300,20,350,20,390,80,300,75, 330, 40]))
|
|
|
|
D.add(Ellipse(50, 150, 40, 20))
|
|
|
|
D.add(Rect(120, 150, 60, 30,
|
|
strokeWidth=10,
|
|
strokeColor=colors.red,
|
|
fillColor=colors.yellow)) #square corners
|
|
|
|
D.add(Rect(220, 150, 60, 30, 10, 10)) #round corners
|
|
|
|
D.add(String(10,50, 'Basic Shapes', fillColor=colors.black))
|
|
|
|
return D
|
|
|
|
|
|
##def getDrawing2():
|
|
## """This drawing uses groups. Each group has two circles and a comment.
|
|
## The line style is set at group level and should be red for the left,
|
|
## bvlue for the right."""
|
|
## D = Drawing(400, 200)
|
|
##
|
|
## Group1 = Group()
|
|
##
|
|
## Group1.add(String(50, 50, 'Group 1', fillColor=colors.black))
|
|
## Group1.add(Circle(75,100,25))
|
|
## Group1.add(Circle(125,100,25))
|
|
## D.add(Group1)
|
|
##
|
|
## Group2 = Group(
|
|
## String(250, 50, 'Group 2', fillColor=colors.black),
|
|
## Circle(275,100,25),
|
|
## Circle(325,100,25)#,
|
|
|
|
|
|
##def getDrawing2():
|
|
## """This drawing uses groups. Each group has two circles and a comment.
|
|
## The line style is set at group level and should be red for the left,
|
|
## bvlue for the right."""
|
|
## D = Drawing(400, 200)
|
|
##
|
|
## Group1 = Group()
|
|
##
|
|
## Group1.add(String(50, 50, 'Group 1', fillColor=colors.black))
|
|
## Group1.add(Circle(75,100,25))
|
|
## Group1.add(Circle(125,100,25))
|
|
## D.add(Group1)
|
|
##
|
|
## Group2 = Group(
|
|
## String(250, 50, 'Group 2', fillColor=colors.black),
|
|
## Circle(275,100,25),
|
|
## Circle(325,100,25)#,
|
|
##
|
|
## #group attributes
|
|
## #strokeColor=colors.blue
|
|
## )
|
|
## D.add(Group2)
|
|
|
|
## return D
|
|
##
|
|
##
|
|
##def getDrawing3():
|
|
## """This uses a named reference object. The house is a 'subroutine'
|
|
## the basic brick colored walls are defined, but the roof and window
|
|
## color are undefined and may be set by the container."""
|
|
##
|
|
## D = Drawing(400, 200, fill=colors.bisque)
|
|
##
|
|
##
|
|
## House = Group(
|
|
## Rect(2,20,36,30, fill=colors.bisque), #walls
|
|
## Polygon([0,20,40,20,20,5]), #roof
|
|
## Rect(8, 38, 8, 12), #door
|
|
## Rect(25, 38, 8, 7), #window
|
|
## Rect(8, 25, 8, 7), #window
|
|
## Rect(25, 25, 8, 7) #window
|
|
##
|
|
## )
|
|
## D.addDef('MyHouse', House)
|
|
##
|
|
## # one row all the same color
|
|
## D.add(String(20, 40, 'British Street...',fill=colors.black))
|
|
## for i in range(6):
|
|
## x = i * 50
|
|
## D.add(NamedReference('MyHouse',
|
|
## House,
|
|
## transform=translate(x, 40),
|
|
## fill = colors.brown
|
|
## )
|
|
## )
|
|
##
|
|
## # now do a row all different
|
|
## D.add(String(20, 120, 'Mediterranean Street...',fill=colors.black))
|
|
## x = 0
|
|
## for color in (colors.blue, colors.yellow, colors.orange,
|
|
## colors.red, colors.green, colors.chartreuse):
|
|
## D.add(NamedReference('MyHouse',
|
|
## House,
|
|
## transform=translate(x,120),
|
|
## fill = color,
|
|
## )
|
|
## )
|
|
## x = x + 50
|
|
## #..by popular demand, the mayor gets a big one at the end
|
|
## D.add(NamedReference('MyHouse',
|
|
## House,
|
|
## transform=mmult(translate(x,110), scale(1.2,1.2)),
|
|
## fill = color,
|
|
## )
|
|
## )
|
|
##
|
|
##
|
|
## return D
|
|
##
|
|
##def getDrawing4():
|
|
## """This tests that attributes are 'unset' correctly when
|
|
## one steps back out of a drawing node. All the circles are part of a
|
|
## group setting the line color to blue; the second circle explicitly
|
|
## sets it to red. Ideally, the third circle should go back to blue."""
|
|
## D = Drawing(400, 200)
|
|
##
|
|
##
|
|
## G = Group(
|
|
## Circle(100,100,20),
|
|
## Circle(200,100,20, stroke=colors.blue),
|
|
## Circle(300,100,20),
|
|
## stroke=colors.red,
|
|
## stroke_width=3,
|
|
## fill=colors.aqua
|
|
## )
|
|
## D.add(G)
|
|
##
|
|
##
|
|
## D.add(String(10,50, 'Stack Unwinding - should be red, blue, red'))
|
|
##
|
|
## return D
|
|
##
|
|
##
|
|
##def getDrawing5():
|
|
## """This Rotates Coordinate Axes"""
|
|
## D = Drawing(400, 200)
|
|
##
|
|
##
|
|
##
|
|
## Axis = Group(
|
|
## Line(0,0,100,0), #x axis
|
|
## Line(0,0,0,50), # y axis
|
|
## Line(0,10,10,10), #ticks on y axis
|
|
## Line(0,20,10,20),
|
|
## Line(0,30,10,30),
|
|
## Line(0,40,10,40),
|
|
## Line(10,0,10,10), #ticks on x axis
|
|
## Line(20,0,20,10),
|
|
## Line(30,0,30,10),
|
|
## Line(40,0,40,10),
|
|
## Line(50,0,50,10),
|
|
## Line(60,0,60,10),
|
|
## Line(70,0,70,10),
|
|
## Line(80,0,80,10),
|
|
## Line(90,0,90,10),
|
|
## String(20, 35, 'Axes', fill=colors.black)
|
|
## )
|
|
##
|
|
## D.addDef('Axes', Axis)
|
|
##
|
|
## D.add(NamedReference('Axis', Axis,
|
|
## transform=translate(10,10)))
|
|
## D.add(NamedReference('Axis', Axis,
|
|
## transform=mmult(translate(150,10),rotate(15)))
|
|
## )
|
|
## return D
|
|
##
|
|
##def getDrawing6():
|
|
## """This Rotates Text"""
|
|
## D = Drawing(400, 300, fill=colors.black)
|
|
##
|
|
## xform = translate(200,150)
|
|
## C = (colors.black,colors.red,colors.green,colors.blue,colors.brown,colors.gray, colors.pink,
|
|
## colors.lavender,colors.lime, colors.mediumblue, colors.magenta, colors.limegreen)
|
|
##
|
|
## for i in range(12):
|
|
## D.add(String(0, 0, ' - - Rotated Text', fill=C[i%len(C)], transform=mmult(xform, rotate(30*i))))
|
|
##
|
|
## return D
|
|
##
|
|
##def getDrawing7():
|
|
## """This defines and tests a simple UserNode0 (the trailing zero denotes
|
|
## an experimental method which is not part of the supported API yet).
|
|
## Each of the four charts is a subclass of UserNode which generates a random
|
|
## series when rendered."""
|
|
##
|
|
## class MyUserNode(UserNode0):
|
|
## import whrandom, math
|
|
##
|
|
##
|
|
## def provideNode(self, sender):
|
|
## """draw a simple chart that changes everytime it's drawn"""
|
|
## # print "here's a random number %s" % self.whrandom.random()
|
|
## #print "MyUserNode.provideNode being called by %s" % sender
|
|
## g = Group()
|
|
## #g._state = self._state # this is naughty
|
|
## PingoNode.__init__(g, self._state) # is this less naughty ?
|
|
## w = 80.0
|
|
## h = 50.0
|
|
## g.add(Rect(0,0, w, h, stroke=colors.black))
|
|
## N = 10.0
|
|
## x,y = (0,h)
|
|
## dx = w/N
|
|
## for ii in range(N):
|
|
## dy = (h/N) * self.whrandom.random()
|
|
## g.add(Line(x,y,x+dx, y-dy))
|
|
## x = x + dx
|
|
## y = y - dy
|
|
## return g
|
|
##
|
|
## D = Drawing(400,200, fill=colors.white) # AR - same size as others
|
|
##
|
|
## D.add(MyUserNode())
|
|
##
|
|
## graphcolor= [colors.green, colors.red, colors.brown, colors.purple]
|
|
## for ii in range(4):
|
|
## D.add(Group( MyUserNode(stroke=graphcolor[ii], stroke_width=2),
|
|
## transform=translate(ii*90,0) ))
|
|
##
|
|
## #un = MyUserNode()
|
|
## #print un.provideNode()
|
|
## return D
|
|
##
|
|
##def getDrawing8():
|
|
## """Test Path operations--lineto, curveTo, etc."""
|
|
## D = Drawing(400, 200, fill=None, stroke=colors.purple, stroke_width=2)
|
|
##
|
|
## xform = translate(200,100)
|
|
## C = (colors.black,colors.red,colors.green,colors.blue,colors.brown,colors.gray, colors.pink,
|
|
## colors.lavender,colors.lime, colors.mediumblue, colors.magenta, colors.limegreen)
|
|
## p = Path(50,50)
|
|
## p.lineTo(100,100)
|
|
## p.moveBy(-25,25)
|
|
## p.curveTo(150,125, 125,125, 200,50)
|
|
## p.curveTo(175, 75, 175, 98, 62, 87)
|
|
##
|
|
##
|
|
## D.add(p)
|
|
## D.add(String(10,30, 'Tests of path elements-lines and bezier curves-and text formating'))
|
|
## D.add(Line(220,150, 220,200, stroke=colors.red))
|
|
## D.add(String(220,180, "Text should be centered", text_anchor="middle") )
|
|
##
|
|
##
|
|
## return D
|
|
|
|
|
|
if __name__=='__main__':
|
|
print __doc__ |