a
    ¦¾de¾ç  ã                   @   sš  d Z dZddlZddlZddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lT dd
lmZmZ eeddƒƒZdd	lT ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' e$eddƒZ(e$eddƒZ)e$eddƒZ*dZ+dZ,dej-ddddddddddej-e&deddœZ.dd	l/T dd„ Z0dd„ Z1G dd„ dƒZ2G dd„ dƒZ3dd „ Z4d!d"„ Z5d#d$„ Z6d%d&„ Z7G d'd(„ d(e3e2ƒZ8G d)d*„ d*e8ƒZ9dld+d,„Z:dmd-d.„Z;dnd0d1„Z<d2d3„ Z=G d4d5„ d5e9eƒZ>G d6d7„ d7ƒZ?G d8d9„ d9e@ƒZAeAƒ ZAG d:d;„ d;e8ƒZBG d<d=„ d=eBƒZCG d>d?„ d?eBƒZDeEeFd@ƒƒ\ZGZHZIZJdAZKg dB¢ZLdodCdD„ZMdde'e'dEe'dFe'e&e&dGe&dHe&iZNG dIdJ„ dJeDƒZOeOƒ ZPdpdKdL„ZQG dMdN„ dNeOƒZRg dddfdOdP„ZSG dQdR„ dReDƒZTG dSdT„ dTeDƒZUG dUdV„ dVeDƒZVG dWdX„ dXeDƒZWG dYdZ„ dZeDƒZXG d[d\„ d\eDƒZYG d]d^„ d^eBƒZZG d_d`„ d`eOƒZ[defdadb„Z\G dcdd„ dde8ƒZ]G dedf„ dfe2ƒZ^G dgdh„ dhe8ƒZ_didj„ Z`eadkk�r–e`ƒ  dS )qz3.5.60z9Core of the graphics library - defines Drawing and Shapesé    N)ÚpiÚcosÚsinÚsqrtÚradiansÚfloor)ÚFlowable)ÚshapeCheckingÚverboseÚdefaultGraphicsFontNameÚ_unset_ÚdecimalSymbol)Úlogger)Úcolors)Ú*)ÚisSeqÚasBytesé   )Úfp_str)ÚstringWidth)Útt2ps)ÚFILL_EVEN_ODDÚFILL_NON_ZEROzNon-Zero WindingzEven-Odd©r   r   r   r   r   r   é
   FÚstart)Ú	transformÚstrokeColorÚstrokeWidthÚstrokeLineCapÚstrokeLineJoinÚstrokeMiterLimitÚstrokeDashArrayÚstrokeOpacityÚfillOpacityÚfillOverprintÚstrokeOverprintÚoverprintMaskÚ	fillColorÚfillModeÚfontSizeÚfontNameÚ
textAnchorc                 C   s   d}| D ]}t |t|||ƒƒ}qt| ƒ| }|}	|d dkrL| }
|	| }	n$|d dkr^d}
n| d }
|	|
 }	|d dkr¬| }|dkr�d}n|dkr | }n
| d }nd|d d	krâd}|dkrÊ|}n|dkrØd}n|d }n.| d }|dkrü| }n|dk�r|}nd}||
||||	fS )
Nr   ÚsÚng       @éÿÿÿÿÚeÚendr   Úw)Úmaxr   Úlen)ÚtextÚfontr*   Úleadingr,   Z	boxAnchorr2   ÚtÚhZytZybÚxbZxt© r;   úR/var/www/sistema_ama/venv/lib/python3.9/site-packages/reportlab/graphics/shapes.pyÚ_textBoxLimitsC   s6    



r=   c                 C   sp   t t|ƒ| |f| | |f| | || f| || ffƒ}dd„ |D ƒ}dd„ |D ƒ}t|ƒt|ƒt|ƒt|ƒ|fS )z�
    Find the corner points of the rotated w x h sized box at x,y
    return the corner points and the min max points in the original space
    c                 S   s   g | ]}|d  ‘qS ©r   r;   ©Ú.0Úxr;   r;   r<   Ú
<listcomp>k   ó    z%_rotatedBoxLimits.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS ©r   r;   r?   r;   r;   r<   rB   l   rC   )ZzTransformPointsÚrotateÚminr3   )rA   Úyr2   r9   ÚangleÚCÚXÚYr;   r;   r<   Ú_rotatedBoxLimitse   s    6rL   c                   @   s   e Zd ZdZdd„ ZdS )Ú_DrawTimeResizeablez:Addin class to provide the horribleness of _drawTimeResizec                 C   s>   t | dƒr:| j}|j}|| |_|_t |dƒr:| ||¡ d S )NÚ_canvasÚ_drawTimeResize)ÚhasattrrN   Z_drawingÚwidthÚheightrO   )Úselfr2   r9   ÚcanvasÚdrawingr;   r;   r<   rO   q   s    

z#_DrawTimeResizeable._drawTimeResizeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   r;   r;   r;   r<   rM   o   s   rM   c                   @   s   e Zd Zi fdd„ZdS )Ú_SetKeyWordArgsc                 C   s"   |  ¡ D ]\}}t| ||ƒ qdS )z9In general properties may be supplied to the constructor.N)ÚitemsÚsetattr)rS   ÚkeywordsÚkeyÚvaluer;   r;   r<   Ú__init__z   s    z_SetKeyWordArgs.__init__N)rV   rW   rX   r`   r;   r;   r;   r<   rZ   y   s   rZ   c           
      C   s|   dd„ | D ƒ}|sd S |d \}}}}|dd … D ]<\}}}}	||k rJ|}||krV|}||k rb|}|	|kr2|	}q2||||fS )Nc                 S   s   g | ]}|d ur|‘qS ©Nr;   r?   r;   r;   r<   rB   ‡   rC   z"getRectsBounds.<locals>.<listcomp>r   r   r;   )
ZrectListÚLZxMinZyMinZxMaxZyMaxÚx1Úy1Úx2Úy2r;   r;   r<   ÚgetRectsBounds…   s    rg   c                 C   s  |d||   |  }d|d|  |   }||  }| g}|| d| |  }|dk�rt |ƒ}|dk rj| }d||  }	g }
z|
 |	| ¡ W n   Y n0 z|
 ||	 ¡ W n   Y n0 |d9 }|d9 }|
D ]>}d|  krædkrÎn qÎ| |||| |  |  |  ¡ qÎ| |¡ |S )ag  
    this is used to find if a curveTo path operator has extrema in its range
    The curveTo operator is defined by the points y0, y1, y2, y3

        B(t):=(1-t)^3*y0+3*(1-t)^2*t*y1+3*(1-t)*t^2*y2+t^3*y3
            :=t^3*(y3-3*y2+3*y1-y0)+t^2*(3*y2-6*y1+3*y0)+t*(3*y1-3*y0)+y0
    and is a cubic bezier curve.

    The differential is a quadratic
        t^2*(3*y3-9*y2+9*y1-3*y0)+t*(6*y2-12*y1+6*y0)+3*y1-3*y0

    The extrema must be at real roots, r, of the above which lie in 0<=r<=1

    The quadratic coefficients are
        a=3*y3-9*y2+9*y1-3*y0 b=6*y2-12*y1+6*y0 c=3*y1-3*y0
    or
        a=y3-3*y2+3*y1-y0 b=2*y2-4*y1+2*y0 c=y1-y0  (remove common factor of 3)
    or
        a=y3-3*(y2-y1)-y0 b=2*(y2-2*y1+y0) c=y1-y0

    The returned value is [y0,x1,x2,y3] where if found x1, x2 are any extremals that were found;
    there can be 0, 1 or 2 extremals
    é   é   é   r   g      à¿g      ø?r   )r   Úappend)Zy0rd   rf   Úy3ÚaÚbÚcrK   ÚdÚqÚRr8   r;   r;   r<   Ú_getBezierExtrema–   s2    
