a
    ¦¾deê ã                
   @   sr  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„ ZIdpd7d8„ZJd9d:„ ZKe HeK¡ZKd;d<„ ZLdqd=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�rnddliZiddhljmkZk eijld(d… �p,digZlelD ]:Zmem ndj¡�rFemndkem Zoepƒ eo ƒ Zqek reqdleo ¡ �q2dS )rz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>ç     €v@c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
WedgeLabelc                 C   s   d S ©N© ©ÚselfÚbar@   r@   ú\/var/www/sistema_ama/venv/lib/python3.9/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rXdpZd7 }t| d	d ƒrntppt| }|  |¡ |S )
N)ÚautoxZautoyéh  g     €F@r6   r7   é   r   r<   Z_anti)Ú	boxAnchorÚintÚ_pmvÚabsÚgetattrÚ_ANGLE2RBOXANCHORÚ_ANGLE2BOXANCHORrE   )rB   rC   ÚnaÚdar@   r@   rD   Ú_getBoxAnchor.   s    
zWedgeLabel._getBoxAnchorN)Ú__name__Ú
__module__Ú__qualname__rE   rR   r@   r@   r@   rD   r>   +   s   r>   c                1   @   sð  e Zd ZdZeeedd�eedd�eedd�eedd�ee	ddd	ƒd
d�ee	ddd	ƒdd�eedd�eedd�ee
dd�eedd�eedd�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�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�eed!d�eed"ƒeed#ƒeed$ƒeed%ƒeed&ƒeed'd�eed(d�eed)d�eed*d�eed+d�eeeƒd,dd-�eed.ƒeed/d�eed0d�ee	d1d2ƒd3d�ee	d4d5d6ƒd7d�d8�,Zd9d:„ Zd4S );Ú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.
    zWidth of the wedge border©ÚdesczFilling color of the wedgezColor of the wedge borderzZStyle of the wedge border, expressed as a list of lengths of alternating dashes and blanksr   é   é   z#Line cap 0=butt, 1=round & 2=squarez$Line join 0=miter, 1=round & 2=bevelz$Miter limit control miter line joinsz How far of centre a wedge to popz"Name of the font of the label textz,Size of the font of the label text in pointsz#Color of the font of the label textzpDistance between the center of the label box and the center of the pie, expressed in times the radius of the piezX Offset of the labelzY Offset of the labelzQAngle of the label, default (0) is horizontal, 90 is vertical, 180 is upside downzAnchoring point of the labelzBorder color for the label boxzBorder width for the label boxzFilling color of the label boxzBorder color for the label textzBorder width for the label textzText of the labelÚ zWidth of the labelz#Maximum width the label can grow tozHeight of the labelz$Maximum height the label can grow toú True if the label is to be drawnzPadding at top of boxzPadding at left of boxzPadding at right of boxzPadding at bottom of boxzSet to True for simple pointerszColor of indicator linezStrokeWidth of indicator linez&Length of final indicator line segmentz!pad between pointer label and boxz!pad between pointer label and piez!None or makeMarker('Diamond') ...©rY   ÚadvancedUsagezSet to false to skip displayingz"amount by which to shade fillColorz6shading changes at multiple of this angle (in degrees)ÚnormalZantiz2Whether shading is at start or end of wedge/sectorNÚlightenZdarkenzuse colors.Whiter or Blacker),ÚstrokeWidthÚ	fillColorÚstrokeColorÚstrokeDashArrayÚstrokeLineCapÚstrokeLineJoinÚstrokeMiterLimitÚpopoutÚfontNameÚfontSizeÚ	fontColorÚlabelRadiusÚlabel_dxÚlabel_dyÚlabel_angleÚlabel_boxAnchorÚlabel_boxStrokeColorÚlabel_boxStrokeWidthÚlabel_boxFillColorÚlabel_strokeColorÚlabel_strokeWidthÚ
label_textÚlabel_leadingÚlabel_widthÚlabel_maxWidthÚlabel_heightÚlabel_textAnchorÚlabel_visibleÚlabel_topPaddingÚlabel_leftPaddingÚlabel_rightPaddingÚlabel_bottomPaddingÚlabel_simple_pointerÚlabel_pointer_strokeColorÚlabel_pointer_strokeWidthÚlabel_pointer_elbowLengthÚlabel_pointer_edgePadÚlabel_pointer_piePadÚswatchMarkerÚvisibleÚshadingAmountÚshadingAngleÚshadingDirectionÚshadingKindc                 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   rd   re   rZ   rj   rk   rc   ç333333ó?rF   ç      à?çš™™™™™¹?Ústarté   r[   g@¤ß¾ @r`   ).rb   rc   r!   rd   re   rg   rf   rh   ri   rj   rk   rl   rm   rn   ro   rp   rw   r~   r   r€   r�   rq   rr   rs   rt   ru   rv   rx   ry   rz   r{   r|   r‚   r}   r   Úblackrƒ   r„   r…   r†   r‡   r‰   r�   rŠ   r‹   rŒ   ©rB   r@   r@   rD   Ú__init__q   sF    




zWedgeProperties.__init__)rS   rT   rU   Ú__doc__ÚAttrMapÚAttrMapValuer   r	   r   r   r
   r   r   r   r   r   r   r   Ú_attrMapr•   r@   r@   r@   rD   rV   :   s`   
































Ô/rV   c           
      C   s  | j rrt|||ƒ}| js d|_nBt|ƒdk sT|dkr<|dk sTd|  k rPdk r\n nd|_nd|_||_d	|_�nx|d u r†t| d
