o
    ¬+ Z¸û  ã                
   @   s¦  d Z dZddl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mZ ddlm Z m!Z! ddl"T 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/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z<m=Z=m>Z> ddddddddddœ	Z?ddddddddddœ	Z@dZAdeA ZBG dd„ de:ƒZCG dd„ de4ƒZDeCfdd „ZEd!d"„ ZFG d#d$„ d$e6ƒZGd%d&„ ZHd'd(„ ZIdnd*d+„ZJdod.d/„ZKd0d1„ ZLd2d3„ ZMd4d5„ ZNe OeN¡ZNd6d7„ ZPdpd8d9„ZQd:d;„ ZRe OeR¡ZRd<d=„ ZSdpd>d?„ZTd@dA„ ZUG dBdC„ dCeVƒZWG dDdE„ dEeGƒZXG dFdG„ dGeXƒZYddHlZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` G dIdJ„ dJe4ƒZaG dKdL„ dLƒZbdMdN„ Zce Oec¡Zce\dOƒZdG dPdQ„ dQeXƒZedRdS„ ZfdTdU„ ZgdVdW„ ZhdXdY„ ZidZd[„ Zjd\d]„ Zkd^d_„ Zld`da„ Zmdbdc„ Znddde„ Zodfdg„ Zpeqdhk�rÏ	 ddlrZrddilsmtZt erjud)d… �p®djgZueuD ]Zvev wdk¡�r»evndlev Zxeyƒ ex ƒ Zzet {ezdmex ¡ �q±dS dS )qz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)ÚisColorÚisNumberÚisListOfNumbersOrNoneÚisListOfNumbersÚisColorOrNoneÚisStringÚisListOfStringsOrNoneÚOneOfÚ
SequenceOfÚ	isBooleanÚisListOfColorsÚisNumberOrNoneÚisNoneOrListOfNoneOrStringsÚisTextAnchorÚisNoneOrListOfNoneOrNumbersÚisBoxAnchorÚisStringOrNoneÚNoneOrÚEitherOrÚisNumberInRange)ÚuSymbol2SymbolÚisSymbol)Ú*)ÚCanvas)ÚGroupÚDrawingÚEllipseÚWedgeÚStringÚSTATE_DEFAULTSÚArcPathÚPolygonÚRectÚPolyLineÚLine)ÚWidgetÚTypedPropertyCollectionÚ
PropHolder)ÚPlotArea)Ú_objStr)ÚLabel)ÚxrangeÚasciiÚcmpÚwÚswÚsÚseÚeÚneÚnÚnw)	r   é-   éZ   é‡   é´   éá   é  i;  éÓÿÿÿgH¯¼šò×z>ç     €v@c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú
WedgeLabelc                 C   s   d S ©N© ©ÚselfÚbarE   rE   úU/var/www/html/env/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@r:   r;   é   r   r@   Ú_anti)Ú	boxAnchorÚintÚ_pmvÚabsÚgetattrÚ_ANGLE2RBOXANCHORÚ_ANGLE2BOXANCHORrJ   )rG   rH   ÚnaÚdarE   rE   rI   Ú_getBoxAnchor/   s   
zWedgeLabel._getBoxAnchorN)Ú__name__Ú
__module__Ú__qualname__rJ   rY   rE   rE   rE   rI   rC   ,   s    rC   c                	   @   s\  e Zd ZdZedZi 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ƒ“ŽZdWdX„ ZdYS )[Ú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') ...©ra   ÚadvancedUsageÚvisiblezSet to false to skip displayingc                 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 S )Nr   rc   rd   rf   rk   rl   rb   ç333333ó?rK   ç      à?çš™™™™™¹?Ústarté   rg   )*r_   rb   r#   rc   rd   rh   re   ri   rj   rk   rl   rm   rn   ro   rp   rq   rx   r�   r‚   rƒ   r„   rr   rs   rt   ru   rv   rw   ry   r{   r|   r}   r~   r…   r   r   Úblackr†   r‡   rˆ   r‰   rŠ   rŽ   ©rG   rE   rE   rI   Ú__init__n   s>   





zWedgeProperties.__init__NrE   )rZ   r[   r\   Ú__doc__ÚAttrMapÚAttrMapValuer   r
   r   r   r   r   r   r   r   r   r   r   Ú_attrMapr–   rE   rE   rE   rI   r]   ;   s¨    ÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåä
ã
â
á
 à