$
rs   c                 C   s\   t | ƒ}| fdd„}tt|td|dƒƒƒ}tt|td|dƒƒƒ}t|ƒt|ƒt|ƒt|ƒfS )Nc                 S   s   ||  S ra   r;   )ÚiÚpr;   r;   r<   Ú<lambda>Í   rC   zgetPathBounds.<locals>.<lambda>r   ri   r   )r4   ÚlistÚmapÚrangerF   r3   )Úpointsr.   ÚfÚxsÚysr;   r;   r<   ÚgetPathBoundsË   s
    r~   c                 C   sT   | d }t |ƒrHdd„ | D ƒ}dd„ | D ƒ}t|ƒt|ƒt|ƒt|ƒfS t| ƒS dS )z"Helper function for list of pointsr   c                 S   s   g | ]}|d  ‘qS r>   r;   ©r@   Zxyr;   r;   r<   rB   Ö   rC   z#getPointsBounds.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS rD   r;   r   r;   r;   r<   rB   ×   rC   N)r   rF   r3   r~   )Z	pointListÚfirstr|   r}   r;   r;   r<   ÚgetPointsBoundsÒ   s    r�   c                   @   sV   e Zd ZdZeƒ Zdd„ Zddd„Zdd„ Zdd
d„Z	dd„ Z
erJdd„ Zdd„ ZdS )ÚShapea1  Base class for all nodes in the tree. Nodes are simply
    packets of data to be created, stored, and ultimately
    rendered - they don't do anything active.  They provide
    convenience methods for verification but do not
    check attribiute assignments or use any clever setattr
    tricks this time.c                 C   s   t d| jj ƒ‚dS )zReturn a clone of this shape.z!No copy method implemented for %sN)ÚNotImplementedErrorÚ	__class__rV   ©rS   r;   r;   r<   Úcopyê   s    z
Shape.copyr   c                 C   s4   i }| j  ¡ D ] \}}|dd… dkr|||< q|S )zDInterface to make it easy to extract automatic
        documentationr   r   Ú_)Ú__dict__r[   )rS   ZrecurÚpropsr^   r_   r;   r;   r<   ÚgetPropertiesð   s
    
zShape.getPropertiesc                 C   s   | j  |¡ dS )zfSupports the bulk setting if properties from,
        for example, a GUI application or a config file.N)rˆ   Úupdate)rS   r‰   r;   r;   r<   ÚsetPropertiesý   s    zShape.setPropertiesÚ c                 C   sH   t |  ¡  ¡ ƒ}| ¡  |r$|d }|D ]\}}td|||f ƒ q(dS )z�Convenience. Lists them on standard output.  You
        may provide a prefix - mostly helps to generate code
        samples for documentation.Ú.z	%s%s = %sN)rw   rŠ   r[   ÚsortÚprint)rS   ÚprefixZpropListÚnamer_   r;   r;   r<   ÚdumpProperties  s    zShape.dumpPropertiesc                 C   sœ   | j dur˜| j ¡ D ]*}|d dkr|| j v sJ d|| f ƒ‚q| j  ¡ D ]L\}}t| |ƒslJ d|| f ƒ‚t| |ƒ}| |¡sJJ d||| jjf ƒ‚qJdS )a.  If the programmer has provided the optional
        _attrMap attribute, this checks all expected
        attributes are present; no unwanted attributes
        are present; and (if a checking function is found)
        checks each attribute.  Either succeeds or raises
        an informative exception.Nr   r‡   z#Unexpected attribute %s found in %szMissing attribute %s from %sz-Invalid value %s for attribute %s in class %s)	Ú_attrMaprˆ   Úkeysr[   rP   ÚgetattrÚvalidater„   rV   )rS   r^   ÚattrZ	metavaluer_   r;   r;   r<   Úverify  s    

zShape.verifyc                 C   s   t | ||ƒ dS )zSBy default we verify.  This could be off
            in some parallel base classes.N)ZvalidateSetattr)rS   r˜   r_   r;   r;   r<   Ú__setattr__%  s    zShape.__setattr__c                 C   s   t dƒ‚dS )ú5Returns bounding rectangle of object as (x1,y1,x2,y2)z+Shapes and widgets must implement getBoundsN©rƒ   r…   r;   r;   r<   Ú	getBounds*  s    zShape.getBoundsN)r   )r�   )rV   rW   rX   rY   ÚAttrMapr”   r†   rŠ   rŒ   r“   r™   r	   rš   r�   r;   r;   r;   r<   r‚   á   s   

r‚   c                
   @   sî   e Zd ZdZeeeddd�eedd�eedd�eeddd�eed	dd�d
�Z	dd„ Z
dd„ Zd3dd„Zdd„ Zd4dd„Zdd„ Zdd„ Zdd„ Zd5dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdS )6ÚGroupa  Groups elements together.  May apply a transform
    to its contents.  Has a publicly accessible property
    'contents' which may be used to iterate over contents.
    In addition, child nodes may be given a name in which
    case they are subsequently accessible as properties.z"Coordinate transformation to applyr   ©ÚdescZadvancedUsagezContained drawable elements©r¡   úTurn on stroke overprintingúTurn on fill overprintingúoverprinting for ordinary CMYK)r   Úcontentsr&   r%   r'   c                 O   s<   | j  ¡ | _ g | _d| _|D ]}|  |¡ qt | |¡ dS )z‰Initial lists of elements may be provided to allow
        compact definitions in literal Python code.  May or
        may not be useful.r   N)r”   Úcloner¦   r   ÚaddrZ   r`   )rS   Úelementsr]   Úeltr;   r;   r<   r`   =  s    zGroup.__init__c                 C   s4   |r0|t | j ¡ ƒvr$ttƒ| j|< t| ||ƒ dS )zLif name is not None add an attribute pointing to node and add to the attrMapN)rw   r”   r•   ÚAttrMapValueÚisValidChildr\   )rS   r’   Únoder;   r;   r<   Ú_addNamedNodeM  s    zGroup._addNamedNodeNc                 C   s4   |dur0t |ƒsJ dƒ‚| j |¡ |  ||¡ dS )z“Appends non-None child node to the 'contents' attribute. In addition,
        if a name is provided, it is subsequently accessible by name
        Nz1Can only add Shape or UserNode objects to a Group)r¬   r¦   rk   r®   )rS   r­   r’   r;   r;   r<   r¨   T  s    z	Group.addc                 C   s   |   |¡ | jd S )Nr/   )r¨   r¦   )rS   r­   r;   r;   r<   Ú_nn^  s    
z	Group._nnc                 C   sP   |durLt |ƒsJ dƒ‚|dk r2|g| j||…< n| j ||¡ |  ||¡ dS )z4Inserts sub-node n in contents at specified locationNz4Can only insert Shape or UserNode objects in a Groupr   )r¬   r¦   Úinsertr®   )rS   rt   r.   r’   r;   r;   r<   r°   b  s    zGroup.insertc                 C   s¢   t | tƒrt| j| jƒptƒ }| j ¡ |_t|dƒrD| jdd… |_| j	}|j	j
}|D ]<}t |tƒrn| ¡ }nt |tƒr‚| ¡ }n| ¡ }||ƒ qV|  |¡ |S )z9Return a new object which only contains primitive shapes.r   N)Ú
isinstanceÚDrawingrQ   rR   rŸ   r”   r§   rP   r   r¦   rk   ÚUserNodeÚprovideNodeÚexpandUserNodesr†   Ú_copyNamedContents)rS   ÚobjÚself_contentsrm   ÚchildZnewChildr;   r;   r<   rµ   l  s    





