o
    &zh7                     @   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,i dddej-ddddddddddddddddddd dd!ej-d"e&d#dd$ed%d&Z.dd	l/T d'd( Z0d)d* Z1G d+d, d,Z2G d-d. d.Z3d/d0 Z4d1d2 Z5d3d4 Z6d5d6 Z7G d7d8 d8e3e2Z8G d9d: d:e8Z9d|d;d<Z:d|d=d>Z;d}d@dAZ<dBdC Z=G dDdE dEe9eZ>G dFdG dGZ?G dHdI dIe@ZAeA ZAG dJdK dKe8ZBG dLdM dMeBZCG dNdO dOeBZDeEeFdP\ZGZHZIZJdQZKg dRZLd~dSdTZMdde'e'dUe'dVe'e&e&dWe&dXe&iZNG dYdZ dZeDZOeO ZPdd[d\ZQG d]d^ d^eOZRg dddfd_d`ZSG dadb dbeDZTG dcdd ddeDZUG dedf dfeDZVG dgdh dheDZWG didj djeDZXG dkdl dleDZYG dmdn dneBZZG dodp dpeOZ[defdqdrZ\G dsdt dte8Z]G dudv dve2Z^G dwdx dxe8Z_dydz Z`ead{kre`  dS dS )z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	transformr   r   r   r   r   r   strokeColorstrokeWidthstrokeLineCapstrokeLineJoinstrokeMiterLimit
   strokeDashArraystrokeOpacityfillOpacityfillOverprintFstrokeOverprintoverprintMask	fillColorfillModefontSizefontName
textAnchorstartc                 C   s  d}| D ]}t |t|||}qt| | }|}	|d dkr&| }
|	| }	n|d dkr/d}
n	| d }
|	|
 }	|d dkrV| }|dkrHd}n?|dkrP| }n7| d }n1|d d	krqd}|dkre|}n"|dkrld}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+   	boxAnchorr2   thytybxbxt r?   T/var/www/html/kangema/venv/lib/python3.10/site-packages/reportlab/graphics/shapes.py_textBoxLimitsC   s6   



rA   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      g | ]}|d  qS r   r?   .0xr?   r?   r@   
<listcomp>k       z%_rotatedBoxLimits.<locals>.<listcomp>c                 S   rB   r   r?   rD   r?   r?   r@   rG   l   rH   )zTransformPointsrotateminr3   )rF   yr2   r:   angleCXYr?   r?   r@   _rotatedBoxLimitse   s   6rR   c                   @      e Zd ZdZdd ZdS )_DrawTimeResizeablez:Addin class to provide the horribleness of _drawTimeResizec                 C   sF   t | dr| j}|j}|||_|_t |dr!||| d S d S d S )N_canvas_drawTimeResize)hasattrrU   _drawingwidthheightrV   )selfr2   r:   canvasdrawingr?   r?   r@   rV   q   s   