!ß"Þ#Ý$Ü%Û&Ú'Ù
(Ø+r]   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¬|ƒ }||_||_||_|j	|_
| jsT|j|_|j|_n@|jd u r_| jd
 }n|jd
 }|jd u rm||_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-|_.|j/|_0|j1|_|j|_|j2|_2|j3|_4|S )NÚmiddler;   r?   éÂ  é>þÿÿéòþÿÿr’   Úendr   g      @r2   r6   )5ÚsimpleLabelsr"   Ú
sideLabelsÚ
textAnchorrS   rR   Ú_simple_pointerÚxÚyro   Údxrp   Údyrr   rP   rl   rq   Úanglers   ÚboxStrokeColorrt   ÚboxStrokeWidthru   ÚboxFillColorrv   rc   rw   r_   rx   Ú_textry   Úleadingr{   Úwidthr|   ÚmaxWidthr}   Úheightr~   r   rŽ   r�   Ú
topPaddingr‚   ÚleftPaddingrƒ   ÚrightPaddingr„   ÚbottomPaddingr…   rk   rm   rb   )
rG   Útextr¨   ÚlabelXÚlabelYÚ
wedgeStyleÚ
labelClassÚtheLabelÚsideLabels_dyr¬   rE   rE   rI   Ú_addWedgeLabel�   sd   4



4r¼   c                 C   s@   | d u rdg| } | S |t | ƒ }|dkrt| ƒdg|  } | S )Nrz   r   )ÚlenÚlist)Úlabelsr8   ÚirE   rE   rI   Ú
_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 )Nrc   rb   rd   r_   r‹   ç       @)r_   rc   rd   rb   )Úslicesr½   rT   r   r&   )rG   ÚrowNor¤   r¥   r®   r°   Ú	baseStyleÚstyleIdxÚstylerc   rb   rd   r_   r‹   rE   rE   rI   Ú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 defaultrx   rz   N)r-   r¿   r    rT   rÄ   )rG   rÀ   Údefaultrµ   r¬   rE   rE   rI   ÚgetSeriesNameã   s   zAbstractPieChart.getSeriesNamerD   )rZ   r[   r\   rÉ   rË   rE   rE   rE   rI   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   rg   g{®Gáz„?rf   r�   r“   rE   )ÚPÚQrE   rE   rI   Ú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]rf   éÿÿÿÿr   )r½   rÎ   ÚappendÚinsert)ÚBrÀ   Úwrapr8   ÚRÚjrE   rE   rI   Ú_findOverlapRunñ   s   
üÿürÖ   rf   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 Nonerf   N)r½   r/   rÖ   )rÒ   rÓ   r8   rÀ   rÔ   rE   rE   rI   Ú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 )Nrg   c                 S   s   g | ]}|j d  ‘qS )Úbounds)Ú	_origdata)Ú.0ÚlrE   rE   rI   Ú
<listcomp>  s    z$fixLabelOverlaps.<locals>.<listcomp>rf   r   é   c                    s   g | ]}|ˆ v r|‘qS rE   rE   )rÛ   Úr©rÔ   rE   rI   rÝ     s    rÏ   ÚcxÚrxÚcyÚrygÍÌÌÌÌÌð?rÙ   r“   r�   )r½   Úfloatr×   Ú_360rR   ÚmaxÚminrS   rÚ   Ú_180_pir   r¤   r   r¥   Ú	getBoundsÚ	enumerate)ÚLr¡   Úmult0ÚnLrÒ   ÚOKÚRPÚiterÚmultÚnRrX   Úr0ÚrLÚbiÚtaaÚaarß   ÚbÚutaaÚntaarÜ   Úorigr¨   ÚradÚl1Úorig1Úbounds1rÀ   rÙ   Údiff1Údiff2rE   rà   rI   ÚfixLabelOverlaps
  sŒ   ("à
#

$$
 
€çr  c                 C   s:   t t| ƒt|ƒƒtt | ƒt |ƒƒ}}||krd S ||fS rD   )rç   rè   )ÚArÒ   r¤   r¥   rE   rE   rI   ÚintervalIntersectionS  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 )NrM   r;   r?   Ú	clockwiser   )rf   é¦ÿÿÿr;   i˜þÿÿr  )rf   r?   rœ   rœ   rf   c                 S   s    g | ]}|d  |d k r|‘qS )rf   rg   rE   ©rÛ   ÚarE   rE   rI   rÝ   e  ó     z$_makeSideArcDefs.<locals>.<listcomp>)Útuple)ÚsaÚ	directionr	  ÚoffsrE   rE   rI   Ú_makeSideArcDefsX  s   20r  c                 C   s"   t |d |d  | d | d  ƒS )Nrf   r   ©r1   )r¤   r¥   rE   rE   rI   Ú_keyFLAg  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   rf   NrE   r  ©ÚsiderE   rI   rÝ   l  s   , z#_findLargestArc.<locals>.<listcomp>rf   ©Úkeyr   )r½   Úsortr  )ÚxArcsr  r	  rE   r  rI   Ú_findLargestArck  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Úrirf   r   r®   ÚedgePadr=   r�   ÚmidÚsmidÚcmidr  )rÚ   rR   r¤   r   ré   r   )
rÜ   r®   r  Údatar  r  rÀ   r2   r  r  rE   rE   rI   Ú_fPLSideq  s:    