zGroup.expandUserNodesc                 C   s²   t ƒ }t| dƒr| j|_t|dƒr2| jdd… |_|  ¡ dd… }|r®| d¡}t|tƒrj| | 	¡ ¡ qBt|t ƒr¢| 
¡ }|jdkr–|j |j¡ q¬| |¡ qB| |¡ qB|S )z return a fully expanded objectÚ	__label__r   Nr   r   )rŸ   rP   rº   r   ÚgetContentsÚpopr±   r³   rk   r´   Ú_exploder¦   Úextendr¨   )rS   r·   ÚPr.   r;   r;   r<   r½   ‚  s     




zGroup._explodec                 C   s   | j D ]}|j  |¡ qd S ra   )r¦   rk   )rS   r·   r¹   r;   r;   r<   Ú_copyContents—  s    
zGroup._copyContents©r¦   c           	      C   s‚   ddl m } | j}|s$t| j ¡ ƒ}| j ¡ D ]N\}}||v r\| |¡}t|||j| ƒ q.||v r.||vr.t||||ƒƒ q.d S )Nr   )r†   )	r†   r¦   rw   r”   r•   rˆ   r[   Úindexr\   )	rS   r·   ZaKeysZnoCopyr†   r¸   ÚkÚvÚposr;   r;   r<   r¶   ›  s    
zGroup._copyNamedContentsc                 C   s$   | j  ¡ |_ |  |¡ |  |¡ |S )zcopies to obj)r”   r§   rÀ   r¶   ©rS   r·   r;   r;   r<   Ú_copy¦  s    

zGroup._copyc                 C   s   |   |  ¡ ¡S )zreturns a copy)rÇ   r„   r…   r;   r;   r<   r†   ­  s    z
Group.copyc                 C   s   t | jt|ƒƒ| _dS ©z&Convenience to help you set transformsN)Úmmultr   rE   )rS   Úthetar;   r;   r<   rE   ±  s    zGroup.rotatec                 C   s   t | jt||ƒƒ| _dS rÈ   )rÉ   r   Ú	translate)rS   ÚdxÚdyr;   r;   r<   rË   µ  s    zGroup.translatec                 C   s   t | jt||ƒƒ| _dS rÈ   )rÉ   r   Úscale)rS   ZsxZsyr;   r;   r<   rÎ   ¹  s    zGroup.scalec                 C   s    t t | jt|ƒƒt|ƒƒ| _dS rÈ   )rÉ   r   ZskewXZskewY)rS   ZkxÚkyr;   r;   r<   Úskew½  s    z
Group.skewc                 C   s   | j dd… ||f | _ dS )z2Convenience function to set the origin arbitrarilyNéþÿÿÿ)r   ©rS   rA   rG   r;   r;   r<   ÚshiftÁ  s    zGroup.shiftc                 C   s$   t | _| j | j¡ || _|| _dS )z| Convenience function to make a drawing from a group
            After calling this the instance will be a drawing!
        N)r²   r„   r”   r‹   Ú_xtraAttrMaprQ   rR   )rS   rQ   rR   r;   r;   r<   Ú	asDrawingÅ  s    zGroup.asDrawingc                 C   s,   t | ddƒ}| j}|r(||vr(|g| }|S )z[Return the list of things to be rendered
        override to get more complicated behaviourÚ
backgroundN)r–   r¦   )rS   rn   rI   r;   r;   r<   r»   Î  s    zGroup.getContentsc                 C   s”   | j rŒg }| j D ]}| | ¡ ¡ qt|ƒ}|d u r8d S |\}}}}| j}||g||g||g||gg}g }	|D ]}
|	 t||
ƒ¡ qnt|	ƒS d S d S ra   )r¦   rk   r�   rg   r   ZtransformPointr�   )rS   rn   Úelemrc   rd   re   rf   ZtransZcornersZ
newCornersZcornerr;   r;   r<   r�   Ö  s    
zGroup.getBounds)N)N)NrÁ   )rV   rW   rX   rY   rž   r«   ZisTransformZisListOfShapesÚ	isBooleanr”   r`   r®   r¨   r¯   r°   rµ   r½   rÀ   r¶   rÇ   r†   rE   rË   rÎ   rÐ   rÓ   rÕ   r»   r�   r;   r;   r;   r<   rŸ   .  s6   

û




	rŸ   c                 C   sX   ddl m} | j}||ƒj}|p$|j}||vr:|g||< n||| vrT||  |¡ dS )z7add an import of obj's class to a dictionary of importsr   )Ú	getmoduleN)ÚinspectrÙ   r„   rV   rk   )r·   ÚIr.   rÙ   ro   Úmr;   r;   r<   Ú_addObjImportë  s    

rÝ   c                 C   sÆ  t | tƒrt| ƒS t| ƒr|d}| D ]}|dt||ƒ  }q"t | tƒrTd|dd…  S d|dd… t| ƒdkrpdprdf S �nF| tu r˜|r”t| |d	ƒ d	S t | t	ƒ�rº|r²t| |ƒ d
dl
m} || jƒ\}}}}}	}
}|�r |t|ƒ d… }|t|ƒ d…= ng }|  ¡ }| jjd }|dd… D ]$}| |d¡}|dt||ƒ 7 }�q$|D ](}| |d¡}|d|t||ƒf 7 }�qN| ¡ D ](\}}|| }|d|t||ƒf 7 }�q€|dd… d S t| ƒS dS )zEreturn a repr style string with named fixed args first, then keywordsr�   z%s,z[%s]Nr/   z(%s%s)r   ú,ÚEmptyClipPathr   )Úgetfullargspecú(z%s=%s,ú))r±   Úfloatr   r   Ú_reprrw   r4   rß   rÝ   r‚   rÚ   rà   r`   rŠ   r„   rV   r¼   r[   Úrepr)rS   rÛ   r-   rÄ   rà   ÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚkwonlydefaultsÚannotationsZkargsr¿   r.   r;   r;   r<   rä   ö  sB    

(rä   ú		c           
      C   sº   d}t | dd ƒ}|r*|d||t|ƒf  }| j}|D ]€}t|tƒrœd| }|d7 }t |ddƒ}	|	rjd|	 }	|d||||	f  }|t|||||ƒ }|d8 }q4|d	||t||ƒf  }q4|S )
Nr�   r   z%s%s.transform = %s
zv%dr   rº   ú#z%s%s=%s._nn(Group())%s
z%s%s.add(%s)
)r–   rä   r¦   r±   rŸ   Ú_renderGroupPy)
ÚGÚpfxrÛ   rt   Úindentr-   rI   r.   ZnpfxÚlr;   r;   r<   rï     s    

rï   c                 K   sH   |  | j¡ i }t|ƒ}| ¡ D ]"}| |¡r || |||d … < q |S ra   )r‹   rˆ   r4   r•   Ú
startswith)rS   rñ   Úkwrr   r.   rÃ   r;   r;   r<   Ú_extraKW/  s    
rö   c                   @   s  e Zd ZdZh d£Zeh d£ Zeeedd�eedd�edƒee	dd�ee
d	d
ddƒdd�ee
ddddƒdd�eedd�eedd�eedd�d�	Zeeeee
eŽ ddd�dd�d�Ze e¡ d2dd„Zdd„ Zefd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd3d+d,„Zd4d-d.„Zd5d0d1„ZdS )6r²   zOutermost container; the thing a renderer works on.
    This has no properties except a height, width and list
    of contents.>   ZpngÚpyZtifZtiffZtifflÚsvgZpictZtiffpZgifÚpdfZpctZbmpZtiff1ZjpegZjpgÚpsÚeps>   r÷   rø   rù   rú   rû   zDrawing width in points.r¢   zDrawing height in points.Nz=Background widget for the drawing e.g. Rect(0,0,width,height)ÚLEFTÚRIGHTZCENTERZCENTREz+Horizontal alignment within parent documentZTOPÚBOTTOMz)Vertical alignment within parent documentzGlobal scaling for renderingz.override the STATE_DEFAULTS value for fontNamez.override the STATE_DEFAULTS value for fontSize)	rQ   rR   ÚcanvrÖ   ÚhAlignÚvAlignÚrenderScaleZinitialFontNameZinitialFontSizer   r   )ÚloZemptyOKzOne or more plot modes)ÚBASEÚformatsé�  éÈ   c                 O   s@   d | _ tj| g|¢R i |¤Ž || _|| _d| _d| _d| _d S )Nrü   rþ   ç      ð?)rÖ   rŸ   r`   rQ   rR   r   r  r  )rS   rQ   rR   Únodesr]   r;   r;   r<   r`   h  s    zDrawing.__init__c                 C   s¨   g d¢g d¢dœ}t |  ¡ d|ƒ}d| jj }d}| ¡ D ],\}}|d|t|ƒdd	…  d