z#_DrawTimeResizeable._drawTimeResizeN)__name__
__module____qualname____doc__rV   r?   r?   r?   r@   rT   o       rT   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)r[   keywordskeyvaluer?   r?   r@   __init__z   s   z_SetKeyWordArgs.__init__N)r^   r_   r`   ri   r?   r?   r?   r@   rc   y   s    rc   c           
      C   s|   dd | D }|sd S |d \}}}}|dd  D ]\}}}}	||k r%|}||kr+|}||k r1|}|	|kr7|	}q||||fS )Nc                 S   s   g | ]}|d ur|qS Nr?   rD   r?   r?   r@   rG      s    z"getRectsBounds.<locals>.<listcomp>r   r   r?   )
rectListLxMinyMinxMaxyMaxx1y1x2y2r?   r?   r@   getRectsBounds   s   ru   c                 C   s  |d||   |  }d|d|  |   }||  }| g}|| d| |  }|dkrt |}|dk r4| }d||  }	g }
z	|
|	|  W n   Y z	|
||	  W n   Y |d9 }|d9 }|
D ]}d|  krndkrn qb||||| |  |  |   qb|| |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)y0rr   rt   y3abcrQ   dqRr9   r?   r?   r@   _getBezierExtrema   s4   "
r   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 rj   r?   )ipr?   r?   r@   <lambda>   s    zgetPathBounds.<locals>.<lambda>r   rw   r   )r4   listmaprangerL   r3   )pointsr.   fxsysr?   r?   r@   getPathBounds   s
   r   c                 C   sP   | d }t |r$dd | D }dd | D }t|t|t|t|fS t| S )z"Helper function for list of pointsr   c                 S   rB   rC   r?   rE   xyr?   r?   r@   rG      rH   z#getPointsBounds.<locals>.<listcomp>c                 S   rB   rI   r?   r   r?   r?   r@   rG      rH   )r   rL   r3   r   )	pointListfirstr   r   r?   r?   r@   getPointsBounds   s   r   c                   @   sX   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r&	 d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 )zReturn a clone of this shape.z!No copy method implemented for %s)NotImplementedError	__class__r^   r[   r?   r?   r@   copy      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__rd   )r[   recurpropsrg   rh   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)r[   r   r?   r?   r@   setProperties   r   zShape.setProperties c                 C   sH   t |   }|  |r|d }|D ]\}}td|||f  qdS )zConvenience. Lists them on standard output.  You
        may provide a prefix - mostly helps to generate code
        samples for documentation..z	%s%s = %sN)r   r   rd   sortprint)r[   prefixpropListnamerh   r?   r?   r@   dumpProperties  s   zShape.dumpPropertiesc                 C   s   | j durL| j D ]}|d dkr|| j v sJ d|| f q
| j  D ](\}}t| |s6J d|| f t| |}||sKJ d||| jjf q%dS d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   keysrd   rW   getattrvalidater   r^   )r[   rg   attr	metavaluerh   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)validateSetattr)r[   r   rh   r?   r?   r@   __setattr__%  s   zShape.__setattr__c                 C      t d)5Returns bounding rectangle of object as (x1,y1,x2,y2)z+Shapes and widgets must implement getBoundsr   r   r?   r?   r@   	getBounds*  s   zShape.getBoundsNrI   )r   )r^   r_   r`   ra   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d4ddZd4ddZd4ddZdd Zdd Zdd Zd5ddZdd  Zd!d" Zd6d$d%Zd7d&d'Zd8d(d)Zd7d*d+Zd7d,d-Zd.d/ Zd0d1 Zd2d3 ZdS )9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   desc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 )zInitial 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   addrc   ri   )r[   elementsrf   eltr?   r?   r@   ri   =  s   zGroup.__init__c                 C   s0   |r|| j vrtt| j |< t| || dS dS )zLif name is not None add an attribute pointing to node and add to the attrMapN)r   AttrMapValueisValidChildre   )r[   r   noder?   r?   r@   _addNamedNodeM  s
   
zGroup._addNamedNodeNc                 C   s8   |durt |sJ d| j| | || dS dS )zAppends 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   ry   r   r[   r   r   r?   r?   r@   r   T  s
   z	Group.addc                 C   s   | j ||d | jd S )N)r   r/   )r   r   r   r?   r?   r@   _nn^  s   
z	Group._nnc                 C   sT   |dur(t |sJ d|dk r|g| j||< n| j|| | || dS dS )z4Inserts sub-node n in contents at specified locationNz4Can only insert Shape or UserNode objects in a Groupr   )r   r   insertr   )r[   r   r.   r   r?   r?   r@   r   b  s   zGroup.insertc                 C   s   t | trt| j| jpt }| j |_t|dr"| jdd |_| j	}|j	j
}|D ]}t |tr7| }nt |trA| }n| }|| q+| | |S )z9Return a new object which only contains primitive shapes.r   N)
isinstanceDrawingrY   rZ   r   r   r   rW   r   r   ry   UserNodeprovideNodeexpandUserNodesr   _copyNamedContents)r[   objself_contentsr|   childnewChildr?   r?   r@   r   l  s   





zGroup.expandUserNodesc                 C   s   t  }t| dr| j|_t|dr| jdd |_|  dd }|rY|d}t|tr6|d|	  n!t|t rR|
 }|jdkrL|j|j n|| n|| |s#|S )z return a fully expanded object	__label__r   Nr   r   )r   rW   r   r   getContentspopr   r   r   r   _exploder   extendr   )r[   r   Pr.   r?   r?   r@   r     s"   





zGroup._explodec                 C   s   | j D ]}|j | qd S rj   )r   ry   )r[   r   r   r?   r?   r@   _copyContents  s   
zGroup._copyContentsr   c           	      C   s   ddl m } | j}|st| j }| j D ]'\}}||v r.||}t|||j|  q||v r>||vr>t|||| qd S )Nr   )r   )	r   r   r   r   r   r   rd   indexre   )	r[   r   aKeysnoCopyr   r   kvposr?   r?   r@   r     s   
zGroup._copyNamedContentsc                 C   s$   | j  |_ | | | | |S )zcopies to obj)r   r   r   r   r[   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.copyr   c                 C   s   t | jt|||| _dS z&Convenience to help you set transformsN)mmultr   rK   )r[   thetacxcyr?   r?   r@   rK     s   zGroup.rotatec                 C      t | jt||| _dS r   )r   r   	translate)r[   dxdyr?   r?   r@   r        zGroup.translatec                 C   r   r   )r   r   scale)r[   sxsyr?   r?   r@   r     r   zGroup.scalec                 C   s    t t | jt|t|| _dS r   )r   r   skewXskewY)r[   kxkyr?   r?   r@   skew      z
Group.skewc                 C   s   | j dd ||f | _ dS )z2Convenience function to set the origin arbitrarilyN)r   r[   rF   rM   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   _xtraAttrMaprY   rZ   )r[   rY   rZ   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   )r[   r}   rO   r?   r?   r@   r     s   zGroup.getContentsc                 C   s   | j rFg }| j D ]	}||  qt|}|d u rd S |\}}}}| j}||g||g||g||gg}g }	|D ]
}
|	t||
 q7t|	S d S rj   )r   ry   r   ru   r   transformPointr   )r[   r}   elemrq   rr   rs   rt   transcorners
