
    h             
       *   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  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
  Z; G d de5      Z< G d de/      Z=dPdZ>d Z? G d  d!e1      Z@d" ZAd# ZBdQd%ZCdRd&ZDd' ZEd( ZFd) ZG ej                  eG      ZGd* ZIdPd+ZJd, ZK ej                  eK      ZKd- ZLdPd.ZMd/ ZN G d0 d1eO      ZP G d2 d3e@      ZQ G d4 d5eQ      ZRdd6lSmTZTmUZUmVZVmWZW  G d7 d8e/      ZX G d9 d:      ZYd; ZZ ej                  eZ      ZZ eUd<      Z[ G d= d>eQ      Z\d? Z]d@ Z^dA Z_dB Z`dC ZadD ZbdE ZcdF ZddG ZedH ZfdI ZgehdJk(  rd	 ddliZiddKljmkZk eij                  d$d xs dLgZlelD ]?  Zmemj                  dM      remndNemz  Zo  ep       eo          Zq ekj                  eqdOeoz         A yy)Sz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 Zd Zy)
WedgeLabelc                      y N selfbas     S/home/dcms/DCMS/lib/python3.12/site-packages/reportlab/graphics/charts/piecharts.py	_checkDXYzWedgeLabel._checkDXY,   s        c                 4   | j                   }|dv rt        | j                  dz  dz        dz  dz  }|dz  s0| j                  |z
  dz  }t        |      dkD  r||dkD  xr dxs dz  }t	        | d	d       xr t
        xs t        |   }| j                  |       |S )
N)autoxautoyh  g     F@r7   r8      r   r=   _anti)	boxAnchorint_pmvabsgetattr_ANGLE2RBOXANCHOR_ANGLE2BOXANCHORrG   )rD   rE   nadas       rF   _getBoxAnchorzWedgeLabel._getBoxAnchor.   s    ^^""tyy}c)*2-s2BGii"n+r7192a4;B-#.B$wt,B1BVFVXZ[BNN2	rH   N)__name__
__module____qualname__rG   rX   rB   rH   rF   r?   r?   +   s    
rH   r?   c                   *   e Zd ZdZ edei d 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/      d0 eed1      d2 eed3      d4 eed5      d6 eed7      d8 eed9      d: eed;      d< eed=      d> eed?      d@ eedA      dB eedC      dD eedE      dF eedG      dH eedI      dJ eedK      dL eedM      dN eedO      dP eedQ      dR e ee      dSdT      dU eedV      dW eedX      dY eedZ      d[ e e	d\d]      d^      d_ e e	d`dadb      dc      Zdd Zy`)fWedgeProperties,  This holds descriptive information about the wedges in a pie chart.

    It is not to be confused with the 'wedge itself'; this just holds
    a recipe for how to format one, and does not allow you to hack the
    angles.  It can format a genuine Wedge object for you with its
    format method.
    strokeWidthzWidth of the wedge borderdesc	fillColorzFilling color of the wedgestrokeColorzColor of the wedge borderstrokeDashArrayzZStyle of the wedge border, expressed as a list of lengths of alternating dashes and blanksstrokeLineCapr         z#Line cap 0=butt, 1=round & 2=squarestrokeLineJoinz$Line join 0=miter, 1=round & 2=bevelstrokeMiterLimitz$Miter limit control miter line joinspopoutz How far of centre a wedge to popfontNamez"Name of the font of the label textfontSizez,Size of the font of the label text in points	fontColorz#Color of the font of the label textlabelRadiuszpDistance between the center of the label box and the center of the pie, expressed in times the radius of the pielabel_dxzX Offset of the labellabel_dyzY Offset of the labellabel_anglezQAngle of the label, default (0) is horizontal, 90 is vertical, 180 is upside downlabel_boxAnchorzAnchoring point of the labellabel_boxStrokeColorzBorder color for the label boxlabel_boxStrokeWidthzBorder width for the label boxlabel_boxFillColorzFilling color of the label boxlabel_strokeColorzBorder color for the label textlabel_strokeWidthzBorder width for the label text
label_textzText of the labellabel_leading label_widthzWidth of the labellabel_maxWidthz#Maximum width the label can grow tolabel_heightzHeight of the labellabel_textAnchorz$Maximum height the label can grow tolabel_visible True if the label is to be drawnlabel_topPaddingzPadding at top of boxlabel_leftPaddingzPadding at left of boxlabel_rightPaddingzPadding at right of boxlabel_bottomPaddingzPadding at bottom of boxlabel_simple_pointerzSet to True for simple pointerslabel_pointer_strokeColorzColor of indicator linelabel_pointer_strokeWidthzStrokeWidth of indicator linelabel_pointer_elbowLengthz&Length of final indicator line segmentlabel_pointer_edgePadz!pad between pointer label and boxlabel_pointer_piePadz!pad between pointer label and pieswatchMarkerz!None or makeMarker('Diamond') ...ra   advancedUsagevisiblezSet to false to skip 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                    d| _         d | _        t        d   | _        t        d   | _        d| _        d| _        d| _        d| _        t        d   | _	        t        d   | _
        t        d   | _        d| _        dx| _        x| _        | _        d | _        dx| _        x| _        x| _        | _        d	| _        d | _        d
| _        d | _        d | _        d| _        d x| _        x| _        x| _        | _        d| _        d| _         d| _!        tD        jF                  | _$        d
| _%        d| _&        d| _'        d| _(        d| _)        d | _*        d
| _+        d| _,        d| _-        y )Nr   rc   rd   rf   rk   rl   rb   333333?rJ         ?皙?start   rg   g@߾ @r   ).r_   rb   r"   rc   rd   rh   re   ri   rj   rk   rl   rm   rn   ro   rp   rq   rx   r   r   r   r   rr   rs   rt   ru   rv   rw   ry   r{   r|   r}   r~   r   r   r   blackr   r   r   r   r   r   r   r   r   r   rD   s    rF   __init__zWedgeProperties.__init__q   sp   )-8-.?@ !&z2&z2'4;<<<(8nooo 6o9PSWSk&$(!$'!"&!%!$]aaa 0a43FIZ '$%!)/&),&)*&%&"$%! " (rH   rB   )rY   rZ   r[   __doc__AttrMapAttrMapValuer   r
   r   r   r   r   r   r   r   r   r   r   _attrMapr   rB   rH   rF   r]   r]   :   s     -
"81LM-
 4PQ-
 #=6QR-
 ''<  C_  `	-

 %U1Qq\7\]-
 &eAal8^_-
 (6\]-
 h,NO-
  .RS-
  .\]-
 !4YZ-
 #8  2d  e-
  .EF-
  .EF-
 #8  2E  F-
  '{8VW!-
"  ,M?_`#-
$  ,H:Z[%-
& *-=]^'-
( )<]^)-
* )7XY+-
, ".6IJ--
. %^</-
0 #>7KL1-
2 &n:_`3-
4 $N8MN5-
6 (:`a7-
8 %Y4VW9-
: (1HI;-
< )2JK=-
> *(3LM?-
@ +84NOA-
B  ,I6WXC-
D %1D]$^E-
F %1?^$_G-
H %1?g$hI-
J !-X;^ _K-
L  ,H:]^M-
N $F8$4;^mnoO-
P y)JKQ-
R %^9]^S-
T $H2jkU-
V (hv(>DxyW-
X #5i#AGefY-
H^#)rH   r]   c                    | j                   rft        |||      }| j                  sd|_        n5t	        |      dk  s|dkD  r|dk  sd|cxk  rdk  rn nd|_        nd|_        ||_        d	|_        n/|t        | d
t              } |       }||_        ||_	        ||_
        |j                  |_        | j                  s#|j                  |_        |j                  |_        n|j"                  | j"                  dz  }n|j"                  dz  }|j                  ||_        n|j                  |z   |_        t	        |      dk  s|dkD  r|dk  sd|cxk  rdk  rn nd|_        nd|_        |j$                  |_        |j(                  |_        |j,                  |_        |j0                  |_        |j4                  |_        |j8                  |_        |j<                  }	|	|}	|	|_        |j@                  |_!        |jD                  |_#        |jH                  |_%        |jL                  |_'        |jP                  |_        |jR                  |_*        |jV                  |_,        |jZ                  |_.        |j^                  |_0        |jb                  |_2        |jf                  |_        |j"                  |_        |jh                  |_4        |jj                  |_6        |S )Nmiddler8   r<     >r   endr   
