
    Kwg                        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 dd
lmZmZ  e edd            Zdd	l 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jZ                  ddddddddddddddddddd dd!ejZ                  d"e&d#dd$ed%d&Z.dd	l/ d' Z0d( Z1 G d) d*      Z2 G d+ d,      Z3d- Z4d. Z5d/ Z6d0 Z7 G d1 d2e3e2      Z8 G d3 d4e8      Z9dld5Z:dld6Z;dmd7Z<d8 Z= G d9 d:e9e      Z> G d; d<      Z? G d= d>e@      ZA eA       ZA G d? d@e8      ZB G dA dBeB      ZC G dC dDeB      ZD eE eFdE            \  ZGZHZIZJdFZKg dGZLdndHZMdde'e'dIe'dJe'e&e&dKe&dLe&iZN G dM dNeD      ZO eO       ZPdodOZQ G dP dQeO      ZRg dddfdRZS G dS dTeD      ZT G dU dVeD      ZU G dW dXeD      ZV G dY dZeD      ZW G d[ d\eD      ZX G d] d^eD      ZY G d_ d`eB      ZZ G da dbeO      Z[defdcZ\ G dd dee8      Z] G df dge2      Z^ G dh die8      Z_dj Z`eadkk(  r e`        yy)pz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           	      x   d}| D ]  }t        |t        |||            } t        |       |z  }|}	|d   dk(  r	| }
|	|z
  }	n|d   dk(  rd}
n| dz  }
|	|
z   }	|d   dk(  r| }|dk(  rd}nI|dk(  r| }n@| dz  }n9|d   d	k(  rd}|dk(  r|}n'|dk(  rd}n|dz  }n| dz  }|dk(  r| }n
|dk(  r|}nd}||
||||	fS )
Nr   sng       @eendr-   w)maxr   len)textfontr*   leadingr,   	boxAnchorr4   thytybxbxts                P/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/graphics/shapes.py_textBoxLimitsrB   C   s(   	A 1+ah/01 	D	'A	B|SR!V	1s	RV"W}cRu1b r"2c6b	2	u1b q"S5bRVuB3b r"br1aR    c           	         t        t        |      | |f| |z   |f| |z   ||z   f| ||z   ff      }|D  cg c]  } | d   	 }} |D  cg c]  } | d   	 }} t        |      t        |      t        |      t        |      |fS c c} w c c} w )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
    r   r   )zTransformPointsrotateminr5   )xyr4   r<   angleCXYs           rA   _rotatedBoxLimitsrN   e   s    
 	1qs1gqs1Q3i1Q3'HIA!1A!1Aq63q63q63q61,, 	s   A=Bc                       e Zd ZdZd Zy)_DrawTimeResizeablez:Addin class to provide the horribleness of _drawTimeResizec                     t        | d      rG| j                  }|j                  }||c|_        |_        t        |d      r|j                  ||       y y y )N_canvas_drawTimeResize)hasattrrR   _drawingwidthheightrS   )selfr4   r<   canvasdrawings        rA   rS   z#_DrawTimeResizeable._drawTimeResizeq   sS    4	"\\FooG,-q)GM7>v/0&&q+ 1	 #rC   N)__name__
__module____qualname____doc__rS    rC   rA   rP   rP   o   s
    D,rC   rP   c                       e Zd Zi fdZy)_SetKeyWordArgsc                 N    |j                         D ]  \  }}t        | ||        y)z9In general properties may be supplied to the constructor.N)itemssetattr)rX   keywordskeyvalues       rA   __init__z_SetKeyWordArgs.__init__z   s(    "..* 	&JCD#u%	&rC   N)r[   r\   r]   rh   r_   rC   rA   ra   ra   y   s
     " &rC   ra   c                     | D cg c]  }||	 }}|sy |d   \  }}}}|dd  D ]$  \  }}}	}
||k  r|}|	|kD  r|	}||k  r|}|
|kD  s#|
}& ||||fS c c}w Nr   r   r_   )rectListrH   LxMinyMinxMaxyMaxx1y1x2y2s              rA   getRectsBoundsru      s    .q.A.TqTD$dabE RR9D9D9D9D $d## 	/s
   AAc                    |d||z
  z  z
  | z
  }d|d|z  z
  | z   z  }|| z
  }| g}||z  d|z  |z  z
  }|dk\  rt        |      }|dk  r| }d||z   z  }	g }
	 |
j                  |	|z         	 |
j                  ||	z         |dz  }|dz  }|
D ]4  }d|cxk  rdk  sn |j                  ||||z  |z   z  |z   z  | z          6 |j                  |       |S #  Y oxY w#  Y axY w)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crM   dqRr;   s               rA   _getBezierExtremar      s$   0 	BrEl2oAAbDnAeA	A 	
!ac!eA!tGQ3QB!A#J	HHQqSM	HHQqSM 	
S	Q 	-A!wQwAqs1uIaK+,	- HHRLH		s   C +C CC c           
          t        |       }| fd}t        t        |t        d|d                  }t        t        |t        d|d                  }t	        |      t	        |      t        |      t        |      fS )Nc                     ||    S Nr_   )ips     rA   <lambda>zgetPathBounds.<locals>.<lambda>   s
    QqT rC   r   rx   r   )r6   listmaprangerG   r5   )pointsr0   fxsyss        rA   getPathBoundsr      sd    FA!A	c!E!AaL!	"B	c!E!AaL!	"BGSWc"gs2w//rC   c                     | d   }t        |      rN| D cg c]  }|d   	 }}| D cg c]  }|d   	 }}t        |      t        |      t        |      t        |      fS t        |       S c c}w c c}w )z"Helper function for list of pointsr   r   )r   rG   r5   r   )	pointListfirstxyr   r   s        rA   getPointsBoundsr      sr    aLEU|'(be(('(be((BR#b'3r733Y''	 )(s
   A*A/c                   R    e Zd ZdZ e       Zd Zd
dZd ZddZ	d Z
er	 d Zd Zy	)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                 F    t        d| j                  j                  z        )zReturn a clone of this shape.z!No copy method implemented for %s)NotImplementedError	__class__r[   rX   s    rA   copyz
Shape.copy   s     ""EH_H_"_``rC   c                 j    i }| j                   j                         D ]  \  }}|dd dk7  s|||<    |S )zDInterface to make it easy to extract automatic
        documentationr   r   _)__dict__rc   )rX   recurpropsrf   rg   s        rA   getPropertieszShape.getProperties   sF     ----/ 	#JC1Qx3"c
	# rC   c                 :    | j                   j                  |       y)zfSupports the bulk setting if properties from,
        for example, a GUI application or a config file.N)r   update)rX   r   s     rA   setPropertieszShape.setProperties   s     	U#rC   c                     t        | j                         j                               }|j                          |r|dz   }|D ]  \  }}t	        ||d|        y)zConvenience. Lists them on standard output.  You
        may provide a prefix - mostly helps to generate code
        samples for documentation..z = N)r   r   rc   sortprint)rX   prefixpropListnamerg   s        rA   dumpPropertieszShape.dumpProperties  sW    
 **,2245c\F% 	7MT5u56	7rC   c                    | j                   | j                  j                         D ]&  }|d   dk7  s|| j                   v rJ d|d|         | j                   j                         D ]_  \  }}t	        | |      sJ d|d|        t        | |      }|j                  |      r=J d|d	|d
