o
    à’Oj… ã                
   @   sx  d Z dZddlZddlmZmZmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddl T dd	l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, dd
l-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddddddddddœ	Z8ddddddddddœ	Z9dZ:de: Z;G dd„ de5ƒZ<G dd„ de/ƒZ=dmdd„Z>d d!„ Z?G d"d#„ d#e1ƒZ@d$d%„ ZAd&d'„ ZBdnd)d*„ZCdod-d.„ZDd/d0„ ZEd1d2„ ZFd3d4„ ZGe HeG¡ZGd5d6„ ZIdmd7d8„ZJd9d:„ ZKe HeK¡ZKd;d<„ ZLdmd=d>„ZMd?d@„ ZNG dAdB„ dBeOƒZPG dCdD„ dDe@ƒZQG dEdF„ dFeQƒZRddGlSmTZTmUZUmVZVmWZW G dHdI„ dIe/ƒZXG dJdK„ dKƒZYdLdM„ ZZe HeZ¡ZZeUdNƒZ[G dOdP„ dPeQƒZ\dQdR„ Z]dSdT„ Z^dUdV„ Z_dWdX„ Z`dYdZ„ Zad[d\„ Zbd]d^„ Zcd_d`„ Zddadb„ Zedcdd„ Zfdedf„ Zgehdgk�r¸	 ddliZiddhljmkZk eijld(d… �p—digZlelD ]Zmem ndj¡�r¤emndkem Zoepƒ eo ƒ Zqek reqdleo ¡ �qšdS dS )pz3.3.0z|Basic Pie Chart class.

This permits you to customize and pop out individual wedges;
supports elliptical and circular pies.
é    N)ÚsinÚcosÚpi)Úcolors)ÚisNumberÚisListOfNumbersOrNoneÚisListOfNumbersÚisColorOrNoneÚisStringÚisListOfStringsOrNoneÚOneOfÚ	isBooleanÚisListOfColorsÚisNumberOrNoneÚisNoneOrListOfNoneOrStringsÚisTextAnchorÚisNoneOrListOfNoneOrNumbersÚisBoxAnchorÚisStringOrNoneÚNoneOrÚEitherOrÚisNumberInRangeÚ
isCallable)ÚuSymbol2SymbolÚisSymbol)Ú*)ÚGroupÚDrawingÚEllipseÚWedgeÚStringÚSTATE_DEFAULTSÚArcPathÚPolygonÚRectÚPolyLineÚLine)ÚTypedPropertyCollectionÚ
PropHolder)ÚPlotArea)Ú_objStr)ÚLabel©ÚcmpÚwÚswÚsÚseÚeÚneÚnÚnw)	r   é-   éZ   é‡   é´   éá   é  i;  éÓÿÿÿgH¯¼šò×z>g     €v@c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú
WedgeLabelc                 C   s   d S ©N© ©ÚselfÚbar@   r@   úi/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/reportlab/graphics/charts/piecharts.pyÚ	_checkDXY,   s   zWedgeLabel._checkDXYc                 C   s„   | j }|dv r@t| jd d ƒd d }|d s/| j| d }t|ƒdkr/||dkr,dp-d7 }t| d	d ƒr7tp8t| }|  |¡ |S )
N)ÚautoxÚautoyéh  g     €F@r6   r7   é   r   r<   Ú_anti)Ú	boxAnchorÚintÚ_pmvÚabsÚgetattrÚ_ANGLE2RBOXANCHORÚ_ANGLE2BOXANCHORrE   )rB   rC   ÚnaÚdar@   r@   rD   Ú_getBoxAnchor.   s   
zWedgeLabel._getBoxAnchorN)Ú__name__Ú
__module__Ú__qualname__rE   rT   r@   r@   r@   rD   r>   +   s    r>   c                	   @   s¢  e Zd ZdZedfi deedd�“deedd�“deedd�“d	eed
d�“dee	dddƒdd�“dee	dddƒdd�“deedd�“deedd�“dee
dd�“deedd�“deedd�“deedd�“deedd�“d eed!d�“d"eed#d�“d$eed%d�“d&eed'd�“d(eed)d�“d*eed+d�“d,eed-d�“d.eed/d�“d0eed1d�“d2eed3d�“d4eed5d�“d6eed7d�“d8eed9d�“d:eed;d�“d<eed=d�“d>eed?ƒ“d@eedAƒ“dBeedCƒ“dDeedEƒ“dFeedGƒ“dHeedId�“dJeedKd�“dLeedMd�“dNeedOd�“dPeedQd�“dReeeƒdSddT�“dUeedVƒ“dWeedXd�“dYeedZd�“d[ee	d\d]ƒd^d�“d_ee	d`dadbƒdcd�“ŽZddde„ Zd`S )gÚWedgePropertiesá,  This holds descriptive information about the wedges in a pie chart.

    It is not to be confused with the 'wedge itself'; this just holds
    a recipe for how to format one, and does not allow you to hack the
    angles.  It can format a genuine Wedge object for you with its
    format method.
    ÚstrokeWidthzWidth of the wedge border©ÚdescÚ	fillColorzFilling color of the wedgeÚstrokeColorzColor of the wedge borderÚstrokeDashArrayzZStyle of the wedge border, expressed as a list of lengths of alternating dashes and blanksÚstrokeLineCapr   é   é   z#Line cap 0=butt, 1=round & 2=squareÚstrokeLineJoinz$Line join 0=miter, 1=round & 2=bevelÚstrokeMiterLimitz$Miter limit control miter line joinsÚpopoutz How far of centre a wedge to popÚfontNamez"Name of the font of the label textÚfontSizez,Size of the font of the label text in pointsÚ	fontColorz#Color of the font of the label textÚlabelRadiuszpDistance between the center of the label box and the center of the pie, expressed in times the radius of the pieÚlabel_dxzX Offset of the labelÚlabel_dyzY Offset of the labelÚlabel_anglezQAngle of the label, default (0) is horizontal, 90 is vertical, 180 is upside downÚlabel_boxAnchorzAnchoring point of the labelÚlabel_boxStrokeColorzBorder color for the label boxÚlabel_boxStrokeWidthzBorder width for the label boxÚlabel_boxFillColorzFilling color of the label boxÚlabel_strokeColorzBorder color for the label textÚlabel_strokeWidthzBorder width for the label textÚ