r   c                 C   s   t |jd | jd ƒS )Nr  )r1   rÚ   ©r	  rù   rE   rE   rI   Ú_fPLCF“  s   r"  c                 C   s   | d S )Nrf   rE   )r	  rE   rE   rI   Ú_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   rf   r�   )r   rf   r  r®   Úindexr  rÙ   r“   rg   r  ÚpiePadÚelbowLengthrÞ   )rÓ   rÏ   c                 S   s   g | ]
}|d  |d  ‘qS )r“   rf   rE   )rÛ   rù   rE   rE   rI   rÝ   Ð  ó    z%_fixPointerLabels.<locals>.<listcomp>)r   rÐ   rç   r  r"  rÚ   r¤   r¥   rS   r½   r×   Úsum))r8   rì   r¤   r¥   r®   r°   r  ÚLRÚmlrrÜ   rÀ   r2   ÚmulÚGÚmelÚhhÚyhhÚmÚTrÒ   ÚaBÚSÚaSÚpÚyhr  ÚincÚlyrù   Úb2rñ   ÚnTrÔ   ró   Új0Új1ÚjlÚsAboveÚsFreeÚsNeedrß   rE   rE   rI   Ú_fixPointerLabelsš  sˆ   

$$
:$ërA  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 )Nrg   c                    s   g | ]}|ˆ  ‘qS rE   rE   )rÛ   Úd)ÚfacrE   rI   rÝ   â  ó    ztheta0.<locals>.<listcomp>r   r�   g    €„.Ag      B@é$   c                    s   g | ]
}t tˆ | ƒƒ‘qS rE   )rS   r   r  )rß   rE   rI   rÝ   ï  r'  r  r=   )r   r(  rÐ   r½   Úrange)
r  r  Úradsrô   ÚhradsÚvstarÚrstarÚdeltarÀ   ÚvrE   )rC  rß   rI   Útheta0à  s(   
€rM  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 rD   )rå   Ú__new__Ú_data)Úclsr¨   r  rG   rE   rE   rI   rO  û  s   zAngleData.__new__N)rZ   r[   r\   r—   rO  rE   rE   rE   rI   rN  ù  s    rN  c                	   @   st  e Zd Zed>i 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�“ŽZdZd/d0„ Zd1d2„ Zd3d4„ Zd?d6d7„Zd8d9„ Zd:d;„ Zd<d=„ ZdS )@Ú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.rf   rŒ   ÚcheckLabelOverlapgš™™™™™©?zFIf true check and attempt to fix
 standard label overlaps(default off)ÚpointerLabelModeÚ	LeftRightÚLeftAndRightrz   Ú	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 piec                 K   sê   t  | ¡ d| _d| _d| _d| _g d¢| _d | _d| _d| _	d| _