| j                  j                          yy)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 z
 found in zMissing attribute z from zInvalid value z for attribute z
 in class )	_attrMapr   keysrc   rT   getattrvalidater   r[   )rX   rf   attr	metavaluerg   s        rA   verifyzShape.verify  s     ==$}}))+ eq6S=$--/dZ]_c1dd/e $(==#6#6#8 KitT*YdTX,YY*d+ ))%0  Kejlprv  sA  sA  sJ  sJ  3K  K0K	 %rC   c                     t        | ||       y)zSBy default we verify.  This could be off
            in some parallel base classes.N)validateSetattr)rX   r   rg   s      rA   __setattr__zShape.__setattr__%  s     De,rC   c                     t        d      )5Returns bounding rectangle of object as (x1,y1,x2,y2)z+Shapes and widgets must implement getBoundsr   r   s    rA   	getBoundszShape.getBounds*  s    !"OPPrC   N)r   ) )r[   r\   r]   r^   AttrMapr   r   r   r   r   r   r
   r   r   r_   rC   rA   r   r      s@     yHa$
7K" 	6	-
QrC   r   c                       e Zd ZdZ e eedd       eed       eed       eedd       eed	d      
      Z	d Z
d ZddZd ZddZd Zd Zd Zd dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)!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                     | j                   j                         | _         g | _        d| _        |D ]  }| j	                  |        t
        j                  | |       y)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   addra   rh   )rX   elementsre   elts       rA   rh   zGroup.__init__=  sR     ++-& 	CHHSM	 	  x0rC   c                     |rO|t        | j                  j                               vrt        t              | j                  |<   t        | ||       yy)zLif name is not None add an attribute pointing to node and add to the attrMapN)r   r   r   AttrMapValueisValidChildrd   )rX   r   nodes      rA   _addNamedNodezGroup._addNamedNodeM  sC    4 2 2 455&2<&@d#D$% rC   Nc                     |@t        |      sJ d       | j                  j                  |       | j                  ||       yy)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   rz   r   )rX   r   r   s      rA   r   z	Group.addT  sE    
 %Z'ZZ%MM  &tD) rC   c                 B    | j                  |       | j                  d   S )Nr1   )r   r   )rX   r   s     rA   _nnz	Group._nn^  s    }}R  rC   c                     |Wt        |      sJ d       |dk  r|g| j                  || n| j                  j                  ||       | j                  ||       yy)z4Inserts sub-node n in contents at specified locationNz4Can only insert Shape or UserNode objects in a Groupr   )r   r   insertr   )rX   r   r0   r   s       rA   r   zGroup.insertb  s[    =?Z$ZZ?s%&Ca"$$Qq)tA& rC   c                 (   t        | t              xr  t        | j                  | j                        xs
 t	               }| j
                  j                         |_        t        |d      r| j                  dd |_        | j                  }|j                  j                  }|D ]\  }t        |t              r|j                         }n1t        |t              r|j                         }n|j                         } ||       ^ | j                  |       |S )z9Return a new object which only contains primitive shapes.r   N)
isinstanceDrawingrV   rW   r   r   r   rT   r   r   rz   UserNodeprovideNodeexpandUserNodesr   _copyNamedContents)rX   objself_contentsr}   childnewChilds         rA   r   zGroup.expandUserNodesl  s     g&J74::dkk+JUeg}}**,3{#T^^A5FS]LL" 	E%* ,,.E5) 002 ::<hK	 	$
rC   c                 6   t               }t        | d      r| j                  |_        t        |d      r| j                  dd |_        | j	                         dd }|r|j                  d      }t        |t              r |j                  |j                                nxt        |t               rW|j                         }|j                  dk(  r&|j                  j                  |j                         n#|j                  |       n|j                  |       |r|S )z return a fully expanded object	__label__r   Nr   r   )r   rT   r   r   getContentspopr   r   rz   r   _exploder   extendr   )rX   r   Pr0   s       rA   r   zGroup._explode  s    g4$..CM3{#T^^A5FS]q!aA!X&)Au%JJL;;-LL''

3GGAJ
  
rC   c                 \    | j                   D ]  }|j                   j                  |        y r   )r   rz   )rX   r   r   s      rA   _copyContentszGroup._copyContents  s'    ]] 	'ELL&	'rC   c                 P   ddl m } | j                  }|s#t        | j                  j	                               }| j
                  j                         D ]R  \  }}||v r,|j                  |      }t        |||j                  |          6||v s;||vs@t        || ||             T y )Nr   )r   )	r   r   r   r   r   r   rc   indexrd   )	rX   r   aKeysnoCopyr   r   kvposs	            rA   r   zGroup._copyNamedContents  s    d4==#5#5#78eMM'') 	)DAqM!#))!,QS 12eQQ(	)rC   c                     | j                   j                         |_         | j                  |       | j                  |       |S )zcopies to obj)r   r   r   r   rX   r   s     rA   _copyzGroup._copy  s7    }}**,3$
rC   c                 @    | j                  | j                               S )zreturns a copy)r   r   r   s    rA   r   z
Group.copy  s    zz$..*++rC   c                 L    t        | j                  t        |            | _        yz&Convenience to help you set transformsN)mmultr   rF   )rX   thetas     rA   rF   zGroup.rotate  s    t~~ve}=rC   c                 N    t        | j                  t        ||            | _        yr   )r   r   	translate)rX   dxdys      rA   r   zGroup.translate  s    t~~yR/@ArC   c                 N    t        | j                  t        ||            | _        yr   )r   r   scale)rX   sxsys      rA   r  zGroup.scale  s    t~~uR}=rC   c                 r    t        t        | j                  t        |            t        |            | _        yr   )r   r   skewXskewY)rX   kxkys      rA   skewz
Group.skew  s#    uT^^U2Y?b	JrC   c                 6    | j                   dd ||fz   | _         y)z2Convenience function to set the origin arbitrarilyN)r   rX   rH   rI   s      rA   shiftzGroup.shift  s    ,aU2rC   c                     t         | _        | j                  j                  | j                         || _        || _        y)z| Convenience function to make a drawing from a group
            After calling this the instance will be a drawing!
        N)r   r   r   r   _xtraAttrMaprV   rW   )rX   rV   rW   s      rA   	asDrawingzGroup.asDrawing  s1     !T../
rC   c                 P    t        | dd      }| j                  }|r
||vr|g|z   }|S )z[Return the list of things to be rendered
        override to get more complicated behaviour
backgroundN)r   r   )rX   r~   rK   s      rA   r   zGroup.getContents  s3     Dd+MM!!QQrC   c                 <   | j                   rg }| j                   D ]!  }|j                  |j                                # t        |      }|y |\  }}}}| j                  }||g||g||g||gg}g }	|D ]  }
|	j                  t        ||
              t        |	      S y r   )r   rz   r   ru   r   transformPointr   )rX   r~   elemrq   rr   rs   rt   transcorners