label_textzText of the labelÚlabel_leadingÚ Úlabel_widthzWidth of the labelÚlabel_maxWidthz#Maximum width the label can grow toÚlabel_heightzHeight of the labelÚlabel_textAnchorz$Maximum height the label can grow toÚlabel_visibleú True if the label is to be drawnÚlabel_topPaddingzPadding at top of boxÚlabel_leftPaddingzPadding at left of boxÚlabel_rightPaddingzPadding at right of boxÚlabel_bottomPaddingzPadding at bottom of boxÚlabel_simple_pointerzSet to True for simple pointersÚlabel_pointer_strokeColorzColor of indicator lineÚlabel_pointer_strokeWidthzStrokeWidth of indicator lineÚlabel_pointer_elbowLengthz&Length of final indicator line segmentÚlabel_pointer_edgePadz!pad between pointer label and boxÚlabel_pointer_piePadz!pad between pointer label and pieÚswatchMarkerz!None or makeMarker('Diamond') ...©r\   ÚadvancedUsageÚvisiblezSet to false to skip displayingÚshadingAmountz"amount by which to shade fillColorÚshadingAnglez6shading changes at multiple of this angle (in degrees)ÚshadingDirectionÚnormalÚantiz2Whether shading is at start or end of wedge/sectorÚshadingKindNÚlightenÚdarkenzuse colors.Whiter or Blackerc                 C   s  d| _ d | _td | _td | _d| _d| _d| _d| _td | _	td | _
td | _d| _d | _ | _| _d | _d | _ | _ | _| _d	| _d | _d
| _d | _d | _d| _d  | _ | _ | _| _d| _d| _ d| _!t"j#| _$d
| _%d| _&d| _'d| _(d| _)d | _*d
| _+d| _,d| _-d S )Nr   r^   r_   ra   rf   rg   r]   ç333333ó?rF   ç      à?çš™™™™™¹?Ústarté   rb   g@¤ß¾ @r�   ).rZ   r]   r!   r^   r_   rc   r`   rd   re   rf   rg   rh   ri   rj   rk   rl   rs   r|   r}   r~   r   rm   rn   ro   rp   rq   rr   rt   rv   rw   rx   ry   r€   rz   r   Úblackr�   r‚   rƒ   r„   r…   r‰   r�   rŠ   r‹   rŒ   ©rB   r@   r@   rD   Ú__init__q   sF   





zWedgeProperties.__init__r@   )rU   rV   rW   Ú__doc__ÚAttrMapÚAttrMapValuer   r	   r   r   r
   r   r   r   r   r   r   r   Ú_attrMapr™   r@   r@   r@   rD   rX   :   s¸    ÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåä
ã
â
á
 à
!ß"Þ#Ý$Ü%Û&Ú'Ù
(Ø)×*Ö+Õ,Ô/rX   c           
      C   sø  | j r8t|||ƒ}| jsd|_n!t|ƒdk s*|dkr|dk s*d|  k r(dk r.n nd|_nd|_||_d	|_n¶|d u rBt| d
tƒ}|ƒ }||_||_	||_
|j|_| js^|j|_|j|_n@|jd u ri| jd }n|jd }|jd u rw||_n|j| |_t|ƒdk s—|dkr‹|dk s—d|  k r•dk r›n nd|_nd|_|j|_|j|_|j|_|j|_|j|_|j|_|j}	|	d u r¿|}	|	|_|j |_!|j"|_#|j$|_%|j&|_'|j(|_|j)|_*|j+|_,|j-|_.|j/|_0|j1|_2|j3|_|j|_|j4|_4|j5|_6|S )NÚmiddler7   r;   éÂ  é>þÿÿéòþÿÿr•   Úendr   Ú
labelClassg      @r.   r2   )7ÚsimpleLabelsr    Ú
sideLabelsÚ
textAnchorrN   rM   Ú_simple_pointerrO   r>   ÚxÚyrj   Údxrk   Údyrm   rK   rg   rl   Úanglern   ÚboxStrokeColorro   ÚboxStrokeWidthrp   ÚboxFillColorrq   r^   rr   rZ   rs   Ú_textrt   Úleadingrv   Úwidthrw   ÚmaxWidthrx   Úheightry   rz   r‰   r|   Ú
topPaddingr}   ÚleftPaddingr~   ÚrightPaddingr   ÚbottomPaddingr€   rf   rh   r]   )
rB   Útextr¬   ÚlabelXÚlabelYÚ
wedgeStyler£   ÚtheLabelÚsideLabels_dyr°   r@   r@   rD   Ú_addWedgeLabel–   sh   4



4r¿   c                 C   s@   | d u rdg| } | S |t | ƒ }|dkrt| ƒdg|  } | S )Nru   r   )ÚlenÚlist)Úlabelsr4   Úir@   r@   rD   Ú
_fixLabelsÔ   s   
þrÄ   c                   @   s   e Zd Zdd„ Zddd„ZdS )ÚAbstractPieChartc              
   C   s¸   | j }|t|ƒ }|| }t|dt|dd ƒƒ}	t|dt|dd ƒƒ}
t|dt|dd ƒƒ}t|dt|dd ƒƒ}t|dt|dd ƒƒ}|rPt|||d  ||d  |
ƒS t||||||	||
d�S )Nr^   r]   r_   rZ   r†   ç       @)rZ   r^   r_   r]   )ÚslicesrÀ   rO   r   r$   )rB   ÚrowNor¨   r©   r²   r´   Ú	baseStyleÚstyleIdxÚstyler^   r]   r_   rZ   r†   r@   r@   rD   ÚmakeSwatchSampleÞ   s   ÿz!AbstractPieChart.makeSwatchSampleNc                 C   sH   z	t | j| ƒ}W n   |}Y | js"t| j| ddƒ}|dur"|}|S )zreturn series name i or defaultrs   ru   N)r*   rÂ   r¤   rO   rÇ   )rB   rÃ   Údefaultr¹   r°   r@   r@   rD   ÚgetSeriesNameì   s   zAbstractPieChart.getSeriesNamer?   )rU   rV   rW   rÌ   rÎ   r@   r@   r@   rD   rÅ   Ü   s    rÅ   c                 C   sj   | d |d d kp3|d | d d kp3| d d|d |d   d kp3|d d| d | d   d k S )Nr   rb   g{®Gáz„?ra   r“   r–   r@   )ÚPÚQr@   r@   rD   ÚboundsOverlap÷   s   jrÑ   c                 C   s�   t | ƒ}|g}	 |d }|d | }||v st| | | | ƒs n| |¡ q	 |d }|d | }||v s>t| | | | ƒsA	 |S | d|¡ q')z find overlap run containing B[i]ra   éÿÿÿÿr   )rÀ   rÑ   ÚappendÚinsert)ÚBrÃ   Úwrapr4   ÚRÚjr@   r@   rD   Ú_findOverlapRunú   s   
üÿürÙ   ra   c                 C   sF   t | ƒ}|dkr!t|d ƒD ]}t| ||ƒ}t |ƒdkr |  S qdS )z>determine a set of overlaps in bounding boxes B or return Nonera   N)rÀ   ÚrangerÙ   )rÕ   rÖ   r4   rÃ   r×   r@   r@   rD   ÚfindOverlapRun
  s   rÛ   Fç      ð?c                    sV  t | ƒ}|dk r
d S dd„ | D ƒ}d}g }d}t|d ƒ}|}|só|dk rñt|ƒ‰ ˆ s-d S t ˆ ƒ}	|	|kr7d S ‡ fdd„|D ƒsB|}d}
ˆ d }ˆ d }|| }t| | jƒ }}ˆ dd … D ]#}|| }t|
t|d |d  |d |d  ƒƒ}
|}|| | j7 }q_|t|	ƒ }t| | j| ƒ}t|ƒ}|
||	d  | 9 }
ˆ D ]>}| | }|j}t|j|
t|jƒ|   ƒ }|_|t	 }|d	 |d
 t
|ƒ  |_|d |d t|ƒ  |_| ¡ ||< q¢ˆ }|d9 }|d7 }|dk s%d S d S |dk �r©t|ƒ‰ ˆ �sd S t ˆ ƒ}	|	|k�rd S | d }|j}|d }tˆ ƒD ]ƒ\}}| | }|j}|d }d}d}||	d k�s�||k�s—|d |d k�rT|d |d k �rT|d |d  }|d |d k�rn|d |d k �rn|d |d  }||k�rƒ| jd|d |d   7  _n||k�r—| jd|d |d   8  _| ¡ ||< �q|d7 }|dk sød S d S )Nrb   c                 S   s   g | ]}|j d  ‘qS )Úbounds)Ú	_origdata)Ú.0Úlr@   r@   rD   Ú
<listcomp>  s    z$fixLabelOverlaps.<locals>.<listcomp>ra   r   é   c                    s   g | ]}|ˆ v r|‘qS r@   r@   )rß   Úr©r×   r@   rD   rá   #  s    rÒ   ÚcxÚrxÚcyÚrygÍÌÌÌÌÌð?rÝ   r–   r“   )rÀ   ÚfloatrÛ   Ú_360rM   ÚmaxÚminrN   rÞ   Ú_180_pir   r¨   r   r©   Ú	getBoundsÚ	enumerate)ÚLr¥   Úmult0ÚnLrÕ   ÚOKÚRPÚiterÚmultÚnRrS   Úr0ÚrLÚbiÚtaaÚaarã   ÚbÚutaaÚntaarà   Úorigr¬   ÚradÚl1Úorig1Úbounds1rÃ   rÝ   Údiff1Údiff2r@   rä   rD   ÚfixLabelOverlaps  sŒ   ("à
#

$$
 
€çr  c                 C   s:   t t| ƒt|ƒƒtt | ƒt |ƒƒ}}||krd S ||fS r?   )rë   rì   )ÚArÕ   r¨   r©   r@   r@   rD   ÚintervalIntersection\  s   &r	  c                 C   sì   | d; } d|   krdk r0n n |dkr"dd| fddd|  dff}nKd| dfd	dd
d|  ff}n=| dkr6dp7d}|dkrUd|d | fd|d |d fdd|  |d ff}nd| |d fd|d |d fd|d d|  ff}t dd„ |D ƒƒS )NrH   r7   r;   Ú	clockwiser   )ra   é¦ÿÿÿr7   i˜þÿÿr  )ra   r;   rŸ   rŸ   ra   c                 S   s    g | ]}|d  |d k r|‘qS )ra   rb   r@   ©rß   Úar@   r@   rD   rá   n  ó     z$_makeSideArcDefs.<locals>.<listcomp>)Útuple)ÚsaÚ	directionr  Úoffsr@   r@   rD   Ú_makeSideArcDefsa  s   20r  c                 C   s"   t |d |d  | d | d  ƒS )Nra   r   r,   )r¨   r©   r@   r@   rD   Ú_keyFLAp  s   "r  c                    s:   ‡ fdd„| D ƒ}|sd S t |ƒdkr|jtd� |d S )Nc                    s,   g | ]}|d  ˆ kr|d dur|d ‘qS )r   ra   Nr@   r  ©Úsider@   rD   rá   u  s   , z#_findLargestArc.<locals>.<listcomp>ra   ©Úkeyr   )rÀ   Úsortr  )ÚxArcsr  r  r@   r  rD   Ú_findLargestArct  s   r  c           
      C   s
  | j }|d u r:|d }|d }|d u rd}|}n"|d u r!d}|}n|d |d  |d |d  kr6d}|}nd}|}|d }|d }|sQd| _|| | _|d }nd| _|| | | _|d }|d |d  d  }	|d	< t|	t ƒ|d
< t|	t ƒ|d< ||d< ||fS )NÚliÚrira   r   r²   ÚedgePadr9   r“   ÚmidÚsmidÚcmidr  )rÞ   rM   r¨   r   rí   r   )
rà   r²   r  Údatar  r  rÃ   r.   r  r  r@   r@   rD   Ú_fPLSidez  s:    

r#  c                 C   s   t |jd | jd ƒS )Nr   )r-   rÞ   ©r  rý   r@   r@   rD   Ú_fPLCFœ  s   r%  c                 C   s   | d S )Nra   r@   )r  r@   r@   rD   Ú_arcCF   s   r&  c           )   	   C   sd  g g f}ddg}|D ]}	t |	||ƒ\}
}||
  |	¡ t|||
 ƒ||
< q
d}| d g }d}|d }|| }t|ƒ}dD �]j}
||
 }|�r¥g }|j}g }|j}|jtd� d}|| }|D ]Š}	|	j}||||d    }|	 j|7  _|	||d < ||d |  }|d	 }|d
 |d  d }|| |krš|| }|| |k r¤|| }|d || |d || f |d	< }||ƒ ||	_|td|| | ƒƒ || }t||d |d  ƒ}t|t|d ||d   ƒ| ƒ}q^||| ƒ d}t	|ƒ}|dk �rŸt
|dd�} | �sn›t	| ƒ}!|!|k�rn‘| d }"| d }#|#d }$t|d |"d … ƒ}%|%t||$d … ƒ }&tdd„ ||"|$… D ƒƒ|$ |" ||" d
 ||# d   }'|'|&k�rQnN||" d
 |%|' |&  }| D ];}(||( }	|	j}|d	 }|d
 |d  d }|d8 }||  }|	_|d || |d |f ||(< |d	< || d }�q_|dk sú|| ||
< d}q<||d |d |fS )Nr   ra   r“   )r   ra   r  r²   Úindexr   rÝ   r–   rb   r  ÚpiePadÚelbowLengthrâ   )rÖ   rÒ   c                 S   s   g | ]
}|d  |d  ‘qS )r–   ra   r@   )rß   rý   r@   r@   rD   rá   Ù  ó    z%_fixPointerLabels.<locals>.<listcomp>)r#  rÓ   rë   r  r%  rÞ   r¨   r©   rN   rÀ   rÛ   Úsum))r4   rð   r¨   r©   r²   r´   r  ÚLRÚmlrrà   rÃ   r.   ÚmulÚGÚmelÚhhÚyhhÚmÚTrÕ   ÚaBÚSÚaSÚpÚyhr"  ÚincÚlyrý   Úb2rõ   ÚnTr×   r÷   Új0Új1ÚjlÚsAboveÚsFreeÚsNeedrã   r@   r@   rD   Ú_fixPointerLabels£  sˆ   

$$
:$ërD  c           
         s¾   dt  t| ƒ ‰ ‡ fdd„| D ƒ}d}g }|D ]‰| |ˆd  ¡ |ˆ7 }qt| ƒd }d}t d }tdƒD ]!}|| ‰t‡fd	d„|D ƒƒ}	|	|k rX|d
krTˆ }nˆ}|	}q7|d t  S )Nrb   c                    s   g | ]}|ˆ  ‘qS r@   r@   )rß   Úd)Úfacr@   rD   rá   ë  ó    ztheta0.<locals>.<listcomp>r   r“   g    €„.Ag      B@é$   c                    s   g | ]
}t tˆ | ƒƒ‘qS r@   )rN   r   r  )rã   r@   rD   rá   ø  r*  r
  r9   )r   r+  rÓ   rÀ   rÚ   )
r"  r  Úradsrø   ÚhradsÚvstarÚrstarÚdeltarÃ   Úvr@   )rF  rã   rD   Útheta0é  s(   
€rO  c                   @   s   e Zd ZdZdd„ ZdS )Ú	AngleDataz/use this to carry the data along with the anglec                 C   s   t  | |¡}||_|S r?   )ré   Ú__new__Ú_data)Úclsr¬   r"  rB   r@   r@   rD   rQ    s   zAngleData.__new__N)rU   rV   rW   rš   rQ  r@   r@   r@   rD   rP    s    rP  c                	   @   s”  e Zd ZedBi de“deedd�“deedd�“deedd�“d	ee	d
dƒdd�“deddd�“dee
dd�“deeddd�“deeeddƒe
fƒddd�“dee	dddƒddd�“dee
ddd�“dee	d d!ƒdd"�“d#eed$d�“d%eed&d�“d'eed(d�“d)edd*dd�“d+ee
d,d�“d-eed.d�“d/eeeƒd0d�“d1eed2d�“ŽZdZd3d4„ Zd5d6„ Zd7d8„ ZdCd:d;„Zd<d=„ Zd>d?„ Zd@dA„ ZdS )DÚPieÚBASEr"  z7List of numbers defining wedge sizes; need not sum to 1r[   rÂ   z2Optional list of labels to use for each data pointÚ
startAnglez#Angle of first slice; 0 is due Eastr  r
  Úanticlockwisez'clockwise' or 'anticlockwise'rÇ   Nz&Collection of wedge descriptor objectsr¤   zœIf true(default) use a simple String not an advanced WedgeLabel. A WedgeLabel is customisable using the properties prefixed label_ in the collection slices.Úother_thresholdz.A value for doing threshholding, not used yet.ra   r‡   ÚcheckLabelOverlapgš™™™™™©?zFIf true check and attempt to fix
 standard label overlaps(default off)ÚpointerLabelModeÚ	LeftRightÚLeftAndRightru   Ú	sameRadiiz,If true make x/y radii the same(default off)Ú	orderModeÚfixedÚ	alternate)rˆ   ÚxradiuszX direction RadiusÚyradiuszY direction RadiusÚinnerRadiusFractionz$fraction of radii to start wedges atÚwedgeRecordzcallable(wedge,*args,**kwds)r¥   zDIf true attempt to make piechart with labels along side and pointersÚsideLabelsOffsetzWThe fraction of the pie width that the labels are situated at from the edges of the pier£   z,A class factory to use for non simple labelsÚ
angleRangez3total degree range for the doughnut defaults to 360c                 K   s  t  | ¡ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dg d¢¡ƒ t| d	| d	d ¡ƒ t| d
| d
d¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dd ¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dd ¡ƒ t| d| dd ¡ƒ t| d| dd ¡ƒ t| d| dd¡ƒ t| d| dd¡ƒ t| d| dttƒ¡ƒ t| d| dd¡ƒ tj| jd _	tj
| jd _	tj| jd _	tj| jd  _	tj| jd! _	tj| jd" _	tj| jd# _	d S )$Nr¨   r   r©   r²   éd   r´   r"  )ra   gffffff@g333333û?gÍÌÌÌÌÌ@rÂ   rV  r7   r  r
  r¤   ra   rY  rZ  r]  Fr^  r_  ra  rb  rc  r¥   re  r”   rÇ   rf  rH   rb   r–   é   rI   é   )r)   r™   ÚsetattrÚpopr'   rX   r   ÚdarkcyanrÇ   r]   Ú
bluevioletÚblueÚcyanÚpinkÚmagentaÚyellow)rB   Úkwdsr@   r@   rD   r™   !  s8   
zPie.__init__c                 C   sö   t ddƒ}tƒ }d|_d|_d|_d|_g d¢|_g d¢|_d|j_	d|jd	 _
d
|jd	 _	d
d
g|jd	 _d|jd	 _tj|jd	 _tj|jd _tj|jd _tj|jd
 _tj|jd	 _tj|jd _tj|jd _tj|jd _| |¡ |S ©NéÈ   rg  é2   é
   éP   ©rw  é   râ   é(   rv  é<   ©r  rý   ÚcrE  r2   Úfr“   r–   rb   ç      ü?r   ra   rh  rI   ri  )r   rT  r¨   r©   r²   r´   r"  rÂ   rÇ   rZ   re   r_   ri   r   Úredrh   rl  r]   rm  rn  ro  Ú
aquamarineÚ	cadetblueÚ
lightcoralÚadd©rB   rE  Úpcr@   r@   rD   Údemo@  s.   



zPie.democ           $         s`  G dd„ dƒ}| j d }| j}d } } } }	}
t| jƒ}g }|j}t| j| jƒ}|D ]É\}‰ ˆ d d u r7q,|  |d¡}|s@q,| j||  }|j	rM|j
sNq,|d7 }t| |d|||ƒ}||ƒ | ¡ }|d |d  }|d |d  }‡ fd	d
„|D ƒ}t|dƒ}t|dƒ}|rÍ|rÍ|dkr¤|d |d  |d |d  k r¡d }n,d }n)|d |d  d|d |d   k r¹d }n|d |d  d |d |d  krÍd }|rÓ|d7 }|rÙ|d7 }t|||||||j|j|jd�	|_t||	ƒ}	|
|d 7 }
q,|�s.| j d }| jd }| j| }| j| }| j�r| j}| j�r| j}| j�r&t||ƒ }}|||||g ƒS ||k}|
| jk �rE|�s@||k�rEt|ƒ}nd }tt|ƒ|| j| j| j | j|d�\}}} }!|dk�rht|| ƒ }} | j| }"| j| j  |  }#|#|" d }| jd |! }|"| }| j| |! }| j�r”| j}| j�r›| j}| j�r¦t||ƒ }}|||||||| ƒS )Nc                   @   s   e Zd Zddd„ZdS )z!Pie.makePointerLabels.<locals>.PLr   c                 S   s.   || _ || _|| _|| _|| _|| _|| _d S r?   )ÚcenterxÚcenteryra  rb  r"  ÚluÚru)rB   r‰  rŠ  ra  rb  r"  r‹  rŒ  r@   r@   rD   r™   ^  s   
z*Pie.makePointerLabels.<locals>.PL.__init__N)r   r   )rU   rV   rW   r™   r@   r@   r@   rD   ÚPL]  s    r�  rb   r   ra   ru   r9   r–   c                    s*   g | ]}|d  t ˆ |d |d fƒf‘qS )r   ra   rb   )r	  r  ©r  r@   rD   rá   z  s   * z)Pie.makePointerLabels.<locals>.<listcomp>r\  g{®Gáz”?)	rÝ   r²   r´   r  r  r'  r  r(  r)  r“   r  )r²   r´   rÀ   rÇ   rÓ   r  rV  r  rÎ   rz   r‰   r¿   rî   r  Údictr„   r…   rƒ   rÞ   rë   r¨   r©   ra  rb  r]  rì   rL   rD  )$rB   ÚanglesÚplModer�  rº   r»   r4   ÚnrÚnlÚmaxWÚsumHÚ
styleCountrð   ÚL_addÚrefArcsrÃ   ÚsnrË   rà   rý   r.   Úhr  r  ra  rb  r‰  rŠ  ÚaonRr  r/  r‹  rŒ  r0  Úx0Úx1r@   rŽ  rD   ÚmakePointerLabels\  s~   




 $$"





