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

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

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

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