Example #1
0
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()
Example #2
0
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()
Example #3
0
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 ''