labelClassg      @r/   r3   )7simpleLabelsr!   
sideLabels
textAnchorrR   rQ   _simple_pointerrS   r?   xyro   dxrp   dyrr   rO   rl   rq   anglers   boxStrokeColorrt   boxStrokeWidthru   boxFillColorrv   rc   rw   r_   rx   _textry   leadingr{   widthr|   maxWidthr}   heightr~   r   r   r   
topPaddingr   leftPaddingr   rightPaddingr   bottomPaddingr   rk   rm   rb   )
rD   textr   labelXlabelY
wedgeStyler   theLabelsideLabels_dyr   s
             rF   _addWedgeLabelr      s   &&$/"*HE
ReSjU3YD%DUQUDU&-#&+##$  l:>J<

 ))$--HK!+!;!;H""* $ 3 * 3 3c 9""*+(11MAE
ReSjU3YD%DUQUDU%("%("#//","A"A","A"A * = =);;);;%%=$%%33#//&55$11(99%33(99);; * = =!+!?!?#-#B#B "++H"++H#--HOrH   c                 d    | dg|z  } | S |t        |       z
  }|dkD  rt        |       dg|z  z   } | S )Nrz   r   )lenlist)labelsr5   is      rF   
_fixLabelsr      sG    ~ M c&kMQ3frd1f,MrH   c                       e Zd Zd ZddZy)AbstractPieChartc           
         | j                   }|t        |      z  }||   }t        |dt        |dd             }	t        |dt        |dd             }