*

zPie.makePointerLabelsFc                    sf   t tt| jƒƒ}tt|ƒƒ }| _|dkrtd| jƒ| nd‰ |r*‡ fdd„|D ƒS ‡ fdd„|D ƒS )Nr   rH   ra   c                    s   g | ]	}t ˆ | |ƒ‘qS r@   )rP  ©rß   r¨   ©r  r@   rD   rá   °  s    z%Pie.normalizeData.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r@   r@   rŸ  r   r@   rD   rá   ²  rG  )	rÁ   ÚmaprN   r"  ré   r+  Ú_sumrì   rf  )rB   ÚkeepDatar"  r0   r@   r   rD   ÚnormalizeData«  s   zPie.normalizeDatac                 C   sŒ  t | dd ƒ}| jrt| j| jƒ}d| j_n| jd }| jdkr!dp"d}dd„ t| j	|d�ƒD ƒ}| j
d	kr„| js„d
d„ |D ƒ}|jtd� g g g}d}|ro|dk rW| d¡}n| d¡}||d   |¡ |d7 }|d; }|sM|d  ¡  |d |d  dd„ |D ƒ }g }	|	j}|D ]8\}}
||
|  }t|
ƒtkr©||kr¤||f}n	||f}n|d f}|r»t|d |
jƒ|d f}|}|||fƒ q‹|	S )Nrd  ra   rH   r
  rÒ   c                 S   s   g | ]}|‘qS r@   r@   r  r@   r@   rD   rá   ¼  s    z"Pie.makeAngles.<locals>.<listcomp>)r£  r`  c                 S   s    g | ]}t |d  ƒdkr|‘qS ©ra   gñhãˆµøä>©rN   r  r@   r@   rD   rá   ¾  r  r  r   rb   rh  c                 S   s    g | ]}t |d  ƒdk r|‘qS r¥  r¦  r  r@   r@   rD   rá   Ë  r  )rO   r¥   rO  r"  r  rÇ   rz   rV  rï   r¤  r^  r  r&  rk  rÓ   ÚreverserN   Ú_ANGLELOrP  rR  )rB   ÚwrrV  ÚwhichWayÚDÚWr4  rÃ   r  r  r¬   ÚendAnglerü   r@   r@   rD   Ú