newCornerscornerr?   r?   r@   r     s   
zGroup.getBoundsrj   )Nr   r   r   rC   rI   )r^   r_   r`   ra   r   r   isTransformisListOfShapes	isBooleanr   ri   r   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r?   r?   r?   r@   r   .  s8    












	r   c                 C   s^   ddl m} | j}||j}|p|j}||vr|g||< dS ||| vr-|| | dS dS )z7add an import of obj's class to a dictionary of importsr   )	getmoduleN)inspectr  r   r^   ry   )r   Ir.   r  r~   mr?   r?   r@   _addObjImport  s   

r  c                    sd  t | tr	t| S t| r7d fdd| D }t | tr$d| dS d| t| dkr2d d	S d d	S | tu rE rCt|  d
 d
S t | t	r rQt|   ddl
m} || j\}}}}}}	}
|rw|t| d }|t| d= ng }|   fdd|dd D  fdd|D   fdd D  }| jj dd| d	S t| S )zEreturn a repr style string with named fixed args first, then keywords,c                 3   s    | ]}t | V  qd S rj   _repr)rE   r   )r	  r?   r@   	<genexpr>  s    z_repr.<locals>.<genexpr>[](r   r   )EmptyClipPathr   )getfullargspecNc                    s   g | ]}t |d  qS rj   r  r   rE   r.   r	  r   r?   r@   rG     s    z_repr.<locals>.<listcomp>c              	      s(   g | ]}| d t |d  qS )=Nr  r  r  r?   r@   rG        ( c                    s(   g | ]\}}| d t |   qS )r  r  )rE   r.   r   r  r?   r@   rG     r  )r   floatr   r   joinr   r4   r  r  r   r  r  ri   r   rd   r   r^   repr)r[   r	  r-   r  argsvarargsvarkwdefaults
kwonlyargskwonlydefaultsannotationskargsr?   r  r@   r    s4   

&
r  		c           
   	   C   s   d}t | dd }|r|| | dt| d7 }|  D ]I}t|trVd| }|d7 }t |dd}	|	r8d|	 }	|| | d	| d
|	 d7 }|t|||||7 }|d8 }q|| | dt|| d7 }q|S )Nr   r   z.transform = 
r   r   r   #r  z._nn(Group())z.add(z)
)r   r  r   r   r   _renderGroupPy)
Gpfxr	  r   indentr-   rO   r.   npfxlr?   r?   r@   r)    s    


 r)  c                    s,   | | j t  fdd| D S )Nc                    s(   i | ]\}}| r| d  |qS rj   )
startswith)rE   r   r   r.   r+  r?   r@   
<dictcomp>(  r  z_extraKW.<locals>.<dictcomp>)r   r   r4   rd   )r[   r+  kwr?   r0  r@   _extraKW%  s   r3  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.>   pspybmpepsgifjpgpctpdfpngsvgtifjpegpicttifftiff1tiffltiffp>   r4  r5  r7  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RIGHTCENTERCENTREz+Horizontal alignment within parent document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)	rY   rZ   canvr   hAlignvAlignrenderScaleinitialFontNameinitialFontSizer   r   )loemptyOKzOne or more plot modes)BASEformats     c                 O   s@   d | _ tj| g|R i | || _|| _d| _d| _d| _d S )NrE  rJ        ?)r   r   ri   rY   rZ   rL  rM  rN  )r[   rY   rZ   nodesrf   r?   r?   r@   ri   Z  s   
zDrawing.__init__c                 C   s   g dg dd}t |  d|}d| jj }d}|ddd	 | D 7 }|d
| d7 }|d| j d| j d7 }|d7 }||7 }|d| d7 }|S )N)_DrawingEditorMixinr   r   )Color	CMYKColor
PCMYKColor)zreportlab.graphics.shapeszreportlab.lib.colorsr[   ExplodedDrawing_z0#Autogenerated by ReportLab guiedit do not edit
r   c                 s   s,    | ]\}}d | dd | dV  qdS )zfrom z import z, r'  N)r  )rE   r
  or?   r?   r@   r  k  s   * z$Drawing._renderPy.<locals>.<genexpr>z
class z(_DrawingEditorMixin,Drawing):
z	def __init__(self,width=z,height=z,*args,**kw):
z1		Drawing.__init__(self,width,height,*args,**kw)
z(

if __name__=="__main__": #NORUNTESTS
	z0().save(formats=['pdf'],outDir='.',fnRoot=None)
)r)  r   r   r^   r  rd   rY   rZ   )r[   r	  r*  r.   r-   r?   r?   r@   	_renderPyc  s   zDrawing._renderPyc              	   C   s:   ddl m} |j| | jdd|tur|nt| dtd dS )zThis 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   	renderPDF_showBoundaryshowBoundaryN)reportlab.graphicsra  drawrK  r   r   )r[   rd  ra  r?   r?   r@   rf  s  s   
zDrawing.drawc                 C   s2   | j }| j}| j}|dkr||9 }||9 }||fS )NrW  )rY   rZ   rN  )r[   
availWidthavailHeightrY   rZ   rN  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   rY   rZ   r   r?   r?   r@   r     s   
zDrawing.expandUserNodesc                 C   s   |  | | j| jS )zReturns a copy)r   r   rY   rZ   r   r?   r?   r@   r     s   zDrawing.copyc                 O   s   |  t|i |S rj   )r   r   )r[   r  r2  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}	|sft| d| jjd }t| d	d}
t|
d
r9|
| }
t|d
rC||
}n#z||
 }W n t	ye } zt
|ddk r[ W Y d}~nd}~ww |du rpt| dd}t|d
ry|| }tj|rtj|\}}n|pt| dd}| tj}|sd}tj|stjt| dtjtjd |}tj|st| tjtj||}tj|}|d dd  | jv r|d }dd |pt| ddgD }|dur|fpt| d|fd }tjjtjjf}| tj_tj_d|v rbddl m!} |d }|r)t"|d|f  |j#| ||fdt| d|j$it%| dfi | |	d }	tj&dkrbddl'}ddl(}|)|*dd |+| | j,D ]i}||v rdd l m-} d!||f }|rt"|||f  t| d"d}|rt|d|g}||v rt|d#ds|.  nd}|j#| |f|t| d|j$d$t%| d%fi | |	d& | }	|r|/| qed'|v r6zdd(l0m1} W n t2y   dd)l m3} Y nw |d* }|rt"|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 rldd5l m6} |d6 }|rPt"|d7|f  |j#| |fdt| d|j$it%| d8fi | |	d9 }	d:|v rdd)l m3} |d; }|rt"|d+|f  |j#| |fdt| d|j$it%| d2fi | |	d< }	d=|v r|d> }|rt"|d=|f  t7|d?}|8t9| : ;d@tj< W d   n	1 sw   Y  |	dA }	|\tj_tj_t| dBr| =||	 |	r||	dd  pdS )CzSaves 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)
        	seqNumberr   z%4d: zgenerating %s file %sr   	rl_configfileNamePatternz%03dchartId__call__znot all arguments convertedNoutDirr   _override_CWDr   c                 S   s   g | ]}|  qS r?   )lowerrD   r?   r?   r@   rG     rH   z Drawing.save.<locals>.<listcomp>rT  r;  r
   r`  z.pdfPDFrd  