t        |dt        |dd             }t        |dt        |dd             }t        |dt        |dd             }|rt        |||dz  z   ||dz  z   |
      S t	        ||||||	||
      S )Nrc   rb   rd   r_   r          @)r_   rc   rd   rb   )slicesr   rS   r   r%   )rD   rowNor   r   r   r   	baseStylestyleIdxstylerc   rb   rd   r_   r   s                 rF   makeSwatchSamplez!AbstractPieChart.makeSwatchSample   s    KK	3y>)(#e]GImTX4YZE;	+d0ST	!%):GIN_`d<efe]GI}UY4Z[ungiX\6]^!,qrz!F2I+iPPAaf$3iI 	IrH   Nc                     	 t        | j                  |         }| j                  st        | j                  |   dd      }||}|S #  |}Y 2xY w)zreturn series name i or defaultrx   rz   )r+   r   r   rS   r   )rD   r   defaultr   r   s        rF   getSeriesNamezAbstractPieChart.getSeriesName   sU    	4;;q>*D   DKKN<;E $	Ds   A ArA   )rY   rZ   r[   r   r   rB   rH   rF   r   r      s    I	rH   r   c                     | d   |d   dz
  kD  xs@ |d   | d   dz
  kD  xs0 | d   d|d   |d   z   z  dz
  kD  xs |d   d| d   | d   z   z  dz
  kD   S )Nr   rg   g{Gz?rf   r   r   rB   )PQs     rF   boundsOverlapr      s    tAaDI~m1ad4im1Q4ad1Q4i$8N3NmRSTURVX[]^_`]abcdebf]fXgimWmRmnnrH   c                     t        |       }|g}	 |d   }|dz   |z  }||v st        | |   | |         sn|j                  |       6	 |d   }|dz
  |z  }||v st        | |   | |         s	 |S |j                  d|       9)z find overlap run containing B[i]rf   r   )r   r   appendinsert)Br   wrapr5   Rjs         rF   _findOverlapRunr      s    AA	
A
bEqS!G6qtAaD15		 
 aDqS!G6qtAaD15H 	
1	 rH   rf   c                     t        |       }|dkD  r2t        |dz
        D ]!  }t        | ||      }t        |      dkD  s|c S  y)z>determine a set of overlaps in bounding boxes B or return Nonerf   N)r   ranger   )r   r   r5   r   r   s        rF   findOverlapRunr   
  sK    AAsqs 	"A!D)A1vax	" rH   c           
      H   t        |       }|dk  ry | D cg c]  }|j                  d    }}d}g }d}t        |dz         }|}	|s|dk  rt        |      }
|
sy t        |
      }||k(  ry |D cg c]	  }||
v s| c}s|}	d}|
d   }|
d   }||   }t	        | |   j
                        x}}|
dd  D ]C  }||   }t        |t        |d   |d   z
  |d   |d   z
              }|}|| |   j
                  z  }E |t        |      z  }t        | |   j
                  |z
        }t	        |      }||	|dz
  z  |z  z  }|
D ]  }| |   }|j                  }t	        |j
                  |t	        |j
                        |z
  z  z         x}|_        |t        z  }|d   |d   t        |      z  z   |_        |d	   |d
   t        |      z  z   |_        |j                         ||<    |
}|	dz  }	|dz  }|dk  ry y |dk  rt        |      }
|
sy t        |
      }||k(  ry | d   }|j                  }|d   }t        |
      D ]  \  }}| |   }|j                  }|d   }d}d}||dz
  k(  r)||k(  s|d   |d   kD  r|d   |d   k  r|d   |d   z
  }|d   |d   kD  r|d   |d   k  r|d   |d   z
  }||kD  r"|xj                  d|d   |d   z
  z  z  c_        n&||k\  r!|xj                  d|d   |d   z
  z  z  c_        |j                         ||<    |dz  }|dk  ry y c c}w c c}w )Nrg   boundsrf   r      r   cxrxcyryg?r   r   )r   	_origdatafloatr   _360rQ   maxminrR   _180_pir   r   r   r   	getBounds	enumerate) Lr   mult0nLlr   OKRPitermultr   nRrrW   r0rLbitaaaabutaantaaorigr   radl1orig1bounds1r   r   diff1diff2s                                    rF   fixLabelOverlapsr    s   	QB	!tV()*1X	*A*	
B	BD%!)ED2gq!AeQB2vu!,!Q!VA,B1B2B2BAbEJJ''C"qrU  aDC!RU
2a51:67adii	 
 E"IBquzz#~&D:D$1+d""B %aD{{!%affRaffb-A&A!BBGm4j4:c#h#664j4:c#h#66{{}!% BDLDAIDA 2gF 2gq!AeQBRx2BLLEHoG | )!aD{{hBqDy!W,!!9WQZ/GAJvay4H$*1Igaj$8E"1:fQi/F1Igaj4H$+AJvay$8E 5=CC#wqz'!*'<"==C"e^CC3
71:(=#>>C;;=AaD!)" AID3 2gW 	+ -s   L0	L:Lc                     t        t        |       t        |            t        t        |       t        |            }}||k\  ry ||fS rA   )r   r   )Ar   r   r   s       rF   intervalIntersectionr  \  s;    
c!fSV
SQA/aA!tDQ3JrH   c                 \   | dz  } d| cxk  rdk  r&n n#|dk(  rdd| fddd| z   dff}n\d| dfd	dd
d| z   ff}nM| dk\  xr dxs d}|dk(  rd|dz
  | fd|dz
  |dz
  fdd| z   |dz
  ff}nd| |dz   fd|dz   |dz   fd|dz   d| z   ff}t        |D cg c]  }|d   |d   k  s| c}      S c c}w )NrL   r8   r<   	clockwiser   )rf   r8   ir  )rf   r<   r   r   rf   rg   )tuple)sa	directionaoffss       rF   _makeSideArcDefsr  a  s    #IB	2zczk!2b	*aR_4A2c
;#c"f~5A3w3#!k!472$s(473QtBwtCx4HHA2d2g$r'$s(3QtCxB4GGAQ,!A$qt)!,--,s   B)B)c                 >    t        |d   |d   z
  | d   | d   z
        S )Nrf   r   r-   )r   r   s     rF   _keyFLAr   p  s'    qtAaDy1ad##rH   c                     | D cg c]  }|d   |k(  s|d   |d    c}}|sy t        |      dkD  r|j                  t               |d   S c c}w )Nr   rf   key)r   sortr   )xArcssider  s      rF   _findLargestArcr'  t  sU    @!!d
qt/?1@AT
1vaxG$Q4K 	As   AAAc                    | j                   }|8|d   }|d   }|d}|}n'|d}|}n |d   |d   z
  |d   |d   z
  kD  rd}|}nd}|}|d   }|d   }|sd| _        ||z   | _        |d   }nd| _        ||z
  |z
  | _        |d   }|d   |d   z   dz  x}	|d	<   t        |	t        z        |d
<   t        |	t        z        |d<   ||d<   ||fS )Nlirirf   r   r   edgePadr:   r   midsmidcmidr&  )r   rQ   r   r   r   r   )
r   r   r&  datar)  r*  r   r/   r+  r,  s
             rF   _fPLSider0  z  s   ;;D|$Z$Z:DAZDAU2a5[Ar!u$DADAWA9oGaiJai'!J1adC'C$u+s7{#DLs7{#DLDL6MrH   c                 N    t        |j                  d   | j                  d         S )Nr-  )r.   r   r  r  s     rF   _fPLCFr3    s!    q{{6"1;;v#677rH   c                     | d   S )Nrf   rB   )r  s    rF   _arcCFr5    s    Q4KrH   c                    g g f}ddg}|D ]8  }	t        |	||      \  }
}||
   j                  |	       t        |||
         ||
<   : d}| d gz  }d}|dz  }||z   }t        |      }dD ]f  }
||
   }|rYg }|j                  }g }|j                  }|j                  t               d}||z   }|D ]  }	|	j
                  }||||d   z
  z  z   }|	xj                  |z  c_        |	||d   <   ||d   |z  z   }|d	   }|d
   |d   z
  dz  }||z   |kD  r||z
  }||z
  |k  r||z   }|d   ||z
  |d   ||z   fx|d	<   } ||       ||	_         |t        d||z
  |z
               ||z
  }t        ||d   |d   z         }t        |t        |d   ||d   z   z        |z
        }  |||z
         d}t        |      }|dk  rt        |d      } | snt        |       }!|!|k(  rn| d   }"| d   }#|#dz   }$t        |d |"dz          }%|%t        ||$d        z   }&t        ||"|$ D cg c]  }|d
   |d   z
   c}      |$z   |"z
  ||"   d
   ||#   d   z
  z
  }'|'|&kD  rns||"   d
   |%|'z  |&z  z   }| D ]V  }(||(   }	|	j
                  }|d	   }|d
   |d   z
  dz  }|dz  }||z
  x}|	_        |d   ||z
  |d   |fx||(<   |d	<   ||z
  dz
  }X |dk  r||z   ||
<   d}i ||d   |d   |fS c c}w )Nr   rf   r   )r   rf   r"  r   indexr-  r   r   rg   r+  piePadelbowLengthr   )r   r   )r0  r   r   r$  r3  r   r   r   rR   r   r   sum))r5   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  s)                                            rF   _fixPointerLabelsrS    s   	BBQ%C qt$!
1QQs1vA C	4&A
C	B
B$CCA 6qEABABFFvFA6B M{{QtG}_--s
#$$w- fb(Nd1Q4i_b58"R%Rb572B&'d2b51be%<<X13qBr?#U$y/$x.89#c$v,43F0F"GHKL!M" r!tHDQBr'"1!,%Vr65qTrUTQu1Xs1RS6{*"R91QqT!A$Y9:2=b@!B%(1R5QR8BST;rU1XfUl500 'A!A;;DXAA$qt)SB#IB!"u$B-.qT"R%!R,@@AaD4>b3B' r', qSCFm6n c!fc!fc!! :s   K
c                    dt         z  t        |       z  }| D cg c]  }||z  	 }}d}g }|D ]  }|j                  ||dz  z          ||z  }  t        |       dz  }d}	t         dz  }
t	        d      D ]H  }||
z  }t        |D cg c]  }t        t        ||z                c}      }||k  s<|dk(  r| }	n|}	|}J |	dz  t         z  S c c}w c c}w )	Nrg   r   r   g    .Ag      B@$   r  r:   )r   r:  r   r   r   rR   r   )r/  r  facdradsr  hradsr  vstarrstardeltar   r  vs                 rF   theta0r^    s    R4T
C aAcE D 	
BE R#X
a IcMEEtGE2Y eG.1S1X./u9K'bE 9R<) ! /s   C
C
c                       e Zd ZdZd Zy)	AngleDataz/use this to carry the data along with the anglec                 @    t         j                  | |      }||_        |S rA   )r   __new___data)clsr   r/  rD   s       rF   rb  zAngleData.__new__  s    }}S'
rH   N)rY   rZ   r[   r   rb  rB   rH   rF   r`  r`    s
    9rH   r`  c                   P   e Zd Z ed:i ded 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      d0      d1 eed2      ZdZd3 Zd4 Zd5 Zd;d6Zd7 Zd8 Zd9 Zy)<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.rf   r   checkLabelOverlapg?zFIf true check and attempt to fix
 standard label overlaps(default off)pointerLabelMode	LeftRightLeftAndRightrz   	sameRadiiz,If true make x/y radii the same(default off)	orderModefixed	alternate)r   xradiuszX direction RadiusyradiuszY direction RadiusinnerRadiusFractionz$fraction of radii to start wedges atwedgeRecordzcallable(wedge,*args,**kwds)r   zDIf true attempt to make piechart with labels along side and pointerssideLabelsOffsetzWThe fraction of the pie width that the labels are situated at from the edges of the pier   z,A class factory to use for non simple labels
angleRangez3total degree range for the doughnut defaults to 360c           
         t        j                  |        t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dg d             t        | d	|j                  d	d              t        | d
|j                  d
d             t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dd              t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dd              t        | d|j                  dd              t        | d|j                  dd              t        | d|j                  dd             t        | d|j                  dd             t        | d|j                  dt	        t
                           t        | d|j                  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#   _	        y )$Nr   r   r   r   d   r   r/  )rf   gffffff@g333333?g@r   rh  r8   r  r  r   rf   rk  rl  ro  Frp  rq  rs  rt  ru  r   rw  r   r   rx  rL   rg   r      rM      )r*   r   setattrpopr(   r]   r   darkcyanr   rb   