makeAngles´  sH   


ù

zPie.makeAnglesc           H         sn  ˆ   ¡ }g }|D ]\}\}}|d u r|}nd||  }| |¡ qˆ j}t|ƒ}tˆ j|ƒ}	tˆ dd ƒ}
|ˆ _tˆ jƒ}ˆ j	}|rCd }|rad}ˆ  
||¡}|j}|j}|j}|j}|j}dd„ }n3ˆ jd }ˆ jd }ˆ j| }ˆ j| }ˆ jr{ˆ j}ˆ jr�ˆ j}ˆ jr‹t||ƒ }}ˆ j}‡ fdd„}tƒ }|j}g }|j}ˆ j}|D �]¸\}\}}|d u r°q¤ˆ j||  }|js»q¤t|| ƒ}||}}||ƒ}|j}|sÑ|rõ|| d } | t }!t|!ƒ}"t|!ƒ}#|rõ|t k rõ|||"  }|||#  }|�r	t!|||||||| || d�}$n|t k�rt"||||ƒ}$n
t!||||||d	�}$|j#|$_#|j$|$_$|j%|$_%|j&|$_&|j'|$_'|j(|$_(|j)|$_)|j*}%|%�rÛ|t+|j,ƒ }&|&d
k�rÛ|%dk�rVt-j.nt-j/}%d
t0|&ƒ }&d
|j1 }'|j2dk�rwd
|' t+|&d
 ƒ }(|'})n|'d
 t+|&d
 ƒ }(d
})|| t+|&ƒ }*|j#}+d |$_#t3|&ƒD ]E},||,|*  }-||,d
 |*  }.|%|+|)|(|,  ƒ}/|�rÂt!||||-|.||| || d�}0n