showBorder_renderPDF_z/.pdfmacCAROzPDF renderPMz%s.%s_drawTimeCollectordisabledfmtrd  
_renderPM_z/.r7  renderPS_SEPrenderPSz.epsEPSEPS_infoTesting	ReportLabpreview	ttf_embed)titledeptcompanyr  rd  r  
_renderPS_z/.epsr=  	renderSVGz.svgSVG_renderSVG_z/.svgr4  z.psz/.psr5  z.pywbr'  z/.py
saveLogger)>r   r   int	reportlabrm  r   r   r^   rW   	TypeErrorstrfindospathisabssplitrstripsepr  dirnamesysargvisdirmakedirsnormpathsplitextrs  
_saveModesr   warnOnceenabledinfoOncere  ra  r   
drawToFilerd  r3  platformmacfs
macostoolsFSSpecSetCreatorTypetouched_bmModesrz  clearsaverlextra.graphicsr  ImportErrorr  eps_previeweps_ttf_embedr  openwriter   r_  replacelinesepr  )r[   rT  r
   fnRootrq  r  r2  genFmtrm  extro  errfnrootplotMode_savedra  filenamer  r  bmFmtrz  dtcdtcfmtsr  r  r   r?   r?   r@   r    s   




 
0 
2



2
	

0
zDrawing.savec                 K   s  || j v sJ d| ddlm} |dkr9ddlm} |dd}|j| |fdt| d	|jit	| d
fi |S || j
v r\ddlm} |j| f|t| d	|jdt	| dfi |S |dkrzddlm}	 W n tyw   ddlm}	 Y nw |	j| |t| d	|jdS |dkrddlm}	 |	j| t| d	|jdS |dkr|  S |dkrd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   rl  r;  r`  r  r   rd  ru  rv  ry  r}  r  r7  r  r  )r  rd  r4  rc  r5  r=  r  r  N)r  r  rm  re  ra  r   drawToStringr   rd  r3  r  rz  r  r  r  r  r_  r  )r[   formatr
   r  r2  rm  ra  r  rz  r  r  r?   r?   r@   asString  s@   0
.zDrawing.asStringfitc                 C   sP  |   }| j}| j}t||g|R  }	|	 \}
}}}|dks7|dkrX|
|k s7||| ks7||k s7||| krX||
 | | |	_|| | | |	_dddd||
 || f|	_|	S |dksj|dkr|
|k sj||| kr||
 | | |	_dddd||
 df|	_|	S |dks|dkr||k s||| kr|| | | |	_ddddd|| f|	_|	S )	z?return a base class drawing which ensures all the contents fitsr  expandr   r   fitxexpandxfityexpandy)r   rY   rZ   r   r   r   )r[   kindlpadrpadbpadtpadrO   oWoHr]   xLyLxHyHr?   r?   r@   resized-  s$   8$$zDrawing.resized)rU  rV  )NNNNr   )Nr   )r  r   r   r   r   )r^   r_   r`   ra   r  r  r   r   isNumberisValidChildOrNoneOneOfisStringOrNoneisNumberOrNoner   r   