d| _d | _d| _d| _d  | _ | _| _d| _d	| _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 S )Nr   éd   )rf   gffffff@g333333û?gÍÌÌÌÌÌ@r;   r  rf   Fr]  r‘   rg   r“   é   rN   é   ) r,   r–   r¤   r¥   r®   r°   r  r¿   rT  r  r    rW  rX  r[  r\  r_  r`  ra  r¡   rc  r*   r]   rÄ   r   Údarkcyanrb   Ú
bluevioletÚblueÚcyanÚpinkÚmagentaÚyellow)rG   ÚkwdrE   rE   rI   r–     s2   


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éÈ   rd  é2   é
   éP   ©rr  é   rÞ   é(   rq  é<   ©r	  rù   ÚcrB  r6   Úfr�   r“   rg   ç      ü?r   rf   re  rN   rf  )r   rR  r¤   r¥   r®   r°   r  r¿   rÄ   r_   rj   rd   rn   r   Úredrm   rg  rb   rh  ri  rj  Ú
aquamarineÚ	cadetblueÚ
lightcoralÚadd©rG   rB  ÚpcrE   rE   rI   Údemo2  s.   



zPie.democ           $         sd  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|||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,|�s0| j d }| jd }| j| }| j| }| j�r| j}| j�r| j}| j�r(t||ƒ }}|||||g ƒS ||k}|
| jk �rG|�sB||k�rGt|ƒ}nd }tt|ƒ|| j| j| j | j|d�\}}} }!|dk�rjt|| ƒ }} | 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 rD   )ÚcenterxÚcenteryr_  r`  r  ÚluÚru)rG   r„  r…  r_  r`  r  r†  r‡  rE   rE   rI   r–   P  s   
z*Pie.makePointerLabels.<locals>.PL.__init__N)r   r   )rZ   r[   r\   r–   rE   rE   rE   rI   ÚPLO  s    rˆ  rg   r   rf   rz   r=   ©r¹   r“   c                    s*   g | ]}|d  t ˆ |d |d fƒf‘qS )r   rf   rg   )r  r  ©r  rE   rI   rÝ   l  s   * z)Pie.makePointerLabels.<locals>.<listcomp>rZ  g{®Gáz”?)	rÙ   r®   r°   r  r  r$  r  r%  r&  r�   r  )r®   r°   r½   rÄ   rÐ   r  rT  r  rË   r   rŽ   r¼   rC   rê   r  Údictr‰   rŠ   rˆ   rÚ   rç   r¤   r¥   r_  r`  r[  rè   rQ   rA  )$rG   ÚanglesÚplModerˆ  r¶   r·   r8   ÚnrÚnlÚmaxWÚsumHÚ
styleCountrì   ÚL_addÚrefArcsrÀ   ÚsnrÈ   rÜ   rù   r2   Úhr  r  r_  r`  r„  r…  ÚaonRr  r,  r†  r‡  r-  Úx0Úx1rE   rŠ  rI   ÚmakePointerLabelsN  s~   




 $$"





*

zPie.makePointerLabelsFc                    s^   t tt| jƒƒ}tt|ƒƒ }| _|dkrd| nd‰ |r&‡ fdd„|D ƒS ‡ fdd„|D ƒS )Nr   rA   rf   c                    s   g | ]	}t ˆ | |ƒ‘qS rE   )rN  ©rÛ   r¤   ©rz  rE   rI   rÝ   ¢  s    z%Pie.normalizeData.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS rE   rE   r›  rœ  rE   rI   rÝ   ¤  rD  )r¾   ÚmaprS   r  rå   r(  Ú_sum)rG   ÚkeepDatar  r4   rE   rœ  rI   Ú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 )Nrb  rf   rM   r  rÏ   c                 S   s   g | ]}|‘qS rE   rE   r  rE   rE   rI   rÝ   ®  s    z"Pie.makeAngles.<locals>.<listcomp>)rŸ  r^  c                 S   s    g | ]}t |d  ƒdkr|‘qS ©rf   gñhãˆµøä>©rS   r  rE   rE   rI   rÝ   °  r
  r  r   rg   re  c                 S   s    g | ]}t |d  ƒdk r|‘qS r¡  r¢  r  rE   rE   rI   rÝ   ½  r
  )rT   r¡   rM  r  r  rÄ   r   rT  rë   r   r\  r  r#  ÚpoprÐ   ÚreverserS   Ú_ANGLELOrN  rP  )rG   ÚwrrT  ÚwhichWayÚDÚWr1  rÀ   r	  r  r¨   ÚendAnglerø   rE   rE   rI   Ú
makeAngles¦  sH   


ù

zPie.makeAnglesc           <         s8  ˆ   ¡ }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)|$_)||$ƒ |
�rO|
|$|j*|d
� |j+�rÂ|�sò|�r§|j,}%||% }&||% }'||&|"  }(||'|#  })t-ˆ || |(|)|ƒ}*||*ƒ |�s’|*j.�r’|||"  |*_/|||#  |*_0|�r¦|(|)| |&|'|||* 1¡ ||fdœ	|*_2q¤|�rñ|�rñ|| }*|*�rñ|*j2}+|+d },|+d }-|||-  }.|||,  }/|j3}0|.|0|-  }1|/|0|,  }2|t4|.|/|1|2|*j|*jf|j5|j6d�ƒ ||*ƒ q¤|�rÂˆ jj}3d}4|D ]*\}}5ˆ j| j#�r|4d7 }4�qý||4 }6ˆ j|6 j#ˆ j| _#ˆ j|6 jˆ j| _�qýt7d|4d ƒD ]}7ˆ j|7 j|3k�r@ˆ j|7 j}3�q/|j,}%||% }'t| ƒdk �sh| dk�rZ| dk �shd|   k �rfdk �rxn ndˆ j8 ˆ j ˆ j |3 }(d}&nˆ jˆ j8ˆ j  |3 }(d}&||'|#  })t-ˆ || |(|)|ƒ}*||*ƒ |�s©|||"  |*_/|||#  |*_0|�rº|(|)| |&|'|||* 1¡ dœ|*_2|* 1¡ \}8}9}:};q¤|�rÐ|�rÐt9|||d� |D ]}*||*ƒ �qÒ|�sš|D ]º}*|*j.�rü|�sü|t:|*j|*j|*j/|*j0|j5|j6d�ƒ �qß|�r˜|* 1¡ \}8}9}:};|*jdˆ j8 ˆ j ˆ j k�rX|t:|*j/|*j0d|*j/|*j  |*jd|;|9   |j5|j6d�ƒ |t:d|*j/|*j  |*jd|;|9   |*j|*jd|;|9   |j5|j6d�ƒ �qß|t:|*j/|*j0d|*j/|*j  |*jd|;|9   |j5|j6d�ƒ |t:d|*j/|*j  |*jd|;|9   |*j|*jd|;|9   |j5|j6d�ƒ �qß|S )Nr�   rb  Fc                 S   s   dS ©Nrz   rE   ©rÀ   rE   rE   rI   Ú<lambda>ì  s    z Pie.makeWedges.<locals>.<lambda>c                    s   ˆ   | d¡S r¬  )rË   r­  r•   rE   rI   r®  ö  s    rÃ   )r`  Úradius1Úyradius1)r`  )ÚvalueÚlabel)	r¤   r¥   r¨   râ   rä   rá   rã   rÙ   rŒ  r  r  )r_   rc   r   rf   r;   r?   rœ   r�   rž   ©r¤   r¥   r¨   râ   rä   rá   rã   rÙ   )rí   g      Ð?);r«  rÐ   r¡   r½   rÁ   r¿   rT   Ú_seriesCountrÄ   rX  rš  r_  r`  r„  r…  r  r®   r°   r¤   r¥   r[  rè   rW  r   r€  ra  rŽ   rS   rj   ré   r   r   Ú_ANGLEHIr!   r    rb   rc   r_   rh   re   ri   rd   rP  r   rn   r¼   r£   Ú_aaxÚ_aayrê   rÚ   rˆ   r'   r‡   r†   rF  rc  r  r(   )<rG   rŒ  Ú
halfAnglesrÀ   Úa1Úa2Ú	halfAngler¡   r8   r¿   r¦  r’  r�  rW  rˆ  r_  r`  r„  r…  ÚPL_dataÚgSNÚgÚg_addrì   r“  ra  r¸   rø   rá   rã   rµ   rj   ÚaverageAngleÚaveAngleRadiansÚcosAAÚsinAAÚtheWedgern   râ   rä   r¶   r·   rÜ   r  ÚsinMÚcosMÚlXÚlYÚlpelÚlXiÚlYiÚslices_popoutr0  r¨   rß   rÕ   r™  Úy1Úx2Úy2rE   r•   rI   Ú
makeWedgesÏ  sb  







ÿ
þ€þ€€$
ÿÿþ€þ*þ6þ*þ6þ€zPie.makeWedgesc                 C   s"   |   ¡ }|  ¡ }|rt||ƒS |S rD   )ÚmakeBackgroundrÐ  r   )rG   r,  r2   rE   rE   rI   ÚdrawŽ  s   zPie.drawrE   )F)rZ   r[   r\   r˜   rÂ   r™   r	   r   r   r   r   r   r   r   rš   rV  r–   rƒ  rš  r   r«  rÐ  rÒ  rE   rE   rE   rI   rR     sZ    ÿþýüûúùø	÷
öõôóòñðï
O	) @rR  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)rS  Ú
drawLegendÚlegend1ÚlegendNumberFormatÚlegendNumberOffsetÚpieAndLegend_colorsÚlegend_namesÚlegend_datar²   r³   r±   r´   c                 C   sf  t  | ¡ d| _d| _d| _d| _g d¢| _d | _d| _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   rd  )g333333C@g33333³4@gfffffæ2@gÍÌÌÌÌÌ.@gffffff@r  é   éH   zPANTONE 458 CV)ÚspotNameéA   rÞ   zPANTONE 288 CVéK   )rÝ  Údensityrq  rf   rg   r“   re  rN   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-Boldrf  r�   zHelvetica-Oblique)+rR  r–   r¤   r¥   r°   r®   r  r¿   r  r   Ú
PCMYKColorr”   rØ  rÄ   rb   r_   rc   r×  rÖ  rÚ  Ú!reportlab.graphics.charts.legendsrã  rÕ  ÚdeltaxÚdeltayÚdxTextSpacer¦   r§   ÚcolumnMaximumÚ	alignmentrÙ  rF  r½   ÚcolorNamePairsrÐ   rk   rl   Ú_legend2r²   r³   r±   r´   rÔ  )rG   ræ  r”   ÚlegendOffsetrã  rz  rE   rE   rI   r–   ¥  st   

û

 
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î  rF  r½   r  rÙ  rØ  rÄ   rb   rÐ   Ú
IndexErrorrÚ  rÖ  Ú
isinstanceÚstrÚhasattrÚ
ValueErrorr0   rR  rÒ  r€  r¤   r×  r¥   rè  ré  r§   rë  Úshiftr²   r´   )rG   rz  ÚldfÚlNFr5  rE   rE   rI   rÒ  è  sL   
",þ





€
zLegendedPie.drawc                 C   sL   | j }| jr|| jj| j 7 }|| j | jj¡7 }| j| j	 | j
 }||fS rD   )r³   rÔ  rÕ  r¤   r×  rî  Ú_calculateMaxWidthrí  r´   r°   r±   )rG   ÚtxÚtyrE   rE   rI   Ú_getDrawingDimensions  s   z!LegendedPie._getDrawingDimensionsc                 C   s,   |s|   ¡ \}}t||ƒ}| |  ¡ ¡ |S rD   )rü  r   r€  rÒ  )rG   Údrawingrú  rû  rE   rE   rI   rƒ    s
   
zLegendedPie.demorD   )rZ   r[   r\   r—   r˜   rR  r™   r   r   r   r   r   rš   r–   rÒ  rü  rƒ  rE   rE   rE   rI   rÓ  ”  s&    










õC)rÓ  )Ú
_getShadedÚ_2radræ   Ú_pi_2Ú_2piré   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ÚWedge3dPropertiesr^   rb   rz   r`   ÚfillColorShadedrm   rk   rl   rq   r„   zpadding at bottom of boxrr   ru   rs   rt   ro   rp   r}   ry   r‚   zpadding at left of boxr|   rƒ   zpadding at right of boxr…   zset to True for simple pointersrv   rw   rx   r~   r�   zpadding at top of boxr   r€   r{   rn   rj   Úshadingrc   ÚstrokeColorShadedrd   r_   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Ó?rf   rc   rd   rk   rl   rb   r�   rK   r�   r‘   r’   )#r_   r  rŽ   r  r  rb   r#   rc   rd   rj   rk   rl   rm   rn   ro   rp   rq   rx   r�   r‚   rƒ   r„   rr   rs   rt   ru   rv   rw   ry   r{   r|   r}   r~   r   r…   r•   rE   rE   rI   r–   N  s0   