t!||||-|.|d	�}0|/|0_#d |0_$d|0_%||0ƒ �q•||$ƒ |
�rê|
|$|j4|d� |j5�r]|�s�|�rB|j6}1||1 }2||1 }3||2|"  }4||3|#  }5t7ˆ || |4|5|ƒ}6||6ƒ |�s-|6j8�r-|||"  |6_9|||#  |6_:|�rA|4|5| |2|3|||6 ;¡ ||fdœ	|6_<q¤|�rŒ|�rŒ|| }6|6�rŒ|6j<}7|7d }8|7d }9|||9  }:|||8  };|j=}<|:|<|9  }=|;|<|8  }>|t>|:|;|=|>|6j|6jf|j?|j@d�ƒ ||6ƒ q¤|�r]ˆ jj}?d}@|D ]*\}}Aˆ j| j#�r©|@d
7 }@�q˜||@ }Bˆ j|B j#ˆ j| _#ˆ j|B jˆ j| _�q˜t3d|@d
 ƒD ]}Cˆ j|C j|?k�rÛˆ j|C j}?�qÊ|j6}1||1 }3t| ƒdk �s| dk�rõ| dk �sd|   k �rdk �rn nd
ˆ jA ˆ j ˆ j |? }4d}2nˆ jˆ jAˆ j  |? }4d}2||3|#  }5t7ˆ || |4|5|ƒ}6||6ƒ |�sD|||"  |6_9|||#  |6_:|�rU|4|5| |2|3|||6 ;¡ dœ|6_<|6 ;¡ \}D}E}F}Gq¤|�rk|�rktB|||d� |D ]}6||6ƒ �qm|�s5|D ]º}6|6j8�r—|�s—|tC|6j|6j|6j9|6j:|j?|j@d�ƒ �qz|�r3|6 ;¡ \}D}E}F}G|6jd
ˆ jA ˆ j ˆ j k�ró|tC|6j9|6j:d|6j9|6j  |6jd|G|E   |j?|j@d�ƒ |tCd|6j9|6j  |6jd|G|E   |6j|6jd|G|E   |j?|j@d�ƒ �qz|tC|6j9|6j:d|6j9|6j  |6jd|G|E   |j?|j@d�ƒ |tCd|6j9|6j  |6jd|G|E   |6j|6jd|G|E   |j?|j@d�ƒ �qz|S )Nr“   rd  Fc                 S   s   dS ©Nru   r@   ©rÃ   r@   r@   rD   Ú<lambda>ú  s    z Pie.makeWedges.<locals>.<lambda>c                    s   ˆ   | d¡S r¯  )rÎ   r°  r˜   r@   rD   r±    s    rÆ   )rb  Úradius1Úyradius1)rb  ra   r�   r�   r   )ÚvalueÚlabel)	r¨   r©   r¬   ræ   rè   rå   rç   rÝ   r�  r   r!  )rZ   r^   r7   r;   rŸ   r    r¡   ©r¨   r©   r¬   ræ   rè   rå   rç   rÝ   )rñ   g      Ð?)Dr®  rÓ   r¥   rÀ   rÄ   rÂ   rO   Ú_seriesCountrÇ   rZ  rž  ra  rb  r‰  rŠ  r"  r²   r´   r¨   r©   r]  rì   rY  r   r…  rc  r‰   rN   re   rí   r   r   Ú_ANGLEHIr   r   r]   r^   rZ   rc   r`   rd   r_   r�   ré   r‹   r   ÚWhiterÚBlackerrL   rŠ   rŒ   rÚ   rR  rz   ri   r¿   r§   Ú_aaxÚ_aayrî   rÞ   rƒ   r%   r‚   r�   re  r  r&   )HrB   r�  Ú
halfAnglesrÃ   Úa1Úa2Ú	halfAngler¥   r4   rÂ   r©  r–  r‘  rY  r�  ra  rb  r‰  rŠ  ÚPL_dataÚgSNÚgÚg_addrð   r—  rc  r¼   rü   rå   rç   r¹   re   ÚaverageAngleÚaveAngleRadiansÚcosAAÚsinAAÚtheWedgeÚshaderÚnshadesrŠ   ÚdshÚshf1ÚshdaÚshscÚishÚsha1Úsha2ÚshcÚshWedgeri   ræ   rè   rº   r»   rà   r"  ÚsinMÚcosMÚlXÚlYÚlpelÚlXiÚlYiÚslices_popoutr3  r¬   rã   rØ   r�  Úy1Úx2Úy2r@   r˜   rD   Ú
makeWedgesÝ  s˜  







ÿ