newCornerscorners              rA   r   zGroup.getBounds  s    ==A +)*+"Bz$NBBNNE2wR2r(RG<GJ! A!!."?@A":.. rC   r   )N)r   )r[   r\   r]   r^   r   r   isTransformisListOfShapes	isBooleanr   rh   r   r   r   r   r   r   r   r   r   r   rF   r   r  r	  r  r  r   r   r_   rC   rA   r   r   .  s    <  2Vefg4QR&y6ST$Y4O^_`$Y4Tcde
H1 &*!',*'	),>B>K3rC   r   c                     ddl m} | j                  } ||      j                  }|xs |j                  }||vr|g||<   y|||   vr||   j	                  |       yy)z7add an import of obj's class to a dictionary of importsr   )	getmoduleN)inspectr  r   r[   rz   )r   Ir0   r  r   ms         rA   _addObjImportr"    s[    !A!A	QZZAzs!	
!A$	!A 
rC   c                 z   t        | t              rt        |       S t        |       rRd}| D ]  }|dt	        ||      z  z   } t        | t
              rd|dd z  S d|dd t        |       dk(  xr dxs dd	S | t        u r|rt        | |d
       y
t        | t              r|rt        | |       ddl
m}  || j                        \  }}}}}	}
}|r|t        |       d }|t        |       d= ng }| j                         }| j                  j                  dz   }|dd D ]&  }|j!                  |d      }|dt	        ||      z  z  }( |D ])  }|j!                  |d      }||dt	        ||      dz  }+ |j#                         D ]  \  }}||   }||dt	        ||      dz  }! |dd d	z   S t%        |       S )zEreturn a repr style string with named fixed args first, then keywordsr   z%s,z[%s]Nr1   (r   ,)EmptyClipPathr   )getfullargspec=)r   floatr   r   _reprr   r6   r'  r"  r   r  r(  rh   r   r   r[   r   rc   repr)rX   r   r/   r   r(  argsvarargsvarkwdefaults
kwonlyargskwonlydefaultsannotationskargsr   r0   s                  rA   r+  r+    s   $ud|	t 	'AEE!AJ&&A	'd4 AcrF?" !  !"vc$il&:s&@b&@AA		mD?3	D	mD#*R`aeananRoOguh
NK#h-)Ec(m^_%E NN##C'ab 	$AaAq##A	$  	+AaAQuQqz**A	+ 779 	,CAa!AQa
++A	, "vczDzrC   c           	      T   d}t        | dd       }|r|||dt        |      dz   }| j                  }|D ]o  }t        |t              rFd|z  }|dz  }t        |dd      }	|	rd|	z   }	|||d	|d
|	dz   }|t        |||||      z   }|dz  }Y|||dt        ||      dz   }q |S )Nr   r   z.transform = 
zv%dr   r   #r)  z._nn(Group())z.add(z)
)r   r+  r   r   r   _renderGroupPy)
Gpfxr   r   indentr/   rK   r0   npfxls
             rA   r8  r8    s    
A+d#AafSqBC!	
A 
?a19DFA+b)ACE!&c!DDAN1T!Af55AFAs51:>>A
? HrC   c                     |j                  | j                         t        |      }|j                         D ci c]  \  }}|j	                  |      s||d  | c}}S c c}}w r   )r   r   r6   rc   
startswith)rX   r:  kwr0   r   r   s         rA   _extraKWrA  /  sN    IIdmmCA!xxz?!Q\\#->AabE!G???s   A A c                      e Zd ZdZh dZeh dz
  Z e eed       eed       ed       ee	d       e e
d	d
dd      d       e e
dddd      d       eed       eed       eed      	      Z ee e e e
e dd      d            Zej#                  e       d$dZd ZefdZd Zd Zd Zd  Zd%d!Zd&d"Zd'd#Zy)(r   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>   rC  rD  rF  rJ  rL  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)	rV   rW   canvr  hAlignvAlignrenderScaleinitialFontNameinitialFontSizer   r   )loemptyOKzOne or more plot modes)BASEformatsc                     d | _         t        j                  | g|i | || _        || _        d| _        d| _        d| _        y )NrT  rY        ?)r  r   rh   rV   rW   r[  r\  r]  )rX   rV   rW   nodesre   s        rA   rh   zDrawing.__init__d  sC    t.U.X.
rC   c           	      x   g dg dd}t        | j                         d|      }d| j                  j                  z   }d}|j	                         D ]-  \  }}|d|dt        |      d	d
 j                  dd      dz   }/ |d|z  z   }|d| j                  d| j                  dz   }|dz   }||z   }|d|z  z   }|S )N)_DrawingEditorMixinr   r   )Color	CMYKColor
PCMYKColor)zreportlab.graphics.shapeszreportlab.lib.colorsrX   ExplodedDrawing_z0#Autogenerated by ReportLab guiedit do not edit
zfrom z import r   r1   'r   r6  z(
class %s(_DrawingEditorMixin,Drawing):
z	def __init__(self,width=z,height=z,*args,**kw):
z1		Drawing.__init__(self,width,height,*args,**kw)
zZ

if __name__=="__main__": #NORUNTESTS
	%s().save(formats=['pdf'],outDir='.',fnRoot=None)
)	r8  r   r   r[   rc   strreplacerV   rW   )rX   r   r9  r0   r/   r!  os          rA   	_renderPyzDrawing._renderPym  s    -V(J 4==?6!4!8!88?GGI 	MDAqQs1va|/C/CC/KLLA	M<q@@4::VZVaVabbFFEuxyyyrC   c                     ddl m} |j                  | | j                  dd|t        ur|       yt        | dt                     y)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.graphicsrt  drawrZ  r   r   )rX   rw  rt  s      rA   ry  zDrawing.draw~  sI     	1tTYY1-9-H\ 	 	uNUVZ[jkrNs 	 	urC   c                 p    | j                   }| j                  }| j                  }|dk7  r
||z  }||z  }||fS )Nre  )rV   rW   r]  )rX   
availWidthavailHeightrV   rW   r]  s         rA   wrapzDrawing.wrap  sE    

&&[ Ek!Ff}rC   c                 t    t         j                  |       }| j                  |_        | j                  |_        |S )z:Return a new drawing which only contains primitive shapes.)r   r   rV   rW   r   s     rA   r   zDrawing.expandUserNodes  s-    ##D)JJ	[[