d¡f  }q:|d|  }|d| j| jf  }|d }|| }|d|  }|S )N)Ú_DrawingEditorMixinr²   rŸ   )ZColorZ	CMYKColorZ
PCMYKColor)zreportlab.graphics.shapeszreportlab.lib.colorsrS   ZExplodedDrawing_z0#Autogenerated by ReportLab guiedit do not edit
zfrom %s import %s
r   r/   ú'r�   z(
class %s(_DrawingEditorMixin,Drawing):
z3	def __init__(self,width=%s,height=%s,*args,**kw):
z1		Drawing.__init__(self,width,height,*args,**kw)
zZ

if __name__=="__main__": #NORUNTESTS
	%s().save(formats=['pdf'],outDir='.',fnRoot=None)
)	rï   r½   r„   rV   r[   ÚstrÚreplacerQ   rR   )rS   rÛ   rð   r.   r-   rÜ   Úor;   r;   r<   Ú	_renderPyq  s    þ&zDrawing._renderPyc              	   C   s:   ddl m} |j| | jdd|tur&|n
t| dtƒd� dS )zš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.r   ©Ú	renderPDFZ_showBoundary©ÚshowBoundaryN)Úreportlab.graphicsr  Údrawrÿ   r   r–   )rS   r  r  r;   r;   r<   r  ‚  s    ÿzDrawing.drawc                 C   s2   | j }| j}| j}|dkr*||9 }||9 }||fS )Nr  )rQ   rR   r  )rS   Z
availWidthZavailHeightrQ   rR   r  r;   r;   r<   ÚwrapŠ  s    zDrawing.wrapc                 C   s   t  | ¡}| j|_| j|_|S )z:Return a new drawing which only contains primitive shapes.)rŸ   rµ   rQ   rR   rÆ   r;   r;   r<   rµ   “  s    
zDrawing.expandUserNodesc                 C   s   |   |  | j| j¡¡S )zReturns a copy)rÇ   r„   rQ   rR   r…   r;   r;   r<   r†   š  s    zDrawing.copyc                 O   s   |   t|i |¤Ž¡S ra   )rÇ   rŸ   )rS   ræ   rõ   r;   r;   r<   ÚasGroupž  s    zDrawing.asGroupr�   c                 K   s  |  dd¡}t|tƒr d| }nd}|d7 }ddlm} d}	|sÌt| d| jjd ƒ}t| d	dƒ}
t|
d
ƒrr|
| ƒ}
t|d
ƒr†||
ƒ}nFz||
 }W n8 t	yÊ } z t
|ƒ d¡dk r¶‚ W Y d}~n
d}~0 0 |du ràt| ddƒ}t|d
ƒrò|| ƒ}tj |¡�rtj |¡\}}n|�p"t| ddƒ}| ¡  tj¡}|�s>d}tj |¡�sptj t| dtj tjd ¡ƒ|¡}tj |¡�sˆt |¡ tj tj ||¡¡}tj |¡}|d dd…  ¡ | jv �rÎ|d }dd„ |�pæt| ddgƒD ƒ}|du�rþ|f�p
t| d|ƒfd }tjjtjjf}| tj_tj_d|v �rÖddl m!} |d }|�rdt"|d|f ƒ |j#| ||fdt| d|j$ƒit%| dfi |¤Ž¤Ž |	d }	tj&dk�rÖddl'}ddl(}| )|¡ *dd¡ | +|¡ | j,D ]Ò}||v �rÜdd l m-} d!||f }|�rt"|||f ƒ t| d"dƒ}|�r^t|d|gƒ}||v �rZt|d#dƒ�sZ| .¡  nd}|j#| |f|t| d|j$ƒd$œt%| d%fi |¤Ž¤Ž |	d& | }	|�rÜ| /|¡ �qÜd'|v �r~zdd(l0m1} W n  t2�yê   dd)l m3} Y n0 |d* }|�r
t"|d+|f ƒ |j#| |f|t| d,d-gƒd t| d,dd.gƒd t| d/|j4ƒt| d|j$ƒt| d0|j5ƒd1œt%| d2fi |¤Ž¤Ž |	d3 }	d4|v �rêdd5l m6} |d6 }|�r²t"|d7|f ƒ |j#| |fdt| d|j$ƒit%| d8fi |¤Ž¤Ž |	d9 }	d:|v �rVdd)l m3} |d; }|�rt"|d+|f ƒ |j#| |fdt| d|j$ƒit%| d2fi |¤Ž¤Ž |	d< }	d=|v �rÎ|d> }|�r~t"|d=|f ƒ t7|d?ƒ�,}| 8t9|  :¡  ;d@tj<¡ƒ¡ W d  ƒ n1 �s¼0    Y  |	dA }	|\tj_tj_t| dBƒ�rö|  =||	¡ |	�r||	dd…  �pdS )CzÞ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)
        Z	seqNumberr�   z%4d: zgenerating %s file %sr   ©Ú	rl_configZfileNamePatternz%03dÚchartIdÚ__call__znot all arguments convertedNÚoutDirrŽ   Z_override_CWDr   c                 S   s   g | ]}|  ¡ ‘qS r;   )Úlowerr?   r;   r;   r<   rB   Ð  rC   z Drawing.save.<locals>.<listcomp>r  rù   r
   r  z.pdfZPDFr  Ú