SequenceOfr   r   ri   r_  r   rf  ri  r   r   rj  r  r  r  r?   r?   r?   r@   r   *  sD    







		

|r   c                   @      e Zd ZdZdddZdS )rY  z<This is a mixin to provide functionality for edited drawingsNc                 C   s   t |}|r&t|dr&d|jvr|j |_|r|du rt }t|||j|< t|dr@|r@|r8|||| dS ||| dS |rJt||| dS t	d)zb
        effectively setattr(obj,name,value), but takes care of things with _attrMaps etc
        r   Nr   zCan't add, need name)
r   rW   r   r   r   r   r   r   re   
ValueError)r[   r   rh   r   r   r   r   ivcr?   r?   r@   _addB  s   
z_DrawingEditorMixin._addNNNN)r^   r_   r`   ra   r  r?   r?   r?   r@   rY  @      rY  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   )isListOfNumbersOrNonetestr   r   tupler  isListOfNumbers)r[   rF   r?   r?   r@   r  W  s   0zisStrokeDashArray.testN)r^   r_   r`   r  r?   r?   r?   r@   r  V  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   rw   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   r[   r2  r?   r?   r@   ri   j  s   
zLineShape.__init__N)r^   r_   r`   r   r   isColorOrNoner  r  r  	isOpacityr  r   ri   r?   r?   r?   r@   r  [  s    



r  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   )rS  rq   rr   rs   rt   c                 K   (   t | | || _|| _|| _|| _d S rj   )r  ri   rq   rr   rs   rt   )r[   rq   rr   rs   rt   r2  r?   r?   r@   ri   |  
   
zLine.__init__c                 C   s   | j | j| j| jfS )r   )rq   rr   rs   rt   r   r?   r?   r@   r     s   zLine.getBoundsN)
r^   r_   r`   r   r  r   r  r   ri   r   r?   r?   r?   r@   r  t  s    



r  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   )rS  r'   r#   r$   r&   r(   c                 C   s    t d | _d | _t| | d S )Nr'   )r  r'   r#   r  ri   r  r?   r?   r@   ri     s   
zSolidShape.__init__N)r^   r_   r`   r   r  r   r  r  r  r  r   r   r   ri   r?   r?   r?   r@   r    s    


r  rx   )rw   rw      r   )moveTolineTocurveTo	closePathc                 C   s   | j }d}d}d}| }| jD ];}	|	tkr,|r(|r(|
tkr(|d7 }|r(|t   |d7 }t|	 }|| }||	 |||   |}|	tkrH|d7 }|	}
q|r^|r^|
tkr^|d7 }|r^|t   ||kS )zHelper function for renderers.r   r   )r   	operators_MOVETO
_CLOSEPATH_PATH_OP_ARG_COUNT)r  	drawFuncs	countOnly
forceCloser   r   hadClosePath	hadMoveToactiveopr   nArgsjr?   r?   r@   _renderPath  s2   


r  znon-zerononzerozeven-odd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;  )rS  r   r  
isClipPath	autocloser(   Nr   c                 K   s^   t | | |d u rg }|d u rg }t|d dksJ d|| _|| _|| _|| _|| _d S Nrw   r   -Point list must have even number of elements!)r  ri   r4   r   r  r  r  r(   )r[   r   r  r  r  r(   r2  r?   r?   r@   ri     s   
zPath.__init__c                 C   s2   |  | jd d  | jd d  }||   |S rj   )r   r   r  r   r   r[   newr?   r?   r@   r     s    z	Path.copyc                 C       | j ||g | jt d S rj   )r   r   r  ry   r  r   r?   r?   r@   r       zPath.moveToc                 C   r  rj   )r   r   r  ry   _LINETOr   r?   r?   r@   r    r  zPath.lineToc                 C   s(   | j ||||||g | jt d S rj   )r   r   r  ry   _CURVETO)r[   rq   rr   rs   rt   x3r{   r?   r?   r@   r    s   zPath.curveToc                 C   s   | j t d S rj   )r  ry   r  r   r?   r?   r@   r    s   zPath.closePathc                 C   s  | j }ztg }|j}|j}g }|j}|j}d}| jD ]O}	t|	 }
||
 }|
dkr6|||  |||d   n0|
dkrf|||d \}}}|t|d ||| ||d |d \}}}|t|d ||| |}qt|t|t|t|fW S    t| Y S )Nr   rw   r   r  r/   )	r   ry   r   r  r  r   rL   r3   r   )r[   r   rP   aXeXrQ   aYeYr   r  r  r  rq   rs   r  rr   rt   r{   r?   r?   r@   r     s0   
zPath.getBounds)r^   r_   r`   ra   r   r  r   r  r  NoneOrr  r   r   r   ri   r   r  r  r  r  r   r?   r?   r?   r@   r    s     r  c                 C   s   |d u r|}g }t d }	||	 }
||	 }||
k r"|dt   }||
k st||
 }|j}|dkrNt||p4d}||	 }tt|| d d}|| }|d7 }nd}d}t|D ]}|