tƒ}|ƒ }||_||_	||_
|j|_| js¾|j|_|j|_nŠ|jd u rÔ| jd }n
|jd }|jd u rð||_n|j| |_t|ƒdk �s:|dk�r|dk �s:d|  k �r6dk �rBn 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 )NZmiddler7   r;   éÂ  é>þÿÿéòþÿÿr‘   Úendr   Ú
labelClassg      @r.   r2   )7ÚsimpleLabelsr    Ú
sideLabelsZ
textAnchorrL   rK   Ú_simple_pointerrM   r>   ÚxÚyrn   Údxro   Údyrq   rI   rk   rp   Úanglerr   ZboxStrokeColorrs   ZboxStrokeWidthrt   ZboxFillColorru   rd   rv   rb   rw   Ú_textrx   Úleadingry   Úwidthrz   ZmaxWidthr{   Úheightr|   r}   r‰   r~   Ú
topPaddingr   ÚleftPaddingr€   ÚrightPaddingr�   ÚbottomPaddingr‚   rj   rl   rc   )
rB   Útextr¦   ÚlabelXÚlabelYÚ
wedgeStylerž   ZtheLabelZsideLabels_dyr§   r@   r@   rD   Ú_addWedgeLabel–   sh    4




>r³   c                 C   s>   | d u rdg| } n&|t | ƒ }|dkr:t| ƒdg|  } | S )Nr\   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 ƒƒ}|r t|||d  ||d  |
ƒS t||||||	||
d�S )Nrd   rc   re   rb   rˆ   ç       @)rb   rd   re   rc   )Úslicesr´   rM   r   r$   )rB   ZrowNor¢   r£   r©   rª   Z	baseStyleZstyleIdxÚstylerd   rc   re   rb   rˆ   r@   r@   rD   ÚmakeSwatchSampleÞ   s    ÿz!AbstractPieChart.makeSwatchSampleNc                 C   sL   zt | j| ƒ}W n   |}Y n0 | jsHt| j| ddƒ}|durH|}|S )zreturn series name i or defaultrw   r\   N)r*   r¶   rŸ   rM   r»   )rB   r·   Údefaultr¯   r§   r@   r@   rD   ÚgetSeriesNameì   s    
zAbstractPieChart.getSeriesName)N)rS   rT   rU   r½   r¿   r@   r@   r@   rD   r¹   Ü   s   r¹   c                 C   sj   | d |d d kpf|d | d d kpf| d d|d |d   d kpf|d d| d | d   d k S )Nr   r[   g{®Gáz„?rZ   r�   r’   r@   )ÚPÚQr@   r@   rD   ÚboundsOverlap÷   s    rÂ   c                 C   sŒ   t | ƒ}|g}|d }|d | }||v sJt| | | | ƒs>qJ| |¡ q|d }|d | }||v sˆt| | | | ƒszqˆ| d|¡ qJ|S )z find overlap run containing B[i]éÿÿÿÿrZ   r   )r´   rÂ   ÚappendÚinsert)ÚBr·   Úwrapr4   ÚRÚjr@   r@   rD   Ú_findOverlapRunú   s    rÊ   rZ   c                 C   sF   t | ƒ}|dkrBt|d ƒD ]$}t| ||ƒ}t |ƒdkr|  S qdS )z>determine a set of overlaps in bounding boxes B or return NonerZ   N)r´   ÚrangerÊ   )rÆ   rÇ   r4   r·   rÈ   r@   r@   rD   ÚfindOverlapRun
  s    rÌ   Fç      ð?c                    sL  t | ƒ}|dk rd S dd„ | D ƒ}d}g }d}t|d ƒ}|}|�sâ|dk �rHt|ƒ‰ ˆ s^�qHt ˆ ƒ}	|	|krr�qH‡ fdd„|D ƒsˆ|}d}