bluevioletbluecyanpinkmagentayellow)rD   kwdss     rF   r   zPie.__init__!  sv   $S#a)S#a)WTXXgc23Xdhhx45VDHHVO<=Xdhhx56\$((<";<[+k!BC^DHH^A$>?(2Ea)HI'1CD(IJ[+e!<=[+g!>?Ytxx	$78Ytxx	$78*4884I$+OP\$((<":;'1CC(HIXdhhx0G0XYZ\$((<"<=#)??A #)#4#4A #);;A #);;A #);;A #)>>A #)==A rH   c                    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   _        |j1                  |       |S N   rz  2   
   P   r     r   (   r  <   r  r  crW  r3   fr   r   rg         ?r   rf   r{  rM   r|  )r   rf  r   r   r   r   r/  r   r   r_   rj   rd   rn   r   redrm   r  rb   r  r  r  
aquamarine	cadetblue
lightcoraladdrD   rW  pcs      rF   demozPie.demo@  sG   CU	%-	!		 		!#$		! ()!u		!$#'		! !'		!!'		!!'!2!2		!!'		!!'		!!'!2!2		!!'!1!1		!!'!2!2		!	b	rH   c                     G d d      }| j                   dz
  }| j                  }dx}x}x}x}	}
t        | j                        }g }|j                  }t        | j                  | j                        }|D ]  \  }}|d   | j                  |d      }|s"| j                  ||z     }|j                  r|j                  sM|dz  }t        | |d|||      } ||       |j                         }|d   |d   z
  }|d   |d   z
  }|D cg c]  }|d   t        ||d   |d   f      f }}t        |d      }t        |d      }|r]|r[|d	k(  r|d   |d   z
  |d   |d   z
  k  rd }n<d }n9|d   |d   z
  d
|d   |d   z
  z  k  rd }n|d   |d   z
  d
z  |d   |d   z
  kD  rd }|r|dz  }|r|dz  }t        |||||||j                   |j"                  |j$                  	      |_        t)        ||	      }	|
|dz   z  }
 |s| j                   dz  }| j                  dz  }| j*                  |z   }| j,                  |z   }| j.                  r| j.                  }| j0                  r| j0                  }| j2                  rt5        ||      x}} |||||g       S ||k(  }|
| j                  k  r|s||k(  rt7        |      }nd }t9        t        |      || j*                  | j,                  | j                   | j                  |      \  } }!}"}#|d	k(  rt)        |!|"      x}!}"| j*                  |!z   }$| j*                  | j                   z   |"z
  }%|%|$z
  dz  }| j                  dz  |#z
  }|$|z   }| j,                  |z   |#z   }| j.                  r| j.                  }| j0                  r| j0                  }| j2                  rt5        ||      x}} |||||| |!|"      S c c}w )Nc                       e Zd ZddZy)!Pie.makePointerLabels.<locals>.PLc                 f    || _         || _        || _        || _        || _        || _        || _        y rA   )centerxcenteryrs  rt  r/  luru)rD   r  r  rs  rt  r/  r  r  s           rF   r   z*Pie.makePointerLabels.<locals>.PL.__init__^  s3    &&&& 	rH   N)r   r   )rY   rZ   r[   r   rB   rH   rF   PLr  ]  s    rH   r  rg   r   rf   rz   r:   r   rn  g{Gz?)	r   r   r   r)  r*  r7  r+  r8  r9  r   )r&  )r   r   r   r   r   r  rh  r  r   r   r   r   r   r  r'  dictr   r   r   r   r   r   r   rs  rt  ro  r   rP   rS  )&rD   anglesplModer  r   r   r5   nrnlmaxWsumH
styleCountr   L_addrefArcsr   r  snr   r   r  r/   hr  r*  r)  rs  rt  r  r  aonRr&  r>  r  r  r?  x0x1s&                                         rF   makePointerLabelszPie.makePointerLabels\  s   	 	 A$%%%B%%dT%

"4??4>>B 	DAqt|X##Ab)BxKK*-E&&emmXFAT"Su=A!HA!QqT	A!QqT	AFMN1Q4,Q!QqT{;<NBN A&B A&Bb>)!uRU{2a5A;.!!!uRU{4Ar!u#55!Q%1+t+BqE"Q%K7!272272aaqB"1UZUpUpx}  yS  yS  `e  `  `  @AKq;DAaCKD=	@ jjnGkk#oGffWnGffWnG||t||W||t||W~~s77/CCwwggggb991uQTDD'FAdffTVVDJJt{{`de"R>!"Rj BVVBYVVDJJr!b5#+++c/#%W*&&.$<<4<<<<4<<>>3ww+??77''''!Br::_ Os   	 O
c                 6   t        t        t        | j                              }t	        t        |            x}| _        |dk7  rt        d| j                        |z  nd}|r|D cg c]  }t        ||z  |       c}S |D cg c]  }||z  	 c}S c c}w c c}w )Nr   rL   rf   )
r   maprR   r/  r   r:  _sumr   rx  r`  )rD   keepDatar/  r1   r  r   s         rF   normalizeDatazPie.normalizeData  s    CDII&'c$i((DI*+Q$CDOO$Q&A.23Iac!$33!%&AAaC&& 4&s   %BBc                    t        | dd       }| j                  r2t        | j                  | j                        }d| j
                  _        n| j                  dz  }| j                  dk(  xr dxs d}t        | j                  |            D cg c]  }| }}| j                  dk(  r| j                  s|D cg c]  }t        |d         dk\  s| }}|j                  t        	       g g g}d
}|rL|dk  r|j                  d
      }n|j                  d      }||dz     j                  |       |dz  }|dz  }|rL|d   j!                          |d
   |d   z   |D cg c]  }t        |d         dk  s| c}z   }g }	|	j                  }|D ]^  \  }}
||
|z  z   }t        |
      t"        k\  r||k\  r||f}n	||f}n|d f}|rt%        |d
   |
j&                        |d   f}|} |||f       ` |	S c c}w c c}w c c}w )Nrv  rf   rL   r  r   )r  rr  gh㈵>r"  r   rg   r{  )rS   r   r^  r/  r  r   r   rh  r   r  rp  rR   r$  r5  r~  r   reverse_ANGLELOr`  rc  )rD   wrrh  whichWayr  DWrC  r   r  r   endAngler  s                rF   
makeAngleszPie.makeAngles  s   T--??		4>>:J()DKK%3.J>>[07R<1!$"4"4b"4"ABC1QCC>>;&t1qQqTD1A1FFvFBAAQ3aAb	A!A#a QQ  aDLLN!QqT	<1S1Yt^Q<<AHH 	HAu"eh&67H5z8#)!*,B#H,B%1ekk22a59!JqfI	 ? D1 =s   	G49G9G9!G>8G>c                      j                         }g }|D ]&  \  }\  }}||}nd||z   z  }|j                  |       (  j                  }t        |      }t	         j
                  |      }	t         dd       }
| _        t         j                        } j                  }|rd }|rTd} j                  ||      }|j                  }|j                  }|j                  }|j                  }|j                  }d }n j                   dz  } j"                  dz  } j$                  |z   } j&                  |z   } j                  r j                  } j                  r j                  } j(                  rt+        ||      x}} j,                  } fd}t/               }|j0                  }g }|j                  } j2                  }|D ]  \  }\  }}| j                  ||z     }|j4                  s,t7        ||z
        }||}} ||      }|j8                  }|s|rB||z   dz  } | t:        z  }!t=        |!      }"t?        |!      }#|r|t@        k  r|||"z  z   }|||#z  z   }|rtC        ||||||||z  ||z        }$n)|t@        k\  rtE        ||||      }$ntC        ||||||      }$|jF                  |$_#        |jH                  |$_$        |jJ                  |$_%        |jL                  |$_&        |jN                  |$_'        |jP                  |$_(        |jR                  |$_)        |jT                  }%|%r<|tW        |jX                        z  }&|&d	kD  r|%d
k(  rtZ        j\                  ntZ        j^                  }%d	ta        |&      z   }&d	|jb                  z
  }'|jd                  dk(  rd	|'z
  tW        |&d	z
        z  }(|'})n|'d	z
  tW        |&d	z
        z  }(d	})||z
  tW        |&      z  }*|jF                  }+d |$_#        tg        |&      D ]n  },||,|*z  z   }-||,d	z   |*z  z   }. |%|+|)|(|,z  z         }/|rtC        ||||-|.|||z  ||z        }0ntC        ||||-|.|      }0|/|0_#        d |0_$        d|0_%         ||0       p  ||$       |