rC   c                 l    | j                  | j                  | j                  | j                              S )zReturns a copy)r   r   rV   rW   r   s    rA   r   zDrawing.copy  s$    zz$..T[[ABBrC   c                 6    | j                  t        |i |      S r   )r   r   )rX   r-  r@  s      rA   asGroupzDrawing.asGroup  s    zz%++,,rC   c                 :   |j                  dd      }t        |t              rd|z  }nd}|dz  }ddlm} d}	|s`t        | d| j                  j                  dz         }t        | d	d      }
t        |
d
      r |
|       }
t        |d
      r	 ||
      }n	 ||
z  }|t        | dd      }t        |d
      r ||       }t        j                  j                  |      r#t        j                  j                  |      \  }}n|xs t        | dd      }|j!                         j!                  t        j"                        }|sd}t        j                  j                  |      sYt        j                  j%                  t        | dt        j                  j'                  t(        j*                  d               |      }t        j                  j-                  |      st        j.                  |       t        j                  j1                  t        j                  j%                  ||            }t        j                  j3                  |      }|d   dd j5                         | j6                  v r|d   }|xs t        | ddg      D cg c]  }|j5                          }}|duxr |fxs t        | d|      fd   }t8        j:                  j<                  t8        j>                  j<                  f}|xt8        j:                  _        t8        j>                  _        d|v rddl m!} |dz   }|rtE        |d|fz          |jF                  | ||fdt        | d|jH                        itK        | dfi | |	dz   }	t(        jL                  dk(  r:ddl'}ddl(}|jS                  |      jU                  dd       |jW                  |       | jX                  D ]  }||v sddl m-} |d|}|rtE        |||fz         t        | dd      }|r2t        |d|g      }||v rt        |d d      s|j]                          nd} |jF                  | |f|t        | d|jH                        d!tK        | d"fi | |	d#z   |z   }	|s|j_                  |        d$|v r	 dd%l0m1} |d'z   }|rtE        |d(|fz          |jF                  | |f|t        | d)d*g      d   t        | d)dd+g      d   t        | d,|jh                        t        | d|jH                        t        | d-|jj                        d.tK        | d/fi | |	d0z   }	d1|v rXdd2l m6} |d3z   }|rtE        |d4|fz          |jF                  | |fdt        | d|jH                        itK        | d5fi | |	d6z   }	d7|v rXdd&l m3} |d8z   }|rtE        |d(|fz          |jF                  | |fdt        | d|jH                        itK        | d/fi | |	d9z   }	d:|v rw|d;z   }|rtE        |d:|fz         to        |d<      5 }|jq                  ts        | ju                         jw                  d=t        jx                                     ddd       |	d>z   }	|\  t8        j:                  _        t8        j>                  _        t        | d?      r| j{                  ||	       |	xr ||	dd z   xs dS # t        $ r)}t        |      j                  d      dk  r Y d}~Td}~ww xY wc c}w # td        $ r
 dd&l m3} Y xw xY w# 1 sw Y   xY w)@zSaves 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   rc  rJ  r   rs  z.pdfPDFrw  
showBorder_renderPDF_z/.pdfmacCAROzPDF renderPM_drawTimeCollectordisabledfmtrw  
_renderPM_z/.rF  renderPS_SEPrenderPSz.epsEPSEPS_infoTesting	ReportLabpreview	ttf_embed)titledeptcompanyr  rw  r  
_renderPS_z/.epsrL  	renderSVGz.svgSVG_renderSVG_z/.svgrC  z.psz/.psrD  z.pywbr6  z/.py
saveLogger)>r   r   int	reportlabr  r   r   r[   rT   	TypeErrorrn  findospathisabssplitrstripsepjoindirnamesysargvisdirmakedirsnormpathsplitextlower
_saveModesr   warnOnceenabledinfoOncerx  rt  r   
drawToFilerw  rA  platformmacfs
macostoolsFSSpecSetCreatorTypetouched_bmModesr  clearsaverlextra.graphicsr  ImportErrorr  eps_previeweps_ttf_embedr  openwriter   rq  ro  linesepr  )rX   rc  r   fnRootr  r  r@  genFmtr  extr  errfnrootplotModerH   _savedrt  filenamer  r  bmFmtr  dtcdtcfmtsr  r  r   s                              rA   r  zDrawing.save  s*    B'fS!v%FF))'T"3T^^5L5LV5SUFd9Q/Gwz*!$-vj)O#g-F >T(40F6*%D\F77== WW]]62NFF9wtHS9F''/vww}}V$rww||GDY[Y`Y`YhYhiliqiqrsitYu<vw}/~fww}}V$bkk&&9!!"'',,vf"=>77##F+A;qr?  "doo5a[F(/(R74	5'3RT!AGGITT$&5G:['$yQX:Y9[]^_((&//*A*AA<CC&//"9H4f}Hfh'778 I  x  \WTR^_h_u_uEv  \  zB  CG  HU  z[  XZ  z[  \.C||U"(X&55ffE""8,]] 	+E 7&,U3E&E(+;";<d#7=%c)UG<G'Jq0I		"###D(  `u'RVWcdmdzdzJ{  `  G  HL  MY  _  \^  _  `Dj5(*	+  H8E f}Hfh'778H (D(.'.tJ	{'KA'N*1$z2kBR*STU*V*1$yAVAV*W-4T,yG]G]-^*1${9CZCZ*[D #+4"Br"BD .CH4f}Hfh'778 I   (D-4T,yG]G]-^Daijno|  bC  @B  bCD .C83e|Hfh'778Hh  SWT,W`WmWm=n  Sqyz~  @L  rR  OQ  rR  S-C8e|HfX67ht$ L 0 8 8bjj IJKL-C;A8!84%OOF3'%vc!"g~++C ! O 3x}}%BCaGGO, UD  8778DL Ls=   [ [6[; A\	[3
[..[3;\\\c           	         || j                   v s
J d|z         ddlm} |dk(  rddlm} |j                  |       S || j                  v r<ddlm}  |j
                  | f|t        | d|j                        dt        | d	fi |S |d
k(  r0	 ddlm} |j                  | |t        | d|j                              S |dk(  r.ddlm} |j                  | t        | d|j                              S |dk(  r| j                         S |dk(  r;ddlm}	  |	j
                  | fdt        | d|j                        it        | dfi |S y# t        $ r	 ddlm} Y w xY w)z,Converts to an 8 bit string in given format.zUnknown file format "%s"r   r  rJ  rs  r  r  r  r  rF  r  r  )r  rw  rC  rv  rD  rL  r  rw  r  N)r  r  r  rx  rt  drawToStringr  r  r   rw  rA  r  r  r  r  rq  r  )
rX   formatr   r  r@  r  rt  r  r  r  s
             rA   asStringzDrawing.asString  s   (M*Dv*MM('U?4))$//t}}$3(8(( X6wtT`%22H4 X6>tL6VSU6VX Xu_8E ((*1-4T,yG]G]-^ ) ` ` t^3((GDV_VlVl<m(nnt^>>##u_4)9))$  SGDV_VlVl<m  Spxy}  L  qR  OQ  qR  S  S   878s   E EEc                 ,   | j                         }| j                  }| j                  }t        ||g| }	|	j	                         \  }
}}}|dk(  s|dk(  rO|
|k  s|||z
  kD  s||k  s|||z
  kD  r5||
z
  |z   |z   |	_        ||z
  |z   |z   |	_        dddd||
z
  ||z
  f|	_        |	S |dk(  s|dk(  r/|
|k  s|||z
  kD  r"||
z
  |z   |z   |	_        dddd||
z
  df|	_        |	S |dk(  s|dk(  r-||k  s|||z
  kD  r ||z
  |z   |z   |	_        ddddd||z
  f|	_        |	S )	z?return a base class drawing which ensures all the contents fitsfitexpandr   r   fitxexpandxfityexpandy)r   rV   rW   r   r   r   )rX   kindlpadrpadbpadtpadrK   oWoHrZ   xLyLxHyHs                 rA   resizedzDrawing.resized7  sg   ZZ[["R##'')2b;4>r$w"RW*4SUVXY]V]S]rE$JtOGMU4Z_GN!"1Qqbb 9G  6\dIo2d7bDjrE$JtOGM!"1Qqb 3G  6\dIo2d7bDjU4Z_GN!"1Qq47 3GrC   )i     )NNNNr   )Nr   )r  r   r   r   r   )r[   r\   r]   r^   r  r  r   r   isNumberisValidChildOrNoneOneOfisStringOrNoneisNumberOrNoner  r   
SequenceOfr   r   rh   rq  r   ry  r}  r   r   r  r  r  r  r_   rC   rA   r   r   4  s   J( 99HX+EFh,GHD!!"4:yzeFGXxHO|}eE8XxHOz{ #81OP&~;kl&~;kl
L E":z"Q$ &>@H
 OOL!"  ' uC-z,xS<rC   r   c                       e Zd ZdZddZy)rh  z<This is a mixin to provide functionality for edited drawingsNc                 x   t        |      }|r\t        |d      rPd|j                  vr|j                  j	                         |_        |r|t         }t        ||      |j                  |<   t        |d      r+|r)|r|j                  |||       y|j                  ||       y|rt        |||       y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   rT   r   r   r   r   r   r   rd   
ValueError)rX   r   rg   r   r   r   r   ivcs           rA   _addz_DrawingEditorMixin._addL  s     5!GC
+-"||113x'L!-ht!<CLL3u#

3uT*d#CU#344rC   NNNN)r[   r\   r]   r^   r   r_   rC   rA   rh  rh  J  s
    F5rC   rh  c                       e Zd Zd Zy)isStrokeDashArrayc                     t         j                  |      xs6 t        |t        t        f      xr t        |d         xr t        |d         S rj   )isListOfNumbersOrNonetestr   r   tupler  isListOfNumbers)rX   rH   s     rA   r  zisStrokeDashArray.testa  sG    $))!,yAtEl1K1xPXYZ[\Y]P^1xcrstuvswcxyrC   N)r[   r\   r]   r  r_   rC   rA   r  r  `  s    zrC   r  c                       e Zd Z e ee       ee       e eddd      d       e eddd      d       eed       eed       ee	d	       ee
d
       ee
dd      	      Zd Zy)	LineShaper   r   rx   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                     t         d   | _        d| _        d| _        d| _        d| _        d | _        d | _        | j                  |       y )Nr   r   r   )	STATE_DEFAULTSr   r   r   r   r    r"   r#   r   rX   r@  s     rA   rh   zLineShape.__init__t  sM    )-8 !#!2rC   N)r[   r\   r]   r   r   isColorOrNoner  r  r  	isOpacityr  r   rh   r_   rC   rA   r
  r
  e  s     "=1"8,$U1Qq\7\]%eAal8^_'6\]&'8>^_$Y4{|&y6ST$Y4Tcde

HrC   r
  c            
       r    e Zd Z ee eed       eed       eed       eed            Zd Zd Z	y)Liner   r   )rb  rq   rr   rs   rt   c                 h    t         j                  | |       || _        || _        || _        || _        y r   )r
  rh   rq   rr   rs   rt   )rX   rq   rr   rs   rt   r@  s         rA   rh   zLine.__init__  s.    4$rC   c                 ^    | j                   | j                  | j                  | j                  fS )r   )rq   rr   rs   rt   r   s    rA   r   zLine.getBounds  s!    $''47733rC   N)
r[   r\   r]   r   r
  r   r  r   rh   r   r_   rC   rA   r  r  ~  s@    I(+(+(+(+	
H4rC   r  c                       e Zd Z ee eed       eed       eed       eedd       e e	e
e                  Zd	 Zy
)
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   )rb  r(   r$   r%   r'   r)   c                 Z    t         d   | _        d | _        t        j	                  | |       y )Nr(   )r  r(   r$   r
  rh   r  s     rA   rh   zSolidShape.__init__  s(    '4 	4$rC   N)r[   r\   r]   r   r
  r   r  r  r  r  r   r   r   rh   r_   rC   rA   r  r    sS     I 4Z["92{|$Y4OP$Y4TcdemM BC
H%rC   r  ry   )rx   rx      r   )moveTolineTocurveTo	closePathc                 R   | j                   }d}d}d}| }| j                  D ]]  }	|	t        k(  r'|r |r
t        k7  r|dz  }|r |t                   |dz  }t        |	   }||z   } ||	   |||   |}|	t        k(  r|dz  }|	}
_ |r |r
t        k7  r|dz  }|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js                rA   _renderPathr*    s     [[F	ALI]Fnn =j A%L-	*-/NI"2&I	"va{#AL iCO!Ij!#$$rC   znon-zerononzerozeven-oddevenoddc                       e Zd ZdZ ee ee       ee       ee       e e	 e
dd                   e e
ee                  ZddddefdZd Zd	 Zd
 Zd Zd Zd Zy)Pathz2Path, made up of straight lines and bezier curves.rL  rJ  )rb  r   r  
isClipPath	autocloser)   Nr   c                     t         j                  | |       |g }|g }t        |      dz  dk(  sJ d       || _        || _        || _        || _        || _        y Nrx   r   -Point list must have even number of elements!)r  rh   r6   r   r  r/  r0  r)   )rX   r   r  r/  r0  r)   r@  s          rA   rh   zPath.__init__  sf    D"%>FI6{Q!#T%TT#"$  rC   c                     | j                  | j                  d d  | j                  d d        }|j                  | j	                                |S r   )r   r   r  r   r   rX   news     rA   r   z	Path.copy  s?    nnT[[^T^^A->?$,,./
rC   c                 |    | j                   j                  ||g       | j                  j                  t               y r   )r   r   r  rz   r  r  s      rA   r  zPath.moveTo  *    Aq6"g&rC   c                 |    | j                   j                  ||g       | j                  j                  t               y r   )r   r   r  rz   _LINETOr  s      rA   r  zPath.lineTo  r8  rC   c                     | j                   j                  ||||||g       | j                  j                  t               y r   )r   r   r  rz   _CURVETO)rX   rq   rr   rs   rt   x3r|   s          rA   r  zPath.curveTo  s3    BBB34h'rC   c                 B    | j                   j                  t               y r   )r  rz   r  r   s    rA   r  zPath.closePath  s    j)rC   c           	         | j                   }	 g }|j                  }|j                  }g }|j                  }|j                  }d}| j                  D ]  }	t        |	   }
||
z   }|
dk(  r |||           |||dz             nN|
dk(  rI|||d   \  }}} |t        |d   |||             ||dz   |d   \  }}} |t        |d   |||             |} t        |      t        |      t        |      t        |      fS #  t        |      cY S xY w)Nr   rx   r   r  r1   )	r   rz   r   r  r   r   rG   r5   r   )rX   r   rL   aXeXrM   aYeYr   r'  r(  r)  rq   rs   r=  rr   rt   r|   s                     rA   r   zPath.getBounds  s'   	)ABBABBAnn *2.I!8vayMvac{OAX%a!e}HBr"(2r"R89%ac!AgHBr"(2r"R89 q6#a&QA..	) ((s   C-C< <D)r[   r\   r]   r^   r   r  r   r  r  NoneOrr  r   r   r   rh   r   r  r  r  r  r   r_   rC   rA   r.  r.    s}    <Jo. 1!), eE(:!;<mM BC
H #dqD[h !
''(*)rC   r.  c           	         ||}g }t         dz  }	||	z  }
||	z  }||
k  r|dt         z  z   }||
k  rt        ||
z
        }|j                  }|dkD  r;t        ||xs d      }||	z  }t	        t        ||z  dz         d      }||z  }|dz  }nd}d}t        |      D ]2  }|
||z  z   } || |t        |      z  z   ||t        |      z  z   f       4 |r|j                          |S )N     f@rx   MbP?re        ?r   r   )
r   r*  rz   rG   r5   r  r   r   r   reverse)centerxcenteryradiusstartangledegreesendangledegreesyradiusdegreedeltarI  r   degreestoradians
startangleendanglerJ   r}   radiansdeltar0   s                   rA   getArcPointsrU    s!   &F%x"#33J//H
:
AbD= :
(Z'(EATz% 1r2"#33E,&s*+A.Qw	Qq B5--	76#e*$$WWSZ-?%?
@AB  MrC   c                       e Zd ZdZddZy)ArcPathzPath with an addArc methodNc
           
          t        ||||||||	      }
|st        | j                        s!| j                  |
d   d   |
d   d          |
d= |
D ]  \  }}| j	                  ||        y )N)rO  rP  rI  r   r   )rU  r6   r  r  r  )rX   rJ  rK  rL  rM  rN  rO  rP  r  rI  r   rH   rI   s                rA   addArczArcPath.addArc6  st    '63Do_ft  JQ  RT^^,KK!Q!Q(!'DAqt{{1Q''rC   r  )r[   r\   r]   r^   rY  r_   rC   rA   rW  rW  4  s
    $(rC   rW  c                    g }g }| D ]  }t        |      s|}g }	n
|d   }|dd  }	|t        vrt        d|z        t        j                  |      }
t	        |	      t
        |
   k7  rt        |dt        |	            |j                  |
       |j                  t        |	              |df|dffD ]+  \  }}t        |t	        |      d      D ]  }||   |z   ||<    - |j                  dd       }|rdD ]  }||   ||dz      f}|d   |d   ||d d   }t        |      t        |      }}|d   |d   t        |      t        |      }}||z
  }t        |      dk\  r5||z
  |z  }t        |t	        |      d      D ]  }||||   |z
  z  z   ||<    t        |t	        |      d      D ]  }||z   d	z  ||<    |d   |d   |z
  n|d   |z
  }t        |t	        |      d      D ]  }||xx   |z  cc<     t        |||fi |S )
Nr   r   zbad operator name %sz bad arguments rx   bbox)r   r   gư>rH  )r   _PATH_OP_NAMESr  r   r6   r   rn  rz   r   r   r   r   rG   r5   absr.  )pathSegsr/  r   r   r@  Or   segopNamer-  r'  r   rp  r   r[  r)  r}   r~   r   facs                       rA   
definePathrc  =  sp   
A
A SzFDVFqr7D'3f<==!!&)t9(,,fSYGHH		d 1v1v~ !qQ" 	AQ46AaD	 66&D 	AQQqS	!At|!h!$Q$Aq63q6qAtAaD$41vs1v1ss8T>Q3)C"1SVA. 0 3!Q</!0 #1SVA. + !As{!+
 !"! 0AaD1HadQhqQ* AaDAID)	. !J$$$rC   c                       e Zd ZdZ ee ee       ee       eed       eed       ee       ee            Zd
dZ	d Z
d Zy	)Rectz)Rectangle, possibly with rounded corners.width of the object in pointsr   height of the objects in points)rb  rH   rI   rV   rW   rxryc                     t         j                  | |       || _        || _        || _        || _        || _        || _        y r   )r  rh   rH   rI   rV   rW   rh  ri  )rX   rH   rI   rV   rW   rh  ri  r@  s           rA   rh   zRect.__init__{  s<    D"%
rC   c                     | j                  | j                  | j                  | j                  | j                        }|j                  | j                                |S r   )r   rH   rI   rV   rW   r   r   r5  s     rA   r   z	Rect.copy  sB    nnTVVTVVTZZE$,,./
rC   c                     | j                   | j                  | j                   | j                  z   | j                  | j                  z   fS r   rH   rI   rV   rW   r   s    rA   r   zRect.getBounds  s3     3TVVdkk5IJJrC   N)r   r   )r[   r\   r]   r^   r   r  r   r  r   rh   r   r   r_   rC   rA   re  re  o  sW    3J""X+JKh,MN(#(#
H
KrC   re  c            
           e Zd ZdZ ee ee       ee       eed       eed       ed            Z	d Z
d Zd	 Zy)
ImagezBitmap image.rf  r   rg  N)rb  rH   rI   rV   rW   r  c                 v    t         j                  | |       || _        || _        || _        || _        || _        y r   )r  rh   rH   rI   rV   rW   r  )rX   rH   rI   rV   rW   r  r@  s          rA   rh   zImage.__init__  s5    D"%
	rC   c                     | j                  | j                  | j                  | j                  | j                  | j
                        }|j                  | j                                |S r   )r   rH   rI   rV   rW   r  r   r   r5  s     rA   r   z
Image.copy  sH    nnTVVTVVTZZdiiP$,,./
rC   c                     | j                   | j                  | j                   | j                  z   | j                  | j                  z   fS r   rm  r   s    rA   r   zImage.getBounds  s3     3TVVdkk5IJJrC   )r[   r\   r]   r^   r   r  r   r  r  r   rh   r   r   r_   rC   rA   ro  ro    sO    J""^1PQn2STD!
H
KrC   ro  c            	       f    e Zd Z ee eed       eed       eed            Zd Zd Z	d Z
y	)
Circlex of the centrer   y of the centreradius in points)rb  cxcyrc                 Z    t         j                  | |       || _        || _        || _        y r   )r  rh   rx  ry  rz  )rX   rx  ry  rz  r@  s        rA   rh   zCircle.__init__  s'    D"%rC   c                     | j                  | j                  | j                  | j                        }|j	                  | j                                |S r   )r   rx  ry  rz  r   r   r5  s     rA   r   zCircle.copy  s<    nnTWWdggtvv6$,,./
rC   c                     | j                   | j                  z
  | j                  | j                  z
  | j                   | j                  z   | j                  | j                  z   fS r   )rx  rz  ry  r   s    rA   r   zCircle.getBounds  sH    $&& $''DFF"2DGGdff4DdggPTPVPVFVWWrC   Nr[   r\   r]   r   r  r   r  r   rh   r   r   r_   rC   rA   rt  rt    s?    J((9:((9:'9:
H
XrC   rt  c            
       x    e Zd Z ee eed       eed       eed       eed            Zd Zd Z	d	 Z
y
)Ellipseru  r   rv  zx radiuszy radius)rb  rx  ry  rh  ri  c                 h    t         j                  | |       || _        || _        || _        || _        y r   )r  rh   rx  ry  rh  ri  )rX   rx  ry  rh  ri  r@  s         rA   rh   zEllipse.__init__  s.    D"%rC   c                     | j                  | j                  | j                  | j                  | j                        }|j                  | j                                |S r   )r   rx  ry  rh  ri  r   r   r5  s     rA   r   zEllipse.copy  sB    nnTWWdggtww@$,,./
rC   c                     | j                   | j                  z
  | j                  | j                  z
  | j                   | j                  z   | j                  | j                  z   fS r   )rx  rh  ry  ri  r   s    rA   r   zEllipse.getBounds  sH    GGdgg%tww'8$''DGG:KTWWW[W^W^M^__rC   Nr~  r_   rC   rA   r  r    sH    J((9:((9:(
3(
3	
H
`rC   r  c                       e Zd ZdZ ee eed       eed       eed       ee       ee       ee       ee       ee       ee	d      
      Z