ˆ d }ˆ d }|| }t| | jƒ }}ˆ dd … D ]F}|| }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|ƒ  |_| ¡ ||< �qHˆ }|d9 }|d7 }qD�nf|dk �rHt|ƒ‰ ˆ �sþ�qHt ˆ ƒ}	|	|k�r�qH| d }|j}|d }tˆ ƒD �]\}}| | }|j}|d }d}d}||	d k�s2||k�s,|d |d k�r¦|d |d k �r¦|d |d  }|d |d k�rÚ|d |d k �rÚ|d |d  }||k�r| jd|d |d   7  _n(||k�r,| jd|d |d   8  _| ¡ ||< �q2|d7 }�qâd S )Nr[   c                 S   s   g | ]}|j d  ‘qS )Úbounds)Ú	_origdata)Ú.0Úlr@   r@   rD   Ú
<listcomp>  ó    z$fixLabelOverlaps.<locals>.<listcomp>rZ   r   é   c                    s   g | ]}|ˆ v r|‘qS r@   r@   )rÐ   Úr©rÈ   r@   rD   rÒ   #  rÓ   rÃ   ÚcxÚrxÚcyÚrygÍÌÌÌÌÌð?rÎ   r’   r�   )r´   ÚfloatrÌ   Ú_360rK   ÚmaxÚminrL   rÏ   Ú_180_pir   r¢   r   r£   Ú	getBoundsÚ	enumerate)ÚLr    Úmult0ZnLrÆ   ÚOKZRPÚiterZmultÚnRrQ   Úr0ZrLZbiZtaaÚaarÕ   ÚbZutaaZntaarÑ   Úorigr¦   ZradÚl1Zorig1Zbounds1r·   rÎ   Zdiff1Zdiff2r@   rÖ   rD   ÚfixLabelOverlaps  s†    
("


$$
 
rì   c                 C   s:   t t| ƒt|ƒƒtt | ƒt |ƒƒ }}||kr2d S ||fS r?   )rÝ   rÞ   )ÚArÆ   r¢   r£   r@   r@   rD   ÚintervalIntersection\  s    &rî   c                 C   sì   | d; } d|   krdk r`n n@|dkrDdd| fddd|  dff}qÚd| dfd	dd
d|  ff}nz| dkrldpnd}|dkrªd|d | fd|d |d fdd|  |d ff}n0d| |d fd|d |d fd|d d|  ff}t dd„ |D ƒƒS )NrG   r7   r;   Ú	clockwiser   )rZ   é¦ÿÿÿr7   i˜þÿÿrð   )rZ   r;   rš   rš   rZ   c                 S   s    g | ]}|d  |d k r|‘qS )rZ   r[   r@   ©rÐ   Úar@   r@   rD   rÒ   n  rÓ   z$_makeSideArcDefs.<locals>.<listcomp>)Útuple)ÚsaÚ	directionrò   Zoffsr@   r@   rD   Ú_makeSideArcDefsa  s    20rö   c                 C   s"   t |d |d  | d | d  ƒS )NrZ   r   r,   )r¢   r£   r@   r@   rD   Ú_keyFLAp  s    r÷   c                    s:   ‡ fdd„| D ƒ}|sd S t |ƒdkr2|jtd� |d S )Nc                    s,   g | ]$}|d  ˆ kr|d dur|d ‘qS )r   rZ   Nr@   rñ   ©Úsider@   rD   rÒ   u  rÓ   z#_findLargestArc.<locals>.<listcomp>rZ   ©Úkeyr   )r´   Úsortr÷   )ZxArcsrù   rò   r@   rø   rD   Ú_findLargestArct  s    rý   c           
      C   s
  | j }|d u rt|d }|d }|d u r0d}|}nD|d u rBd}|}n2|d |d  |d |d  krld}|}nd}|}|d }|d }|s¢d| _|| | _|d }nd| _|| | | _|d }|d |d  d  }	|d	< t|	t ƒ|d
< t|	t ƒ|d< ||d< ||fS )NÚliÚrirZ   r   r©   ÚedgePadr9   r�   ÚmidÚsmidÚcmidrù   )rÏ   rK   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 )NrZ   r@   )rò   r@   r@   rD   Ú_arcCF   s    r  c           )   	   C   sl  g g f}ddg}|D ]4}	t |	||ƒ\}
}||
  |	¡ t|||
 ƒ||
< qd}| d g }d}|d }|| }t|ƒ}dD �]Ü}
||
 }|�rRg }|j}g }|j}|jtd� d}|| }|D �]}	|	j}||||d    }|	 j|7  _|	||d < ||d |  }|d	 }|d
 |d  d }|| |k�r8|| }|| |k �rN|| }|d || |d || f |d	< }||ƒ ||	_|td|| | ƒƒ || }t||d |d  ƒ}t|t|d ||d   ƒ| ƒ}q¼||| ƒ d}t	|ƒ}|dk �rFt
|dd�} | �s�qFt	| ƒ}!|!|k�r&�qF| d }"| d }#|#d }$t|d |"d … ƒ}%|%t||$d … ƒ }&tdd„ ||"|$… D ƒƒ|$ |" ||" d
 ||# d   }'|'|&k�r®�qF||" d
 |%|' |&  }| D ]v}(||( }	|	j}|d	 }|d
 |d  d }|d8 }||  }|	_|d || |d |f ||(< |d	< || d }�qÊ�qð|| ||
< d}qx||d |d |fS )Nr   rZ   r�   )r   rZ   rú   r©   Úindexr  rÎ   r’   r[   r   ÚpiePadÚelbowLengthrÔ   )rÇ   rÃ   c                 S   s   g | ]}|d  |d  ‘qS )r’   rZ   r@   )rÐ   ré   r@   r@   rD   rÒ   Ù  rÓ   z%_fixPointerLabels.<locals>.<listcomp>)r  rÄ   rÝ   rü   r  rÏ   r¢   r£   rL   r´   rÌ   Úsum))r4   râ   r¢   r£   r©   rª   rù   ZLRZmlrrÑ   r·   r.   ÚmulÚGÚmelÚhhZyhhÚmÚTrÆ   ZaBÚSZaSÚpZyhr  ÚincZlyré   Úb2rå   ZnTrÈ   ræ   Zj0Zj1ZjlZsAboveZsFreeZsNeedrÕ   r@   r@   rD   Ú_fixPointerLabels£  s†    


$$

:$r  c           
         s¾   dt  t| ƒ ‰ ‡ fdd„| D ƒ}d}g }|D ]‰| |ˆd  ¡ |ˆ7 }q.t| ƒd }d}t d }tdƒD ]B}|| ‰t‡fd	d„|D ƒƒ}	|	|k rn|d
kr¨ˆ }nˆ}|	}qn|d t  S )Nr[   c                    s   g | ]}|ˆ  ‘qS r@   r@   )rÐ   Úd)Úfacr@   rD   rÒ   ë  rÓ   ztheta0.<locals>.<listcomp>r   r�   g    €„.Ag      B@é$   c                    s   g | ]}t tˆ | ƒƒ‘qS r@   )rL   r   rñ   )rÕ   r@   rD   rÒ   ø  rÓ   rï   r9   )r   r  rÄ   r´   rË   )
r  rõ   Zradsrç   ZhradsZvstarZrstarÚdeltar·   Úvr@   )r  rÕ   rD   Útheta0é  s&    
r  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   r    s    zAngleData.__new__N)rS   rT   rU   r–   r  r@   r@   r@   rD   r    s   r  c                   @   s8  e Zd Zeeeedd�eedd�eedd�ee	ddƒdd�edd	d�ee
d
d�eeddd�eeeddƒe
fƒddd�ee	dddƒddd�ee
ddd�ee	ddƒdd�eedd�eedd�eedd�edddd�ee
dd�eedd�eeeƒdd�d�ZdZdd „ Zd!d"„ Zd#d$„ Zd.d&d'„Zd(d)„ Zd*d+„ Zd,d-„ ZdS )/ÚPiez7List of numbers defining wedge sizes; need not sum to 1rX   z2Optional list of labels to use for each data pointz#Angle of first slice; 0 is due Eastrï   Zanticlockwisez'clockwise' or 'anticlockwise'Nz&Collection of wedge descriptor objectszœIf true(default) use a simple String not an advanced WedgeLabel. A WedgeLabel is customisable using the properties prefixed label_ in the collection slices.z.A value for doing threshholding, not used yet.rZ   r^   gš™™™™™©?zFIf true check and attempt to fix
 standard label overlaps(default off)Z	LeftRightÚLeftAndRightr\   z,If true make x/y radii the same(default off)ÚfixedÚ	alternate)r_   zX direction RadiuszY direction Radiusz$fraction of radii to start wedges atzcallable(wedge,*args,**kwds)zDIf true attempt to make piechart with labels along side and pointerszWThe fraction of the pie width that the labels are situated at from the edges of the piez,A class factory to use for non simple labels)ÚBASEr  r¶   Ú
startAnglerõ   r»   rŸ   Úother_thresholdÚcheckLabelOverlapÚpointerLabelModeÚ	sameRadiiÚ	orderModeÚxradiusÚyradiusÚinnerRadiusFractionÚwedgeRecordr    ÚsideLabelsOffsetrž   c                 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   )rZ   gffffff@g333333û?gÍÌÌÌÌÌ@r7   rï   rZ   Fr$  r�   r[   r’   é   rH   é   ) r)   r•   r¢   r£   r©   rª   r  r¶   r'  rõ   rŸ   r)  r*  r+  r,  r-  r.  r/  r    r1  r'   rV   r»   r   Údarkcyanrc   Ú
bluevioletÚblueÚcyanZpinkZmagentaZyellow)rB   Zkwdr@   r@   rD   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éÈ   r2  é2   é
   éP   ©r<  é   rÔ   é(   r;  é<   ©rò   ré   Úcr  r2   Úfr�   r’   r[   ç      ü?r   rZ   r3  rH   r4  )r   r"  r¢   r£   r©   rª   r  r¶   r»   rb   ri   re   rm   r   Úredrl   r5  rc   r6  r7  r8  Ú
aquamarineÚ	cadetblueÚ
lightcoralÚadd©rB   r  Úpcr@   r@   rD   Údemo<  s.    



zPie.democ           $         sr  G dd„ dƒ}| j d }| j}d } } } }	}
t| jƒ}g }|j}t| j| jƒ}|D �]¢\}‰ ˆ d d u rpqX|  |d¡}|s‚qX| j||  }|j	rX|j
sžqX|d7 }t| |d|||ƒ}||ƒ | ¡ }|d |d  }|d |d  }‡ fd	d
„|D ƒ}t|dƒ}t|dƒ}|�r¨|�r¨|dk�rR|d |d  |d |d  k �rLd }nd }nV|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 }
qX|�sn| j d }| jd }| j| }| j| }| j�r:| j}| j�rH| j}| j�r^t||ƒ }}|||||g ƒS ||k}|
| jk �rœ|�s’||k�rœt|ƒ}nd }tt|ƒ|| j| j| j | j|d�\}}} }!|dk�rât|| ƒ }} | j| }"| j| j  |  }#|#|" d }| jd |! }|"| }| j| |! }| j�r:| j}| j�rH| 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Úcenteryr-  r.  r  ÚluÚru)rB   rN  rO  r-  r.  r  rP  rQ  r@   r@   rD   r•   Z  s    z*Pie.makePointerLabels.<locals>.PL.__init__N)r   r   )rS   rT   rU   r•   r@   r@   r@   rD   ÚPLY  s   rR  r[   r   rZ   r\   r9   r’   c                    s*   g | ]"}|d  t ˆ |d |d fƒf‘qS )r   rZ   r[   )rî   rñ   ©rí   r@   rD   rÒ   v  rÓ   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ö   r'  rõ   r¿   r}   r‰   r³   rà   rý   Údictr†   r‡   r…   rÏ   rÝ   r¢   r£   r-  r.  r+  rÞ   rJ   r  )$rB   ÚanglesÚplModerR  r°   r±   r4   ÚnrÚnlZmaxWZsumHÚ
styleCountrâ   ÚL_addZrefArcsr·   Zsnr¼   rÑ   ré   r.   Úhrÿ   rþ   r-  r.  rN  rO  ZaonRrù   r  rP  rQ  r  Zx0Úx1r@   rS  rD   ÚmakePointerLabelsX  s~    





"&&"





*

zPie.makePointerLabelsFc                    sb   t tt| jƒƒ}tt|ƒƒ }| _|dkr2d| nd‰ |rL‡ fdd„|D ƒS ‡ fdd„|D ƒS d S )Nr   r=   rZ   c                    s   g | ]}t ˆ | |ƒ‘qS r@   )r  ©rÐ   r¢   ©rD  r@   rD   rÒ   ¬  rÓ   z%Pie.normalizeData.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r@   r@   r^  r_  r@   rD   rÒ   ®  rÓ   )rµ   ÚmaprL   r  rÛ   r  Ú_sum)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rBdpDd}dd„ t| j	|d�ƒD ƒ}| j
d	k�r
| j�s
d
d„ |D ƒ}|jtd� g g g}d}|rà|dk r²| d¡}n
| d¡}||d   |¡ |d7 }|d; }qš|d  ¡  |d |d  dd„ |D ƒ }g }	|	j}|D ]x\}}
||
|  }t|
ƒtk�rX||k�rN||f}n||f}n|d f}|�r~t|d |
jƒ|d f}|}|||fƒ �q|	S )Nr0  rZ   rG   rï   rÃ   c                 S   s   g | ]}|‘qS r@   r@   rñ   r@   r@   rD   rÒ   ¸  rÓ   z"Pie.makeAngles.<locals>.<listcomp>)rb  r%  c                 S   s    g | ]}t |d  ƒdkr|‘qS ©rZ   gñhãˆµøä>©rL   rñ   r@   r@   rD   rÒ   º  rÓ   rú   r   r[   r3  c                 S   s    g | ]}t |d  ƒdk r|‘qS rd  re  rñ   r@   r@   rD   rÒ   Ç  rÓ   )rM   r    r  r  rõ   r»   r}   r'  rá   rc  r,  rü   r  ÚpoprÄ   ÚreverserL   Ú_ANGLELOr  r   )rB   Úwrr'  ZwhichWayÚDÚWr  r·   rò   rí   r¦   ZendAnglerè   r@   r@   rD   Ú
makeAngles°  sF    






zPie.makeAnglesc           H         s„  ˆ   ¡ }g }|D ]0\}\}}|d u r*|}nd||  }| |¡ qˆ j}t|ƒ}tˆ j|ƒ}	tˆ dd ƒ}
|ˆ _tˆ jƒ}ˆ j	}|r†d }|rÂd}ˆ  
||¡}|j}|j}|j}|j}|j}dd„ }njˆ 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 �rh�qLˆ j||  }|j�s‚�qLt|| ƒ}|| }}||ƒ}|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�rÀt-j.nt-j/}%d
t0|&ƒ }&d
|j1 }'|j2dk�rd
|' t+|&d
 ƒ }(|'})n|'d
 t+|&d
 ƒ }(d
})|| t+|&ƒ }*|j#}+d |$_#t3|&ƒD ]Š},||,|*  }-||,d
 |*  }.|%|+|)|(|,  ƒ}/|�r˜t!||||-|.||| || d�}0nt!||||-|.|d	�}0|/|0_#d |0_$d|0_%||0ƒ �q>||$ƒ |
�rè|
|$|j4|d� |j5�rL|�s0|�r˜|j6}1||1 }2||1 }3||2|"  }4||3|#  }5t7ˆ || |4|5|ƒ}6||6ƒ |�sn|6j8�rn|||"  |6_9|||#  |6_:|�r,|4|5| |2|3|||6 ;¡ ||fdœ	|6_<n”|�rÎ|�rÎ|| }6|6�rÎ|6j<}7|7d }8|7d }9|||9  }:|||8  };|j=}<|:|<|9  }=|;|<|8  }>|t>|:|;|=|>|6j|6jf|j?|j@d�ƒ ||6ƒ �qL|�rLˆ jj}?d}@|D ]R\}}Aˆ j| j#�rf|@d
7 }@n0||@ }Bˆ j|B j#ˆ j| _#ˆ j|B jˆ j| _�qFt3d|@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ƒ |�sœ|||"  |6_9|||#  |6_:|�r¾|4|5| |2|3|||6 ;¡ dœ|6_<|6 ;¡ \}D}E}F}G�qL|�rì|�rìtB|||d� |D ]}6||6ƒ �qð|�s€|D �]r}6|6j8�rF|�sF|tC|6j|6j|6j9|6j:|j?|j@d�ƒ �q
|�r
|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�ƒ n€|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�ƒ �q
|S )Nr�   r0  Fc                 S   s   dS ©Nr\   r@   ©r·   r@   r@   rD   Ú<lambda>ö  rÓ   z Pie.makeWedges.<locals>.<lambda>c                    s   ˆ   | d¡S rm  )r¿   rn  r”   r@   rD   ro     rÓ   rº   )r.  Zradius1Zyradius1)r.  rZ   ra   r`   r   )ÚvalueÚlabel)	r¢   r£   r¦   rØ   rÚ   r×   rÙ   rÎ   rU  r  r  )rb   rd   r7   r;   rš   r›   rœ   ©r¢   r£   r¦   rØ   rÚ   r×   rÙ   rÎ   )rã   g      Ð?)Drl  rÄ   r    r´   r¸   r¶   rM   Ú_seriesCountr»   r*  r]  r-  r.  rN  rO  r  r©   rª   r¢   r£   r+  rÞ   r)  r   rJ  r/  r‰   rL   ri   rß   r   r   Ú_ANGLEHIr   r   rc   rd   rb   rg   rf   rh   re   r�   rÛ   r‹   r   ZWhiterZBlackerrJ   rŠ   rŒ   rË   r   r}   rm   r³   r¡   Z_aaxZ_aayrà   rÏ   r…   r%   r„   rƒ   r1  rì   r&   )HrB   rU  Z
halfAnglesr·   Úa1Za2Z	halfAngler    r4   r¶   ri  rY  rV  r)  rR  r-  r.  rN  rO  ZPL_dataZgSNÚgZg_addrâ   rZ  r/  r²   rè   r×   rÙ   r¯   ri   ZaverageAngleZaveAngleRadiansZcosAAZsinAAÚtheWedgeZshaderZnshadesrŠ   ZdshZshf1ZshdaZshscZishÚsha1Zsha2ZshcZshWedgerm   rØ   rÚ   r°   r±   rÑ   r  ZsinMZcosMZlXZlYZlpelZlXiZlYiZslices_popoutr  r¦   rÕ   rÉ   r\  Úy1Zx2Úy2r@   r”   rD   Ú
makeWedgesÙ  sŽ   






