U
    c2                 
   @   sp  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 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l/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 dddddddddd	Z7dddddddddd	Z8dZ9de9 Z:G dd de4Z;G dd de.Z<e;fddZ=d d! Z>G d"d# d#e0Z?d$d% Z@d&d' ZAdmd)d*ZBdnd-d.ZCd/d0 ZDd1d2 ZEd3d4 ZFeGeFZFd5d6 ZHdod7d8ZId9d: ZJeGeJZJd;d< ZKdpd=d>ZLd?d@ ZMG dAdB dBeNZOG dCdD dDe?ZPG dEdF dFePZQddGlRmSZSmTZTmUZUmVZV G dHdI dIe.ZWG dJdK dKZXdLdM ZYeGeYZYeTdNZZG dOdP dPePZ[dQdR Z\dSdT Z]dUdV Z^dWdX Z_dYdZ Z`d[d\ Zad]d^ Zbd_d` Zcdadb Zddcdd Zededf ZfegdgkrlddlhZhddhlimjZj ehjkd(d p*digZkekD ]:ZlelmdjrDelndkel Zneo en  Zpejqepdlen  q0d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)isNumberisListOfNumbersOrNoneisListOfNumbersisColorOrNoneisStringisListOfStringsOrNoneOneOf	isBooleanisListOfColorsisNumberOrNoneisNoneOrListOfNoneOrStringsisTextAnchorisNoneOrListOfNoneOrNumbersisBoxAnchorisStringOrNoneNoneOrEitherOrisNumberInRange)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-1d6i77bl/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@r5   r6      r   r;   Z_anti)	boxAnchorint_pmvabsgetattr_ANGLE2RBOXANCHOR_ANGLE2BOXANCHORrD   )rA   rB   nadar?   r?   rC   _getBoxAnchor.   s    
zWedgeLabel._getBoxAnchorN)__name__
__module____qualname__rD   rQ   r?   r?   r?   rC   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') ...rX   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   rc   rd   rY   ri   rj   rb   333333?rE         ?皙?start   rZ   g@߾ @r_   ).ra   rb   r    rc   rd   rf   re   rg   rh   ri   rj   rk   rl   rm   rn   ro   rv   r}   r~   r   r   rp   rq   rr   rs   rt   ru   rw   rx   ry   rz   r{   r   r|   r   blackr   r   r   r   r   r   r   r   r   r   rA   r?   r?   rC   __init__q   sF    