r |
|$|jh                  |       |jj                  s|s.|r|jl                  }1||1z  }2||1z  }3||2"z  z   }4||3#z  z   }5to         | |4|5|      }6 ||6       |s&|6jp                  r|||"z  z   |6_9        |||#z  z   |6_:        |s;|4|5| |2|3|||6jw                         ||fd	|6_<        ^|sbsf||   }6|6so|6jx                  }7|7d   }8|7d   }9|||9z  z   }:|||8z  z   };|jz                  }<|:|<|9z  z   }=|;|<|8z  z   }> |t}        |:|;|=|>|6j$                  |6j&                  f|j~                  |j                                ||6       |s j                  j8                  }?d}@|D ]  \  }}A j                  |   jF                  r@d	z  }@%|@z  }B j                  |B   jF                   j                  |   _#         j                  |B   j8                   j                  |   _         tg        d@d	z
        D ]8  }C j                  |C   j8                  |?kD  s  j                  C   j8                  }?: |jl                  }1||1z  }3t7               dk  s| dkD  r| dk  sd| cxk  rdk  r2n n/d	 j                  z    j                   z   j$                  z   |?z   }4d}2n+ j$                   j                   j                   z  z
  |?z
  }4d}2||3#z  z   }5to         || |4|5|      }6 ||6       |s||"z  z   |6_9        |||#z  z   |6_:        |r|4|5| |2|3|||6jw                         d|6_<        |6jw                         \  }D}E}F}G |r|rt        |||       |D ]
  }6 ||6        |s}|D ]w  }6|6jp                  rV|sT |t        |6j$                  |6j&                  |6jr                  |6jt                  j~                  |j                               f|si|6jw                         \  }D}E}F}G|6j$                  d	 j                  z    j                   z   j$                  z   k(  r |t        |6jr                  |6jt                  d|6jr                  |6j$                  z   z  |6j&                  dGEz
  z  z   j~                  |j                                |t        d|6jr                  |6j$                  z   z  |6j&                  d|G|Ez
  z  z   |6j$                  |6j&                  d|G|Ez
  z  z   |j~                  |j                                |t        |6jr                  |6jt                  d|6jr                  |6j$                  z   z  |6j&                  dGEz
  z  z   j~                  |j                                |t        d|6jr                  |6j$                  z   z  |6j&                  d|G|Ez
  z  z   |6j$                  |6j&                  d|G|Ez
  z  z   |j~                  |j                               z |S )Nr   rv  Fc                      yNrz   rB   )r   s    rF   <lambda>z Pie.makeWedges.<locals>.<lambda>  s    rH   c                 (    j                  | d      S r  )r   )r   rD   s    rF   r  z Pie.makeWedges.<locals>.<lambda>  s    D..q4 rH   r   )rt  radius1yradius1)rt  rf   r   r   r   )valuelabel)	r   r   r   r   r   r   r   r   r  r-  r.  )r_   rc   r8   r<   r   r   r   r   r   r   r   r   r   r   r   )r   g      ?)Dr  r   r   r   r   r   rS   _seriesCountr   rl  r  rs  rt  r  r  r/  r   r   r   r   ro  r   rk  r   r  ru  r   rR   rj   r   r   r   _ANGLEHIr    r   rb   rc   r_   rh   re   ri   rd   r   r   r   r   WhiterBlackerrP   r   r   r   rc  r   rn   r   r   _aax_aayr   r   r   r&   r   r   rw  r  r'   )HrD   r  