dZ	 	 dd
Zd Zd Zd Zd Zy	)WedgeznA "slice of a pie" by default translates to a polygon moves anticlockwise
       from start angle to end angleru  r   rv  rw  ztreat as annular ring)
rb  rJ  rK  rL  rM  rN  rO  radius1yradius1annularr   Nc                     t         j                  | |       ||k  r|dz   }||k  r|||||f\  | _        | _        | _        | _        | _        || _        || _        y )Nih  )	r  rh   rJ  rK  rL  rM  rN  rO  r  )	rX   rJ  rK  rL  rM  rN  rO  r  r@  s	            rA   rh   zWedge.__init__  sk    D"%//-c1O // Wf&7H 	^dlDK1GI]rC   c                 ~    t        | dd       }|| j                  }t        | dd       }t        | d|      }||}|||fS )NrO  r  r  )r   rL  )rX   rO  r  r  s       rA   
_xtraRadiizWedge._xtraRadii  sO    $	40?dkkG$y$/4
73?hG))rC   c                 *   | j                   }| j                  }| j                  }| j                         \  }}}| j                  }| j
                  }t        dz  }	||	z  }
||	z  }||
k  r|dt        z  z   }||
k  rt        ||
z
        }g }|dkD  rEt        | j                  xs d|      }||	z  }t        dt        ||z  dz               }||z  }|dz  }nd}d}g }|j                  }|j                  }t        |      D ]&  }|