showBorderZ_renderPDF_z/.pdfÚmacZCAROzPDF ©ÚrenderPMz%s.%sZ_drawTimeCollectorÚdisabled©Úfmtr  Ú
_renderPM_z/.rû   ©ÚrenderPS_SEP©ÚrenderPSz.epsZEPSZEPS_infoZTestingZ	ReportLabÚpreviewÚ	ttf_embed)ÚtitleZdeptZcompanyr*  r  r+  Z
_renderPS_z/.epsrø   ©Ú	renderSVGz.svgZSVGÚ_renderSVG_z/.svgrú   z.psz/.psr÷   z.pyÚwbÚ
z/.pyÚ
saveLogger)>r¼   r±   ÚintÚ	reportlabr  r–   r„   rV   rP   Ú	TypeErrorr  ÚfindÚosÚpathÚisabsÚsplitÚrstripÚsepÚjoinÚdirnameÚsysÚargvÚisdirÚmakedirsÚnormpathÚsplitextr  Ú
_saveModesr   ZwarnOnceZenabledZinfoOncer  r  r�   Z
drawToFiler  rö   ÚplatformÚmacfsÚ
macostoolsZFSSpecZSetCreatorTypeZtouchedÚ_bmModesr!  ÚclearÚsaveÚrlextra.graphicsr'  ÚImportErrorr)  Zeps_previewZeps_ttf_embedr.  ÚopenÚwriter   r  r  Úlinesepr2  )rS   r  r
   ZfnRootr  r,  rõ   ZgenFmtr  Úextr  ÚerrZfnrootZplotModeZ_savedr  ÚfilenamerG  rH  ZbmFmtr!  ZdtcZdtcfmtsr)  r.  r{   r;   r;   r<   rK  ¡  sÚ    




*

2$
2



2
ÿùø	
ÿþþ
0
<zDrawing.savec           
      K   s`  || j v sJ d| ƒ‚ddlm} |dkr@ddlm} | | ¡S || jv r†ddlm} |j| f|t| d|j	ƒdœt
| d	fi |¤Ž¤ŽS |d
krØzddlm} W n ty¼   ddlm} Y n0 |j| |t| d|j	ƒd�S |dk�rddlm} |j| t| d|j	ƒd�S |dk�r|  ¡ S |dk�r\ddlm}	 |	j| fdt| d|j	ƒit
| dfi |¤Ž¤ŽS dS )z,Converts to an 8 bit string in given format.zUnknown file format "%s"r   r  rù   r  r   r  r#  r%  rû   r&  r(  )r*  r  rú   r  r÷   rø   r-  r  r/  N)rE  r4  r  r  r  ZdrawToStringrI  r!  r–   r  rö   rL  r'  rM  r)  r  r.  )
rS   Úformatr
   r*  rõ   r  r  r!  r)  r.  r;   r;   r<   ÚasString  s:    

ÿÿþ


zDrawing.asStringÚfitc                 C   sT  |   ¡ }| j}| j}t||g|¢R Ž }	|	 ¡ \}
}}}|dksn|dkr®|
|k sn||| ksn||k sn||| kr®||
 | | |	_|| | | |	_dddd||
 || f|	_n¢|dksÒ|dkrü|
|k sÒ||| krü||
 | | |	_dddd||
 df|	_nT|dk�s(|dk�rP||k �s(||| k�rP|| | | |	_ddddd|| f|	_|	S )	z?return a base class drawing which ensures all the contents fitsrV  Úexpandr   r   ZfitxZexpandxZfityZexpandy)r»   rQ   rR   r²   r�   r   )rS   ÚkindZlpadZrpadZbpadZtpadrI   ZoWZoHrU   ZxLZyLZxHZyHr;   r;   r<   Úresized;  s     8$,zDrawing.resized)r  r  )NNNNr�   )Nr   )rV  r   r   r   r   )rV   rW   rX   rY   rE  rI  rž   r«   ÚisNumberZisValidChildOrNoneÚOneOfZisStringOrNoneÚisNumberOrNonerÔ   rŸ   Ú
SequenceOfr”   r‹   r`   r  r   r  r  rµ   r†   r  rK  rU  rY  r;   r;   r;   r<   r²   8  sB   





õþþÿ

		
|
r²   c                   @   s   e Zd ZdZddd„ZdS )r
  z<This is a mixin to provide functionality for edited drawingsNc                 C   sš   t |ƒ}|rLt|dƒrLd|jvr,|j ¡ |_|r<|du r<t }t||ƒ|j|< t|dƒr||r||rn| |||¡ q–| ||¡ n|rŽt|||ƒ nt	dƒ‚dS )zb
        effectively setattr(obj,name,value), but takes care of things with _attrMaps etc
        r”   Nr¨   zCan't add, need name)
r¬   rP   rˆ   r”   r§   r«   r°   r¨   r\   Ú
ValueError)rS   r·   r_   r’   r—   r¡   rÅ   Zivcr;   r;   r<   Ú_addP  s    
z_DrawingEditorMixin._add)NNNN)rV   rW   rX   rY   r_  r;   r;   r;   r<   r
  N  s   r
  c                   @   s   e Zd Zdd„ ZdS )ÚisStrokeDashArrayc                 C   s0   t  |¡p.t|ttfƒo.t|d ƒo.t|d ƒS )Nr   r   )ZisListOfNumbersOrNoneÚtestr±   rw   ÚtuplerZ  ÚisListOfNumbers)rS   rA   r;   r;   r<   ra  e  s    zisStrokeDashArray.testN)rV   rW   rX   ra  r;   r;   r;   r<   r`  d  s   r`  c                   @   s€   e Zd Zeeeƒeeƒeedddƒdd�eedddƒdd�eedd�eedd�ee	d	d�ee
d
d�ee
ddd�d�	Zdd„ ZdS )Ú	LineShaper   r   ri   z#Line cap 0=butt, 1=round & 2=squarer¢   z$Line join 0=miter, 1=round & 2=bevelz$miter limit control miter line joinsz[numbers] or [phase,[numbers]]zEThe level of transparency of the line, any real number betwen 0 and 1r£   r¥   r    )	r   r   r   r    r!   r"   r#   r&   r'   c                 C   s<   t d | _d| _d| _d| _d| _d | _d | _|  |¡ d S )Nr   r   r   )	ÚSTATE_DEFAULTSr   r   r   r    r!   r"   r#   rŒ   ©rS   rõ   r;   r;   r<   r`   x  s    
zLineShape.__init__N)rV   rW   rX   rž   r«   ÚisColorOrNonerZ  r[  r`  Ú	isOpacityrØ   r”   r`   r;   r;   r;   r<   rd  i  s   



÷rd  c                	   @   sN   e Zd Zeeeedd�eedd�eedd�eedd�d�Zdd„ Zdd„ Z	dS )	ÚLiner�   r¢   )r  rc   rd   re   rf   c                 K   s(   t  | |¡ || _|| _|| _|| _d S ra   )rd  r`   rc   rd   re   rf   )rS   rc   rd   re   rf   rõ   r;   r;   r<   r`   Š  s
    zLine.__init__c                 C   s   | j | j| j| jfS )r›   )rc   rd   re   rf   r…   r;   r;   r<   r�   ‘  s    zLine.getBoundsN)
rV   rW   rX   rž   rd  r«   rZ  r”   r`   r�   r;   r;   r;   r<   ri  ‚  s   



üri  c                
   @   sT   e Zd Zeeeedd�eedd�eedd�eeddd�ee	e
eƒƒd�Zd	d
„ ZdS )Ú
SolidShapez$filling color of the shape, e.g. redr¢   zGthe level of transparency of the color, any real number between 0 and 1r¤   r¥   r   r    )r  r(   r$   r%   r'   r)   c                 C   s    t d | _d | _t | |¡ d S )Nr(   )re  r(   r$   rd  r`   rf  r;   r;   r<   r`      s    
zSolidShape.__init__N)rV   rW   rX   rž   rd  r«   rg  rh  rØ   r[  r   r   r”   r`   r;   r;   r;   r<   rj  •  s   


ûrj  rj   )ri   ri   é   r   )ÚmoveToÚlineToÚcurveToÚ	closePathc                 C   sÄ   | j }d}d}d}| }| jD ]v}	|	tkrX|rP|rP|
tkrP|d7 }|rP|t ƒ  |d7 }t|	 }|| }||	 |||… Ž  |}|	tkr�|d7 }|	}
q|r¼|r¼|
tkr¼|d7 }|r¼|t ƒ  ||kS )zHelper function for renderers.r   r   )rz   Ú	operatorsÚ_MOVETOÚ
_CLOSEPATHÚ_PATH_OP_ARG_COUNT)r8  Z	drawFuncsZ	countOnlyZ
forceCloserz   rt   ZhadClosePathZ	hadMoveToÚactiveÚopr¼   ÚnArgsÚjr;   r;   r<   Ú_renderPath¬  s2    


rx  znon-zeroZnonzerozeven-oddZevenoddc                
   @   sŒ   e Zd ZdZeeeeƒeeƒeeƒee	e