zWedgeProperties.__init__)rR   rS   rT   __doc__AttrMapAttrMapValuer   r	   r   r   r
   r   r   r   r   r   r   r   _attrMapr   r?   r?   r?   rC   rU   :   s`   
































/rU   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	|_nd| }||_||_||_|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 r"dk r.n nd|_nd|_|j|_|j|_|j|_|j|_|j|_|j|_|j}	|	d krx|}	|	|_|j|_|j |_!|j"|_#|j$|_%|j&|_|j'|_(|j)|_*|j+|_,|j-|_.|j/|_0|j1|_|j|_|j2|_2|j3|_4|S )NZmiddler6   r:     >r   endr   g      @r-   r1   )5simpleLabelsr   
sideLabelsZ
textAnchorrK   rJ   _simple_pointerxyrm   dxrn   dyrp   rH   rj   ro   anglerq   ZboxStrokeColorrr   ZboxStrokeWidthrs   ZboxFillColorrt   rc   ru   ra   rv   _textrw   leadingrx   widthry   ZmaxWidthrz   heightr{   r|   r   r}   
topPaddingr~   leftPaddingr   rightPaddingr   bottomPaddingr   ri   rk   rb   )
rA   textr   labelXlabelY
wedgeStyle
labelClassZtheLabelZsideLabels_dyr   r?   r?   rC   _addWedgeLabel   sf    4




>
 r   c                 C   s>   | d krdg| } n&|t |  }|dkr:t| dg|  } | S )Nr[   r   )lenlist)labelsr3   ir?   r?   rC   
_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 )Nrc   rb   rd   ra   r          @)ra   rc   rd   rb   )slicesr   rL   r   r#   )rA   ZrowNor   r   r   r   Z	baseStyleZstyleIdxstylerc   rb   rd   ra   r   r?   r?   rC   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 defaultrv   r[   N)r)   r   r   rL   r   )rA   r   defaultr   r   r?   r?   rC   getSeriesName   s    
 zAbstractPieChart.getSeriesName)N)rR   rS   rT   r   r   r?   r?   r?   rC   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   rZ   g{Gz?rY   r   r   r?   )PQr?   r?   rC   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]rY   r   )r   r   appendinsert)Br   wrapr3   Rjr?   r?   rC   _findOverlapRun   s      r   rY   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 NonerY   N)r   ranger   )r   r   r3   r   r   r?   r?   rC   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 )NrZ   c                 S   s   g | ]}|j d  qS )bounds)	_origdata).0lr?   r?   rC   
<listcomp>  s     z$fixLabelOverlaps.<locals>.<listcomp>rY   r      c                    s   g | ]}| kr|qS r?   r?   )r   rr   r?   rC   r   !  s      r   cxrxcyryg?r   r   r   )r   floatr   _360rJ   maxminrK   r   _180_pir   r   r   r   	getBounds	enumerate)Lr   mult0ZnLr   OKZRPiterZmultnRrP   r0ZrLZbiZtaaaar   bZutaaZntaar   origr   Zradl1Zorig1Zbounds1r   r   Zdiff1Zdiff2r?   r   rC   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?   rC   intervalIntersectionZ  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 )NrF   r6   r:   	clockwiser   )rY   r6   ir   )rY   r:   r   r   rY   c                 S   s    g | ]}|d  |d k r|qS )rY   rZ   r?   r   ar?   r?   rC   r   l  s      z$_makeSideArcDefs.<locals>.<listcomp>)tuple)sa	directionr   Zoffsr?   r?   rC   _makeSideArcDefs_  s    20r   c                 C   s"   t |d |d  | d | d  S )NrY   r   r+   )r   r   r?   r?   rC   _keyFLAn  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   rY   Nr?   r   sider?   rC   r   s  s       z#_findLargestArc.<locals>.<listcomp>rY   keyr   )r   sortr   )ZxArcsr   r   r?   r   rC   _findLargestArcr  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rirY   r   r   edgePadr8   r   midsmidcmidr   )r   rJ   r   r   r   r   )
r   r   r   datar   r   r   r-   r   r   r?   r?   rC   _fPLSidex  s:     

r  c                 C   s   t |jd | jd S )Nr   )r,   r   r   r   r?   r?   rC   _fPLCF  s    r  c                 C   s   | d S )NrY   r?   )r   r?   r?   rC   _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   rY   r   )r   rY   r   r   indexr   r   r   rZ   r   piePadelbowLengthr   )r   r   c                 S   s   g | ]}|d  |d  qS )r   rY   r?   )r   r   r?   r?   rC   r     s     z%_fixPointerLabels.<locals>.<listcomp>)r  r   r   r   r  r   r   r   rK   r   r   sum))r3   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?   rC   _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 )NrZ   c                    s   g | ]}|  qS r?   r?   )r   d)facr?   rC   r     s     ztheta0.<locals>.<listcomp>r   r   g    .Ag      B@$   c                    s   g | ]}t t | qS r?   )rK   r   r   )r   r?   rC   r     s     r   r8   )r   r
  r   r   r   )
r  r   Zradsr   ZhradsZvstarZrstardeltar   vr?   )r  r   rC   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  rA   r?   r?   rC   r    s    zAngleData.__new__N)rR   rS   rT   r   r  r?   r?   r?   rC   r     s   r  c                   @   s*  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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 1rW   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.rY   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 pie)BASEr  r   
startAngler   r   r   other_thresholdcheckLabelOverlappointerLabelMode	sameRadii	orderModexradiusyradiusinnerRadiusFractionwedgeRecordr   sideLabelsOffsetc                 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   rY   gffffff@g333333?g@r6   r   Fr!  r   rZ   r      rG      ) r(   r   r   r   r   r   r  r   r$  r   r   r&  r'  r(  r)  r*  r+  r,  r   r.  r&   rU   r   r   darkcyanrb   
bluevioletbluecyanZpinkZmagentaZyellow)rA   Zkwdr?   r?   rC   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   r/  2   
   P      r   (   <   r   r   cr  r1   fr   r   rZ         ?r   rY   r0  rG   r1  )r   r  r   r   r   r   r  r   r   ra   rh   rd   rl   r   redrk   r2  rb   r3  r4  r5  
aquamarine	cadetblue
lightcoraladdrA   r  pcr?   r?   rC   demo9  s.    

zPie.democ           $         sv  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|||td}|| | }|d |d  }|d	 |d  } fd
d|D }t|d}t|d}|r|r|dkrV|d |d  |d |d  k rPd }nd }nV|d |d  d|d |d   k rd }n*|d |d  d |d |d  krd }|r|d7 }|r|d7 }t|||||||j|j|jd	|_t||	}	|
|d 7 }
qX|sr| j d }| jd }| j| }| j| }| jr>| j}| jrL| j}| jrbt|| }}|||||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rL| j}| jrbt|| }}|||||||| 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)rA   rI  rJ  r*  r+  r  rK  rL  r?   r?   rC   r   W  s    z*Pie.makePointerLabels.<locals>.PL.__init__N)r   r   )rR   rS   rT   r   r?   r?   r?   rC   PLV  s   rM  rZ   r   rY   r[   r8   r   r   c                    s*   g | ]"}|d  t  |d |d ffqS )r   rY   rZ   )r   r   r   r?   rC   r   s  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   r   dictr   r   r   r   r   r   r   r*  r+  r(  r   rI   r  )$rA   anglesplModerM  r   r   r3   nrnlZmaxWZsumH
styleCountr   L_addZrefArcsr   Zsnr   r   r   r-   hr   r   r*  r+  rI  rJ  ZaonRr   r  rK  rL  r  Zx0x1r?   rO  rC   makePointerLabelsU  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<   rY   c                    s   g | ]}t  | |qS r?   )r  r   r   r?  r?   rC   r     s     z%Pie.normalizeData.<locals>.<listcomp>c                    s   g | ]} | qS r?   r?   rZ  r[  r?   rC   r     s     )r   maprK   r  r   r
  _sum)rA   keepDatar  r/   r?   r[  rC   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-  rY   rF   r   r   c                 S   s   g | ]}|qS r?   r?   r   r?   r?   rC   r     s     z"Pie.makeAngles.<locals>.<listcomp>)r^  r"  c                 S   s    g | ]}t |d  dkr|qS rY   gh㈵>rK   r   r?   r?   rC   r     s      r   r   rZ   r0  c                 S   s    g | ]}t |d  dk r|qS r`  ra  r   r?   r?   rC   r     s      )rL   r   r  r  r   r   r|   r$  r   r_  r)  r   r  popr   reverserK   _ANGLELOr  r  )rA   wrr$  ZwhichWayDWr  r   r   r   r   ZendAngler   r?   r?   rC   
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?   rC   <lambda>      z Pie.makeWedges.<locals>.<lambda>c                    s     | dS ri  )r   rj  r   r?   rC   rk    rl  r   )r+  Zradius1Zyradius1)r+  rY   r`   r_   r   )valuelabel)	r   r   r   r   r   r   r   r   rQ  r   r  )ra   rc   r6   r:   r   r   r   r   r   r   r   r   r   r   r   )r   g      ?)Drh  r   r   r   r   r   rL   _seriesCountr   r'  rY  r*  r+  rI  rJ  r  r   r   r   r   r(  r   r&  r   rE  r,  r   rK   rh   r   r   r   _ANGLEHIr   r   rb   rc   ra   rf   re   rg   rd   r   r   r   r   ZWhiterZBlackerrI   r   r   r   r  r|   rl   r   r   Z_aaxZ_aayr   r   r   r$   r   r   r.  r   r%   )HrA   rQ  Z
halfAnglesr   a1Za2Z	halfAngler   r3   r   re  rU  rR  r&  rM  r*  r+  rI  rJ  ZPL_dataZgSNgZg_addr   rV  r,  r   r   r   r   r   rh   ZaverageAngleZaveAngleRadiansZcosAAZsinAAtheWedgeZshaderZnshadesr   ZdshZshf1ZshdaZshscZishsha1Zsha2ZshcZshWedgerl   r   r   r   r   r   r  ZsinMZcosMZlXZlYZlpelZlXiZlYiZslices_popoutr  r   r   r   rX  y1Zx2y2r?   r   rC   
makeWedges  s   





   
  
 


     

$
    
*6
*6zPie.makeWedgesc                 C   s"   |   }|  }|rt||S |S r>   )ZmakeBackgroundrx  r   )rA   r  r-   r?   r?   rC   draw  s
     
zPie.draw)F)rR   rS   rT   r   r   r   r   r   r   r   r   r   r   r   r   r%  r   rH  rY  r_  rh  rx  ry  r?   r?   r?   rC   r    s8   









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 legendrW   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   r/  g333333C@g333334@gfffff2@g.@gffffff@r      H   zPANTONE 458 CV)spotNameA   r   zPANTONE 288 CVK   )r  Zdensityr8  rY   rZ   r   r0  rG   g      ?   3   z%.1f%%)LegendgGz@gףp=
W,@gHz&@   rightzAAA:zAA:zA:zBBB:zNR:zHelvetica-Boldr1  r   zHelvetica-Oblique)+r  r   r   r   r   r   r  r   r   r   
PCMYKColorr   r  r   rb   ra   rc   r~  r}  r  !reportlab.graphics.charts.legendsr  r|  deltaxdeltayZdxTextSpacer   r   columnMaximum	alignmentr  r   r   colorNamePairsr   ri   rj   _legend2r   r   r   r   r{  )rA   r  r   ZlegendOffsetr  r?  r?   r?   rC   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   rb   r   
IndexErrorr  r}  
isinstancestrhasattr
ValueErrorasciir  ry  rE  r   r~  r   r  r  r   r  shiftr   r   )rA   r?  ZldfZlNFr  r?   r?   rC   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   )rA   txtyr?   r?   rC   _getDrawingDimensions6  s    z!LegendedPie._getDrawingDimensionsc                 C   s,   |s|   \}}t||}||   |S r>   )r  r   rE  ry  )rA   drawingr  r  r?   r?   rC   rH  >  s
    
zLegendedPie.demo)N)rR   rS   rT   r   r   r  r   r   r   r   r   r   r   r   ry  r  rH  r?   r?   r?   rC   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 )Wedge3dPropertiesrV   r[   rW   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)"rb   fillColorShadedrk   ri   rj   ro   r   rp   rs   rq   rr   rm   rn   rz   rw   r~   ry   r   r   rt   ru   rv   r{   r}   r|   rx   rl   rh   shadingrc   strokeColorShadedrd   ra   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?rY   rc   rd   ri   rj   rb   r   rE   r   r   r   )#ra   r  r   r  r  rb   r    rc   rd   rh   ri   rj   rk   rl   rm   rn   ro   rv   r}   r~   r   r   rp   rq   rr   rs   rt   ru   rw   rx   ry   rz   r{   r|   r   r   r?   r?   rC   r   s  s0    




zWedge3dProperties.__init__N)rR   rS   rT   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r?   r?   r?   rC   r  F  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   rF   r   )lohir   rK   rq  not360)rA   r  r  r?   r?   rC   r     s    z_SL3D.__init__c                 C   s   d| j | jf S )Nz_SL3D(%.2f,%.2f))r  r  r   r?   r?   rC   __str__  s    z_SL3D.__str__N)rR   rS   rT   r   r  r?   r?   r?   rC   r    s   	r  c                 C   s   t | d |d  S Nr   r+   r  r?   r?   rC   _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.rW   zdepth of the pie.zThe view angle.)r#  perspectivedepth_3dangle_3dF      r8   c                 C   s   | j | jr| j| jpdS r  )_sl3dr  r   rh   )rA   r   r?   r?   rC   _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   rA   r   r  r?   r?   rC   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?   rC   CY  s    zPie3d.CYc                 C   s   |  ||| jtt|  S r>   )r  _radiusxr   r  rA   r   or  r?   r?   rC   OX  s    zPie3d.OXc                 C   s   |  ||| jtt|  S r>   )r  _radiusyr   r  r  r?   r?   rC   OY  s    zPie3d.OYc                 C   s$   | j }tt|| t|| d S )NrF   )_3dvar   rK   )rA   r   r  r?   r?   rC   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   rY   rZ   r   r0  rG   r1  i,  r7  g      )@g4@r   g      6@g      @g      2@g      *@)r  r   r&   r  r   r   r2  rb   r3  r4  r5  ZazureZcrimsonZ
darkvioletr*  r+  r   r   r  r   r?   r?   rC   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   rY   rc   rb   ra   rf   )	r  r  r   r  r  r  r  r   r"   )	rA   r   r   r   rc   ra   rb   rdr  r?   r?   rC   	_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 )Nr6   r   r   g      Y@r   r   rY   r   r8   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   r3   _ody)r  r   r  r  r@   r?   r?   rC   rD     s    
z*Pie3d.draw.<locals>.WedgeLabel3d._checkDXYN)rR   rS   rT   r  rD   r?   r   r?   rC   WedgeLabel3d  s   r  )r+  rc   ra   rb   rf   r  )r+  ZmoveTo)r+  rc  )rc   ra   rb   rf   rN  ro  r   c                 S   s   g | ]}|d  qS )rY   r?   )r   r/   r?   r?   rC   r   L  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  rK   rd  r  rb   r  r  rc   r  ra   rE  r   r!   ZaddArcZlineToZ	closePathr   rq  r   r|   rl   r   r   r   r   r   r  r   r   )5rA   r   Z	_3d_angler  Za0r  ZradiusxZradiusyr  r
  r  r  r  r  r  r  r3   r  rs  lastr  Zangle1Zangle0r   rr  r  r  r   r  r&  r   r   slr  r  r   rb   rc   ra   Zcx0Zcy0Zcx1Zcy1r  r  rt  r   Zratr   r   r   r   r   r?   r   rC   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 r6  )r   r  r   r   r   r   r  r   r   ra   rh   rd   rl   r   rA  rk   r2  rb   r3  r4  r5  rB  rC  rD  r   rE  rF  r?   r?   rC   rH  P  s8    

z
Pie3d.demoN)rR   rS   rT   r   r  r   r   r   r  r  r  r  r  r  r  r  r  r   r  ry  rH  r?   r?   r?   rC   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.  r7     r8  r9  r   rY   )	r   r  r   r   r  r   r   ra   rE  r  rG  r?   r?   rC   sample0ar  s    

r  c                  C   sN   t dd} t }d|_d|_d|_d|_dg|_dg|_d	|j_	| 
| | S )
r  r  r7  r  r8  x   r/  r9  r   rY   )r   r  r   r   r   r   r  r   r   ra   rE  r  r?   r?   rC   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  r7  r  r8  r9  r;  r   r<  r=  r   r   r>  r  r1   r?  rY   r   rZ   r@  )r   r  r   r   r  r   r   ra   rh   rd   rl   r   rA  rk   rE  r  r?   r?   rC   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  r7  }   r  gףp=
?gl?gS㥻?g~jt?gL7A`?gQ?g~jt?gT㥛 ?g333333?12345678Xr  rY   r   rZ   r   r0  rG   r1  r     )r   r  r   r   r  r   r   r   r   ra   r   	steelbluerb   thistle
cornflowerlightsteelbluerB  rC  rD  tanZdarkseagreenrE  r  r?   r?   rC   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  r7  r  r  J   rY   r  r   rZ   )r   r  r   r   r  r   r   r   ra   r   r  rb   r  r  rE  r  r?   r?   rC   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  r7  r  r  r  rY      r  r   rZ   r   r0  rG   )r   r  r   r   r  r   r   r   ra   r   r  rb   r  r  r  rB  rC  rE  r  r?   r?   rC   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  r7  r  r  r  rY   rZ   example1example2example3example4example5example6r  r   r   r0  rG   )r   r  r   r   r  r   r   r   r   r   ra   r   r  rb   r  r  r  rB  rC  rE  r  r?   r?   rC   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  r7  r   r  r  rY   r  r  r  r  r  r  r  r  rZ   r   r0  rG   )r   r  r   r   r  r   r   r   r   r   ra   r   r  rb   r  r  r  rB  rC  r%   rE  )r  rG  r   r?   r?   rC   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  r7  r8  r  r/  rY   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   rZ   r   r0  rG   )r   r  r   r   r   r   r  r   r   r&  r   r   ra   r   r  rb   r  r  r  rB  rC  rE  r  r?   r?   rC   sample78  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  r7  r8  r  r/  rY   r   r<  r;  r9  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rZ   r   r0  rG   )r   r  r   r   r   r   r  r   r   r&  r   ra   r   r  rb   r  r  r  rB  rC  rE  r  r?   r?   rC   sample8Z  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  r7  r  r8  )   r;  r<     r   r  #   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rY   r/  r   rZ   r   r0  rG   )r   r  r   r   r  r   r   r&  r   r   r   ra   r   r  rb   r  r  r  rB  rC  rE  r  r?   r?   rC   sample9z  s:    
&       
r   __main__)	renderPDFr  samplezsample%sz%s.pdf)rY   )Fr   )N)N)r__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   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,   rN   rM   rd  rq  r=   rU   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   rR   sysZreportlab.graphicsr  argvr   
startswithnameglobalsr  Z
drawToFiler?   r?   r?   rC   <module>	   s   P4\<
	
I

"

F   5 G
 T  "  