||z  z   } |t        |      t        |      f       ( |D ]!  \  }} ||||z  z           ||||z  z          # |dk(  s||dk(  s| ||        ||       n6|j!                          |D ]!  \  }} ||||z  z           ||||z  z          # | j"                  rt%        t'        | dt(              	      }|j+                  |d   |d          t        dd|z  d      D ]  }|j-                  ||   ||dz              |j/                          |j+                  |d|z     |d|z  dz             t        d|z  dz   d
|z  d      D ]  }|j-                  ||   ||dz              |j/                          |S t1        |      S )NrF  rx   rG  re  r   rH  r   r)   )r)   ry   )rJ  rK  rL  r  rM  rN  r   r*  rG   rP  r5   r  rz   r   r   r   rI  r  r.  r   r   r  r  r  Polygon)rX   rJ  rK  rL  rO  r  r  rM  rN  rQ  rR  rS  rJ   r   rP  rT  r0   CACAAr}   r   r/   r   rH   s                           rA   	asPolygonzWedge.asPolygon  s   ,,%)__%6"( 22..e8&'77
"#33z!"}H z!hz)*;d..4"U;K&'77LAc%,S012A 7LFAALiiMM1X 	)Eu\11EUCJ'(	)  	!CAagfQhggai 	! QJ'/!x?OgJ'
JJL &!''!)#$'(1*$%& <<gd:}EFAHHVAYvay)1QqS^ 06!A#;/0KKMHHVAaC[!A/1Q3q51Q' 06!A#;/0KKMH6?"rC   c                     | j                  | j                  | j                  | j                  | j                  | j
                        }|j                  | j                                |S r   )r   rJ  rK  rL  rM  rN  r   r   r5  s     rA   r   z