||  }|| |t|  ||t|  f qV|rw|	  |S )N     f@rw   MbP?rW        ?r   r   )
r   r  ry   rL   r3   r  r   r   r   reverse)centerxcenteryradiusstartangledegreesendangledegreesyradiusdegreedeltar  r   degreestoradians
startangleendanglerN   r|   radiansdeltar.   r?   r?   r@   getArcPoints  s.   
&r+  c                   @   r  )ArcPathzPath with an addArc methodNc
              
   C   sf   t ||||||||	d}
|st| js$| |
d d |
d d  |
d= |
D ]
\}}| || q&d S )N)r%  r&  r  r   r   )r+  r4   r  r  r  )r[   r   r!  r"  r#  r$  r%  r&  r  r  r   rF   rM   r?   r?   r@   addArc,  s
   zArcPath.addArcr  )r^   r_   r`   ra   r-  r?   r?   r?   r@   r,  *  r  r,  c                 K   s>  g }g }| D ]B}t |s|}g }	n
|d }|dd  }	|tvr%td| t|}
t|	t|
 kr<td|t|	f ||
 |t	|	 q|df|dffD ]\}}t
|t|dD ]
}|| | ||< q]qQ|dd }|rdD ]}|| ||d  f}|d d u r|d d u rqt||d d }t|t|}}|d d ur|d d urt|t|}}|| }t|dkr|| | }t
|t|dD ]}|||| |   ||< qqtt
|t|dD ]
}|| d	 ||< qqt|d d ur|d | n|d | }t
|t|dD ]}||  |7  < qqtt|||fi |S )
Nr   r   zbad operator name %sz%s bad arguments %srw   bbox)r   r   gư>r  )r   _PATH_OP_NAMESr  r   r4   r  r  ry   r   r   r   r   rL   r3   absr  )pathSegsr  r   r   r2  Or   segopNamer  r  r   r^  r   r.  r  r|   r}   r~   facr?   r?   r@   
definePath3  sT   

$r6  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)rS  rF   rM   rY   rZ   rxryr   c                 K   s4   t | | || _|| _|| _|| _|| _|| _d S rj   )r  ri   rF   rM   rY   rZ   r:  r;  )r[   rF   rM   rY   rZ   r:  r;  r2  r?   r?   r@   ri   q  s   
zRect.__init__c                 C   *   |  | j| j| j| j}||   |S rj   )r   rF   rM   rY   rZ   r   r   r  r?   r?   r@   r   z     z	Rect.copyc                 C       | j | j| j | j | j| j fS rj   rF   rM   rY   rZ   r   r?   r?   r@   r     s    zRect.getBoundsNr  )r^   r_   r`   ra   r   r  r   r  r   ri   r   r   r?   r?   r?   r@   r7  e  s    


		r7  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.r8  r   r9  N)rS  rF   rM   rY   rZ   r  c                 K   s.   t | | || _|| _|| _|| _|| _d S rj   )r  ri   rF   rM   rY   rZ   r  )r[   rF   rM   rY   rZ   r  r2  r?   r?   r@   ri     s   
zImage.__init__c                 C   .   |  | j| j| j| j| j}||   |S rj   )r   rF   rM   rY   rZ   r  r   r   r  r?   r?   r@   r     s   z
Image.copyc                 C   r>  rj   r?  r   r?   r?   r@   r     r   zImage.getBounds)r^   r_   r`   ra   r   r  r   r  r  r   ri   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)rS  r   r   rc                 K   s"   t | | || _|| _|| _d S rj   )r  ri   r   r   rF  )r[   r   r   rF  r2  r?   r?   r@   ri     s   
zCircle.__init__c                 C   &   |  | j| j| j}||   |S rj   )r   r   r   rF  r   r   r  r?   r?   r@   r        zCircle.copyc                 C   s,   | j | j | j| j | j | j | j| j fS rj   )r   rF  r   r   r?   r?   r@   r        ,zCircle.getBoundsNr^   r_   r`   r   r  r   r  r   ri   r   r   r?   r?   r?   r@   rB    s    