ÿ


ÿþ
þ
$ÿ
ÿþ
þ*þ6þ
*þ6þzPie.makeWedgesc                 C   s"   |   ¡ }|  ¡ }|rt||ƒS |S r?   )ZmakeBackgroundr{  r   )rB   r  r.   r@   r@   rD   Údraw¶  s    zPie.draw)F)rS   rT   rU   r—   r¹   r˜   r   r   r   r   r   r   r   r   r   r   r™   r(  r•   rM  r]  rc  rl  r{  r|  r@   r@   r@   rD   r"  	  s:   









îO
	) ^r"  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 legendrX   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)r&  Ú
drawLegendÚlegend1ÚlegendNumberFormatÚlegendNumberOffsetÚpieAndLegend_colorsÚlegend_namesÚlegend_datar¬   r­   r«   r®   c                 C   sh  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   r2  )g333333C@g33333³4@gfffffæ2@gÍÌÌÌÌÌ.@gffffff@rï   é   éH   zPANTONE 458 CV)ÚspotNameéA   rÔ   zPANTONE 288 CVéK   )r‡  Zdensityr;  rZ   r[   r’   r3  rH   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-Boldr4  r�   zHelvetica-Oblique)+r"  r•   r¢   r£   rª   r©   r  r¶   rõ   r   Ú
PCMYKColorr“   r‚  r»   rc   rb   rd   r�  r€  r„  Ú!reportlab.graphics.charts.legendsrŒ  r  ÚdeltaxÚdeltayZdxTextSpacer¤   r¥   ÚcolumnMaximumÚ	alignmentrƒ  rË   r´   ÚcolorNamePairsrÄ   rj   rk   Ú_legend2r¬   r­   r«   r®   r~  )rB   r�  r“   ZlegendOffsetrŒ  rD  r@   r@   rD   r•   Í  st    