halfAnglesr   a1a2	halfAngler   r5   r   r  r  r  rk  r  rs  rt  r  r  PL_datagSNgg_addr   r  ru  r   r  r   r   r   rj   averageAngleaveAngleRadianscosAAsinAAtheWedgeshadernshadesr   dshshf1shdashscishsha1sha2shcshWedgern   r   r   r   r   r   r/  sinMcosMlXlYlpellXilYislices_popoutrB  r   r  r   r  y1x2y2sH   `                                                                       rF   
makeWedgeszPie.makeWedges  sS
   "
 	)IAgr"z	BK	i(	) __
KDKK*T--%
&&F %%%fV4BjjGjjGjjGjjGggGCjjnGkk#oGffw&Gffw&G||t||W||t||W~~s77/CCww $ 6 64CG"66   L	4IAgr"z8 Qz\2J%%xRUB gBq6D&&Fv "2s{".w"6O,O,bk 6%</B 6%</B" R"b' '(; ;WM`E`b x<&r2w@H$RWb"gNH ",!5!5H#-#9#9H #-#9#9H &0&?&?H#%/%=%=H"(2(C(CH%'1'A'AH$++FuZ%<%<==Q;.4i.?V]]V^^FGnG$%j&>&>$>M!22H< gai0@@,,Qgai0@@ rE5>1D%//D)-H&$W~ '!CH}!SUDL0$T$S.9.&+BGT4QX,34G,GQXYlQl'nG ',BGT4QX&YG,/).2+./+g' (O8"((6''!&0&<&<$[0$[0!#bh!#bh*4\&PZ[a%!*;*;%'%5AF%'%5AF,17Vl242BR67kkmrRTg+.AK  G#AJ#$;;D#'<D#'<D!#gdl!2B!#gdl!2B#-#G#GD"$tDy.C"$tDy.C!(Br#c!##acc+B0:0T0T0:0T0T#V W "!H(,(:(:(. NHAu#{{1~77 !Q$%aC;?;;q>;S;SA 88<A8M8MA 5N "'q1 FA#{{1~44}D04A0E0EF '1&<&<$[0-2s9J|]`O`fj ,g3.2g3&'(=(=&=tzz%IDFF%RUb%bF!"B%)VVt/D/Ddjj.P%PS`%`F!"B!#bh*4\&PZ[a%%'%5AF%'%5AF,17Vl242BR67kkm+.AK '(kkm2bYL	4\ Q
2CDAE!H O$$Z$qss133qvvaff$.$H$H$.$H$HJ K  "#++-KBr"Rssq!6!66

BTVVKKd166!&&affQSSj1A!##tRPRU|BT(2(L(L(2(L(LN O d3qss
#3ACCr"u4Fqss133PTVXY[V[P\K](2(L(L(2(L(LN O d166!&&affQSSj1A!##tRPRU|BT(2(L(L(2(L(LN O d3qss
#3ACCr"u4Fqss133PTVXY[V[P\K](2(L(L(2(L(LN O'O. rH   c                 b    | j                         }| j                         }|rt        ||      S |S rA   )makeBackgroundr  r   )rD   r>  r/   s      rF   drawzPie.draw  s/    !OOU1QZrH   rB   )F)rY   rZ   r[   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   rj  r   r  r  r  r  r  r  rB   rH   rF   rf  rf  	  s    
, 
O2kl
3:no
 "(1VW
 !{O!DKkl	

 d)QR
 $I  5S  T
 'x6fuvw
 )?43J92U)V  ^g  vw  x
 (d;~(NUWfgh
 !1_nop
 !w{!;!L
 ~4HI
 ~4HI
 +>@fg
 #4.L[\]
  ")2xy!
" (  8Q  R#
$  z 29gh%
& "(1fg'
H* O1>8M;^''R[zrH   rf  c                      e Zd ZdZ ee eed       edd       edd       eed       ee	d       ee
d	       eed
       eed       eed       eed       eed            Zd Zd Zd ZddZy)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)rg  
drawLegendlegend1legendNumberFormatlegendNumberOffsetpieAndLegend_colorslegend_nameslegend_datar   r   r   r   c                    t        | d|j                  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      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&                  |z   | j$                  _        | j*                  | j$                  _        d| j$                  _        d| j$                  _        d| j$                  _        d| j$                  _        d| j$                  _        d| j$                  _        d| j$                  _        g d| _        t?        tA        | j                              D ]C  }| j$                  jB                  jE                  | j                  |   | j<                  |   f       E d| j$                  _#        d | j$                  _$        || j$                  _        d!| j$                  _
         |       | _%        d| jJ                  _        d| jJ                  _        d| jJ                  _        d"| jJ                  _#        d | jJ                  _$        | j$                  j                  | jJ                  _        d| _&        d| _'        d| _(        d| _)        d| _*        y )#Nr/  )g333333C@g333334@gfffff2@g.@gffffff@   H   r   zPANTONE 458 CV)spotNamerz  A   r   zPANTONE 288 CVK   )r  densityr  rf   rg   r   r{  rM   g      ?   3   z%.1f%%)LegendgGz@gףp=
W,@gHz&@   right)zAAA:zAA:zA:zBBB:zNR:zHelvetica-Boldr|  r   zHelvetica-Oblique)+r}  r~  rf  r   r   
PCMYKColorr   r  r   rb   r_   rc   r   r  r/  r  !reportlab.graphics.charts.legendsr  r  r   r   r   r   deltaxdeltaydxTextSpacer   r   columnMaximum	alignmentr  r   r   colorNamePairsr   rk   rl   _legend2r   r   r   r   r  )rD   r  r  r   legendOffsetr  r  s          rF   r   zLegendedPie.__init__  s&   VDHHV,IJKT!D!"--v||E
$.r"RCS$T$.s2aDT$U$.r"RCS\^$_$.s2aDT]_$`$.r"RCS\^$_$.s2aDT]_$`$b  "&!9!9!!<A !%!9!9!!<A !%!9!9!!<A !%!9!9!!<A !%!9!9!!<A !%!9!9!!<A "&"'"$"*99 	=xL0"##( %&"!(<s499~& 	dALL''..0H0H0KTM^M^_`Ma/bc	d 0 !#( #& $%!")!4!"$(LL$<$<!rH   c           	         | j                   r"g | j                  _        g | j                  _        t	        t        | j                              D ]n  }| j                  d k(  rV| j                  |   | j                  |   _
        | j                  j                  j                  | j                  |   d f       nc	 | j                  |   | j                  |   _
        | j                  j                  j                  | j                  |   | j                  |   f       | j                  d k7  s| j                  |   }| j                  }||nLt        |t               r||z  }n6t#        |d      r	 ||      }n!t%        dt'        | j                        z        | j                  j                  j                  d |f       q t(        j+                  |       }| j                   r!|j-                  | j                         | j                  j.                  | j0                  z   | j                  _        | j                  j2                  | j                  _        | j                  j4                  | j                  _        | j                  j6                  | j                  _        | j                  j8                  | j                  _        | j                  j:                  | j                  _        |j-                  | j                         |j=                  | j>                  | j@                         |S # t        $ r | j                  |t        | j                        z     | j                  |   _
        | j                  j                  j                  | j                  |t        | j                        z     | j                  |   f       Y w xY w)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asciirf  r  r  r   r   r   r  r  r   r  shiftr   r   )rD   r  ldflNFrG  s        rF   r  zLegendedPie.draw  s   ??*,DLL'+-DMM(s499~& 	@A  D(+/+C+CA+FA(++22D4L4LQ4OQU3VWJ/3/G/G/JDKKN,LL//668P8PQR8SUYUfUfghUi7jk 4'&&q)--;#+C()CS,c(C$%]`efjf}f}`~%~,,33T#J?-	@. HHTN??EE$,,"llnnT-D-DDDMMO"llnnDMMO#'<<#6#6DMM #'<<#6#6DMM #||DMM*.,,*D*DDMM'EE$-- 	  $"4"457 " J/3/G/G#dNfNfJgHg/hDKKN,LL//668P8PQRSVW[WoWoSpQp8qsw  tE  tE  FG  tH  8I  JJs   7A"L**BOOc                 6   | j                   }| j                  rX|| j                  j                  | j                  z   z  }|| j
                  j                  | j
                  j                        z  }| j                  | j                  z   | j                  z   }||fS rA   )r   r  r  r   r   r  _calculateMaxWidthr  r   r   r   )rD   txtys      rF   _getDrawingDimensionsz!LegendedPie._getDrawingDimensions7  sz    ??$,,..!8!888B$--224==3O3OPPB+DOO;2wrH   c                     |s| j                         \  }}t        ||      }|j                  | j                                |S rA   )r)  r   r  r  )rD   drawingr'  r(  s       rF   r  zLegendedPie.demo?  s9    ..0EBrb"oGDIIK rH   rA   )rY   rZ   r[   r   r   rf  r   r   r   r   r   r   r   r   r  r)  r  rB   rH   rF   r  r    s    _C!)2WXt*DE)$5rs)(9uv*>@hi#$?Ffg"#>Evw"82NO#H3PQ!(1LM$X4RS
H;z'RrH   r  )
_getShaded_2radr   r   c            	          e Zd ZdZ ed/i 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      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,      Zd- Zy.)0Wedge3dPropertiesr^   rb   rz   r`   fillColorShadedrm   rk   rl   rq   r   zpadding at bottom of boxrr   ru   rs   rt   ro   rp   r}   ry   r   zpadding at left of boxr|   r   zpadding at right of boxr   zset to True for simple pointersrv   rw   rx   r~   r   zpadding at top of boxr   r   r{   rn   rj   shadingrc   strokeColorShadedrd   r_   r   zset to false to skip displayingc                 &   d| _         d| _        d| _        d x| _        x| _        | _        t        d   | _        t        d   | _        d| _	        t        d   | _
        t        d   | _        t        d   | _        d	| _        dx| _        x| _        | _        d | _        dx| _        x| _        x| _        | _        d
| _        d | _        d| _        d | _        d | _        d| _        d x| _        x| _        x| _        | _        d| _         d| _!        d| _"        y )Nr   g333333?rf   rc   rd   rk   rl   rb   r   rJ   r   r   r   )#r_   r1  r   r2  r0  rb   r"   rc   rd   rj   rk   rl   rm   rn   ro   rp   rq   rx   r   r   r   r   rr   rs   rt   ru   rv   rw   ry   r{   r|   r}   r~   r   r   r   s    rF   r   zWedge3dProperties.__init__t  s#   IMMM!5)-8-.?@&z2&z2'4;<<<(8nooo 6o9PSWSk&$(!$'!"&!%!$]aaa 0a43FIZ '$%!rH   NrB   )rY   rZ   r[   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   rB   rH   rF   r/  r/  G  se     #
 B7#
&}"=#
 !B7#
  b1	#

  b1#
 #84#
 +84NO#
 '{;#
 *-R@#
  ,MrB#
  ,H"=#
  b1#
  b1#
 $N;#
 %^<#
  )2JK!#
" &n"=##
$ *(3LM%#
&  ,I6WX'#
( )B?)#
* )r:+#
, ".b9-#
. ("=/#
0 (1HI1#
2 %Y4VW3#
4 #>r:5#
6 #847#
8 hB/9#
: xR0;#
< #=b9=#
> )B??#
@ ''<"EA#
B #84C#
D y)JKE#
HJ&rH   r/  c                       e Zd Zd Zd Zy)_SL3Dc                     |dk  r
|dz  }|dz  }|| _         || _        ||z   dz  | _        t        ||z
        t        k  | _        y )Nr   rL   r   )lohir,  rR   r  not360)rD   r7  r8  s      rF   r   z_SL3D.__init__  sL    a4#IB#IBrE3;"R%j8+rH   c                 8    d| j                   | j                  fz  S )Nz_SL3D(%.2f,%.2f))r7  r8  r   s    rF   __str__z_SL3D.__str__  s    !TWWTWW$555rH   N)rY   rZ   r[   r   r;  rB   rH   rF   r5  r5    s    ,6rH   r5  c                 (    t        | d   |d          S Nr   r-   r2  s     rF   _keyS3Dr>    s    !QqTN?rH   r<   c            	           e Zd Z ee eed       eed       eed            ZdZdZ	dZ
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)Pie3dzA flattening parameter.r`   zdepth of the pie.zThe view angle.)rg  perspectivedepth_3dangle_3dF      r:   c                 r    | j                   |   j                  xr | j                  |   j                  xs dS r=  )_sl3dr9  r   rj   )rD   r   s     rF   _popoutzPie3d._popout  s.    zz!}##=A(=(=BBrH   c                     | j                   |xr | j                  xs dz   | j                  |      t        t	        | j
                  |   j                              z  z   S r=  )_cx