Wedge.copy4  sT    nnT\\LLKK**((	*
 	$,,./
rC   c                 >    | j                         j                         S r   )r  r   r   s    rA   r   zWedge.getBounds=  s    ~~))++rC   )NF)r[   r\   r]   r^   r   r  r   r  r  r  r   rP  rh   r  r  r   r   r_   rC   rA   r  r    s    ( Jx->?x->?h,>?(2&x0~.~./y.EF

H K]a	*4#l,rC   r  c                   J    e Zd ZdZ ee eed            Zg fdZ	d Z
d Zy)	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   rb  r   c                 v    t         j                  | |       t        |      dz  dk(  sJ d       |xs g | _        y r2  )r  rh   r6   r   )rX   r   r@  s      rA   rh   zPolygon.__init__H  s9    D"%6{Q!#T%TT#lrC   c                 z    | j                  | j                        }|j                  | j                                |S r   r   r   r   r   r5  s     rA   r   zPolygon.copyM  0    nnT[[)$,,./
rC   c                 ,    t        | j                        S r   r   r   r   s    rA   r   zPolygon.getBoundsR      t{{++rC   N)r[   r\   r]   r^   r   r  r   r  r   rh   r   r   r_   rC   rA   r  r  @  s4    ) Jo3jk
H ! #

,rC   r  c                   J    e Zd ZdZ ee eed            Zg fdZ	d Z
d Zy)	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.r  r   r  c                     t         j                  | |       |xs g }t        |      }|r^t        |d         r8g }|D ]'  \  }}|j	                  |       |j	                  |       ) |}|| _        y t        |      dz  dk(  sJ d       || _        y )Nr   rx   r3  )r
  rh   r6   r   rz   r   )rX   r   r@  	lenPointsrl   rH   rI   s          rA   rh   zPolyLine.__init__^  s    4$2K	VAY#  EQqHHQKHHQK    6{Q!+\-\\+rC   c                 z    | j                  | j                        }|j                  | j                                |S r   r  r5  s     rA   r   zPolyLine.copym  r  rC   c                 ,    t        | j                        S r   r  r   s    rA   r   zPolyLine.getBoundsr  r  rC   N)r[   r\   r]   r^   r   r
  r   r  r   rh   r   r   r_   rC   rA   r  r  U  s4    4 Io3jk
