author  aaron_watters 
Thu, 22 Jun 2000 19:05:24 +0000  
changeset 301  5ad57f31ae75 
parent 300  44c954f72e2b 
child 304  3d53a0b5d429 
permissions  rwrr 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

1 
#!/bin/env python 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

2 
############################################################################### 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

3 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

4 
# ReportLab Public License Version 1.0 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

5 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

6 
# Except for the change of names the spirit and intention of this 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

7 
# license is the same as that of Python 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

8 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

9 
# (C) Copyright ReportLab Inc. 19982000. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

10 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

11 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

12 
# All Rights Reserved 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

13 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

14 
# Permission to use, copy, modify, and distribute this software and its 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

15 
# documentation for any purpose and without fee is hereby granted, provided 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

16 
# that the above copyright notice appear in all copies and that both that 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

17 
# copyright notice and this permission notice appear in supporting 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

18 
# documentation, and that the name of ReportLab not be used 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

19 
# in advertising or publicity pertaining to distribution of the software 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

20 
# without specific, written prior permission. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

21 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

22 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

23 
# Disclaimer 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

24 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

25 
# ReportLab Inc. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

26 
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

27 
# IN NO EVENT SHALL ReportLab BE LIABLE FOR ANY SPECIAL, INDIRECT 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

28 
# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

29 
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

30 
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

31 
# PERFORMANCE OF THIS SOFTWARE. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

32 
# 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

33 
############################################################################### 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

34 
# $Log: genuserguide.py,v $ 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

35 
# Revision 1.8 2000/06/22 19:05:24 aaron_watters 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

36 
# added quickhack for font changes in paragraphs and lots of new text 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

37 
# 
300
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

38 
# Revision 1.7 2000/06/22 13:55:59 aaron_watters 
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

39 
# showPage resets all state parameters warning. 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

40 
# 
299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

41 
# Revision 1.6 2000/06/22 13:35:28 aaron_watters 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

42 
# textobject and pathobject methods, among other things 
300
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

43 
# 
298  44 
# Revision 1.5 2000/06/21 21:19:29 aaron_watters 
45 
# colors, line styles, more examples 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

46 
# 
296  47 
# Revision 1.4 2000/06/21 15:16:05 aaron_watters 
48 
# Lots of graphical examples added 

298  49 
# 
293  50 
# Revision 1.3 2000/06/20 20:31:42 aaron_watters 
51 
# typos and more examples 

296  52 
# 
283  53 
# Revision 1.2 2000/06/19 21:13:02 aaron_watters 
54 
# 2nd try. more text 

293  55 
# 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

56 
# Revision 1.1 2000/06/17 02:57:56 aaron_watters 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

57 
# initial checkin. user guide generation framework. 
283  58 
# 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

59 
__version__=''' $Id: genuserguide.py,v 1.8 2000/06/22 19:05:24 aaron_watters Exp $ ''' 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

60 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

61 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

62 
__doc__ = """ 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

63 
This module contains the script for building the user guide. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

64 
""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

65 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

66 
from reportlab.platypus.doctemplate import SimpleDocTemplate 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

67 
from reportlab.platypus.flowables import Flowable 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

68 
from reportlab.lib.units import inch 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

69 
from reportlab.lib.pagesizes import letter 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

70 
from reportlab.platypus import Paragraph, Spacer, Preformatted, PageBreak 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

71 
from reportlab.lib.styles import PropertySet, getSampleStyleSheet, ParagraphStyle 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

72 
from reportlab.lib import colors 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

73 
import examples 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

74 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

75 
styleSheet = getSampleStyleSheet() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

76 
from reportlab.lib.corp import ReportLabLogo 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

77 
LOGO = ReportLabLogo(0.25*inch, 0.25*inch, inch, 0.75*inch) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

78 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

79 
from t_parse import Template 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

80 
QFcodetemplate = Template("X$X$", "X") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

81 
codesubst = "%s<font name=courier color=green>%s</font>" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

82 
QFreptemplate = Template("X^X^", "X") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

83 
QFsubst = "%s<font name=Helvetica color=blue><i>%s</i></font>" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

84 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

85 
def quickfix(text): 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

86 
"""inside text find any subsequence of form $subsequence$. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

87 
Format the subsequence as code. If similarly if text contains ^arg^ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

88 
format the arg as replaceable. The escape sequence for literal 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