zWedge3dProperties.__init__NrE   )rZ   r[   r\   r—   r˜   r™   r
   r   r   r   r   r   r   r   r   rš   r–   rE   rE   rE   rI   r  !  s�    ÿþýüûú
ùø	÷
öõôóòñ
ðï
î
íìëêé
èçæåäãâá à!ß
"Þ%r  c                   @   rB   )Ú_SL3Dc                 C   sH   |dk r|d7 }|d7 }|| _ || _|| d | _t|| ƒtk | _d S )Nr   rM   r�   )ÚloÚhir  rS   rµ  Únot360)rG   r  r  rE   rE   rI   r–   i  s   z_SL3D.__init__c                 C   s   d| j | jf S )Nz_SL3D(%.2f,%.2f))r  r  r•   rE   rE   rI   Ú__str__r  s   z_SL3D.__str__N)rZ   r[   r\   r–   r
  rE   rE   rE   rI   r  h  s    	r  c                 C   s   t | d |d ƒ S ©Nr   r  r!  rE   rE   rI   Ú_keyS3Du  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.)rS  ÚperspectiveÚdepth_3dÚangle_3déF   é   r=   c                 C   s   | j | jr| j| jpdS r  )Ú_sl3dr	  rÄ   rj   )rG   rÀ   rE   rE   rI   Ú_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  ©rG   rÀ   rB  rE   rE   rI   ÚCX‡  ó   2zPie3d.CXc                 C   r  r  )Ú_cyÚ