ÿþ€þ€€$
ÿÿþ€þ*þ6þ*þ6þ€zPie.makeWedgesc                 C   s"   |   ¡ }|  ¡ }|rt||ƒS |S r?   )ÚmakeBackgroundrà  r   )rB   r/  r.   r@   r@   rD   Údrawº  s   zPie.drawr@   )F)rU   rV   rW   r›   rÅ   rœ   r   r   r   r   r   r   r   r   r   r   r�   rX  r™   rˆ  rž  r¤  r®  rà  râ  r@   r@   r@   rD   rT  	  sb    ÿþýüûúùø	÷
öõôóòñðïîí
O	) ^rT  c                   @   sª   e Zd ZdZeeeedd�eddd�eddd�eedd�ee	dd�ee
d	d�eed
d�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dd„ZdS )ÚLegendedPiezUPie with a two part legend (one editable with swatches, one hidden without swatches).z#If true then create and draw legendr[   NzHandle to legend for piez;Formatting routine for number on right hand side of legend.z:Horizontal space between legend and numbers on r/hand sidez&Colours used for both swatches and piezNames used in legend (or None)z/Numbers used on r/hand side of legend (or None)zPadding on left of drawingzPadding on right of drawingzPadding at top of drawingzPadding at bottom of drawing)rU  Ú
drawLegendÚlegend1ÚlegendNumberFormatÚlegendNumberOffsetÚpieAndLegend_colorsÚlegend_namesÚlegend_datar¶   r·   rµ   r¸   c                 K   sX  t | d| dg d¢¡ƒ tj| fi |¤Ž tjtj}}|dddddd�|dd	dd
dd�|ddddddd�|dd	dd
ddd�|ddddddd�|dd	dd
ddd�g| _| jd | jd _	| jd | jd _	| jd | jd _	| jd | jd _	| jd | jd _	| jd | jd _	d| j_
|| j_d}d| _d| _| j| _ddlm} |ƒ | _| j| | j_| j| j_d| j_d| j_d| j_d| j_d| j_d| j_d| j_g d¢| _tt | jƒƒD ]}| jj! "| j| | j| f¡ qÛd| j_#d | j_$|| j_d!| j_
|ƒ | _%d| j%_d| j%_d| j%_d"| j%_#d | j%_$| jj| j%_d| _&d| _'d| _(d| _)d| _*d S )#Nr"  )g333333C@g33333³4@gfffffæ2@gÍÌÌÌÌÌ.@gffffff@é   éH   r   zPANTONE 458 CV)ÚspotNamerg  éA   râ   zPANTONE 288 CVéK   )rí  Údensityrv  ra   rb   r–   rh  rI   g      è?é   é3   z%.1f%%)ÚLegendg®Gáz®@g×£p=
W,@gHáz®Ç&@é   Úright)zAAA:zAA:zA:zBBB:zNR:zHelvetica-Boldri  r“   zHelvetica-Oblique)+rj  rk  rT  r™   r   Ú
PCMYKColorr—   rè  rÇ   r]   rZ   r^   rç  ræ  r"  rê  Ú!reportlab.graphics.charts.legendsró  rå  r²   r¨   r´   r©   ÚdeltaxÚdeltayÚdxTextSpacerª   r«   ÚcolumnMaximumÚ	alignmentré  rÚ   rÀ   ÚcolorNamePairsrÓ   rf   rg   Ú_legend2r¶   r·   rµ   r¸   rä  )rB   rs  rö  r—   ÚlegendOffsetró  r  r@   r@   rD   r™   Ñ  sh   û

 
zLegendedPie.__init__c              
   C   sî  | j rg | j_g | j_tt| jƒƒD ]Ÿ}| jd kr/| j| | j	| _
| jj | j| d f¡ nFz| j| | j	| _
| jj | j| | j| f¡ W n+ tyt   | j|t| jƒ  | j	| _
| jj | j|t| jƒ  | j| f¡ Y nw | jd kr±| j| }| j}|d u sŠ|d u r‹nt|tƒr•|| }nt|dƒrŸ||ƒ}n	tdt| jƒ ƒ‚| jj d |f¡ qt | ¡}| j rí| | j¡ | jj| j | j_| jj| j_| jj| j_| jj| j_| jj| j_| jj| j_| | j¡ | | j| j ¡ |S )NÚ__call__z6Unknown formatter type %s, expected string or function)!rä  rå  rý  rþ  rÚ   rÀ   r"  ré  rè  rÇ   r]   rÓ   Ú
IndexErrorrê  ræ  Ú
isinstanceÚstrÚhasattrÚ
ValueErrorÚasciirT  râ  r…  r¨   rç  r©   rø  rù  r«   rû  Úshiftr¶   r¸   )rB   r  ÚldfÚlNFr8  r@   r@   rD   râ    sL   
",þ





€
zLegendedPie.drawc                 C   sL   | j }| jr|| jj| j 7 }|| j | jj¡7 }| j| j	 | j
 }||fS r?   )r·   rä  rå  r¨   rç  rþ  Ú_calculateMaxWidthrý  r¸   r´   rµ   )rB   ÚtxÚtyr@   r@   rD   Ú_getDrawingDimensions7  s   z!LegendedPie._getDrawingDimensionsc                 C   s,   |s|   ¡ \}}t||ƒ}| |  ¡ ¡ |S r?   )r  r   r…  râ  )rB   Údrawingr  r  r@   r@   rD   rˆ  ?  s
   
zLegendedPie.demor?   )rU   rV   rW   rš   r›   rT  rœ   r   r   r   r   r   r�   r™   râ  r  rˆ  r@   r@   r@   rD   rã  À  s&    










õ=)rã  )Ú
_getShadedÚ_2radrê   rí   c                   @   sò  e Zd ZdZed0i deedd�“deedd�“deedd�“deedd�“deedd�“d	eedd�“d
eedƒ“dee	dd�“deedd�“deedd�“deedd�“deedd�“deedd�“dee
dd�“dee
dd�“deedƒ“dee
dd�“deedƒ“deedƒ“deedd�“deedd�“deedd�“deedd�“deed ƒ“d!eed"d�“d#ee
dd�“d$eedd�“d%eedd�“d&eedd�“d'eedd�“d(eedd�“d)eedd�“d*eedd�“d+eed,ƒ“ŽZd-d.„ Zd/S )1ÚWedge3dPropertiesrY   r]   ru   r[   ÚfillColorShadedrh   rf   rg   rl   r   zpadding at bottom of boxrm   rp   rn   ro   rj   rk   rx   rt   r}   zpadding at left of boxrw   r~   zpadding at right of boxr€   zset to True for simple pointersrq   rr   rs   ry   r|   zpadding at top of boxrz   r{   rv   ri   re   Úshadingr^   ÚstrokeColorShadedr_   rZ   r‰   zset to false to skip displayingc                 C   sä   d| _ d| _d| _d  | _ | _| _td | _td | _d| _	td | _
td | _td | _d	| _d | _ | _| _d | _d | _ | _ | _| _d
| _d | _d| _d | _d | _d| _d  | _ | _ | _| _d| _ d| _!d| _"d S )Nr   g333333Ó?ra   r^   r_   rf   rg   r]   r’   rF   r“   r”   r•   )#rZ   r  r‰   r  r  r]   r!   r^   r_   re   rf   rg   rh   ri   rj   rk   rl   rs   r|   r}   r~   r   rm   rn   ro   rp   rq   rr   rt   rv   rw   rx   ry   rz   r€   r˜   r@   r@   rD   r™   t  s0   





zWedge3dProperties.__init__Nr@   )rU   rV   rW   rš   r›   rœ   r	   r
   r   r   r   r   r   r   r   r�   r™   r@   r@   r@   rD   r  G  s�    ÿþýüûú
ùø	÷
öõôóòñ
ðï
î
íìëêé
èçæåäãâá à!ß
"Þ%r  c                   @   r=   )Ú_SL3Dc                 C   sH   |dk r|d7 }|d7 }|| _ || _|| d | _t|| ƒtk | _d S )Nr   rH   r“   )ÚloÚhir  rN   r¸  Únot360)rB   r  r  r@   r@   rD   r™   �  s   z_SL3D.__init__c                 C   s   d| j | jf S )Nz_SL3D(%.2f,%.2f))r  r  r˜   r@   r@   rD   Ú__str__˜  s   z_SL3D.__str__N)rU   rV   rW   r™   r  r@   r@   r@   rD   r  Ž  s    	r  c                 C   s   t | d |d ƒ S ©Nr   r,   r$  r@   r@   rD   Ú_keyS3D›  s   r  r;   c                   @   s�   e Zd Zeeeedd�eedd�eedd�d�ZdZdZ	dZ
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPie3dzA flattening parameter.r[   zdepth of the pie.zThe view angle.)rU  ÚperspectiveÚdepth_3dÚangle_3déF   é   r9   c                 C   s   | j | jr| j| jpdS r  )Ú_sl3dr  rÇ   re   )rB   rÃ   r@   r@   rD   Ú_popoutª  s   zPie3d._popoutc                 C   ó2   | j |r| jpd |  |¡tt| j| jƒƒ  S r  )Ú_cxÚ
_xdepth_3dr#  r   r  r"  r  ©rB   rÃ   rE  r@   r@   rD   ÚCX­  ó   2zPie3d.CXc                 C   r$  r  )Ú_cyÚ
_ydepth_3dr#  r   r  r"  r  r'  r@   r@   rD   ÚCY¯  r)  zPie3d.CYc                 C   ó   |   ||¡| jtt|ƒƒ  S r?   )r(  Ú_radiusxr   r  ©rB   rÃ   ÚorE  r@   r@   rD   ÚOX±  ó   zPie3d.OXc                 C   r-  r?   )r,  Ú_radiusyr   r  r/  r@   r@   rD   ÚOY³  r2  zPie3d.OYc                 C   s$   | j }tt|| ƒt|| d ƒƒS )NrH   )Ú_3dvarì   rN   )rB   r  r5  r@   r@   rD   Úrad_dist¶  s   zPie3d.rad_distc                 C   sœ   t  | ¡ ttƒ| _tj| jd _tj| jd _tj	| jd _tj
| jd _tj| jd _tj| jd _tj| jd _d  | _| _d| _d	| _g d
¢| _d S )Nr   ra   rb   r–   rh  rI   ri  i,  ru  )g      )@gš™™™™4@rÆ   g      6@g      @g      2@g      *@)rT  r™   r'   r  rÇ   r   rl  r]   rm  rn  ro  ÚazureÚcrimsonÚ
darkvioletra  rb  r²   r´   r"  r˜   r@   r@   rD   r™   º  s   