ddƒƒƒee
eeƒƒd�Zddddefdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPathz2Path, made up of straight lines and bezier curves.rø   rù   )r  rz   rp  Ú
isClipPathÚ	autocloser)   Nr   c                 K   s^   t  | |¡ |d u rg }|d u r$g }t|ƒd dks<J dƒ‚|| _|| _|| _|| _|| _d S ©Nri   r   ú-Point list must have even number of elements!)rj  r`   r4   rz   rp  rz  r{  r)   )rS   rz   rp  rz  r{  r)   rõ   r;   r;   r<   r`   Þ  s    zPath.__init__c                 C   s2   |   | jd d … | jd d … ¡}| |  ¡ ¡ |S ra   )r„   rz   rp  rŒ   rŠ   ©rS   Únewr;   r;   r<   r†   ë  s     z	Path.copyc                 C   s    | j  ||g¡ | j t¡ d S ra   )rz   r¾   rp  rk   rq  rÒ   r;   r;   r<   rl  ð  s    zPath.moveToc                 C   s    | j  ||g¡ | j t¡ d S ra   )rz   r¾   rp  rk   Ú_LINETOrÒ   r;   r;   r<   rm  ô  s    zPath.lineToc                 C   s(   | j  ||||||g¡ | j t¡ d S ra   )rz   r¾   rp  rk   Ú_CURVETO)rS   rc   rd   re   rf   Úx3rl   r;   r;   r<   rn  ø  s    zPath.curveToc                 C   s   | j  t¡ d S ra   )rp  rk   rr  r…   r;   r;   r<   ro  ü  s    zPath.closePathc                 C   s  | j }zèg }|j}|j}g }|j}|j}d}| jD ]ž}	t|	 }
||
 }|
dkrl||| ƒ |||d  ƒ n`|
dkrÌ|||d… \}}}|t|d |||ƒƒ ||d |d… \}}}|t|d |||ƒƒ |}q2t|ƒt|ƒt|ƒt|ƒfW S    t|ƒ Y S 0 d S )Nr   ri   r   rk  r/   )	rz   rk   r¾   rp  rs  rs   rF   r3   r~   )rS   rz   rJ   ZaXZeXrK   ZaYZeYrt   ru  rv  rw  rc   re   r‚  rd   rf   rl   r;   r;   r<   r�   ÿ  s0    
zPath.getBounds)rV   rW   rX   rY   rž   rj  r«   rc  rØ   ÚNoneOrr[  r   r   r”   r`   r†   rl  rm  rn  ro  r�   r;   r;   r;   r<   ry  Ó  s   ûry  c                 C   sì   |d u r|}g }t d }	||	 }
||	 }||
k r>|dt   }q(t||
 ƒ}|j}|dkr–t||pbdƒ}||	 }tt|| d ƒdƒ}|| }|d7 }nd}d}t|ƒD ]4}|
||  }|| |t|ƒ  ||t|ƒ  fƒ q¦|rè| 	¡  |S )Nç     €f@ri   çü©ñÒMbP?r  ç      à?r   r   )
r   rã   rk   rF   r3   r3  ry   r   r   Úreverse)ÚcenterxÚcenteryÚradiusÚstartangledegreesÚendangledegreesÚyradiusÚdegreedeltar‡  rz   ÚdegreestoradiansÚ
startangleÚendanglerH   rm   Úradiansdeltar.   r;   r;   r<   ÚgetArcPoints  s,    
&r“  c                   @   s   e Zd ZdZddd„ZdS )ÚArcPathzPath with an addArc methodNc
              
   C   sf   t ||||||||	d�}
|s&t| jƒsH|  |
d d |
d d ¡ |
d= |
D ]\}}|  ||¡ qLd S )N)r�  rŽ  r‡  r   r   )r“  r4   rp  rl  rm  )rS   rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  rl  r‡  r¿   rA   rG   r;   r;   r<   ÚaddArc:  s
    zArcPath.addArc)NNNN)rV   rW   rX   rY   r•  r;   r;   r;   r<   r”  8  s   r”  c                 K   sP  g }g }| D ]„}t |ƒs"|}g }	n|d }|dd … }	|tvrJtd| ƒ‚t |¡}
t|	ƒt|
 krxtd|t|	ƒf ƒ‚| |
¡ | t	|	ƒ¡ q|df|dffD ].\}}t
|t|ƒdƒD ]}|| | ||< qºq¢| dd ¡}|�r<dD �]P}|| ||d  f}|d d u �r |d d u �r qè||d d… }t|ƒt|ƒ }}|d d u�rì|d d u�rìt|ƒt|ƒ }}|| }t|ƒdk�rÂ|| | }t
|t|ƒdƒD ]}|||| |   ||< �q n(t
|t|ƒdƒD ]}|| d	 ||< �qÒqè|d d u�r|d | n
|d | }t
|t|ƒdƒD ]}||  |7  < �q"qèt|||fi |¤ŽS )
Nr   r   zbad operator name %sz%s bad arguments %sri   Úbbox)r   r   g�íµ ÷Æ°>r†  )r   Ú_PATH_OP_NAMESr^  rÂ   r4   rs  r  rk   r¾   rw   ry   r¼   rF   r3   Úabsry  )ZpathSegsrz  rÌ   rÍ   rõ   ÚOr¿   ÚsegZopNameræ   ru  rp   r  rt   r–  rw  rm   rn   ro   Zfacr;   r;   r<   Ú
definePathA  sL    


&r›  c                	   @   s`   e Zd ZdZeeeeƒeeƒeedd�eedd�eeƒeeƒd�Zddd„Z	d	d
„ Z
dd„ ZdS )ÚRectz)Rectangle, possibly with rounded corners.úwidth of the object in pointsr¢   úheight of the objects in points)r  rA   rG   rQ   rR   ÚrxÚryr   c                 K   s4   t  | |¡ || _|| _|| _|| _|| _|| _d S ra   )rj  r`   rA   rG   rQ   rR   rŸ  r   )rS   rA   rG   rQ   rR   rŸ  r   rõ   r;   r;   r<   r`     s    zRect.__init__c                 C   s*   |   | j| j| j| j¡}| |  ¡ ¡ |S ra   )r„   rA   rG   rQ   rR   rŒ   rŠ   r~  r;   r;   r<   r†   ˆ  s    z	Rect.copyc                 C   s    | j | j| j | j | j| j fS ra   ©rA   rG   rQ   rR   r…   r;   r;   r<   r�   �  s    zRect.getBoundsN)r   r   )rV   rW   rX   rY   rž   rj  r«   rZ  r”   r`   r†   r�   r;   r;   r;   r<   rœ  s  s   

ú	
	rœ  c                	   @   sX   e Zd ZdZeeeeƒeeƒeedd�eedd�edƒd�Z	dd„ Z
d	d
„ Zdd„ ZdS )ÚImagezBitmap image.r�  r¢   rž  N)r  rA   rG   rQ   rR   r8  c                 K   s.   t  | |¡ || _|| _|| _|| _|| _d S ra   )rj  r`   rA   rG   rQ   rR   r8  )rS   rA   rG   rQ   rR   r8  rõ   r;   r;   r<   r`   ›  s    zImage.__init__c                 C   s.   |   | j| j| j| j| j¡}| |  ¡ ¡ |S ra   )r„   rA   rG   rQ   rR   r8  rŒ   rŠ   r~  r;   r;   r<   r†   £  s    z
Image.copyc                 C   s    | j | j| j | j | j| j fS ra   r¡  r…   r;   r;   r<   r�   ¨  s    zImage.getBounds)rV   rW   rX   rY   rž   rj  r«   rZ  r\  r”   r`   r†   r�   r;   r;   r;   r<   r¢  �  s   

ûr¢  c                   @   sL   e Zd Zeeeedd�eedd�eedd�d�Zdd„ Zdd	„ Z	d
d„ Z
dS )ÚCircleúx of the centrer¢   úy of the centreúradius in points)r  ÚcxÚcyÚrc                 K   s"   t  | |¡ || _|| _|| _d S ra   )rj  r`   r§  r¨  r©  )rS   r§  r¨  r©  rõ   r;   r;   r<   r`   ´  s    zCircle.__init__c                 C   s&   |   | j| j| j¡}| |  ¡ ¡ |S ra   )r„   r§  r¨  r©  rŒ   rŠ   r~  r;   r;   r<   r†   º  s    zCircle.copyc                 C   s,   | j | j | j| j | j | j | j| j fS ra   )r§  r©  r¨  r…   r;   r;   r<   r�   ¿  s    zCircle.getBoundsN©rV   rW   rX   rž   rj  r«   rZ  r”   r`   r†   r�   r;   r;   r;   r<   r£  ¬  s   


