def test(): from reportlab.graphics.charts.piecharts import WedgeProperties wedges = TypedPropertyCollection(WedgeProperties) wedges.fillColor = colors.red wedges.setVector(fillColor=(colors.blue,colors.green,colors.white)) print len(_ItemWrapper) d = shapes.Drawing(400, 200) tc = TwoCircles() d.add(tc) import renderPDF renderPDF.drawToFile(d, 'sample_widget.pdf', 'A Sample Widget') print 'saved sample_widget.pdf' d = shapes.Drawing(400, 200) f = Face() f.skinColor = colors.yellow f.mood = "sad" d.add(f, name='theFace') print 'drawing 1 properties:' d.dumpProperties() renderPDF.drawToFile(d, 'face.pdf', 'A Sample Widget') print 'saved face.pdf' d2 = d.expandUserNodes() renderPDF.drawToFile(d2, 'face_copy.pdf', 'An expanded drawing') print 'saved face_copy.pdf' print 'drawing 2 properties:' d2.dumpProperties()
class Drawing(Group, Flowable): """Outermost container; the thing a renderer works on. This has no properties except a height, width and list of contents.""" _saveModes = ( 'pdf', 'ps', 'eps', 'gif', 'png', 'jpg', 'jpeg', 'pct', 'pict', 'tiff', 'tif', 'py', 'bmp', 'svg', 'tiffp', 'tiffl', 'tiff1', ) _xtraAttrMap = AttrMap( width=AttrMapValue(isNumber, desc="Drawing width in points."), height=AttrMapValue(isNumber, desc="Drawing height in points."), canv=AttrMapValue(None), background=AttrMapValue(isValidChildOrNone, desc="Background widget for the drawing"), hAlign=AttrMapValue( OneOf("LEFT", "RIGHT", "CENTER", "CENTRE"), desc="Horizontal alignment within parent document"), vAlign=AttrMapValue(OneOf("TOP", "BOTTOM", "CENTER", "CENTRE"), desc="Vertical alignment within parent document"), #AR temporary hack to track back up. #fontName = AttrMapValue(isStringOrNone), renderScale=AttrMapValue(isNumber, desc="Global scaling for rendering"), ) _attrMap = AttrMap(BASE=Group) _attrMap.update(_xtraAttrMap) def __init__(self, width=400, height=200, *nodes, **keywords): self.background = None apply(Group.__init__, (self, ) + nodes, keywords) self.width = width self.height = height self.hAlign = 'LEFT' self.vAlign = 'BOTTOM' self.renderScale = 1.0 def _renderPy(self): I = { 'reportlab.graphics.shapes': ['_DrawingEditorMixin', 'Drawing', 'Group'] } G = _renderGroupPy(self._explode(), 'self', I) n = 'ExplodedDrawing_' + self.__class__.__name__ s = '#Autogenerated by ReportLab guiedit do not edit\n' for m, o in I.items(): s = s + 'from %s import %s\n' % ( m, string.replace(str(o)[1:-1], "'", "")) s = s + '\nclass %s(_DrawingEditorMixin,Drawing):\n' % n s = s + '\tdef __init__(self,width=%s,height=%s,*args,**kw):\n' % ( self.width, self.height) s = s + '\t\tapply(Drawing.__init__,(self,width,height)+args,kw)\n' s = s + G s = s + '\n\nif __name__=="__main__": #NORUNTESTS\n\t%s().save(formats=[\'pdf\'],outDir=\'.\',fnRoot=None)\n' % n return s def draw(self, showBoundary=_unset_): """This is used by the Platypus framework to let the document draw itself in a story. It is specific to PDF and should not be used directly.""" import renderPDF renderPDF.draw(self, self.canv, 0, 0, showBoundary=showBoundary) def wrap(self, availWidth, availHeight): width = self.width height = self.height renderScale = self.renderScale if renderScale != 1.0: width *= renderScale height *= renderScale return width, height def expandUserNodes(self): """Return a new drawing which only contains primitive shapes.""" obj = Group.expandUserNodes(self) obj.width = self.width obj.height = self.height return obj def copy(self): """Returns a copy""" return self._copy(self.__class__(self.width, self.height)) def asGroup(self, *args, **kw): return self._copy(apply(Group, args, kw)) def save(self, formats=None, verbose=None, fnRoot=None, outDir=None, title='', **kw): """Saves copies of self in desired location and formats. Multiple formats can be supported in one call the extra keywords can be of the form _renderPM_dpi=96 (which passes dpi=96 to renderPM) """ from reportlab import rl_config ext = '' if not fnRoot: fnRoot = getattr(self, 'fileNamePattern', (self.__class__.__name__ + '%03d')) chartId = getattr(self, 'chartId', 0) if callable(fnRoot): fnRoot = fnRoot(chartId) else: try: fnRoot = fnRoot % getattr(self, 'chartId', 0) except TypeError, err: #the exact error message changed from 2.2 to 2.3 so we need to #check a substring if str(err).find('not all arguments converted') < 0: raise if os.path.isabs(fnRoot): outDir, fnRoot = os.path.split(fnRoot) else: outDir = outDir or getattr(self, 'outDir', '.') outDir = outDir.rstrip().rstrip(os.sep) if not outDir: outDir = '.' if not os.path.isabs(outDir): outDir = os.path.join( getattr(self, '_override_CWD', os.path.dirname(sys.argv[0])), outDir) if not os.path.isdir(outDir): os.makedirs(outDir) fnroot = os.path.normpath(os.path.join(outDir, fnRoot)) plotMode = os.path.splitext(fnroot) if string.lower(plotMode[1][1:]) in self._saveModes: fnroot = plotMode[0] plotMode = map(str.lower, formats or getattr(self, 'formats', ['pdf'])) verbose = (verbose is not None and (verbose, ) or (getattr(self, 'verbose', verbose), ))[0] _saved = logger.warnOnce.enabled, logger.infoOnce.enabled logger.warnOnce.enabled = logger.infoOnce.enabled = verbose if 'pdf' in plotMode: from reportlab.graphics import renderPDF filename = fnroot + '.pdf' if verbose: print "generating PDF file %s" % filename renderPDF.drawToFile(self, filename, title, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPDF_', **kw)) ext = ext + '/.pdf' if sys.platform == 'mac': import macfs, macostools macfs.FSSpec(filename).SetCreatorType("CARO", "PDF ") macostools.touched(filename) for bmFmt in ('gif', 'png', 'tif', 'jpg', 'tiff', 'pct', 'pict', 'bmp', 'tiffp', 'tiffl', 'tiff1'): if bmFmt in plotMode: from reportlab.graphics import renderPM filename = '%s.%s' % (fnroot, bmFmt) if verbose: print "generating %s file %s" % (bmFmt, filename) renderPM.drawToFile(self, filename, fmt=bmFmt, showBoundary=getattr( self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPM_', **kw)) ext = ext + '/.' + bmFmt if 'eps' in plotMode: try: from rlextra.graphics import renderPS_SEP as renderPS except ImportError: from reportlab.graphics import renderPS filename = fnroot + '.eps' if verbose: print "generating EPS file %s" % filename renderPS.drawToFile(self, filename, title=fnroot, dept=getattr(self, 'EPS_info', ['Testing'])[0], company=getattr(self, 'EPS_info', ['', 'ReportLab'])[1], preview=getattr(self, 'preview', rl_config.eps_preview), showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), ttf_embed=getattr(self, 'ttf_embed', rl_config.eps_ttf_embed), **_extraKW(self, '_renderPS_', **kw)) ext = ext + '/.eps' if 'svg' in plotMode: from reportlab.graphics import renderSVG filename = fnroot + '.svg' if verbose: print "generating EPS file %s" % filename renderSVG.drawToFile(self, filename, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderSVG_', **kw)) ext = ext + '/.svg' if 'ps' in plotMode: from reportlab.graphics import renderPS filename = fnroot + '.ps' if verbose: print "generating EPS file %s" % filename renderPS.drawToFile(self, filename, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPS_', **kw)) ext = ext + '/.ps' if 'py' in plotMode: filename = fnroot + '.py' if verbose: print "generating py file %s" % filename open(filename, 'w').write(self._renderPy()) ext = ext + '/.py' logger.warnOnce.enabled, logger.infoOnce.enabled = _saved if hasattr(self, 'saveLogger'): self.saveLogger(fnroot, ext) return ext and fnroot + ext[1:] or ''