U
    '1e                 
   @   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 ]:ZmemndjrFemndkem Zoep eo  Zqekreqdleo  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;  gHz>     v@c                   @   s   e Zd Zdd Zdd ZdS )
WedgeLabelc                 C   s   d S N selfbar@   r@   G/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/charts/piecharts.py	_checkDXY,   s    zWedgeLabel._checkDXYc                 C   s   | j }|dkrt| 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autoyh  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 krt| d
t}| }||_||_	||_
|j|_| js|j|_|j|_n|jd kr| jd }n
|jd }|jd k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 k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   sj    4




>
 r   c                 C   s>   | d k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 }|rt|||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X | jsHt| j| dd}|dk	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{Gz?rZ   r   r   r@   )PQr@   r@   rD   boundsOverlap   s    r   c                 C   s   t | }|g}|d }|d | }||ksJt| | | | s>qJ|| q|d }|d | }||kst| | | | 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 }qd S )Nr[   c                 S   s   g | ]}|j d  qS )bounds)	_origdata).0lr@   r@   rD   
<listcomp>  s     z$fixLabelOverlaps.<locals>.<listcomp>rZ   r      c                    s   g | ]}| kr|qS r@   r@   )r   rr   r@   rD   r   #  s      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}qd| dfd	dd
d|  ff}nz| dkrldpnd}|dkrd|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   ir   )rZ   r;   r   r   rZ   c                 S   s    g | ]}|d  |d k r|qS )rZ   r[   r@   r   ar@   r@   rD   r   n  s      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k	r|d qS )r   rZ   Nr@   r   sider@   rD   r   u  s       z#_findLargestArc.<locals>.<listcomp>rZ   keyr   )r   sortr   )ZxArcsr   r   r@   r   rD   _findLargestArct  s      r   c           
      C   s
  | j }|d krt|d }|d }|d kr0d}|}nD|d krBd}|}n2|d |d  |d |d  krld}|}nd}|}|d }|d }|sd| _|| | _|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     s     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   Z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     s     ztheta0.<locals>.<listcomp>r   r   g    .Ag      B@$   c                    s   g | ]}t t | qS r@   )rL   r   r   )r   r@   rD   r     s     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 objectszIf 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| _ddddg| _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   Fr"  r   r[   r      rH      ) r)   r   r   r   r   r   r  r   r%  r   r   r'  r(  r)  r*  r+  r,  r-  r   r/  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|_dddddd	g|_d
dddddg|_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   r0  2   
   P      r   (   <   r   r   cr  r2   fr   r   r[         ?r   rZ   r1  rH   r2  )r   r   r   r   r   r   r  r   r   rb   ri   re   rm   r   redrl   r3  rc   r4  r5  r6  
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 krpqX| |d}|sqX| j||  }|j	rX|j
sqX|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rd }|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rt|}nd }tt||| j| j| j | j|d\}}} }!|dkrt||  }} | 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   rJ  rK  r+  r,  r  rL  rM  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   rN  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  s     z)Pie.makePointerLabels.<locals>.<listcomp>r!  g{Gz?)	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plModerN  r   r   r4   nrnlZmaxWZsumH
styleCountr   L_addZrefArcsr   Zsnr   r   r   r.   hr   r   r+  r,  rJ  rK  ZaonRr   r  rL  rM  r  Zx0x1r@   rO  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   r@  r@   rD   r     s     z%Pie.normalizeData.<locals>.<listcomp>c                    s   g | ]} | qS r@   r@   rZ  r[  r@   rD   r     s     )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 )Nr.  rZ   rG   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 rZ   gh㈵>rL   r   r@   r@   rD   r     s      r   r   r[   r1  c                 S   s    g | ]}t |d  dk r|qS r`  ra  r   r@   r@   rD   r     s      )rM   r   r  r  r   r   r}   r%  r   r_  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 kr*|}nd||  }|| q j}t|}t j|}	t dd }
| _t j} j	}|rd }|rd} 
||}|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 k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rt-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
 |*  }.|%|+|)|(|,  }/|rt!||||-|.||| || 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|rtB|||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   r.  Fc                 S   s   dS Nr\   r@   r   r@   r@   rD   <lambda>      z Pie.makeWedges.<locals>.<lambda>c                    s     | dS ri  )r   rj  r   r@   rD   rk     rl  r   )r,  Zradius1Zyradius1)r,  rZ   ra   r`   r   )valuelabel)	r   r   r   r   r   r   r   r   rQ  r  r  )rb   rd   r7   r;   r   r   r   r   r   r   r   r   r   r   r   )r   g      ?)Drh  r   r   r   r   r   rM   _seriesCountr   r(  rY  r+  r,  rJ  rK  r  r   r   r   r   r)  r   r'  r   rF  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   r/  r   r&   )HrB   rQ  Z