ýr£  c                	   @   sV   e Zd Zeeeedd�eedd�eedd�eedd�d�Zdd„ Zd	d
„ Z	dd„ Z
dS )ÚEllipser¤  r¢   r¥  zx radiuszy radius)r  r§  r¨  rŸ  r   c                 K   s(   t  | |¡ || _|| _|| _|| _d S ra   )rj  r`   r§  r¨  rŸ  r   )rS   r§  r¨  rŸ  r   rõ   r;   r;   r<   r`   Ê  s
    zEllipse.__init__c                 C   s*   |   | j| j| j| j¡}| |  ¡ ¡ |S ra   )r„   r§  r¨  rŸ  r   rŒ   rŠ   r~  r;   r;   r<   r†   Ñ  s    zEllipse.copyc                 C   s,   | j | j | j| j | j | j | j| j fS ra   )r§  rŸ  r¨  r   r…   r;   r;   r<   r�   Ö  s    zEllipse.getBoundsNrª  r;   r;   r;   r<   r«  Â  s   



ür«  c                   @   sŽ   e Zd ZdZeeeedd�eedd�eedd�eeƒeeƒeeƒeeƒeeƒee	dd�d�
Z
dZddd„Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )ÚWedgeznA "slice of a pie" by default translates to a polygon moves anticlockwise
       from start angle to end angler¤  r¢   r¥  r¦  ztreat as annular ring)
r  rˆ  r‰  rŠ  r‹  rŒ  r�  Úradius1Úyradius1Úannularr   NFc           	      K   sP   t  | |¡ ||k r|d }q|||||f\| _| _| _| _| _|| _|| _d S )Nih  )	rj  r`   rˆ  r‰  rŠ  r‹  rŒ  r�  r¯  )	rS   rˆ  r‰  rŠ  r‹  rŒ  r�  r¯  rõ   r;   r;   r<   r`   ë  s    
ÿzWedge.__init__c                 C   sH   t | dd ƒ}|d u r| j}t | dd ƒ}t | d|ƒ}|d u r>|}|||fS )Nr�  r­  r®  )r–   rŠ  )rS   r�  r­  r®  r;   r;   r<   Ú
_xtraRadiiö  s    zWedge._xtraRadiic                 C   sn  | j }| j}| j}|  ¡ \}}}| j}| j}td }	||	 }
||	 }||
k rZ|dt  }qDt||
 ƒ}g }|dkr²t| j	p|d|ƒ}||	 }t
dt|| d ƒƒ}|| }|d7 }nd}d}g }|j}|j}t|ƒD ]$}|
||  }|t|ƒt|ƒfƒ qÒ|D ](\}}||||  ƒ ||||  ƒ qü|dk�s:|d u �r`|dk�sN|d u �r`||ƒ ||ƒ n8| ¡  |D ]*\}}||||  ƒ ||||  ƒ �ql| j�rbtt| dtƒd	�}| |d |d ¡ tdd| dƒD ]}| || ||d  ¡ �qÖ| ¡  | |d|  |d| d  ¡ td| d d
| dƒD ]}| || ||d  ¡ �q6| ¡  |S t|ƒS d S )Nr„  ri   r…  r  r   r†  r   r)   )r)   rj   )rˆ  r‰  rŠ  r°  r‹  rŒ  r   rã   rF   rŽ  r3   r3  rk   ry   r   r   r‡  r¯  ry  r–   r   rl  rm  ro  ÚPolygon)rS   rˆ  r‰  rŠ  r�  r­  r®  r‹  rŒ  r�  r�  r‘  rH   rz   rŽ  r’  r.   ÚCAZCAArm   ro   r-   r¿   rA   r;   r;   r<   Ú	asPolygon  s`    
( zWedge.asPolygonc                 C   s.   |   | j| j| j| j| j¡}| |  ¡ ¡ |S ra   )r„   rˆ  r‰  rŠ  r‹  rŒ  rŒ   rŠ   r~  r;   r;   r<   r†   8  s    üz
Wedge.copyc                 C   s   |   ¡  ¡ S ra   )r³  r�   r…   r;   r;   r<   r�   A  s    zWedge.getBounds)NF)rV   rW   rX   rY   rž   rj  r«   rZ  r\  rØ   r”   rŽ  r`   r°  r³  r†   r�   r;   r;   r;   r<   r¬  Ù  s(   



÷  ÿ
6	r¬  c                   @   s@   e Zd ZdZeeeedd�d�Zg fdd„Z	dd„ Z
d	d
„ ZdS )r±  zKDefines a closed shape; Is implicitly
    joined back to the start for you.ú5list of numbers in the form x1, y1, x2, y2 ... xn, ynr¢   ©r  rz   c                 K   s2   t  | |¡ t|ƒd dks$J dƒ‚|p*g | _d S r|  )rj  r`   r4   rz   )rS   rz   rõ   r;   r;   r<   r`   L  s    zPolygon.__init__c                 C   s   |   | j¡}| |  ¡ ¡ |S ra   ©r„   rz   rŒ   rŠ   r~  r;   r;   r<   r†   Q  s    zPolygon.copyc                 C   s
   t | jƒS ra   ©r�   rz   r…   r;   r;   r<   r�   V  s    zPolygon.getBoundsN)rV   rW   rX   rY   rž   rj  r«   rc  r”   r`   r†   r�   r;   r;   r;   r<   r±  D  s   
ÿr±  c                   @   s@   e Zd ZdZeeeedd�d�Zg fdd„Z	dd„ Z
d	d
„ ZdS )ÚPolyLinez–Series of line segments.  Does not define a
    closed shape; never filled even if apparently joined.
    Put the numbers in the list, not two-tuples.r´  r¢   rµ  c                 K   sz   t  | |¡ |pg }t|ƒ}|rpt|d ƒrXg }|D ]\}}| |¡ | |¡ q4|}nt|ƒd dkspJ dƒ‚|| _d S )Nr   ri   r}  )rd  r`   r4   r   rk   rz   )rS   rz   rõ   Z	lenPointsrb   rA   rG   r;   r;   r<   r`   b  s    
zPolyLine.__init__c                 C   s   |   | j¡}| |  ¡ ¡ |S ra   r¶  r~  r;   r;   r<   r†   q  s    zPolyLine.copyc                 C   s
   t | jƒS ra   r·  r…   r;   r;   r<   r�   v  s    zPolyLine.getBoundsN)rV   rW   rX   rY   rž   rd  r«   rc  r”   r`   r†   r�   r;   r;   r;   r<   r¸  Y  s   