89 
$ is $\\$ (^ is ^\\^. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

90 
""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

91 
from string import join 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

92 
for (template,subst) in [(QFcodetemplate, codesubst), (QFreptemplate, QFsubst)]: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

93 
fragment = text 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

94 
parts = [] 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

95 
try: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

96 
while fragment: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

97 
try: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

98 
(matches, index) = template.PARSE(fragment) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

99 
except: raise ValueError 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

100 
else: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

101 
[prefix, code] = matches 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

102 
if code == "\\": 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

103 
part = fragment[:index] 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

104 
else: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

105 
part = subst % (prefix, code) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

106 
parts.append(part) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

107 
fragment = fragment[index:] 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

108 
except ValueError: 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

109 
parts.append(fragment) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

110 
text = join(parts, "") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

111 
return text 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

112 
#print quickfix("$testing$ testing $one$ ^two^ $three(^four^)$") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

113 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

114 
class PageAnnotations: 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

115 
""" "closure" containing onfirstpage, onnextpage actions 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

116 
and any data they might want to use. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

117 
""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

118 
pagesize = letter 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

119 
pagenumber = 1 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

120 
def onFirstPage(self, canvas, doc): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

121 
(xsize, ysize) = self.pagesize 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

122 
LOGO.draw(canvas) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

123 
# width=6.25*inch,height=0.62*inch) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

124 
canvas.setFont("Helvetica", 12) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

125 
canvas.drawRightString(xsizeinch, ysize0.8*inch, "ReportLab User Guide") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

126 
self.pagenumber = self.pagenumber+1 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

127 
def onNextPage(self, canvas, doc): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

128 
canvas.saveState() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

129 
(xsize, ysize) = self.pagesize 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

130 
canvas.setFont("Helvetica", 12) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

131 
canvas.drawString(inch, ysize0.8*inch, "Page %s" % self.pagenumber) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

132 
self.onFirstPage(canvas, doc) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

133 
canvas.restoreState() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

134 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

135 
class Guide: 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

136 
def __init__(self): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

137 
self.myannotations = PageAnnotations() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

138 
self.story = story() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

139 
def go(self, filename="userguide.pdf"): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

140 
# generate the doc... 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

141 
doc = SimpleDocTemplate(filename,pagesize = letter ,showBoundary=0, 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

142 
leftMargin=inch, rightMargin=inch, topMargin=1.7*inch, bottomMargin=inch+90) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

143 
story = self.story 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

144 
doc.build(story, self.myannotations.onFirstPage, self.myannotations.onNextPage) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

145 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

146 
H = styleSheet['Heading2'] 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

147 
lessonnamestyle = ParagraphStyle("lessonname", parent=H) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

148 
lessonnamestyle.fontName = 'HelveticaBold' 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

149 
B = styleSheet['BodyText'] 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

150 
discussiontextstyle = ParagraphStyle("discussiontext", parent=B) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

151 
discussiontextstyle.fontName= 'Helvetica' 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

152 
exampletextstyle = styleSheet['Code'] 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

153 
# size for every example 
283  154 
examplefunctionxinches = 5.5 
155 
examplefunctionyinches = 3 

156 
examplefunctiondisplaysizes = (examplefunctionxinches*inch, examplefunctionyinches*inch) 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

157 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

158 
# for testing 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

159 
def NOP(*x,**y): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

160 
return None 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

161 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

162 
BODY = [] 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

163 
def story(): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

164 
return BODY 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

165 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

166 
def disc(text, klass=Paragraph, style=discussiontextstyle): 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

167 
text = quickfix(text) 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

168 
P = klass(text, style) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

169 
BODY.append(P) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

170 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

171 
def eg(text): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

172 
BODY.append(Spacer(0.1*inch, 0.1*inch)) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

173 
disc(text, klass=Preformatted, style=exampletextstyle) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

174 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

175 
#eg(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

176 
#this 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

177 
# is 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

178 
# an 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

179 
# example""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

180 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

181 
def head(text): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

182 
disc(text, style=lessonnamestyle) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

183 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

184 
#head("this is a header") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

185 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

186 
def lesson(text): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

187 
BODY.append(PageBreak()) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

188 
head(text) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

189 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

190 
def canvasdemo(function): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

191 
BODY.append(Spacer(0.1*inch, 0.1*inch)) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

192 
BODY.append(OperationWrapper(function)) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

193 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

194 
class OperationWrapper(Flowable): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

195 
"""wrap a drawing operation as a flowable. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

196 
the operation should respect the examplefunctiondisplaysizes 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

197 
limitations. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

198 
This example wraps a drawing operator f(pdfgen.canvas). 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

199 
Always enclosed in a rectangle. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

200 
""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

201 
def __init__(self, operation): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

202 
self.operation = operation 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

203 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

204 
def wrap(self, aw, ah): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

205 
return examplefunctiondisplaysizes # always the same 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

206 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

207 
def draw(self): 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

208 
canvas = self.canv 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

209 
canvas.saveState() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

210 
(x,y) = examplefunctiondisplaysizes 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

211 
self.operation(canvas) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

212 
canvas.restoreState() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

213 
canvas.rect(0,0,x,y) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

214 

296  215 

216 
def pencilnote(): 

217 
BODY.append(examples.NoteAnnotation()) 

218 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

219 
###### testing... 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

220 
#canvasdemo(NOP) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

221 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

222 
#lesson("this is a new lesson") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

223 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

224 
#disc("this explains the example") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

225 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

226 
#eg(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

227 
#this 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

228 
# is the 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

229 
# example 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

230 
# code""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

231 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

232 
#disc("the execution of the example follows") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

233 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

234 
#canvasdemo(NOP) # execute some code 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

235 

296  236 
#pencilnote() 
237 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

238 
head("ReportLab User Guide") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

239 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

240 
disc(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

241 
This document is intended to be a conversational introduction 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

242 
to the use of the ReportLab packages. Some previous programming experience 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

243 
is presumed and familiarity with the Python Programming language is 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

244 
recommended. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

245 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

246 

296  247 
#canvasdemo(NOP) # execute some code 
248 

249 
pencilnote() 

250 

283  251 
disc(""" 
252 
This document is in a <em>very</em> preliminary form. 

253 
""") 

254 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

255 
lesson("Introduction to $pdfgen$") 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

256 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

257 
disc(""" 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

258 
The $pdfgen$ package is the lowest level interface for 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

259 
generating PDF documents. A $pdfgen$ program is essentially 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

260 
a sequence of instructions for "painting" a document onto 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

261 
a sequence of pages. The interface object which provides the 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

262 
painting operations is the $pdfgen$ canvas. 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

263 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

264 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

265 
disc(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

266 
The canvas should be thought of as a sheet of white paper 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

267 
with points on the sheet identified using Cartesian ^(X,Y)^ coordinates 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

268 
which by default have the ^(0,0)^ origin point at the lower 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

269 
left corner of the page. Furthermore the first coordinate ^x^ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

270 
goes to the right and the second coordinate ^y^ goes up, by 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

271 
default.""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

272 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

273 
disc(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

274 
A simple example 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

275 
program that uses a canvas follows. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

276 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

277 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

278 
eg(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

279 
from reportlab.pdfgen import canvas 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

280 
c = canvas.Canvas("hello.pdf") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

281 
hello(c) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

282 
c.showPage() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

283 
c.save() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

284 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

285 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

286 
disc(""" 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

287 
The above code creates a $canvas$ object which will generate 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

288 
a PDF file named $hello.pdf$ in the current working directory. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

289 
It then calls the $hello$ function passing the $canvas$ as an argument. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

290 
Finally the $showPage$ method saves the current page of the canvas 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

291 
and the $save$ method stores the file and closes the canvas.""") 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

292 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

293 
disc(""" 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

294 
The $showPage$ method causes the $canvas$ to stop drawing on the 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

295 
current page and any further operations will draw on a subsequent 
293  296 
page (if there are any further operations  if not no 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

297 
new page is created). The $save$ method must be called after the 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

298 
construction of the document is complete  it generates the PDF 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

299 
document, which is the whole purpose of the $canvas$ object. 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

300 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

301 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

302 
disc(""" 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

303 
Suppose the $hello$ function referenced above is implemented as 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

304 
follows (we will not explain each of the operations in detail 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

305 
yet). 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

306 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

307 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

308 
eg(examples.testhello) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

309 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

310 
disc(""" 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

311 
Examining this code notice that there are essentially two types 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

312 
of operations performed using a canvas. The first type draws something 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

313 
on the page such as a text string or a rectangle or a line. The second 
283  314 
type changes the state of the canvas such as 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

315 
changing the current fill or stroke color or changing the current font 
283  316 
type and size. 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

317 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

318 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

319 
disc(""" 
283  320 
If we imagine the program as a painter working on 
321 
the canvas the "draw" operations apply paint to the canvas using 

322 
the current set of tools (colors, line styles, fonts, etcetera) 

323 
and the "state change" operations change one of the current tools 

324 
(changing the fill color from whatever it was to blue, or changing 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

325 
the current font to $TimesRoman$ in 15 points, for example). 
283  326 
""") 
327 

328 
disc(""" 

329 
The document generated by the "hello world" program listed above would contain 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

330 
the following graphics. 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

331 
""") 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

332 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

333 
canvasdemo(examples.hello) 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

334 

283  335 
head("About the demos in this document") 
336 

337 
disc(""" 

338 
This document contains demonstrations of the code discussed like the one shown 

339 
in the rectangle above. These demos are drawn on a "tiny page" embedded 

340 
within the real pages of the guide. The tiny pages are %s inches wide 

293  341 
and %s inches tall. The demo displays show the actual output of the demo 
283  342 
code. 
343 
""" % (examplefunctionxinches, examplefunctionyinches)) 

344 

345 
lesson('The tools: the "draw" operations') 

346 

347 
disc(""" 

348 
This section briefly lists the tools available to the program 

349 
for painting information onto a page using the canvas interface. 

350 
These will be discussed in detail in later sections. They are listed 

351 
here for easy reference and for summary purposes. 

352 
""") 

353 

354 
head("Line methods") 

355 

356 
eg("""canvas.line(x1,y1,x2,y2)""") 

357 
eg("""canvas.lines(linelist)""") 

358 

359 
disc(""" 

360 
The line methods draw straight line segments on the canvas. 

361 
""") 

362 

363 
head("Shape methods") 

364 

365 
eg("""canvas.grid(xlist, ylist) """) 

366 
eg("""canvas.bezier(x1, y1, x2, y2, x3, y3, x4, y4)""") 

367 
eg("""canvas.arc(x1,y1,x2,y2) """) 

368 
eg("""canvas.rect(x, y, width, height, stroke=1, fill=0) """) 

369 
eg("""canvas.ellipse(x, y, width, height, stroke=1, fill=0)""") 

370 
eg("""canvas.wedge(x1,y1, x2,y2, startAng, extent, stroke=1, fill=0) """) 

371 
eg("""canvas.circle(x_cen, y_cen, r, stroke=1, fill=0)""") 

372 
eg("""canvas.roundRect(x, y, width, height, radius, stroke=1, fill=0) """) 

373 

374 
disc(""" 

375 
The shape methods draw common complex shapes on the canvas. 

376 
""") 

377 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

378 
head("String drawing methods") 
283  379 

380 
eg("""canvas.drawString(x, y, text):""") 

381 
eg("""canvas.drawRightString(x, y, text) """) 

382 
eg("""canvas.drawCentredString(x, y, text)""") 

383 

384 
disc(""" 

385 
The draw string methods draw single lines of text on the canvas. 

386 
""") 

387 

388 
head("The text object methods") 

389 
eg("""textobject = canvas.beginText(x, y) """) 

390 
eg("""canvas.drawText(textobject) """) 

391 

392 
disc(""" 

393 
Text objects are used to format text in ways that 

394 
are not supported directly by the canvas interface. 

395 
A program creates a text object from the canvas using beginText 

396 
and then formats text by invoking textobject methods. 

397 
Finally the textobject is drawn onto the canvas using 

398 
drawText. 

399 
""") 

400 

401 
head("The path object methods") 

402 

403 
eg("""path = canvas.beginPath() """) 

293  404 
eg("""canvas.drawPath(path, stroke=1, fill=0) """) 
405 
eg("""canvas.clipPath(path, stroke=1, fill=0) """) 

283  406 

407 
head("Image methods") 

408 

409 
eg("""canvas.drawInlineImage(self, image, x,y, width=None,height=None) """) 

410 

411 
head("Ending a page") 

412 

413 
eg("""canvas.showPage()""") 

414 

300
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

415 
disc("""The showPage method finishes the current page. All additional drawing will 
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

416 
be done on another page.""") 
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

417 

44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

418 
pencilnote() 
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

419 

44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

420 
disc("""Warning! All state changes (font changes, color settings, geometry transforms, etcetera) 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

421 
are FORGOTTEN when you advance to a new page in $pdfgen$. Any state settings you wish to preserve 
300
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

422 
must be set up again before the program proceeds with drawing!""") 
44c954f72e2b
showPage resets all state parameters warning.
aaron_watters
parents:
299
diff
changeset

423 

283  424 
lesson('The toolbox: the "state change" operations') 
425 

426 
disc(""" 

427 
This section briefly lists the ways to switch the tools used by the 

428 
program 

429 
for painting information onto a page using the canvas interface. 

430 
These too will be discussed in detail in later sections. 

431 
""") 

432 

433 
head("Changing Colors") 

434 
eg("""canvas.setFillColorCMYK(c, m, y, k) """) 

435 
eg("""canvas.setStrikeColorCMYK(c, m, y, k) """) 

436 
eg("""canvas.setFillColorRGB(r, g, b) """) 

437 
eg("""canvas.setStrokeColorRGB(r, g, b) """) 

438 
eg("""canvas.setFillColor(acolor) """) 

439 
eg("""canvas.setStrokeColor(acolor) """) 

440 
eg("""canvas.setFillGray(gray) """) 

441 
eg("""canvas.setStrokeGray(gray) """) 

442 

443 
head("Changing Fonts") 

444 
eg("""canvas.setFont(psfontname, size, leading = None) """) 

445 

446 
head("Changing Graphical Styles") 

447 

448 
eg("""canvas.setLineWidth(width) """) 

449 
eg("""canvas.setLineCap(mode) """) 

450 
eg("""canvas.setLineJoin(mode) """) 

451 
eg("""canvas.setMiterLimit(limit) """) 

452 
eg("""canvas.setDash(self, array=[], phase=0) """) 

453 

454 
head("Changing Geometry") 

455 

456 
eg("""canvas.setPageSize(pair) """) 

457 
eg("""canvas.transform(a,b,c,d,e,f): """) 

458 
eg("""canvas.translate(dx, dy) """) 

459 
eg("""canvas.scale(x, y) """) 

460 
eg("""canvas.rotate(theta) """) 

461 
eg("""canvas.skew(alpha, beta) """) 

462 

463 
head("State control") 

464 

465 
eg("""canvas.saveState() """) 

466 
eg("""canvas.restoreState() """) 

467 

468 

469 
lesson("Other canvas methods.") 

470 

471 
disc(""" 

472 
Not all methods of the canvas object fit into the "tool" or "toolbox" 

473 
categories. Below are some of the misfits, included here for completeness. 

474 
""") 

475 

476 
eg(""" 

477 
canvas.setAuthor() 

478 
canvas.addOutlineEntry(title, key, level=0, closed=None) 

479 
canvas.setTitle(title) 

480 
canvas.setSubject(subj) 

481 
canvas.pageHasData() 

482 
canvas.showOutline() 

483 
canvas.bookmarkPage(name) 

484 
canvas.bookmarkHorizontalAbsolute(name, yhorizontal) 

485 
canvas.doForm() 

486 
canvas.beginForm(name, lowerx=0, lowery=0, upperx=None, uppery=None) 

487 
canvas.endForm() 

488 
canvas.linkAbsolute(contents, destinationname, Rect=None, addtopage=1, name=None, **kw) 

489 
canvas.getPageNumber() 

490 
canvas.addLiteral() 

491 
canvas.getAvailableFonts() 

492 
canvas.stringWidth(self, text, fontName, fontSize) 

493 
canvas.setPageCompression(onoff=1) 

494 
canvas.setPageTransition(self, effectname=None, duration=1, 

495 
direction=0,dimension='H',motion='I') 

496 
""") 

497 

498 

499 
lesson('Coordinates (default user space)') 

500 

501 
disc(""" 

502 
By default locations on a page are identified by a pair of numbers. 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

503 
For example the pair $(4.5*inch, 1*inch)$ identifies the location 
283  504 
found on the page by starting at the lower left corner and moving to 
505 
the right 4.5 inches and up one inch. 

506 
""") 

507 

508 
disc("""For example, the following function draws 

509 
a number of elements on a canvas.""") 

510 

511 
eg(examples.testcoords) 

512 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

513 
disc("""In the default user space the "origin" ^(0,0)^ point is at the lower 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

514 
left corner. Executing the $coords$ function in the default user space 
283  515 
(for the "demo minipage") we obtain the following.""") 
516 

517 
canvasdemo(examples.coords) 

518 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

519 
head("Moving the origin: the $translate$ method") 
283  520 

521 
disc("""Often it is useful to "move the origin" to a new point off 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

522 
the lower left corner. The $canvas.translate(^x,y^)$ method moves the origin 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

523 
for the current page to the point currently identified by ^(x,y)^.""") 
283  524 

525 
disc("""For example the following translate function first moves 

526 
the origin before drawing the same objects as shown above.""") 

527 

528 
eg(examples.testtranslate) 

529 

530 
disc("""This produces the following.""") 

531 

532 
canvasdemo(examples.translate) 

533 

296  534 

535 
#canvasdemo(NOP) # execute some code 

536 

537 
pencilnote() 

538 

539 

283  540 
disc(""" 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

541 
<i>Note:</i> As illustrated in the example it is perfectly possible to draw objects 
283  542 
or parts of objects "off the page". 
543 
In particular a common confusing bug is a translation operation that translates the 

544 
entire drawing off the visible area of the page. If a program produces a blank page 

545 
it is possible that all the drawn objects are off the page. 

546 
""") 

547 

548 
head("Shrinking and growing: the scale operation") 

549 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

550 
disc("""Another important operation is scaling. The scaling operation $canvas.scale(^dx,dy^)$ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

551 
stretches or shrinks the ^x^ and ^y^ dimensions by the ^dx^, ^dy^ factors respectively. Often 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

552 
^dx^ and ^dy^ are the same  for example to reduce a drawing by half in all dimensions use 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

553 
$dx = dy = 0.5$. However for the purposes of illustration we show an example where 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

554 
$dx$ and $dy$ are different. 
283  555 
""") 
556 

557 
eg(examples.testscale) 

558 

559 
disc("""This produces a "short and fat" reduced version of the previously displayed operations.""") 

560 

561 
canvasdemo(examples.scale) 

562 

296  563 

564 
#canvasdemo(NOP) # execute some code 

565 

566 
pencilnote() 

567 

568 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

569 
disc("""<i>Note:</i> scaling may also move objects or parts of objects off the page, 
283  570 
or may cause objects to "shrink to nothing." """) 
571 

572 
disc("""Scaling and translation can be combined, but the order of the 

573 
operations are important.""") 

574 

575 
eg(examples.testscaletranslate) 

576 

577 
disc("""This example function first saves the current canvas state 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

578 
and then does a $scale$ followed by a $translate$. Afterward the function 
283  579 
restores the state (effectively removing the effects of the scaling and 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

580 
translation) and then does the <i>same</i> operations in a different order. 
283  581 
Observe the effect below.""") 
582 

583 
canvasdemo(examples.scaletranslate) 

584 

296  585 

586 
#canvasdemo(NOP) # execute some code 

587 

588 
pencilnote() 

589 

590 

283  591 
disc("""<em>Note:</em> scaling shrinks or grows everything including line widths 
592 
so using the canvas.scale method to render a microscopic drawing in 

593 
scaled microscopic units 

594 
may produce a blob (because all line widths will get expanded a huge amount). 

595 
Also rendering an aircraft wing in meters scaled to centimeters may cause the lines 

596 
to shrink to the point where they disappear. For engineering or scientific purposes 

597 
such as these scale and translate 

598 
the units externally before rendering them using the canvas.""") 

599 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

600 
head("Saving and restoring the canvas state: $saveState$ and $restoreState$") 
283  601 

602 
disc(""" 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

603 
The $scaletranslate$ function used an important feature of the canvas object: 
283  604 
the ability to save and restore the current parameters of the canvas. 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

605 
By enclosing a sequence of operations in a matching pair of $canvas.saveState()$ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

606 
an $canvas.restoreState()$ operations all changes of font, color, line style, 
283  607 
scaling, translation, or other aspects of the canvas graphics state can be 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

608 
restored to the state at the point of the $saveState()$. Remember that the save/restore 
283  609 
calls must match: a stray save or restore operation may cause unexpected 
301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

610 
and undesirable behavior. Also, remember that <i>no</i> canvas state is 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

611 
preserved across page breaks, and the save/restore mechanism does not work 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

612 
across page breaks. 
283  613 
""") 
614 

293  615 
head("Mirror image") 
616 

617 
disc(""" 

618 
It is interesting although perhaps not terribly useful to note that 

619 
scale factors can be negative. For example the following function 

620 
""") 

621 

622 
eg(examples.testmirror) 

623 

624 
disc(""" 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

625 
creates a mirror image of the elements drawn by the $coord$ function. 
293  626 
""") 
627 

628 
canvasdemo(examples.mirror) 

629 

630 
disc(""" 

631 
Notice that the text strings are painted backwards. 

632 
""") 

633 

298  634 
lesson("Colors") 
635 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

636 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

637 
There are four way to specify colors in $pdfgen$: by name (using the $color$ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

638 
module, by red/green/blue (additive, $RGB$) value, 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

639 
by cyan/magenta/yellow/darkness (subtractive, $CMYK$), or by gray level. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

640 
The $colors$ function below exercises each of the four methods. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

641 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

642 

298  643 
eg(examples.testcolors) 
644 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

645 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

646 
The $RGB$ or additive color specification follows the way a computer 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

647 
screen adds different levels of the red, green, or blue light to make 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

648 
any color, where white is formed by turning all three lights on full 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

649 
$(1,1,1)$.""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

650 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

651 
disc("""The $CMYK$ or subtractive method follows the way a printer 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

652 
mixes three pigments (cyan, magenta, and yellow) to form colors. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

653 
Because mixing chemicals is more difficult than combining light there 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

654 
is a fourth parameter for darkness. For example a chemical 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

655 
combination of the $CMY$ pigments generally never makes a perfect 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

656 
black  instead producing a muddy color  so, to get black printers 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

657 
don't use the $CMY$ pigments but use a direct black ink. Because 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

658 
$CMYK$ maps more directly to the way printer hardware works it may 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

659 
be the case that colors specified in $CMYK$ will provide better fidelity 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

660 
and better control when printed. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

661 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

662 

298  663 
canvasdemo(examples.colors) 
664 

283  665 
lesson('Painting back to front') 
666 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

667 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

668 
Objects may be painted over other objects to good effect in $pdfgen$. As 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

669 
in painting with oils the object painted last will show up on top. For 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

670 
example, the $spumoni$ function below paints up a base of colors and then 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

671 
paints a white text over the base. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

672 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

673 

283  674 
eg(examples.testspumoni) 
675 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

676 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

677 
The word "SPUMONI" is painted in white over the colored rectangles, 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

678 
with the apparent effect of "removing" the color inside the body of 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

679 
the word. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

680 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

681 

283  682 
canvasdemo(examples.spumoni) 
683 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

684 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

685 
The last letters of the word are not visible because the default canvas 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

686 
background is white and painting white letters over a white background 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

687 
leaves no visible effect. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

688 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

689 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

690 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

691 
This method of building up complex paintings in layers can be done 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

692 
in very many layers in $pdfgen$  there are fewer physical limitations 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

693 
than there are when dealing with physical paints. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

694 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

695 

283  696 
eg(examples.testspumoni2) 
697 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

698 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

699 
The $spumoni2$ function layers an ice cream cone over the 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

700 
$spumoni$ drawing. Note that different parts of the cone 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

701 
and scoops layer over eachother as well. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

702 
""") 
283  703 
canvasdemo(examples.spumoni2) 
704 

705 

706 
lesson('Fonts and text objects') 

707 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

708 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

709 
Text may be drawn in many different colors, fonts, and sizes in $pdfgen$. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

710 
The $textsize$ function demonstrates how to change the color and font and 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

711 
size of text and how to place text on the page. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

712 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

713 

298  714 
eg(examples.testtextsize) 
715 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

716 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

717 
The $textsize$ function generates the following page. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

718 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

719 

298  720 
canvasdemo(examples.textsize) 
721 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

722 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

723 
A number of different fonts are always available in $pdfgen$. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

724 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

725 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

726 
eg(examples.testfonts) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

727 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

728 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

729 
The $fonts$ function lists the fonts that are always available. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

730 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

731 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

732 
canvasdemo(examples.fonts) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

733 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

734 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

735 
Other fonts can be added to a PDF document as well. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

736 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

737 

298  738 
lesson("Text object methods") 
739 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

740 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

741 
For the dedicated presentation of text in a PDF document, use a text object. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

742 
The text object interface provides detailed control of text layout parameters 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

743 
not available directly at the canvas level. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

744 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

745 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

746 
eg("""textobject.setTextOrigin(x,y)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

747 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

748 
eg("""textobject.setTextTransform(a,b,c,d,e,f)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

749 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

750 
eg("""textobject.moveCursor(dx, dy) # from start of current LINE""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

751 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

752 
eg("""(x,y) = textobject.getCursor()""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

753 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

754 
eg("""x = textobject.getX(); y = textobject.getY()""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

755 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

756 
eg("""textobject.setFont(psfontname, size, leading = None)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

757 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

758 
eg("""textobject.textOut(text)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

759 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

760 
eg("""textobject.textLine(text='')""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

761 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

762 
eg("""textobject.textLines(stuff, trim=1)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

763 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

764 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

765 
The text object methods shown above relate to basic text geometry. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

766 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

767 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

768 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

769 
A text object maintains a text cursor which moves about the page when 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

770 
text is drawn. For example the $setTextOrigin$ places the cursor 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

771 
in a known position and the $textLine$ and $textLines$ methods move 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

772 
the text cursor down past the lines that have been missing. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

773 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

774 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

775 
eg(examples.testcursormoves1) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

776 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

777 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

778 
The $testcursormoves1$ function relies on the automatic 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

779 
movement of the text cursor for placing text after the origin 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

780 
has been set. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

781 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

782 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

783 
canvasdemo(examples.cursormoves1) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

784 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

785 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

786 
It is also possible to control the movement of the cursor 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

787 
more explicitly by using the $moveCursor$ method (which moves 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

788 
the cursor as an offset from the start of the current <i>line</i> 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

789 
NOT the current cursor, and which also has positive ^y^ offsets 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

790 
move <i>down</i> (in contrast to the normal geometry where 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

791 
positive ^y^ usually moves up. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

792 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

793 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

794 
eg(examples.testcursormoves2) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

795 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

796 
disc(""" 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

797 
Here the $textOut$ does not move the down a line in contrast 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

798 
to the $textLine$ function which does move down. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

799 
""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

800 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

801 
canvasdemo(examples.cursormoves2) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

802 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

803 
head("Character Spacing") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

804 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

805 
eg("""textobject.setCharSpace(charSpace)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

806 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

807 
disc("""The $setCharSpace$ method adjusts one of the parameters of text  the intercharacter 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

808 
spacing.""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

809 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

810 
eg(examples.testcharspace) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

811 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

812 
disc("""The 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

813 
$charspace$ function exercises various spacing settings. 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

814 
It produces the following page.""") 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

815 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

816 
canvasdemo(examples.charspace)\ 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

817 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

818 
head("Word Spacing") 
299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

819 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

820 
eg("""textobject.setWordSpace(wordSpace)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

821 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

822 
eg(examples.testwordspace) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

823 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

824 
canvasdemo(examples.wordspace) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

825 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

826 
eg("""textobject.setHorizScale(horizScale)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

827 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

828 
eg(examples.testhorizontalscale) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

829 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

830 
canvasdemo(examples.horizontalscale) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

831 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

832 
eg("""textobject.setLeading(leading)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

833 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

834 
eg(examples.testleading) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

835 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

836 
canvasdemo(examples.leading) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

837 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

838 
eg("""textobject.setTextRenderMode(mode)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

839 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

840 
eg("""textobject.setRise(rise)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

841 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

842 
eg("""textobject.setFillColor(aColor); 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

843 
textobject.setStrokeColor(self, aColor) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

844 
# and similar""") 
298  845 

846 
lesson('Paths and Lines') 

847 

848 
eg(examples.teststar) 

849 

850 
canvasdemo(examples.star) 

851 

852 
eg(examples.testjoins) 

853 

854 
canvasdemo(examples.joins) 

855 

856 
eg(examples.testcaps) 

857 

858 
canvasdemo(examples.caps) 

859 

860 
eg(examples.testdashes) 

861 

862 
canvasdemo(examples.dashes) 

283  863 

296  864 
eg(examples.testpenciltip) 
865 

866 
canvasdemo(examples.penciltip) 

867 

283  868 
lesson('Rectangles, circles, ellipses') 
869 

296  870 
eg(examples.testpencil) 
871 

872 
canvasdemo(examples.pencil) 

873 

283  874 
lesson('Bezier curves') 
273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

875 

293  876 
eg(examples.testbezier) 
877 

878 
canvasdemo(examples.bezier) 

879 

880 
eg(examples.testbezier2) 

881 

882 
canvasdemo(examples.bezier2) 

883 

298  884 
lesson("Path object methods") 
885 

299
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

886 
eg("""pathobject.moveTo(x,y)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

887 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

888 
eg("""pathobject.lineTo(x,y)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

889 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

890 
eg("""pathobject.curveTo(x1, y1, x2, y2, x3, y3) """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

891 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

892 
eg("""pathobject.arc(x1,y1, x2,y2, startAng=0, extent=90) """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

893 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

894 
eg("""pathobject.arcTo(x1,y1, x2,y2, startAng=0, extent=90) """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

895 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

896 
eg("""pathobject.rect(x, y, width, height) """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

897 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

898 
eg("""pathobject.ellipse(x, y, width, height)""") 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

899 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

900 
eg("""pathobject.circle(x_cen, y_cen, r) """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

901 

909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

902 
eg("""pathobject.close() """) 
909b83ce750c
textobject and pathobject methods, among other things
aaron_watters
parents:
298
diff
changeset

903 

301
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

904 
eg(examples.testhand) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

905 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

906 
canvasdemo(examples.hand) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

907 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

908 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

909 
eg(examples.testhand2) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

910 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

911 
canvasdemo(examples.hand2) 
5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

912 

5ad57f31ae75
added quickhack for font changes in paragraphs and lots of new text
aaron_watters
parents:
300
diff
changeset

913 

298  914 
##### FILL THEM IN 
915 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

916 
lesson("...more lessons...") 
296  917 

918 
#####################################################################################################3 

919 

920 
lesson("Introduction to Platypus") 

921 

922 
lesson("A very simple Flowable") 

923 

924 
eg(examples.testnoteannotation) 

273
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

925 

cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

926 
if __name__=="__main__": 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

927 
g = Guide() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

928 
g.go() 
cd705b27b6a5
initial checkin. user guide generation framework.
aaron_watters
parents:
diff
changeset

929 