_ydepth_3dr  r   rÿ  r  r  r  rE   rE   rI   ÚCY‰  r  zPie3d.CYc                 C   ó   |   ||¡| jtt|ƒƒ  S rD   )r  Ú_radiusxr   rÿ  ©rG   rÀ   ÚorB  rE   rE   rI   ÚOX‹  ó   zPie3d.OXc                 C   r  rD   )r  Ú_radiusyr   rÿ  r   rE   rE   rI   ÚOY�  r#  zPie3d.OYc                 C   s$   | j }tt|| ƒt|| d ƒƒS )NrM   )Ú_3dvarè   rS   )rG   r	  r&  rE   rE   rI   Úrad_dist�  s   zPie3d.rad_distc                 C   sd   t  | ¡ tj| jd _tj| jd _tj| jd _tt	ƒ| _d  | _
| _d| _d| _g d¢| _d S )Nre  rN   rf  i,  rp  )g      )@gš™™™™4@rÃ   g      6@g      @g      2@g      *@)rR  r–   r   ÚazurerÄ   rb   ÚcrimsonÚ
darkvioletr*   r  r_  r`  r®   r°   r  r•   rE   rE   rI   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   rf   ©rc   rb   r_   rh   )	r'  r  r  r  r  r"  r%  rÐ   r%   )	rG   rì   rÀ   r¨   rc   r_   rb   Úrdr5  rE   rE   rI   Ú	_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� |�rh|�rhtG|tHƒ dd„ |D ƒ| | D ]}4| 6|4¡ �qs|S )Nr;   rÃ   rØ   g      Y@r  rÏ   rf   r   r=   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   r8   Ú_ody)rô  r§   r.  r  rF   rE   rE   rI   rJ   Õ  s   
ýz*Pie3d.draw.<locals>.WedgeLabel3d._checkDXYN)rZ   r[   r\   r  rJ   rE   r•   rE   rI   ÚWedgeLabel3dÓ  s    r/  )r`  rc   r_   rb   rh   r+  )r`  ÚmoveTo)r`  r¤  )rc   r_   rb   rh   r‰  r³  r  c                 S   s   g | ]}|d  ‘qS ©rf   rE   )rÛ   r4   rE   rE   rI   rÝ   #  rD  zPie3d.draw.<locals>.<listcomp>)IrÄ   r  ræ   r&  rÿ  r  r   r  r   r  r¤   r®   r  r¥   r°   r  r_  r`  r  r  r$  r   rž  r  r  r"  r%  r'  r-  r½   r´  r  r   rT  r  rÐ   r  rÁ   r¿   rC   rW  rF  rŽ   r  r  rS   r¥  rþ  rb   r  r  rc   r  r_   r€  r!   r$   ÚaddArcÚlineToÚ	closePathrè   rµ  r    r   rn   r  r¼   rê   rÚ   r  r  r  r¡   )5rG   rÄ   Ú	_3d_angler&  Úa0r  ÚradiusxÚradiusyr  r(  r  r  r"  r%  r'  r-  r8   r  r¾  ÚlastrL  Úangle1Úangle0r¿   r¹  r1  r3  rì   r/  rW  rÀ   rÈ   Úslr  r  rø   rb   rc   r_   Úcx0Úcy0Úcx1Úcy1r5  r,  rÄ  rµ   Úratr  r¶   r·   rÜ   r¤   rE   r•   rI   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 ro  )r   rR  r¤   r¥   r®   r°   r  r¿   rÄ   r_   rj   rd   rn   r   r|  rm   rg  rb   rh  ri  rj  r}  r~  r  rŽ   r€  r�  rE   rE   rI   rƒ  '  s8   