halfAnglesr   a1Za2Z	halfAngler   r4   r   re  rU  rR  r'  rN  r+  r,  rJ  rK  ZPL_dataZgSNgZg_addr   rV  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   rX  y1Zx2y2r@   r   rD   
makeWedges  s   





   
  
 


     

$
    
*6
*6zPie.makeWedgesc                 C   s"   |   }|  }|rt||S |S r?   )ZmakeBackgroundrx  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   rI  rY  r_  rh  rx  ry  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   st  t |  d| _d| _d| _d| _dddddg| _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_d"d#d$d%d&g| _tt | jD ]$}| jj!"| j| | j| f qd'| 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   r0  g333333C@g333334@gfffff2@g.@gffffff@r      H   zPANTONE 458 CV)spotNameA   r   zPANTONE 288 CVK   )r  Zdensityr9  rZ   r[   r   r1  rH   g      ?   3   z%.1f%%)LegendgGz@gףp=
W,@gHz&@   rightzAAA:zAA:zA:zBBB:zNR:zHelvetica-Boldr2  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  r@  r@   r@   rD   r     st    

"zLegendedPie.__init__c              
   C   s  | j rg | j_g | j_tt| jD ]H}| jd kr`| j| | j	| _
| jj| j| d f nz4| j| | j	| _
| jj| j| | j| f W nX tk
r   | j|t| j  | j	| _
| jj| j|t| j  | j| f Y nX | jd kr$| j| }| j}|d ks\|d krn>t|tr4|| }n(t|drJ||}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   ry  rF  r   r~  r   r  r  r   r  shiftr   r   )rB   r@  ZldfZlNFr  r@   r@   rD   ry    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   rF  ry  )rB   drawingr  r  r@   r@   rD   rI  A  s
    
zLegendedPie.demo)N)rS   rT   rU   r   r   r   r   r   r   r   r   r   r   r   ry  r  rI  r@   r@   r@   rD   rz    s$   










C)rz  )
_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   rq  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_3dF      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	| _d
ddddddg| _d S )Nr   rZ   r[   r   r1  rH   r2  i,  r8  g      )@g4@r   g      6@g      @g      2@g      *@)r   r   r'   r  r   r   r3  rc   r4  r5  r6  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qt/|j0|j1|j2}$t/|j3|j4|j2p0|$}%|j5}&|
|d}'||d}(|
|d})||d}*|r|6t7|)|*||!|"||%|&|$dd
 |!|  k r|"k rn n|}|!|  k r|"k rn 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rt>|'|(|||%|&|$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|3C d|3_D| _| _q|jEtFd |r|rtG| 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,  rc  )rd   rb   rc   rg   )r   ro  r   c                 S   s   g | ]}|d  qS )rZ   r@   )r   r0   r@   r@   rD   r   O  s     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   rp  r  r   r%  r   r   r  r   r   r>   r'  r   r   r  r  rL   rd  r  rc   r  r  rd   r  rb   rF  r   r"   ZaddArcZlineToZ	closePathr   rq  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  rs  lastr  Zangle1Zangle0r   rr  r  r  r   r  r'  r   r   slr  r  r   rc   rd   rb   Zcx0Zcy0Zcx1Zcy1r  r  rt  r   Zratr   r   r   r   r   r@   r   rD   ry    s     


 
 


 



       

      

   
z
Pie3d.drawc                 C   sB  t dd}t }d|_d|_d|_d|_dddddd	g|_d
dddddg|_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 r7  )r   r   r   r   r   r   r  r   r   rb   ri   re   rm   r   rB  rl   r3  rc   r4  r5  r6  rC  rD  rE  r   rF  rG  r@   r@   rD   rI  S  s8    

z
Pie3d.demoN)rS   rT   rU   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r   r  ry  rI  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.  r8     r9  r:  r   rZ   )	r   r   r   r   r  r   r   rb   rF  r  rH  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  r8  r  r9  x   r0  r:  r   rZ   )r   r   r   r   r   r   r  r   r   rb   rF  r  r@   r@   rD   sample0b  s    

r  c                  C   s   t dd} t }d|_d|_dddddd	g|_d
dddddg|_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  r8  r  r9  r:  r<  r   r=  r>  r   r   r?  r  r2   r@  rZ   r   r[   rA  )r   r   r   r   r  r   r   rb   ri   re   rm   r   rB  rl   rF  r  r@   r@   rD   sample1  s    

r  c               	   C   s   t dd} t }d|_d|_ddddd	d
dddg	|_dddddddddg	|_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  r8  }   r  gףp=
?gl?gS㥻?g~jt?gL7A`?gQ?g~jt?gT㥛 ?g333333?12345678Xr  rZ   r   r[   r   r1  rH   r2  r     )r   r   r   r   r  r   r   r   r   rb   r   	steelbluerc   thistle
cornflowerlightsteelbluerC  rD  rE  tanZdarkseagreenrF  r  r@   r@   rD   sample2  s6    
    