_xdepth_3drH  r   r-  rG  r,  rD   r   rW  s      rF   CXzPie3d.CX  J    xx.t3!4T\\!_StzzZ[}O`O`IaEb5bbbrH   c                     | j                   |xr | j                  xs dz   | j                  |      t        t	        | j
                  |   j                              z  z   S r=  )_cy
_ydepth_3drH  r   r-  rG  r,  rL  s      rF   CYzPie3d.CY  rN  rH   c                 j    | j                  ||      | j                  t        t        |            z  z   S rA   )rM  _radiusxr   r-  rD   r   orW  s       rF   OXzPie3d.OX  (    wwq|DMM#eAh-777rH   c                 j    | j                  ||      | j                  t        t        |            z  z   S rA   )rR  _radiusyr   r-  rU  s       rF   OYzPie3d.OY  rX  rH   c                 h    | j                   }t        t        ||z
        t        ||z
  dz               S )NrL   )_3dvar   rR   )rD   r  r]  s      rF   rad_distzPie3d.rad_dist  s-    

3qw<AeGCK 011rH   c                 |   t         j                  |        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 x| _        | _        d| _        d	| _        g d
| _        y )Nr   rf   rg   r   r{  rM   r|  i,  r  )g      )@g4@r   g      6@g      @g      2@g      *@)rf  r   r(   r/  r   r   r  rb   r  r  r  azurecrimson
darkvioletrs  rt  r   r   r/  r   s    rF   r   zPie3d.__init__  s    T-.?@#)??A #)#4#4A #);;A #);;A #)<<A #)>>A #)#4#4A &**t|
=	rH   c                    | j                  |      }|| j                  | j                  |   j                        k  r| j                  |d      | j	                  |d      | j                  |d      | j	                  |d      | j                  ||d      | j                  ||d      | j                  ||d      | j                  ||d      g}|j                  |t        ||||d      f       y y )Nr   rf   rc   rb   r_   rh   )	r^  rG  r,  rM  rR  rW  r[  r   r$   )	rD   r   r   r   rc   r_   rb   rdrG  s	            rF   	_fillSidezPie3d._fillSide  s    ]]5!dmmDJJqM--..1dggal!TWWQq\%"4771U1#5%"4771U1#57A HHby]hxyz{| /rH   c                 "     j                   } j                  }t        |dz         x} _        t	        |      } j
                  }t        |      |z   _        t        |      |z   _	         j                   j                  dz  z    _         j                   j                   j                  z
  dz  z    _         j                   j                  z
  x}} j                   r j                   } j"                  r j"                  }| _        d j&                  dz  z
  |z  x _        } j+                         } j,                  }	 j.                  }
 j0                  } j2                  } j4                  } j6                  } j8                  }t;        |      x _        }g x} _        tA               }t         jB                        } jD                  dk(  xr dxs d}|D ]4  }||z  }|||z   }}|}|dkD  r||}}|jG                  tI        ||             6 tK         jL                  |      }|}|d	z   }g }g }g } G  fd
dtN              } jP                  }tS        |      D ]E  }||   }|jT                  s||   } | jV                  x}!}| jX                  x}"}t[        |"|!z
        }#|#t\        k  rOt_        |j`                  |jb                  |jd                        }$t_        |jf                  |jh                  |jd                        xs |$}%|jj                  }& |