ÿr¸  c                	   @   sn   e Zd ZdZeeeeee	edd�fdƒdd�eee
edfƒdd�eee
ed	fƒd
d�d�Zddg fdd„ZdS )ÚHatchingz\define a hatching of a set of polygons defined by lists of the form [x0,y0,x1,y1,....,xn,yn]r   )r  z
xy list(s)z8list(s) of numbers in the form x1, y1, x2, y2 ... xn, ynr¢   zangle(s)zCthe angle or list of angles at which hatching lines should be drawnzspacings(s)z-orthogonal distance(s) between hatching lines)r  ÚxyListsÚanglesÚspacingsri   é-   c              
   K   sÔ  t j| fi |¤Ž t|ƒr |f}t|ƒr.|f}t|ƒr<|f}t|ƒt|ƒ }|dkrjt|ƒ||d g  }|| _|| _|| _| j	}| j
}t|ƒD �]<\}}|| }	t|ƒ}t|ƒ}
t|ƒ}d}| }|D ]J}tdt|ƒdƒD ]4}||d  |
 || |  }t||ƒ}t||ƒ}qÜqÈtt||	 ƒƒd }tt||	 ƒƒd }t||ƒD �]„}g }|	| }|D ]à}t|ƒd }tdt|ƒdƒD ]¼}|| }||d  }||
 ||  }||
 ||  }|| }||d  }||
 ||  }||
 ||  }||k �rü||k�s||k �r2||k�r2| ||| ||  ||   ¡ |}�q|�q\| ¡  tdt|ƒdƒD ]r}|| |
 ||  }||
 || |  }||d  |
 ||  }||
 ||d  |  }|||ƒ |||ƒ �qV�qFq�d S )Nr   r/   iÿÿÿri   r   )ry  r`   rc  rZ  r4   rw   rº  r»  r¼  rl  rm  Ú	enumerater   r   r   ry   rF   r3   r3  r   rk   r�   )rS   r¼  r»  rº  Úkwdsrt   rl  rm  rÊ   ÚspacingZcosThetaZsinThetaZspanMinZspanMaxr¿   rw  rG   Z	spanStartZspanEndÚstepZnodeXZstripeYrÃ   rm   rn   Za1Úb1rA   rc   rd   r;   r;   r<   r`   ‚  sl    
("
zHatching.__init__N)rV   rW   rX   rY   rž   ry  r«   ZEitherOrrc  r]  rZ  r”   r`   r;   r;   r;   r<   r¹  y  s   ýr¹  c           
      C   sH   t | d|ƒ}| |¡}|dkrDt | ddƒ}	|	t|d |… |||ƒ }|S )NZ_dpr   Z_dpLen)r–   Úrfindr   )
ÚtAr5   r2   r+   r*   ÚencodingZpivotCharacterZdprt   ZdpOffsr;   r;   r<   ÚnumericXShiftÑ  s    
rÆ  c                   @   s®   e Zd ZdZeeedd�eedd�eedd�eddd�eedd�eed	d�ee	d
dddƒdd�eeƒee	ddddddddƒdd�d�	Z
dZdd„ Zdd„ Zdd„ Zd d!„ ZdS )"ÚStringziNot checked against the spec, just a way to make something work.
    Can be anchored left, middle or end.zx point of anchoringr¢   zy point of anchoringzthe text of the stringNz_font name of the text - font is either acrobat standard or registered when using external font.z	font sizezcolor of the fontr   Úmiddler1   Únumericz(treat (x,y) as one of the options below.r   r   ri   rh   rj   é   rk  é   z.Control whether text is filled/stroked etc etc)	rA   rG   r5   r+   r*   r(   r,   rÅ  ZtextRenderModeÚutf8c                 K   sD   || _ || _|| _d| _td | _td | _td | _|  |¡ d S )Nr   r+   r*   r(   )	rA   rG   r5   r,   re  r+   r*   r(   rŒ   )rS   rA   rG   r5   rõ   r;   r;   r<   r`   ë  s    


zString.__init__c                 C   s   | j t| j| j| j| jƒ S ra   )rA   r   r5   r+   r*   rÅ  r…   r;   r;   r<   ÚgetEastõ  s    zString.getEastc                 C   s&   |   | j| j| j¡}| |  ¡ ¡ |S ra   )r„   rA   rG   r5   rŒ   rŠ   r~  r;   r;   r<   r†   ø  s    zString.copyc                 C   sž   | j }t|| j| j| jƒ}| j}| j}|dkrz|dkrD|d| 8 }n6|dkrV||8 }n$|dkrz|t|||| j| j| jƒ8 }|| jd| j  || | j| j fS )Nr   rÈ  r†  r1   rÉ  gš™™™™™É?)	r5   r   r+   r*   rÅ  r,   rA   rÆ  rG   )rS   r8   r2   rÄ  rA   r;   r;   r<   r�   ý  s    
zString.getBounds)rV   rW   rX   rY   rž   r«   rZ  ZisStringrg  r[  r”   rÅ  r`   rÍ  r†   r�   r;   r;   r;   r<   rÇ  Ù  s"   





÷
rÇ  c                   @   s   e Zd ZdZdd„ ZdS )r³   ak  A simple template for creating a new node.  The user (Python
    programmer) may subclasses this.  provideNode() must be defined to
    provide a Shape primitive when called by a renderer.  It does
    NOT inherit from Shape, as the renderer always replaces it, and
    your own classes can safely inherit from it without getting
    lots of unintended behaviour.c                 C   s   t dƒ‚dS )zºOverride this to create your own node. This lets widgets be
        added to drawings; they must create a shape (typically a group)
        so that the renderer can draw the custom node.ú4this method must be redefined by the user/programmerNrœ   r…   r;   r;   r<   r´     s    zUserNode.provideNodeN)rV   rW   rX   rY   r´   r;   r;   r;   r<   r³     s   r³   c                   @   s   e Zd ZdZdd„ ZdS )Ú
DirectDrawz"try to draw directly on the canvasc                 C   s   t dƒ‚d S )NrÎ  rœ   )rS   rT   r;   r;   r<   ÚdrawDirectly  s    zDirectDraw.drawDirectlyN)rV   rW   rX   rY   rÐ  r;   r;   r;   r<   rÏ    s   rÏ  c                  C   sp   t ddddƒ} dd l}|j}tjj}|dƒ ||  ¡ ƒ |dƒ |  ¡  |dƒ |dƒ | `|d	ƒ |  ¡  d S )
Nr   r  é2   r   za Rectangle: z
verifying...z OK
zdeleting rect.width zverifying...)rœ  Úpprintr?  ÚstdoutrO  rŠ   r™   rQ   )r©  rÒ  Úppr2   r;   r;   r<   ra     s    ra  Ú__main__)N)N)r   rí   )FF)NNN)bÚ__version__rY   r7  r?  Úmathr   r   r   r   r   r   Zreportlab.platypusr   Zreportlab.rl_configr	   r
   r   Z_baseGFontNamer   r   Zreportlab.libr   r   Zreportlab.lib.validatorsZreportlab.lib.utilsr   r   rƒ  ZisNumberInRangerh  Zreportlab.lib.attrmapZreportlab.lib.rl_accelr   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.lib.fontsr   Zreportlab.pdfgen.canvasr   r   Z_baseGFontNameBZ_baseGFontNameIZ_baseGFontNameBIZNON_ZERO_WINDINGZEVEN_ODDZblackre  r   r=   rL   rM   rZ   rg   rs   r~   r�   r‚   rŸ   rÝ   rä   rï   rö   r²   r
  Z	Validatorr`  rd  ri  rj  rw   ry   rq  r€  r�  rr  rs  r—  rx  Z_fillModeMapry  rß   r“  r”  r›  rœ  r¢  r£  r«  r¬  r±  r¸  r¹  rÆ  rÇ  r³   rÏ  ra  rV   r;   r;   r;   r<   Ú<module>   s¾    
ë"

5M >

'
	  
ù
H
	2k X3