z
Pie3d.demoN)rZ   r[   r\   r˜   rR  r™   r   rš   r  r  r  r  r  r  r"  r%  r'  r–   r-  rÒ  rƒ  rE   rE   rE   rI   r  z  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.é�  rp  é–   rq  rr  r	  rf   )	r   rR  r¤   r¥   r  r¿   rÄ   r_   r€  ©rB  r‚  rE   rE   rI   Úsample0aI  s   

rF  c                  C   sN   t ddƒ} tƒ }d|_d|_d|_d|_dg|_dg|_d	|j_	|  
|¡ | S )
rB  rC  rp  rD  rq  éx   rd  rr  r	  rf   )r   rR  r¤   r¥   r®   r°   r  r¿   rÄ   r_   r€  rE  rE   rE   rI   Úsample0bZ  s   

rH  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.rC  rp  rD  rq  rt  rx  rf   ru  r“   rg   r{  )r   rR  r¤   r¥   r  r¿   rÄ   r_   rj   rd   rn   r   r|  rm   r€  rE  rE   rE   rI   Úsample1m  s   



rI  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.rC  rp  é}   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ÚXrD  rf   r   rg   r“   re  rN   rf  rä  é   )r   rR  r¤   r¥   r  r¿   r®   r°   rÄ   r_   r   Ú	steelbluerb   ÚthistleÚ
cornflowerÚlightsteelbluer}  r~  r  ÚtanÚdarkseagreenr€  rE  rE   rE   rI   Úsample2„  s(   



r[  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.rC  rp  rJ  r  )éJ   rf   r  rD  rf   r   rg   )r   rR  r¤   r¥   r  r®   r°   rÄ   r_   r   rU  rb   rV  rW  r€  rE  rE   rE   rI   Úsample3¤  s   