rB  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 )EllipserC  r   rD  zx radiuszy radius)rS  r   r   r:  r;  c                 K   r  rj   )r  ri   r   r   r:  r;  )r[   r   r   r:  r;  r2  r?   r?   r@   ri     r  zEllipse.__init__c                 C   r<  rj   )r   r   r   r:  r;  r   r   r  r?   r?   r@   r     r=  zEllipse.copyc                 C   s,   | j | j | j| j | j | j | j| j fS rj   )r   r:  r   r;  r   r?   r?   r@   r     rI  zEllipse.getBoundsNrJ  r?   r?   r?   r@   rK    s    



rK  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 anglerC  r   rD  rE  ztreat as annular ring)
rS  r   r!  r"  r#  r$  r%  radius1yradius1annularr   NFc           	      K   sV   t | | ||k r|d }||k s
|||||f\| _| _| _| _| _|| _|| _d S )Nih  )	r  ri   r   r!  r"  r#  r$  r%  rO  )	r[   r   r!  r"  r#  r$  r%  rO  r2  r?   r?   r@   ri     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%  rM  rN  )r   r"  )r[   r%  rM  rN  r?   r?   r@   
_xtraRadii  s   
zWedge._xtraRadiic                 C   sd  | j }| j}| j}|  \}}}| j}| j}td }	||	 }
||	 }||
k r0|dt  }||
k s&t||
 }g }|dkr\t| j	pAd|}||	 }t
dt|| d }|| }|d7 }nd}d}g }|j}|j}t|D ]}|
||  }|t|t|f ql|D ]\}}||||   ||||   q|dks|d u r|dks|d u r|| || n|  |D ]\}}||||   ||||   q| jr.tt| dtd	}||d |d  tdd| dD ]}||| ||d   q|  ||d|  |d| d   td| d d
| dD ]}||| ||d   q|  |S t|S )Nr  rw   r  rW  r   r  r   r(   )r(   rx   )r   r!  r"  rP  r#  r$  r   r  rL   r&  r3   r  ry   r   r   r   r  rO  r  r   r   r  r  r  Polygon)r[   r   r!  r"  r%  rM  rN  r#  r$  r'  r(  r)  rN   r   r&  r*  r.   CACAAr|   r~   r-   r   rF   r?   r?   r@   	asPolygon  sb   
  zWedge.asPolygonc                 C   rA  rj   )r   r   r!  r"  r#  r$  r   r   r  r?   r?   r@   r   *  s   z
Wedge.copyc                 C   s   |    S rj   )rT  r   r   r?   r?   r@   r   3  s   zWedge.getBounds)NF)r^   r_   r`   ra   r   r  r   r  r  r  r   r&  ri   rP  rT  r   r   r?   r?   r?   r@   rL    s*    




6	rL  c                   @   @   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 )rQ  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   rS  r   c                 K   s2   t | | t|d dksJ d|pg | _d S r  )r  ri   r4   r   )r[   r   r2  r?   r?   r@   ri   >  s   zPolygon.__init__c                 C      |  | j}||   |S rj   r   r   r   r   r  r?   r?   r@   r   C     zPolygon.copyc                 C   
   t | jS rj   r   r   r   r?   r?   r@   r   H     
zPolygon.getBoundsN)r^   r_   r`   ra   r   r  r   r  r   ri   r   r   r?   r?   r?   r@   rQ  6  s    
rQ  c                   @   rU  )PolyLinezSeries of line segments.  Does not define a
    closed shape; never filled even if apparently joined.
    Put the numbers in the list, not two-tuples.rV  r   rW  c                 K   sz   t | | |p	g }t|}|r8t|d r,g }|D ]\}}|| || q|}nt|d dks8J d|| _d S )Nr   rw   r  )r  ri   r4   r   ry   r   )r[   r   r2  	lenPointsrl   rF   rM   r?   r?   r@   ri   T  s   

zPolyLine.__init__c                 C   rX  rj   rY  r  r?   r?   r@   r   c  rZ  zPolyLine.copyc                 C   r[  rj   r\  r   r?   r?   r@   r   h  r]  zPolyLine.getBoundsN)r^   r_   r`   ra   r   r  r   r  r   ri   r   r   r?   r?   r?   r@   r^  K  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   )rQ  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)rS  xyListsanglesspacingsrw   -   c              
   K   s  t j| fi | t|r|f}t|r|f}t|r|f}t|t| }|dkr5t|||d g  }|| _|| _|| _| j	}| j
}t|D ]\}}|| }	t|}t|}
t|}d}| }|D ]%}tdt|dD ]}||d  |
 || |  }t||}t||}qnqdtt||	 d }tt||	 d }t||D ]}g }|	| }|D ]m}t|d }tdt|dD ]\}|| }||d  }||
 ||  }||
 ||  }|| }||d  }||
 ||  }||
 ||  }||k r||ks||k r||kr|||| ||  ||    |}qq|  tdt|dD ]9}|| |
 ||  }||
 || |  }||d  |
 ||  }||
 ||d  |  }||| ||| q'qqHd S )Nr   r/   irw   r   )r  ri   r  r  r4   r   ra  rb  rc  r  r  	enumerater   r   r   r   rL   r3   r  r   ry   r   )r[   rc  rb  ra  kwdsr   r  r  r   spacingcosThetasinThetaspanMinspanMaxr   r  rM   	spanStartspanEndstepnodeXstripeYr   r|   r}   a1b1rF   rq   rr   r?   r?   r@   ri   t  sv   
&"
zHatching.__init__N)r^   r_   r`   ra   r   r  r   EitherOrr  r  r  r   ri   r?   r?   r?   r@   r`  k  s    r`  c           
      C   sH   t | d|}||}|dkr"t | dd}	|	t|d | ||| }|S )N_dpr   _dpLen)r   rfindr   )