H ! 
,rC   r  c                       e Zd ZdZ ee e ee e	ed      fd      d       e ee
edf      d       e ee
ed	f      d
            Zddg fdZy)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)rb  xyListsanglesspacingsrx   -   c           
      L   t        j                  | fi | t        |      r|f}t        |      r|f}t        |      r|f}t	        |      t	        |      z
  }|dkD  rt        |      ||d   gz  z   }|| _        || _        || _        | j                  }| j                  }t        |      D ]  \  }}||   }	t        |      }t        |      }
t        |      }d}| }|D ]I  }t        dt	        |      d      D ].  }||dz      |
z  ||   |z  z
  }t!        ||      }t#        ||      }0 K t%        t'        ||	z              dz
  }t%        t'        ||	z              dz   }t        ||      D ]4  }g }|	|z  }|D ]  }t	        |      dz
  }t        dt	        |      d      D ]  }||   }||dz      }||
z  ||z  z   }||
z  ||z  z
  }||   }||dz      }||
z  ||z  z   }||
z  ||z  z
  }||k  r||k\  s
||k  r(||k\  r#|j)                  |||z
  ||z
  z  ||z
  z  z          |}  |j+                          t        dt	        |      d      D ]R  }||   |
z  ||z  z
  }||
z  ||   |z  z   }||dz      |
z  ||z  z
  }||
z  ||dz      |z  z   } |||        |||       T 7  y )Nr   r1   irx   r   )r.  rh   r  r  r6   r   r  r  r  r  r  	enumerater   r   r   r   rG   r5   r  r   rz   r   )rX   r  r  r  kwdsr   r  r  r   spacingcosThetasinThetaspanMinspanMaxr   r)  rI   	spanStartspanEndstepnodeXstripeYr   r}   r~   a1b1rH   rq   rr   s                                 rA   rh   zHatching.__init__~  s4   d#d#7#zGFYFH {HKH%Q3H~a"&66H !&) :	 HAuqkGENE5zH5zH GhG  -qQ* -A!A#x!X5A!!GnG!!GnG	-- E''/23a7I512Q6G i0 $ !$, ! AAqA"1SVA. aDacFxZ!H*4xZ!H*4aDacFxZ(
2xZ(
2 wJ2w;2g:"g+!LLRUWRZ,@"R%,H)HI& 

 qUA. 	 Aa)GH,<<A(q()::Aac
8+gh.>>A(51:h+>>A 1QK1QK	 7$ -:	 rC   N)r[   r\   r]   r^   r   r.  r   EitherOrr  r  r  r   rh   r_   rC   rA   r  r  u  s    fDxOWX9Y(Z[gh  oi  jh'LM  TY  Z(?=)Q R  YH  I
H !""b M rC   r  c                     t        | d|      }|j                  |      }|dk\  r!t        | dd      }	|	t        |d | |||      z   }|S )N_dpr   _dpLen)r   rfindr   )
tAr7   r4   r+   r*   encodingpivotCharacterdpr   dpOffss
             rA   numericXShiftr    sR    	E.	)B

2A!tHQ'[bq(8HEEHrC   c                      e Zd ZdZ e eed       eed       eed       edd       eed       eed	       e e	d
ddd      d       ee       e e	dddddddd      d      	      Z
dZd Zd Zd Zd Zy)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-   middler3   numericz(treat (x,y) as one of the options below.r   r   rx   rw   ry      r     z.Control whether text is filled/stroked etc etc)	rH   rI   r7   r+   r*   r(   r,   r  textRenderModeutf8c                     || _         || _        || _        d| _        t        d   | _        t        d   | _        t        d   | _        | j                  |       y )Nr-   r+   r*   r(   )	rH   rI   r7   r,   r  r+   r*   r(   r   )rX   rH   rI   r7   r@  s        rA   rh   zString.__init__  sP    	!&z2&z2'42rC   c                     | j                   t        | j                  | j                  | j                  | j
                        z   S r   )rH   r   r7   r+   r*   r  r   s    rA   getEastzString.getEast  s,    vvDIIdmmDMM4==YYYrC   c                     | j                  | j                  | j                  | j                        }|j	                  | j                                |S r   )r   rH   rI   r7   r   r   r5  s     rA   r   zString.copy  s<    nnTVVTVVTYY7$,,./
rC   c           	         | j                   }t        || j                  | j                  | j                        }| j
                  }| j                  }|dk7  rO|dk(  r	|d|z  z  }nA|dk(  r||z  }n6|dk(  r1|t        |||| j                  | j                  | j                        z  }|| j                  d| j                  z  z
  ||z   | j                  | j                  z   fS )Nr-   r  rH  r3   r  g?)	r7   r   r+   r*   r  r,   rH   r  rI   )rX   r;   r4   r  rH   s        rA   r   zString.getBounds  s    II$--dmmD__FFw;8|SU
UQY]2a$--dmmTT466C$--//1dfft}}6LMMrC   )r[   r\   r]   r^   r   r   r  isStringr  r  r   r  rh   r  r   r   r_   rC   rA   r  r    s    , '=>'=>H*BC  +L  Mk: 4GH!%y"IOyz)%eAa!Aa!&<Brs

H HZ
NrC   r  c                       e Zd ZdZd Zy)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                     t        d      )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   s    rA   r   zUserNode.provideNode  s    
 ""XYYrC   N)r[   r\   r]   r^   r   r_   rC   rA   r   r     s    %ZrC   r   c                       e Zd ZdZd Zy)
DirectDrawz"try to draw directly on the canvasc                     t        d      )Nr  r   )rX   rY   s     rA   drawDirectlyzDirectDraw.drawDirectly  s    !"XYYrC   N)r[   r\   r]   r^   r  r_   rC   rA   r  r    s    ,ZrC   r  c                  4   t        dddd      } dd l}|j                  }t        j                  j                  } |d        || j                                 |d       | j                           |d        |d       | ` |d	       | j                          y )
Nr!   r  2   r   za Rectangle: z
verifying...z OK
zdeleting rect.width zverifying...)re  pprintr  stdoutr  r   r   rV   )rz  r  ppr4   s       rA   r  r    s~    R3rA	B

AoqHHJgJ 	nHHJrC   __main__r   )r   z		)FF)NNN)b__version__r^   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   rD  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   rB   rN   rP   ra   ru   r   r   r   r   r   r"  r+  r8  rA  r   rh  	Validatorr  r
  r  r  r   r   r  r:  r<  r  r   r\  r*  _fillModeMapr.  r'  rU  rW  rc  re  ro  rt  r  r  r  r  r  r  r  r   r  r  r[   r_   rC   rA   <module>r     sx  
 G  3 3 ' y y     & .?1Q'(	 # ) 4 % @q+q+!,  &  6<<	
 1 Q a  t T 4 U u Q  !" #& '( )* 7+6   D-, ,& &$"3j0(KQO/ KQZ{E {z	%N$@
TeX Tl5 5,z	 z &'  249 4&% %& *.eAh &(J! 8%< 	d}M=}M=
F): F)P f6(d ( aA! 0%dK: K:KJ K8XZ X,`j `.i,J i,V,j ,*,y ,@V t V p 8<= 1NU 1NfZ" ZZ Z
" ZF rC   