zPie3d.__init__c           	      C   s    |   |¡}||   | j| j¡k rN|  |d¡|  |d¡|  |d¡|  |d¡|  ||d¡|  ||d¡|  ||d¡|  ||d¡g}| |t||||dd�f¡ d S d S )Nr   ra   ©r^   r]   rZ   rc   )	r6  r"  r  r(  r,  r1  r4  rÓ   r#   )	rB   rð   rÃ   r¬   r^   rZ   r]   Úrdr8  r@   r@   rD   Ú	_fillSideÉ  s   
ý ûzPie3d._fillSidec           5         sþ  ˆ j }ˆ j}t|d ƒ }ˆ _t|ƒ}ˆ j}t|ƒ| ˆ _t|ƒ| ˆ _	ˆ j
ˆ jd  ˆ _ˆ jˆ jˆ j	 d  ˆ _ˆ jˆ j
  }}ˆ jrGˆ j}ˆ jrMˆ j}|ˆ _dˆ jd  |  ˆ _}ˆ  ¡ }ˆ j}	ˆ j}
ˆ j}ˆ j}ˆ j}ˆ j}ˆ j}t|ƒ ˆ _}g  }ˆ _t ƒ }tˆ j!ƒ}ˆ j"dkr�dp‘d}|D ] }||9 }||| }}|}|dkr¬||}}| #t$||ƒ¡ q”t%ˆ j&|ƒ}|}|d	 }g }g }g }G ‡ fd
d„dt'ƒ}ˆ j(}t)|ƒD �]}}|| }|j*sãqØ|| } | j+ }!}| j, }"}t-|"|! ƒ}#|#t.k rüqØt/|j0|j1|j2ƒ}$t/|j3|j4|j2ƒ�p|$}%|j5}&|
|dƒ}'||dƒ}(|
|dƒ})||dƒ}*|�r½| 6t7|)|*||!|"||%|&|$dd�
¡ |!|  k �rH|"k �rLn n|}|!|  k �rX|"k �r\n n|}t8|%|$|&dd�}+|+j9|)|*||||dd� |+ :|||dƒ|||dƒ¡ |+j9|'|(||||dd� |+ ;¡  ||k�r›||k�r›d},n	t<||ƒ||ƒƒ},| #|,|+f¡ ||||!|%|&|$ƒ ||||"|%|&|$ƒ |j0}$|j3�pÅ|$}%| #t7|'|(||!|"||%|&|$dd�
¡ |#t=k�rét>|'|(|||%|&|$dd�}-nt7|'|(||!|"||%|&|$dd�
}-| #|-¡ || }.|j?�rV|.�rV|j@}/ˆ  j|/9  _ˆ  j|/9  _| jA}0|||0dƒ}1|||0dƒ}2tBˆ |.|0|1|2||d�}3| #|3¡ |�rP|1|2|0ˆ jˆ j|
|dƒ||dƒ|3 C¡ dœ|3_D|ˆ _|ˆ _qØ|jEtFd� |�ri|�ritG|ˆ jHƒ dd„ |D ƒ| | D ]}4| 6|4¡ �qt|S )Nr7   rÆ   rÜ   g      Y@r
  rÒ   ra   r   r9   c                       s   e Zd Z” jZdd„ ZdS )z Pie3d.draw.<locals>.WedgeLabel3dc                 S   s:   |d dkrt | dƒs| j| _| j | j | _d S d S d S )Nr   r4   Ú_ody)r  r«   r=  r+  rA   r@   r@   rD   rE   ÿ  s   
ýz*Pie3d.draw.<locals>.WedgeLabel3d._checkDXYN)rU   rV   rW   r+  rE   r@   r˜   r@   rD   ÚWedgeLabel3dý  s    r>  )rb  r^   rZ   r]   rc   r:  )rb  ÚmoveTo)rb  r§  )r^   rZ   r]   rc   )r£   r¶  r  c                 S   s   g | ]}|d  ‘qS ©ra   r@   )rß   r0   r@   r@   rD   rá   M  rG  zPie3d.draw.<locals>.<listcomp>)IrÇ   r  rê   r5  r  r  r   r&  r   r+  r¨   r²   r%  r©   r´   r*  ra  rb  r.  r  r3  r¤  r¢  r(  r,  r1  r4  r6  r<  rÀ   r·  r"  r   rV  r  rÓ   r  rÄ   rÂ   r>   rY  rÚ   r‰   r  r  rN   r¨  r  r]   r  r  r^   r  rZ   r…  r   r"   ÚaddArcÚlineToÚ	closePathrì   r¸  r   rz   ri   r  r¿   rî   rÞ   r  r  r  r¥   )5rB   rÇ   Ú	_3d_angler5  Úa0r  ÚradiusxÚradiusyr"  r+  r(  r,  r1  r4  r6  r<  r4   r"  rÃ  ÚlastrN  Úangle1Úangle0rÂ   r¾  r4  r6  rð   r>  rY  rÃ   rË   Úslr  r  rü   r]   r^   rZ   Úcx0Úcy0Úcx1Úcy1r8  r;  rÉ  r¹   Úratr  rº   r»   rà   r¨   r@   r˜   rD   râ  Ò  sÞ   








þ  ÿ

ÿÿ

þ€z
Pie3d.drawc                 C   s2  t ddƒ}tƒ }d|_d|_d|_d|_g d¢|_g d¢|_d|j_	d|jd	 _
d
|jd	 _	d
d
g|jd	 _d|jd	 _tj|jd	 _tj|jd _tj|jd _tj|jd
 _tj|jd	 _tj|jd _tj|jd _tj|jd _d| jd _d| jd	 _d| jd _d| jd _d| jd _| |¡ |S rt  )r   rT  r¨   r©   r²   r´   r"  rÂ   rÇ   rZ   re   r_   ri   r   r�  rh   rl  r]   rm  rn  ro  r‚  rƒ  r„  r‰   r…  r†  r@   r@   rD   rˆ  Q  s8   



z
Pie3d.demoN)rU   rV   rW   r›   rT  rœ   r   r�   r  r  r  r#  r(  r,  r1  r4  r6  r™   r<  râ  rˆ  r@   r@   r@   rD   r     s&    


ý	r  c                  C   sB   t ddƒ} tƒ }d|_d|_dg|_dg|_d|j_|  |¡ | S )ú1Make a degenerated pie chart with only one slice.é�  ru  é–   rv  rw  r  ra   )	r   rT  r¨   r©   r"  rÂ   rÇ   rZ   r…  ©rE  r‡  r@   r@   rD   Úsample0as  s   

rU  c                  C   sN   t ddƒ} tƒ }d|_d|_d|_d|_dg|_dg|_d	|j_	|  
|¡ | S )
rQ  rR  ru  rS  rv  éx   rg  rw  r  ra   )r   rT  r¨   r©   r²   r´   r"  rÂ   rÇ   rZ   r…  rT  r@   r@   rD   Úsample0b„  s   