r]  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.rC  rp  rJ  r  ©r\  rf   rf   rf   rf   é   rD  rf   r   rg   r“   re  rN   )r   rR  r¤   r¥   r  r®   r°   rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r€  rE  rE   rE   rI   Úsample4»  s    


r`  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.rC  rp  rJ  r  )rä  rf   rf   rf   rf   rg   ©Úexample1Úexample2Úexample3Úexample4Úexample5Úexample6rf   rD  r   rg   r“   re  rN   )r   rR  r¤   r¥   r  r¿   r¡   r®   r°   rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r€  rE  rE   rE   rI   Úsample5Ô  s$   



rh  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 labelsrC  rp  r   r  r^  ra  rf   rD  rg   r“   re  rN   )r   rR  r¤   r¥   r  r¿   r¡   r®   r°   rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r(   r€  )rB  r‚  rÜ   rE   rE   rI   Úsample6ï  s*   




ri  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 pointersrC  rp  rq  rD  rd  )rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   )rb  rc  rd  re  rf  rg  Úexample7Úexample8Úexample9Ú	example10Ú	example11Ú	example12Ú	example13Ú	example14Ú	example15Ú	example16Ú	example17Ú	example18Ú	example19Ú	example20Ú	example21Ú	example22Ú	example23Ú	example24Ú	example25Ú	example26Ú	example27Ú	example28rf   r   rg   r“   re  rN   )r   rR  r¥   r¤   r®   r°   r  r¿   r¡   rW  r    rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r€  rE  rE   rE   rI   Úsample7  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 labelsrC  rp  rq  rD  rd  )rf   rf   rf   rf   rf   rÞ   rq  rf   rf   rf   rf   rf   rf   rv  ru  rr  ©rb  rc  rd  re  rf  rg  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rf   r   rg   r“   re  rN   )r   rR  r¥   r¤   r®   r°   r  r¿   r¡   rW  rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r€  rE  rE   rE   rI   Úsample81  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�  rC  rp  rJ  rq  )é)   ru  rv  é   ru  rÞ   rq  r…  r  é#   r  ru  rÞ   rv  ru  rÞ   r‚  rf   rd  r   rg   r“   re  rN   )r   rR  r¤   r¥   r  r¿   r¡   rW  r®   r°   rÄ   r_   r   rU  rb   rV  rW  rX  r}  r~  r€  rE  rE   rE   rI   Úsample9Q  s(   



r‡  Ú__main__)Ú	renderPDFrQ  Úsamplezsample%sz%s.pdfr1  )FrØ   rD   )|Ú__version__r—   ÚcopyÚ	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   r   Ú"reportlab.graphics.widgets.markersr   r   Úreportlab.lib.attrmapÚreportlab.pdfgen.canvasr   Úreportlab.graphics.shapesr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Úreportlab.graphics.widgetbaser)   r*   r+   Úreportlab.graphics.charts.areasr,   rç  r-   Ú$reportlab.graphics.charts.textlabelsr.   Ú	reportlabr/   r0   r1   rV   rU   r¥  rµ  rC   r]   r¼   rÁ   rÂ   rÎ   rÖ   r×   r  r  r  r  Ú
cmp_to_keyr  r   r"  r#  rA  rM  rå   rN  rR  rÓ  Ú!reportlab.graphics.charts.utils3drþ  rÿ  ræ   r   r  ré   r  r  r  Ú_270rr  rF  rH  rI  r[  r]  r`  rh  ri  r€  rƒ  r‡  rZ   ÚsysÚreportlab.graphicsr‰  Úargvr	  Ú
startswithÚnameÚglobalsrý  Ú
drawToFilerE   rE   rE   rI   Ú<module>   s˜   X4T<

	I

"

F     G
 P  " 
 ô	