r  c                  C   st   t dd} t }d|_d|_dddg|_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  r8  r  r  J   rZ   r  r   r[   )r   r   r   r   r  r   r   r   rb   r   r  rc   r  r  rF  r  r@   r@   rD   sample3  s    

r  c                  C   s   t dd} t }d|_d|_ddddddg|_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  r8  r  r  r  rZ      r  r   r[   r   r1  rH   )r   r   r   r   r  r   r   r   rb   r   r  rc   r  r  r  rC  rD  rF  r  r@   r@   rD   sample4  s     

r  c                  C   s   t dd} t }d|_d|_ddddddg|_dd	d
d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 with side labels.r  r8  r  r  r  rZ   r[   example1example2example3example4example5example6r  r   r   r1  rH   )r   r   r   r   r  r   r   r   r   r   rb   r   r  rc   r  r  r  rC  rD  rF  r  r@   r@   rD   sample5   s$    

r  c                  C   s   t dd} t }d|_d|_ddddddg|_dd	d
d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 _tdddd}| | | | | S )z=Illustrates the pie moving to leave space for the left labelsr  r8  r   r  r  rZ   r  r  r  r  r  r  r  r  r[   r   r1  rH   )r   r   r   r   r  r   r   r   r   r   rb   r   r  rc   r  r  r  rC  rD  r&   rF  )r  rH  r   r@   r@   rD   sample6  s(    


r  c                  C   s   t dd} t }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|_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|_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  r8  r9  r  r0  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	example28r   r[   r   r1  rH   )r   r   r   r   r   r   r  r   r   r'  r   r   rb   r   r  rc   r  r  r  rC  rD  rF  r  r@   r@   rD   sample7;  sT    
>                  
r  c                  C   s   t dd} t }d|_d|_d|_d|_ddddddddddddddd	d
g|_ddddddddddddddddg|_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  r8  r9  r  r0  rZ   r   r=  r<  r:  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r[   r   r1  rH   )r   r   r   r   r   r   r  r   r   r'  r   rb   r   r  rc   r  r  r  rC  rD  rF  r  r@   r@   rD   sample8]  s:    
&       
r  c                  C   s   t dd} t }d|_d|_dddddd	ddd
dd
dd	ddd	g|_ddddddddddddddd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 )#r  r  r8  r  r9  )   r<  r=     r   r  #   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rZ   r0  r   r[   r   r1  rH   )r   r   r   r   r  r   r   r'  r   r   r   rb   r   r  rc   r  r  r  rC  rD  rF  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   rd  rq  r>   rV   r   r   r   r   r   r   r   r   r   r   
cmp_to_keyr   r  r  r  r  r  r   r  r   rz  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  "  