û

"zLegendedPie.__init__c              
   C   sú  | j rg | j_g | j_tt| jƒƒD �]F}| jd kr`| j| | j	| _
| jj | j| d f¡ nŒz4| j| | j	| _
| jj | j| | j| f¡ W nV tyê   | j|t| jƒ  | j	| _
| jj | j|t| jƒ  | j| f¡ Y n0 | jd kr$| j| }| j}|d u �sZ|d u �rn>t|tƒ�r2|| }n(t|dƒ�rH||ƒ}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»   rc   rÄ   Ú
IndexErrorr„  r€  Ú
isinstanceÚstrÚhasattrÚ
ValueErrorÚasciir"  r|  rJ  r¢   r�  r£   r‘  r’  r¥   r“  Úshiftr¬   r®   )rB   rD  ZldfZlNFr  r@   r@   rD   r|    sH    
".




zLegendedPie.drawc                 C   sL   | j }| jr2|| jj| j 7 }|| j | jj¡7 }| j| j	 | j
 }||fS r?   )r­   r~  r  r¢   r�  r–  Z_calculateMaxWidthr•  r®   rª   r«   )rB   ÚtxÚtyr@   r@   rD   Ú_getDrawingDimensions9  s    z!LegendedPie._getDrawingDimensionsc                 C   s,   |s|   ¡ \}}t||ƒ}| |  ¡ ¡ |S r?   )r¡  r   rJ  r|  )rB   ÚdrawingrŸ  r   r@   r@   rD   rM  A  s
    
zLegendedPie.demo)N)rS   rT   rU   r–   r—   r"  r˜   r   r   r   r   r   r™   r•   r|  r¡  rM  r@   r@   r@   rD   r}  ¼  s$   










õC)r}  )Ú
_getShadedÚ_2radrÜ   rß   c                %   @   sh  e Zd ZdZe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ƒ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�eedƒee
dd�eedƒeedƒeedd�eedd�eedd�eedd�ee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�eedd�eed
ƒd�"Zdd„ ZdS )ÚWedge3dPropertiesrW   r\   rX   zpadding at bottom of boxzpadding at left of boxzpadding at right of boxzset to True for simple pointerszpadding at top of boxr]   zset to false to skip displaying)"rc   ÚfillColorShadedrl   rj   rk   rp   r�   rq   rt   rr   rs   rn   ro   r{   rx   r   rz   r€   r‚   ru   rv   rw   r|   r~   r}   ry   rm   ri   Úshadingrd   ÚstrokeColorShadedre   rb   r‰   c                 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Ó?rZ   rd   re   rj   rk   rc   rŽ   rF   r�   r�   r‘   )#rb   r§  r‰   r¨  r¦  rc   r!   rd   re   ri   rj   rk   rl   rm   rn   ro   rp   rw   r~   r   r€   r�   rq   rr   rs   rt   ru   rv   rx   ry   rz   r{   r|   r}   r‚   r”   r@   r@   rD   r•   v  s0    




zWedge3dProperties.__init__N)rS   rT   rU   r–   r—   r˜   r	   r
   r   r   r   r   r   r   r   r™   r•   r@   r@   r@   rD   r¥  I  sL   



























Þ%r¥  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_SL3Dc                 C   sH   |dk r|d7 }|d7 }|| _ || _|| d | _t|| ƒtk | _d S )Nr   rG   r�   )ÚloÚhir  rL   rt  Ú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)rS   rT   rU   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.rX   zdepth of the pie.zThe view angle.)r&  ÚperspectiveÚdepth_3dÚangle_3déF   é   r9   c                 C   s   | j | jr| j| jpdS r®  )Ú_sl3dr¬  r»   ri   )rB   r·   r@   r@   rD   Ú_popout¬  s    zPie3d._popoutc                 C   s2   | j |r| jpd |  |¡tt| j| jƒƒ  S r®  )Ú_cxÚ
_xdepth_3dr·  r   r¤  r¶  r  ©rB   r·   r  r@   r@   rD   ÚCX¯  s    zPie3d.CXc                 C   s2   | j |r| jpd |  |¡tt| j| jƒƒ  S r®  )Ú_cyÚ
_ydepth_3dr·  r   r¤  r¶  r  rº  r@   r@   rD   ÚCY±  s    zPie3d.CYc                 C   s   |   ||¡| jtt|ƒƒ  S r?   )r»  Ú_radiusxr   r¤  ©rB   r·   Úor  r@   r@   rD   ÚOX³  s    zPie3d.OXc                 C   s   |   ||¡| jtt|ƒƒ  S r?   )r¾  Ú_radiusyr   r¤  rÀ  r@   r@   rD   ÚOYµ  s    zPie3d.OYc                 C   s$   | j }tt|| ƒt|| d ƒƒS )NrG   )Ú_3dvarÞ   rL   )rB   rò   rÅ  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   rZ   r[   r’   r3  rH   r4  i,  r:  )g      )@gš™™™™4@rº   g      6@g      @g      2@g      *@)r"  r•   r'   r¥  r»   r   r5  rc   r6  r7  r8  ZazureZcrimsonZ
darkvioletr-  r.  r©   rª   r  r”   r@   r@   rD   r•   ¼  s    

zPie3d.__init__c           	      C   sœ   |   |¡}||   | j| j¡k r˜|  |d¡|  |d¡|  |d¡|  |d¡|  ||d¡|  ||d¡|  ||d¡|  ||d¡g}| |t||||dd�f¡ d S )Nr   rZ   ©rd   rc   rb   rg   )	rÆ  r¶  r  r»  r¾  rÂ  rÄ  rÄ   r#   )	rB   râ   r·   r¦   rd   rb   rc   Úrdr  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rŽˆ j}ˆ jršˆ j}|ˆ _dˆ jd  |  ˆ _}ˆ  ¡ }ˆ j}	ˆ j}
ˆ j}ˆ j}ˆ j}ˆ j}ˆ j}t|ƒ ˆ _}g  }ˆ _t ƒ }tˆ j!ƒ}ˆ j"dk�r$d�p&d}|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ƒ�p0|$}%|j5}&|
|dƒ}'||dƒ}(|
|dƒ})||dƒ}*|�rŠ| 6t7|)|*||!|"||%|&|$dd�
¡ |!|  k �r |"k �r¨n n|}|!|  k �rÀ|"k �rÈn n|}t8|%|$|&dd�}+|+j9|)|*||||dd� |+ :|||dƒ|||dƒ¡ |+j9|'|(||||dd� |+ ;¡  ||k�rF||k�rFd},nt<||ƒ||ƒƒ},| #|,|+f¡ ||||!|%|&|$ƒ ||||"|%|&|$ƒ |j0}$|j3�pš|$}%| #t7|'|(||!|"||%|&|$dd�
¡ |#t=k�rât>|'|(|||%|&|$dd�}-nt7|'|(||!|"||%|&|$dd�
}-| #|-¡ || }.|j?�r¸|.�r¸|j@}/ˆ  j|/9  _ˆ  j|/9  _| jA}0|||0dƒ}1|||0dƒ}2tBˆ |.|0|1|2||d�}3| #|3¡ |�r°|1|2|0ˆ jˆ j|
|dƒ||dƒ|3 C¡ dœ|3_D|ˆ _|ˆ _�q¸|jEtFd� |�rä|�rätG|ˆ jHƒ dd„ |D ƒ| | D ]}4| 6|4¡ �qú|S )Nr7   rº   rÍ   g      Y@rï   rÃ   rZ   r   r9   c                       s   e Zd Z” jZdd„ ZdS )z Pie3d.draw.<locals>.WedgeLabel3dc                 S   s2   |d dkr.t | dƒs.| j| _| j | j | _d S )Nr   r4   Ú_ody)r›  r¥   rÊ  r½  rA   r@   r@   rD   rE     s    
z*Pie3d.draw.<locals>.WedgeLabel3d._checkDXYN)rS   rT   rU   r½  rE   r@   r”   r@   rD   ÚWedgeLabel3dÿ  s   rË  )r.  rd   rb   rc   rg   rÇ  )r.  ZmoveTo)r.  rg  )rd   rb   rc   rg   )rž   rr  rú   c                 S   s   g | ]}|d  ‘qS )rZ   r@   )rÐ   r0   r@   r@   rD   rÒ   O  rÓ   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Ã  rc  ra  r»  r¾  rÂ  rÄ  rÆ  rÉ  r´   rs  r¶  r   r'  rõ   rÄ   r©  r¸   r¶   r>   r)  rË   r‰   rª  r«  rL   rh  r£  rc   r¦  r§  rd   r¨  rb   rJ  r   r"   ZaddArcZlineToZ	closePathrÞ   rt  r   r}   rm   r  r³   rà   rÏ   rü   r¯  rì   r    )5rB   r»   Z	_3d_anglerÅ  Za0r²  ZradiusxZradiusyr  r  r»  r¾  rÂ  rÄ  rÆ  rÉ  r4   r¶  rv  Úlastr  Zangle1Zangle0r¶   ru  r  r  râ   rË  r)  r·   r¼   Úslrª  r«  rè   rc   rd   rb   Zcx0Zcy0Zcx1Zcy1r  rÈ  rw  r¯   Z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 r9  )r   r"  r¢   r£   r©   rª   r  r¶   r»   rb   ri   re   rm   r   rF  rl   r5  rc   r6  r7  r8  rG  rH  rI  r‰   rJ  rK  r@   r@   rD   rM  S  s8    



z
Pie3d.demoN)rS   rT   rU   r—   r"  r˜   r   r™   r±  r²  r³  r·  r»  r¾  rÂ  rÄ  rÆ  r•   rÉ  r|  rM  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.é�  r:  é–   r;  r<  rò   rZ   )	r   r"  r¢   r£   r  r¶   r»   rb   rJ  ©r  rL  r@   r@   rD   Úsample0au  s    

rÒ  c                  C   sN   t ddƒ} tƒ }d|_d|_d|_d|_dg|_dg|_d	|j_	|  
|¡ | S )
rÎ  rÏ  r:  rÐ  r;  éx   r2  r<  rò   rZ   )r   r"  r¢   r£   r©   rª   r  r¶   r»   rb   rJ  rÑ  r@   r@   rD   Úsample0b†  s    

rÔ  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.rÏ  r:  rÐ  r;  r>  rB  rZ   r?  r’   r[   rE  )r   r"  r¢   r£   r  r¶   r»   rb   ri   re   rm   r   rF  rl   rJ  rÑ  r@   r@   rD   Úsample1™  s    



rÕ  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.rÏ  r:  é}   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ÚXrÐ  rZ   r   r[   r’   r3  rH   r4  r�  é   )r   r"  r¢   r£   r  r¶   r©   rª   r»   rb   r   Ú	steelbluerc   ÚthistleÚ
cornflowerÚlightsteelbluerG  rH  rI  ÚtanZdarkseagreenrJ  rÑ  r@   r@   rD   Ú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.rÏ  r:  rÖ  rµ  )éJ   rZ   rµ  rÐ  rZ   r   r[   )r   r"  r¢   r£   r  r©   rª   r»   rb   r   rá  rc   râ  rã  rJ  rÑ  r@   r@   rD   Ú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.rÏ  r:  rÖ  rµ  ©rç  rZ   rZ   rZ   rZ   é   rÐ  rZ   r   r[   r’   r3  rH   )r   r"  r¢   r£   r  r©   rª   r»   rb   r   rá  rc   râ  rã  rä  rG  rH  rJ  rÑ  r@   r@   rD   Ú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.rÏ  r:  rÖ  rµ  )r�  rZ   rZ   rZ   rZ   r[   ©Úexample1Úexample2Úexample3Úexample4Úexample5Úexample6rZ   rÐ  r   r[   r’   r3  rH   )r   r"  r¢   r£   r  r¶   r    r©   rª   r»   rb   r   rá  rc   râ  rã  rä  rG  rH  rJ  rÑ  r@   r@   rD   Úsample5   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 _tddddƒ}|  |¡ |  |¡ | S )z=Illustrates the pie moving to leave space for the left labelsrÏ  r:  r   rµ  ré  rì  rZ   rÐ  r[   r’   r3  rH   )r   r"  r¢   r£   r  r¶   r    r©   rª   r»   rb   r   rá  rc   râ  rã  rä  rG  rH  r&   rJ  )r  rL  rÑ   r@   r@   rD   Úsample6  s(    




rô  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 pointersrÏ  r:  r;  rÐ  r2  )rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   rZ   )rí  rî  rï  rð  rñ  rò  Úexample7Úexample8Úexample9Ú	example10Ú	example11Ú	example12Ú	example13Ú	example14Ú	example15Ú	example16Z	example17Z	example18Z	example19Z	example20Z	example21Z	example22Z	example23Z	example24Z	example25Z	example26Z	example27Z	example28rZ   r   r[   r’   r3  rH   )r   r"  r£   r¢   r©   rª   r  r¶   r    r)  rŸ   r»   rb   r   rá  rc   râ  rã  rä  rG  rH  rJ  rÑ  r@   r@   rD   Ú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 labelsrÏ  r:  r;  rÐ  r2  )rZ   rZ   rZ   rZ   rZ   rÔ   r;  rZ   rZ   rZ   rZ   rZ   rZ   r@  r?  r<  ©rí  rî  rï  rð  rñ  rò  rõ  rö  r÷  rø  rù  rú  rû  rü  rý  rþ  rZ   r   r[   r’   r3  rH   )r   r"  r£   r¢   r©   rª   r  r¶   r    r)  r»   rb   r   rá  rc   râ  rã  rä  rG  rH  rJ  rÑ  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   rÏ  r:  rÖ  r;  )é)   r?  r@  é   r?  rÔ   r;  r  rµ  é#   rµ  r?  rÔ   r@  r?  rÔ   r  rZ   r2  r   r[   r’   r3  rH   )r   r"  r¢   r£   r  r¶   r    r)  r©   rª   r»   rb   r   rá  rc   râ  rã  rä  rG  rH  rJ  rÑ  r@   r@   rD   Úsample9}  s&    



r  Ú__main__)Ú	renderPDFrÝ  Úsamplezsample%sz%s.pdf)N)rZ   )FrÍ   )N)N)sÚ__version__r–   Ú	functoolsÚmathr   r   r   Zreportlab.libr   Zreportlab.lib.validatorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z"reportlab.graphics.widgets.markersr   r   Zreportlab.lib.attrmapZreportlab.graphics.shapesr   r   r   r   r    r!   r"   r#   r$   r%   r&   Zreportlab.graphics.widgetbaser'   r(   Zreportlab.graphics.charts.areasr)   r�  r*   Z$reportlab.graphics.charts.textlabelsr+   Z	reportlabr-   rO   rN   rh  rt  r>   rV   r³   r¸   r¹   rÂ   rÊ   rÌ   rì   rî   rö   r÷   Ú
cmp_to_keyrý   r  r  r  r  r  rÛ   r  r"  r}  Z!reportlab.graphics.charts.utils3dr£  r¤  rÜ   rß   r¥  r©  r¯  Z_270rr°  rÒ  rÔ  rÕ  ræ  rè  rë  ró  rô  rÿ  r  r  rS   ÚsysZreportlab.graphicsr  Úargvrò   Ú
startswithÚnameÚglobalsr¢  Z
drawToFiler@   r@   r@   rD   Ú<module>	   sŽ   T4\
>
	
I

"

F   6 G
 T  "  