|d      }' ||d      }( |
|d      }) ||d      }*|r|jm                  to        |)|*||!|"||%|&|$d
             |!|cxk  r|"k  rn n|}|!|cxk  r|"k  rn n|}tq        |%|$|&d      }+|+js                  |)|*||||d       |+ju                   |||d       |||d             |+js                  |'|(||||d       |+jw                          ||k  r||k\  rd},nty         ||       ||            },|jG                  |,|+f        ||||!|%|&|$        ||||"|%|&|$       |j`                  }$|jf                  xs |$}%|jG                  to        |'|(||!|"||%|&|$d
             |#tz        k\  rt}        |'|(|||%|&|$d      }-nto        |'|(||!|"||%|&|$d
      }-|jG                  |-       ||   }.|j~                  sy|.s}|j                  }/ xj$                  |/z  c_         xj(                  |/z  c_        | j                  }0 |||0d      }1 |||0d      }2t         |.|0|1|2||      }3|jG                  |3       |r@|1|2|0 j$                   j(                   |
|d       ||d      |3j                         d|3_D        | _        | _        H |j                  t               |r|rt        | j                         |D 4cg c]  }4|4d   	 c}4|z   |z   D ]  }5|jm                  |5        |S c c}4w )Nr8   r         ?g      Y@r  r   rf   r   r:   c                   .    e Zd ZW  j                  Zd Zy) Pie3d.draw.<locals>.WedgeLabel3dc                     |d   dk(  r>t        | d      s1| j                  | _        | j                   | j                  z   | _        y y y )Nr   r5   _ody)r  r   rl  rQ  rC   s     rF   rG   z*Pie3d.draw.<locals>.WedgeLabel3d._checkDXY  sB    a5#:"4/$(GG	#'99*t"> 0 rH   N)rY   rZ   r[   rQ  rG   r   s   rF   WedgeLabel3drj    s    J?rH   rm  )rt  rc   r_   rb   rh   rd  )rt  moveTo)rt  r  )rc   r_   rb   rh   )r   r  r"  )Ir   rC  r   r]  r-  rB  r   rK  r   rQ  r   r   rJ  r   r   rP  rs  rt  rT  rA  rZ  r  r  rM  rR  rW  r[  r^  rf  r   r  rG  r   rh  r  r   r5  r   r   r?   rk  r   r   r7  r8  rR   r  r,  rb   r0  r1  rc   r2  r_   r  r    r#   addArclineTo	closePathr   r  r   r   rn   r,  r   r   r   r$  r>  r  r   )6rD   r   	_3d_angler]  a0rB  radiusxradiusyr/  r:  rM  rR  rW  r[  r^  rf  r5   rG  r  lastr]  angle1angle0r   r  rC  rE  r   rm  rk  r   r   slr7  r8  r  rb   rc   r_   cx0cy0cx1cy1rG  re  r  r   ratr,  r   r   r   r1   r   s6   `                                                     rF   r  z
Pie3d.draw  s   MM	!)B,//
5\==b'(*b'(*66$**S.(664;;8#== HHTVVO+'<<4<<<<4<<#&)9)9%)?#?"HH!!#iiWWWWWWWW==NN	 #D	)A
GDOO$^^[(/R41 	/AGA!1T6FFD!tffVVLLvf-.	/ DKK*s]	?: 	? !22q A	(A1IE==(qB%%B%%BRUB({H"5??53H3HWI$U%6%6u7N7Nu}}]jajK++KQq'CQq'CQq'CQq'CeCGRG,7KZc/02 3 <R<"<R<"yU`pqrSwaPAfQ1VA7SwqQ5=VU]BXf-hv.>?B"Q !Ab[C!Ab[C I++8yKHHU3s72b(3V_opr s8|"3Wg(3V_opr !SBw(3V_oprHHX!9D""t''$$ffAc!Ac! d3vfUl[$)/Vc*.--dmmRTUVWXRY`bcdef`g./kkm#&AK !( 'CA	(F 	
7Qt/!"#A1Q4#A%a' 	AEE!H	 $s   Xc                 ^   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   _        |j3                  |       |S r  )r   rf  r   r   r   r   r/  r   r   r_   rj   rd   rn   r   r  rm   r  rb   r  r  r  r  r  r  r   r  r  s      rF   r  z
Pie3d.demoQ  s   CU	%-	!		 		!#$		! ()!u		!$#'		! !'		!!'		!!'!2!2		!!'		!!'		!!'!2!2		!!'!1!1		!!'!2!2		!!"A!"A!"A!"A!"A	b	rH   N)rY   rZ   r[   r   rf  r   r   r   rA  rB  rC  rH  rM  rR  rW  r[  r^  r   rf  r  r  rB   rH   rF   r@  r@    sx    C"82KL/BC/@A
H
 KHHCcc882>}}~rH   r@  c                      t        dd      } t               }d|_        d|_        dg|_        dg|_        d|j                  _        | j                  |       | S )1Make a degenerated pie chart with only one slice.  r     r  r  r  rf   )	r   rf  r   r   r/  r   r   r_   r  rW  r  s     rF   sample0ar  s  sS     	SA	BBDBDdBGBIBIIEE"IHrH   c                      t        dd      } t               }d|_        d|_        d|_        d|_        dg|_        dg|_        d	|j                  _	        | j                  |       | S )
r  r  r  r  r  x   rz  r  r  rf   )r   rf  r   r   r   r   r/  r   r   r_   r  r  s     rF   sample0br    sa     	SA	BBDBDBHBIdBGBIBIIEE"IHrH   c                     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	   _        | j                  |       | S )zFMake a typical pie chart with with one slice treated in a special way.r  r  r  r  r  r  rf   r  r   rg   r  )r   rf  r   r   r/  r   r   r_   rj   rd   rn   r   r  rm   r  r  s     rF   sample1r    s     	SA	BBDBD&BG.BIBIIBIIaL BIIaL$%a5BIIaL #BIIaL#ZZBIIaLEE"IHrH   c                  6   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   _        | j+                  |       | S )z"Make a pie chart with nine slices.r  r  }   rE  )	gףp=
?gl?gS㥻?g~jt?gL7A`?gQ?g~jt?gT㥛 ?g333333?)	12345678Xr  rf   r   rg   r   r{  rM   r|  r     )r   rf  r   r   r/  r   r   r   r   r_   r   	steelbluerb   thistle
cornflowerlightsteelbluer  r  r  tandarkseagreenr  r  s     rF   sample2r    s#    	SA	BBDBD#BG >BIBHBIBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaL#..BIIaL#ZZBIIaL#00BIIaLEE"IHrH   c                     t        dd      } t               }d|_        d|_        g d|_        d|_        d|_        d|j                  _        t        j                  |j                  d   _        t        j                  |j                  d   _        t        j                  |j                  d	   _        | j                  |       | S )
z(Make a pie chart with a very slim slice.r  r  r  rE  )J   rf   rE  r  rf   r   rg   )r   rf  r   r   r/  r   r   r   r_   r   r  rb   r  r  r  r  s     rF   sample3r    s     	SA	BBDBDBGBHBIBII#--BIIaL#^^BIIaL#..BIIaLEE"IHrH   c                  X   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   _        | j#                  |       | S )z/Make a pie chart with several very slim slices.r  r  r  rE  r  rf   rf   rf   rf      r  rf   r   rg   r   r{  rM   )r   rf  r   r   r/  r   r   r   r_   r   r  rb   r  r  r  r  r  r  r  s     rF   sample4r    s     	SA	BBDBD"BGBHBIBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLEE"IHrH   c                  x   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   _        | j'                  |       | S )zMake a pie with side labels.r  r  r  rE  )r  rf   rf   rf   rf   rg   example1example2example3example4example5example6rf   r  r   rg   r   r{  rM   )r   rf  r   r   r/  r   r   r   r   r   r_   r   r  rb   r  r  r  r  r  r  r  s     rF   sample5r    s     	SA	BBDBD BGXBIBMBHBIBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLEE"IHrH   c                     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      }| j)                  |       | j)                  |       | S )z=Illustrates the pie moving to leave space for the left labelsr  r  r   rE  r  r  rf   r  rg   r   r{  rM   )r   rf  r   r   r/  r   r   r   r   r   r_   r   r  rb   r  r  r  r  r  r'   r  )rW  r  r   s      rF   sample6r    s    	SA	B'BDBD"BGXBIBMBHBIBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLQq3AEE"IEE!HHrH   c                     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   _        | j+                  |       | S )zCase with overlapping pointersr  r  r  r  rz  )rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   rf   )r  r  r  r  r  r  example7example8example9	example10	example11	example12	example13	example14	example15	example16	example17	example18	example19	example20	example21	example22	example23	example24	example25	example26	example27	example28rf   r   rg   r   r{  rM   )r   rf  r   r   r   r   r/  r   r   rk  r   r   r_   r   r  rb   r  r  r  r  r  r  r  s     rF   sample7r  9  s     	SA	BBDBDBHBIbBGkBI BMBBO BII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLEE"IHrH   c                     	 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   _        | j)                  |       | S )Case with overlapping labelsr  r  r  r  rz  )rf   rf   rf   rf   rf   r   r  rf   rf   rf   rf   rf   rf   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rf   r   rg   r   r{  rM   )r   rf  r   r   r   r   r/  r   r   rk  r   r_   r   r  rb   r  r  r  r  r  r  r  s     rF   sample8r  [  s     eSA	BBDBDBHBIABG*BI BMBBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLEE"IHrH   c                     	 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   _        | j)                  |       | S )r  r  r  r  r  ))   r  r     r  r   r  r  rE  #   rE  r  r   r  r  r   r  rf   rz  r   rg   r   r{  rM   )r   rf  r   r   r/  r   r   rk  r   r   r   r_   r   r  rb   r  r  r  r  r  r  r  s     rF   sample9r  {  s     _SA	BBDBDNBG*BI BMBBHBIBII#--BIIaL#^^BIIaL#..BIIaL#22BIIaL#..BIIaL#--BIIaLEE"IHrH   __main__)	renderPDFr  samplezsample%sz%s.pdfrA   )rf   )Frh  )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.   rU   rT   r  r  r?   r]   r   r   r   r   r   r   r  r  r  r   
cmp_to_keyr'  r0  r3  r5  rS  r^  r   r`  rf  r  !reportlab.graphics.charts.utils3dr,  r-  r   r   r/  r5  r>  _270rr@  r  r  r  r  r  r  r  r  r  r  r  rY   sysreportlab.graphicsr  argvr  
startswithnameglobalsr+  
drawToFilerB   rH   rF   <module>r     s   	     @ @ @ @ @ @ H # E  E  E  E M 4 5 6 DSd3UY`de Tct$CVZaef h Z)j Z)x<|x 6o GR
.$
)

w
'D8			f	%D"L2 u
 unD# DL O NE&
 E&N6 6
)

w
'c
PC Pf"&.@.26@ D@@ Z
 ,88AB< C5D 7LL*q
Q!')D/#	Who67 rH   