rW  c                  C   sˆ   t ddƒ} tƒ }d|_d|_g d¢|_g d¢|_d|j_d|jd	 _d
|jd	 _d
d
g|jd	 _	d|jd	 _
tj|jd	 _|  |¡ | S )zFMake a typical pie chart with with one slice treated in a special way.rR  ru  rS  rv  ry  r}  ra   rz  r–   rb   r€  )r   rT  r¨   r©   r"  rÂ   rÇ   rZ   re   r_   ri   r   r�  rh   r…  rT  r@   r@   rD   Úsample1—  s   



rX  c                  C   sÐ   t ddƒ} tƒ }d|_d|_g d¢|_g d¢|_d|_d|_d|j_	t
j|jd	 _t
j|jd _t
j|jd
 _t
j|jd _t
j|jd _t
j|jd _t
j|jd _t
j|jd _t
j|jd _|  |¡ | S )z"Make a pie chart with nine slices.rR  ru  é}   r!  )	g×£p=
×Ó?g‹lçû©ñÂ?gÙÎ÷Sã¥»?gÛù~j¼t³?gL7‰A`å ?g¸…ëQ¸ž?gÛù~j¼t“?gTã¥›Ä À?g333333Ã?)	Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8ÚXrS  ra   r   rb   r–   rh  rI   ri  rô  é   )r   rT  r¨   r©   r"  rÂ   r²   r´   rÇ   rZ   r   Ú	steelbluer]   ÚthistleÚ
cornflowerÚlightsteelbluer‚  rƒ  r„  ÚtanÚdarkseagreenr…  rT  r@   r@   rD   Úsample2®  s(   



rj  c                  C   sr   t ddƒ} tƒ }d|_d|_g d¢|_d|_d|_d|j_t	j
|jd _t	j|jd _t	j|jd	 _|  |¡ | S )
z(Make a pie chart with a very slim slice.rR  ru  rY  r!  )éJ   ra   r!  rS  ra   r   rb   )r   rT  r¨   r©   r"  r²   r´   rÇ   rZ   r   rd  r]   re  rf  r…  rT  r@   r@   rD   Úsample3Î  s   


rl  c                  C   sœ   t ddƒ} tƒ }d|_d|_g d¢|_d|_d|_d|j_t	j
|jd _t	j|jd _t	j|jd	 _t	j|jd
 _t	j|jd _t	j|jd _|  |¡ | S )z/Make a pie chart with several very slim slices.rR  ru  rY  r!  ©rk  ra   ra   ra   ra   é   rS  ra   r   rb   r–   rh  rI   )r   rT  r¨   r©   r"  r²   r´   rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r…  rT  r@   r@   rD   Úsample4å  s    


ro  c                  C   s¬   t ddƒ} tƒ }d|_d|_g d¢|_g d¢|_d|_d|_d|_d|j	_
tj|j	d	 _tj|j	d _tj|j	d
 _tj|j	d _tj|j	d _tj|j	d _|  |¡ | S )zMake a pie with side labels.rR  ru  rY  r!  )rô  ra   ra   ra   ra   rb   ©Úexample1Úexample2Úexample3Úexample4Úexample5Úexample6ra   rS  r   rb   r–   rh  rI   )r   rT  r¨   r©   r"  rÂ   r¥   r²   r´   rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r…  rT  r@   r@   rD   Úsample5þ  s$   



rw  c                  C   sÆ   t ddƒ} tƒ }	 d|_d|_g d¢|_g d¢|_d|_d|_d|_d|j	_
tj|j	d _tj|j	d _tj|j	d	 _tj|j	d
 _tj|j	d _tj|j	d _tddddƒ}|  |¡ |  |¡ | S )z=Illustrates the pie moving to leave space for the left labelsrR  ru  r   r!  rm  rp  ra   rS  rb   r–   rh  rI   )r   rT  r¨   r©   r"  rÂ   r¥   r²   r´   rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r&   r…  )rE  r‡  rà   r@   r@   rD   Úsample6  s*   




rx  c                  C   s¸   t ddƒ} tƒ }d|_d|_d|_d|_g d¢|_g d¢|_d|_d|_	d	|_
d|j_tj|jd	 _tj|jd _tj|jd
 _tj|jd _tj|jd _tj|jd _|  |¡ | S )zCase with overlapping pointersrR  ru  rv  rS  rg  )ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   ra   )rq  rr  rs  rt  ru  rv  Úexample7Úexample8Úexample9Ú	example10Ú	example11Ú	example12Ú	example13Ú	example14Ú	example15Ú	example16Ú	example17Ú	example18Ú	example19Ú	example20Ú	example21Ú	example22Ú	example23Ú	example24Ú	example25Ú	example26Ú	example27Ú	example28ra   r   rb   r–   rh  rI   )r   rT  r©   r¨   r²   r´   r"  rÂ   r¥   rY  r¤   rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r…  rT  r@   r@   rD   Úsample79  s(   



r�  c                  C   s´   	 t ddƒ} tƒ }d|_d|_d|_d|_g d¢|_g d¢|_d|_d|_	d|j
_tj|j
d	 _tj|j
d _tj|j
d
 _tj|j
d _tj|j
d _tj|j
d _|  |¡ | S )úCase with overlapping labelsrR  ru  rv  rS  rg  )ra   ra   ra   ra   ra   râ   rv  ra   ra   ra   ra   ra   ra   r{  rz  rw  ©rq  rr  rs  rt  ru  rv  ry  rz  r{  r|  r}  r~  r  r€  r�  r‚  ra   r   rb   r–   rh  rI   )r   rT  r©   r¨   r²   r´   r"  rÂ   r¥   rY  rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r…  rT  r@   r@   rD   Úsample8[  s(   



r’  c                  C   s´   	 t ddƒ} tƒ }d|_d|_g d¢|_g d¢|_d|_d|_d|_d|_	d|j
_tj|j
d	 _tj|j
d _tj|j
d
 _tj|j
d _tj|j
d _tj|j
d _|  |¡ | S )r�  rR  ru  rY  rv  )é)   rz  r{  é   rz  râ   rv  r”  r!  é#   r!  rz  râ   r{  rz  râ   r‘  ra   rg  r   rb   r–   rh  rI   )r   rT  r¨   r©   r"  rÂ   r¥   rY  r²   r´   rÇ   rZ   r   rd  r]   re  rf  rg  r‚  rƒ  r…  rT  r@   r@   rD   Úsample9{  s(   



r–  Ú__main__)Ú	renderPDFr`  Úsamplezsample%sz%s.pdfr?   r@  )FrÜ   )sÚ__version__rš   Ú	functoolsÚmathr   r   r   Úreportlab.libr   Úreportlab.lib.validatorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú"reportlab.graphics.widgets.markersr   r   Úreportlab.lib.attrmapÚreportlab.graphics.shapesr   r   r   r   r    r!   r"   r#   r$   r%   r&   Úreportlab.graphics.widgetbaser'   r(   Úreportlab.graphics.charts.areasr)   r÷  r*   Ú$reportlab.graphics.charts.textlabelsr+   Ú	reportlabr-   rQ   rP   r¨  r¸  r>   rX   r¿   rÄ   rÅ   rÑ   rÙ   rÛ   r  r	  r  r  Ú
cmp_to_keyr  r#  r%  r&  rD  rO  ré   rP  rT  rã  Ú!reportlab.graphics.charts.utils3dr  r  rê   rí   r  r  r  Ú_270rr  rU  rW  rX  rj  rl  ro  rw  rx  r�  r’  r–  rU   ÚsysÚreportlab.graphicsr˜  Úargvr  Ú
startswithÚnameÚglobalsr  Ú
drawToFiler@   r@   r@   rD   Ú<module>   s–   T4
\>

	I

"

F   : G
 T  " 
 ô	