tAr5   r2   r*   r)   encodingpivotCharacterdpr   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   rw   rv   rx      r     z.Control whether text is filled/stroked etc etc)	rF   rM   r5   r*   r)   r'   r+   rx  textRenderModeutf8c                 K   sD   || _ || _|| _d| _td | _td | _td | _| | d S )Nr,   r*   r)   r'   )	rF   rM   r5   r+   r  r*   r)   r'   r   )r[   rF   rM   r5   r2  r?   r?   r@   ri     s   


zString.__init__c                 C   s   | j t| j| j| j| j S rj   )rF   r   r5   r*   r)   rx  r   r?   r?   r@   getEast  s   zString.getEastc                 C   rG  rj   )r   rF   rM   r5   r   r   r  r?   r?   r@   r     rH  zString.copyc                 C   s   | j }t|| j| j| j}| j}| j}|dkr=|dkr"|d| 8 }n|dkr+||8 }n|dkr=|t|||| j| j| j8 }|| jd| j  || | j| j fS )Nr,   r~  r  r1   r  g?)	r5   r   r*   r)   rx  r+   rF   r|  rM   )r[   r9   r2   rw  rF   r?   r?   r@   r     s   
$zString.getBounds)r^   r_   r`   ra   r   r   r  isStringr  r  r   rx  ri   r  r   r   r?   r?   r?   r@   r}    s$    






r}  c                   @   rS   )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   r   )zOverride 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/programmerr   r   r?   r?   r@   r     s   zUserNode.provideNodeN)r^   r_   r`   ra   r   r?   r?   r?   r@   r     s    r   c                   @   rS   )
DirectDrawz"try to draw directly on the canvasc                 C   r   )Nr  r   )r[   r\   r?   r?   r@   drawDirectly  s   zDirectDraw.drawDirectlyN)r^   r_   r`   ra   r  r?   r?   r?   r@   r    rb   r  c                  C   sp   t dddd} dd l}|j}tjj}|d ||   |d |   |d |d | `|d	 |   d S )
Nr    rV  2   r   za Rectangle: z
verifying...z OK
zdeleting rect.width zverifying...)r7  pprintr  stdoutr  r   r   rY   )rF  r  ppr2   r?   r?   r@   r    s   r  __main__rj   )r   r&  )FF)NNN)b__version__ra   r  r  mathr   r   r   r   r   r   reportlab.platypusr   reportlab.rl_configr	   r
   r   _baseGFontNamer   r   reportlab.libr   r   reportlab.lib.validatorsreportlab.lib.utilsr   r   r  isNumberInRanger  reportlab.lib.attrmapreportlab.lib.rl_accelr   reportlab.pdfbase.pdfmetricsr   reportlab.lib.fontsr   reportlab.pdfgen.canvasr   r   _baseGFontNameB_baseGFontNameI_baseGFontNameBINON_ZERO_WINDINGEVEN_ODDblackr  r   rA   rR   rT   rc   ru   r   r   r   r   r   r  r  r)  r3  r   rY  	Validatorr  r  r  r  r   r   r  r  r  r  r  r/  r  _fillModeMapr  r  r+  r,  r6  r7  r@  rB  rK  rL  rQ  r^  r`  r|  r}  r   r  r  r^   r?   r?   r?   r@   <module>   s    		
"

5M 
>

  

H
	2k X3

