
    BPc Z                        d dl Z d dlZd dlZd dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZ d dlmZ g dg dg d	g d
g ddZ G d dej                  Zedk    r e                                             dS dS )    N)ArgumentTypeError)filename_arg)FilterTextElementCircle	Rectangle)Moveline)inkex_gettext)z#460101z#980101z#d40000z#f44800z#fb8b00z#eec73ez#d9bb7az#fdd99b)z#000442z#0F1781z#252FB7z#3A45E1z#656DDEz#8A91EC)z#222222z#444444z#666666z#888888z#aaaaaaz#ccccccz#eeeeee)z#0000FFz#FF0000z#00FF00z#CF9100z#FF00FFz#00FFFF)z#f8d753z#5c9746z#3e75a7z#7a653ez#e1662az#74796fz#c4384fz#fff8a3z#a9cc8fz#b2c8d9z#bea37az#f3aa79z#b5b5a9z#e6a5a5)redbluegraycontrastsapc                   x    e Zd ZdZdZed             Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd ZddZd ZddZd ZdS )	NiceChartz
    Inkscape extension that can draw pie charts and bar charts
    (stacked, single, horizontally or vertically)
    with optional drop shadow, from a csv file or from pasted text
    Tc                 Z    t          d                              | j        j                  S )zLayer title/labelzChart-Layer: {})_formatoptionswhat)selfs    +/usr/share/inkscape/extensions/nicechart.pycontainer_labelzNiceChart.container_labeln   s&     "##**4<+<===    c                 h   |                     d           |                     dd           |                     dddd	           |                     d
d|                     d          | j        d           |                     ddt          j        dd           |                     ddt
          d           |                     dddd	           |                     dddd	           |                     ddd d!	           |                     d"d#$           |                     d%t          j        dd&           |                     d'd(t          d)d*           |                     d+d,t          d-d.           |                     d/t          j        dd0           |                     d1d2t          j        dd3           |                     d4d5t          d6d7           |                     d8d9t          d:d;           |                     d<d=t          d:d>           |                     d?d@t          dAdB           |                     dCt          dDE           |                     dFdGt          dAdH           |                     dIt          dJdK           |                     dLt          j        ddM           |                     dNdOdPdQ	           |                     dRdSt          d6dT           |                     dUdVdWdX	           |                     dYdZt          j        dd[           d S )\Nz--tabz
--encodingzutf-8)defaultz-wz--whatz%apples:3,bananas:5,oranges:10,pears:4zChart Values)r   helpz-tz--typerenderz
Chart Type)typer   r   z-bz--blurFz	Blur Typez-fz
--filenamezName of File)r    r   z-iz--input_typefilez-dz--delimiter;	delimiterz-cz--colorsr   zcolor-schemez--colors_overridezcolor-scheme-override)r   z--reverse_colorszreverse color-schemez-kz	--col_keyr   zcolumn that contains the keysz-vz	--col_val   zcolumn that contains the valuesz
--headingsz?first line of the CSV file consists of headings for the columnsz-rz--rotatezDraw barchart horizontallyz-Wz--bar-width
   zwidth of barsz-pz--pie-radiusd   zradius of pie-chartsz-Hz--bar-heightzheight of barsz-Oz--bar-offset   zdistance between barsz--stroke-widthg      ?)r    r   z-oz--text-offsetz%distance between bar and descriptionsz--heading-offset2   z&distance between chart and chart titlez--segment-overlapz=Remove aliasing effects by letting pie chart segments overlapz-Fz--fontz
sans-serifzfont of descriptionz-Sz--font-sizezfont size of descriptionz-Cz--font-color#000000zfont color of descriptionz-Vz--show_valueszShow values in chart)add_argument
arg_method
render_barinkexBooleanr   intfloat)r   parss     r   add_argumentszNiceChart.add_argumentss   s6   '""",888;	 	 	
 	
 	
 	**O 	 	
 	
 	
 	(K 	 	
 	
 	
 	$<nUUU$\RRR$sMMM$
INSSS-4KLLL'	 	 	
 	
 	
 	+C9X 	 	
 	
 	
 	2 	 	
 	
 	
 	R	 	 	
 	
 	
 	- 	 	
 	
 	
 	-c2O 	 	
 	
 	
 	.sC>T 	 	
 	
 	
 	.sC>N 	 	
 	
 	
 	.sA<S 	 	
 	
 	
 	*DDD8 	 	
 	
 	
 	9	 	 	
 	
 	
 	P	 	 	
 	
 	
 	(L7L 	 	
 	
 	
 	-c2<V 	 	
 	
 	
 	.):U 	 	
 	
 	
 	' 	 	
 	
 	
 	
 	
r   c                   	 | j         j        | j         j        d 	| j         j        dk    r| j         j        !t          j        t          d                    t          | j         j        d          5 }t          j
        || j         j                  }}| j         j        rt          |          }|         }	fd|D             }|ft          t          |           z   cddd           S # 1 swxY w Y   nT| j         j        dk    rDt          d	 | j         j                            d
          D              \  }}d|	fd|D             fS t          j        t          d                    )zProcess the datac                 r    t          |           } | dk     r!t          j        t          d                    | S )z'Confirm the values from files or directr   z,Negative values are currently not supported!)r0   r-   AbortExtensionr   )vals    r   process_valuez)NiceChart.get_data.<locals>.process_value   s>    **CQww*DEE   Jr   r!   NzFilename not specified!r)r#   c                 B    g | ]}|          |                   fS  r:   ).0r
   col_keycol_valr7   s     r   
<listcomp>z&NiceChart.get_data.<locals>.<listcomp>   s=       FJT']MM$w-$@$@A  r   direct_inputc                 :    g | ]}|                     d d          S ):r$   )split)r;   ls     r   r>   z&NiceChart.get_data.<locals>.<listcomp>   s$    HHHa!''#q//HHHr   ,zDirect Inputc                 &    g | ]} |          S r:   r:   )r;   r6   r7   s     r   r>   z&NiceChart.get_data.<locals>.<listcomp>   s#    *P*P*P#==+=+=*P*P*Pr   zUnknown input type)r   r<   r=   
input_typefilenamer-   r5   r   opencsvreaderr#   headingsnexttuplezipr   rB   )
r   fhlrJ   titleheadervalueskeysr<   r=   r7   s
          @@@r   get_datazNiceChart.get_data   s   ,&,&	 	 	 <"f,,|$,*1-F+G+GHHH dl+S11 6SC4<3IJJJ<( ,!&\\F"7OE     NT   x%V"5"556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 \$66 HH4<+<+B+B3+G+GHHHNT6 #D*P*P*P*P*P*P*PQQ"1%9#:#:;;;s   6A/C22C69C6c                 $   | j         j        rr| j        j        }|                    t          dddd                    }|                    dd           t          j        |	                    d          	          S t          j                    S )
z(Add blur to the svg and return if needed3z-0.5)heightwidthxyfeGaussianBlurz1.1)stdDeviation   )as_url)filter)
r   blursvgdefsaddr   add_primitiver-   Styleget_id)r   rb   filts      r   get_blurzNiceChart.get_blur  s    < 	=8=D88F#SFfMMMNND/eDDD;dkkk&;&;<<<<{}}r   c                 J   t          | d          s| j        j        r| j        j                                        }n| j        j        }|d                                         r9t                              |                                t          d                   }n$t          j
        d|          }|st          d         }| j        j        r|                                 || _        d| _        | j        | j                 }| j        dz   t          | j                  z  | _        |S )zGet the next available color_colorsr   r   z(#[0-9a-fA-F]{6})r$   )hasattrr   colors_overridestripcolorsisalphaCOLOUR_TABLEgetlowerrefindallreverse_colorsreverserj   _color_indexlen)r   rn   colors      r   	get_colorzNiceChart.get_color  s   tY'' 	"|+ -5;;==,ay  "" 1%))&,,..,u:MNN $7@@ 1)%0F|* !   !DL !DT./!.2c$,6G6GGr   c              #     K   |                                  \  | _        }}|s!t          j        t	          d                    | j                            | j                            d                    | _        | j                            | j        j	        d                   | _
        t          | j        j                  dz  | _        |                                 | _        | j                            ||          D ]}|V  dS )z1Generates a nice looking chart into SVG document.zNo data to render into a chart.rX   rW      N)rT   rP   r-   r5   r   ra   unittouurq   rX   attribrW   r0   r   	font_sizefontoffrh   r`   r    r   rS   rR   elems       r   generatezNiceChart.generate*  s       &*]]__"T6 	M&q)J'K'KLLL X&&tx||G'<'<==
h''(ABBT\344q8 MMOO	 L%%dF33 	 	DJJJJ	 	r   c                     | j         j        r| j        rz|                     | j        dd          }|                    dt          | j        dz  | j         j        z                        |                    dt          |                     |S dS )zDraw an optional header text   endanchorrZ   r]   rY   N)r   rK   rP   	draw_textsetstrrW   heading_offset)r   	heading_xheadingtexts      r   draw_headerzNiceChart.draw_header>  s    <  	TZ 	..Qu.EEKOOCT[1_t|7R%R!S!STTTOOCY000tr   c           	   #     K   | j         j        }| j         j        }| j         j        }t	          t          |          dgz             }t          |          D ]\  }}|||z   z  }	||z  |z  }
| j        dz  |	z   }| j        dz  t          |
          z
  }|}t          |
          }| j         j
        r||||f\  }}}}||z  }|                     ||||          D ]}|V  |r/|                     ||         d          }| j         j
        s|                    dd           |                    ddt          | j        dz  | j         j        z             z              |                    d	t          | j        dz  |	z   |dz  z   | j        z                        nt|                    d	t          | j        dz  |	z   |dz  z   | j        z                        |                    dt          | j        dz  | j         j        z
                       |V  | j         j        r:|                     t          |                    }| j         j
        s|                    dd           |                    ddt          | j        dz  |z   | j         j        z
            z              |                    d	t          | j        dz  |	z   |dz  z   | j        z                        nw|                    d	t          | j        dz  |	z   |dz  z   | j        z                        |                    dt          | j        dz  |z   | j         j        z                        |V  |                     | j        dz            V  d
S )zDraw bar chart        r]   r   r   	transformzrotate(-90)rY   -rZ   N)r   
bar_height	bar_width
bar_offsetmaxlist	enumeraterX   rW   r/   rotatedraw_rectangler   r   r   text_offsetr   show_valuesr   )r   rS   rR   r   r   r   	value_maxcntvalueoffset	bar_valuerY   rZ   rX   rW   r   textvtexts                     r   r,   zNiceChart.render_barG  s     \,
L*	\,
 Vu,--	 $F++ :	 :	JCI
23F*j8I 
Q'Aa#i..0AE^^F|" &'FE&9#1eVU
++Aq%@@  



  ~~d3i~>>|* SHH[-888HHS#DK!Odl>V,V(W(W"WXXXHHSa&!89q=!H4<!WXX    HHSa&!89q=!H4<!WXX   HHS#dkAo8P&P"Q"QRRR


|' s5zz22|* IIk=999IIc$+/E"9DL<T"TUUU  
 IISa&!89q=!H4<!WXX    IISa&!89q=!H4<!WXX   IISq5!84<;S!STT   tzA~.......r   c              #     K   | j         r]t          t          |dz             t          |dz             t          |          t          |                    }| j         |_        |V  t          t          |          t          |          t          |          t          |                    }|                    dd|                                 z              |V  dS )z)Draw a rectangle bar with optional shadowr$   rY   rZ   rX   rW   stylefill:N)r`   r   r   r   r   rz   )r   rY   rZ   rX   rW   shadowrects          r   r   zNiceChart.draw_rectangle  s      9 	a!e**AE

#e**S[[  F  9FLLLL3q66SVV3u::c&kkRRR'DNN$4$44555




r   r   startc                     t          di |}| j        j        | j        j        t	          | j        j        |z             dz   ddddd||d
|_        t	          |          |_        |S )zDraw a textual labelpxnormalzBitstream Charter)
fillzfont-familyz	font-sizez
font-stylezfont-variantzfont-weightzfont-stretchz-inkscape-font-specificationz
text-alignztext-anchorr:   )r   r   
font_colorfontr   r   r   r   )r   r   add_sizer   kwargsr   s         r   r   zNiceChart.draw_text  sv    %%f%%L+<,T\3h>??$F"$#$,? !
 
 YY
r   c              #   F   K   |                      ||d          D ]}|V  dS )z&Draw a pie chart, with absolute valuesTN)
render_pier   s       r   render_pie_abszNiceChart.render_pie_abs  s<       OOD&$77 	 	DJJJJ	 	r   Fc           	   #   <  K   | j         j        }d}t          | j                  dz  }t          | j                  dz  }| j        rtt          t          |          t          |                    }|                    dt          |                     | j        t          j
        d          z   |_        |V  t          t          |          t          |                    }	|	                    dt          |                     |	                    dd           |	V  	 t          |          }
n# t          $ r d}
Y nw xY w|rd	}
d}t          |          D ]\  }}d
|
z  t          |          z  }|}||z   }| j         j        r&|t!          |          dz
  k    r|dz  }|dk    r|dz  }t          j                            ||g||||          }|                    dd|                                 z   dz              |dz  |z   }|rt          j                    }t)          | j        dz  |t+          j        |          z  z   | j        dz  |t+          j        |          z  z             t1          | j         j        dz
  t+          j        |          z  | j         j        dz
  t+          j        |          z            g|_        d| j         j        | j         j        dd|_        |V  ||         }| j         j        r,|d                    t          |          d|                   z  }t+          j        |          dk    rdnd}|                     ||          }|| j         j        z   }|                    d| j        dz  |t+          j        |          z  z              |                    d| j        dz  |t+          j        |          z  z   | j         z              |V  ||z   }|dz   dz  }|V  | !                    | j        dz  |z
            V  dS )zDraw pie chartr   r]   )cxcyr8   r)   )r   r   zstroke:#ececec;fill:#f9f9f9r&   gz !@r$   g
ףp=
?)r   r   r   z;stroke:none;fill-opacity:1nonebuttr   strokezstroke-widthzstroke-linecapz ({}{})) %r   r   r   rY   rZ      N)"r   
pie_radiusr0   rX   rW   r`   r   r   r   r-   re   r   sum
ValueErrorr   segment_overlaprx   PathElementarcrz   r	   mathcossinr
   r   pathr   stroke_widthr   r   r   r   r   )r   rS   rR   pie_absr   ry   rY   rZ   r   
backgroundvaluesumr   r   r   angler   r   piesliceangr   labelr   r   offs                           r   r   zNiceChart.render_pie  sP     \,
 $*!$+" 9 	s1vv#a&&111FJJsC
OO,,,9u{	'B'B'BBFLLLL s1vv#a&&111
sC
OO,,,w =>>>	6{{HH 	 	 	HHH	  	H  $F++ @	 @	JC!X-e<EE5.C |+ #f++/))4KC!88E
 (,,A
Je -  H LL4>>#3#336SS   !)f$C   (**a:+EEqJ#,FF  1A5#F1A5#F 		 #"l5$(L$=&,	 
 


S	<+ NY--c%jj)G:LMMME %)HSMMA$5$55~~eF~;; 4<#;;tzA~tx}}1DDEEEt{Q#2EETUUU


 e^FQY!OE NNNNtzA~
:;;;;;;;s   #D3 3EEc              #   2	  K   d}	 t          |          }n# t          $ r d}Y nw xY wd}| j        j        }| j        j        }| j        dz  }| j        dz  }	| j        r| j        j        r||}}|	}
nt          |	| j        j        z
            }
t          t          |          t          |
          t          |          t          |                    }| j        |_        |V  t          |          D ]~\  }}| j        j        |z  t          |          z  }t                      }| j        j        s|                    dt          | j        dz                       |                    dt          | j        dz  |z
  |z
                       |                    dt          | j        j                             |                    dt          |                     n|                    dt          | j        dz  |z                        |                    dt          | j        dz                       |                    dt          | j        j                             |                    dt          |                     |                    d	d
|                                 z              |r| j        j        s{| j        | j        j        z   dz  }|	|z
  |dz  z
  }| j        j        dz  | j        j        z   }d}| j        dz  | j        j        z   | j        j        z   dz   }|	|z
  | j        z   |dz  z
  }n||z   |dz  z   }|	| j        j        dz  z   }d}| j        j        dz  | j        j        |z  z   | j        j        z   }||z   |dz  z   | j        z
  }|	| j        j        z   | j        j        |dz   z  z   | j        j        z   }t'          j                    }t+          ||          t-          ||          g|_        d| j        j        | j        j        dd|_        |V  |                     ||         t          |          t          |                    V  ||z   }|dz   dz  }|V  |                     | j        dz  |z   |z             V  dS )zDraw stacked bar chartr   r   r]   r   rY   rZ   rX   rW   r   r   r$   r   r   r   )rY   rZ   r   N)r   r   r   r   r   rX   rW   r`   r   r   r   r   r   r0   r   rz   r   r   r   r-   r   r	   r
   r   r   r   r   r   )r   rS   rR   ry   r   r   rX   rW   rY   rZ   shyr   r   r   normedvaluer   x1y1x2y2txttytr   s                          r   render_stbarzNiceChart.render_stbar  s      	6{{HH 	 	 	HHH	 &(JNK!O9 	|" 7 &v!dl5566 a&&c((%jj6{{	  F  9FLLLL $F++ F	 F	JC  <2X=uMK ;;D <& 	4c$*q.11222c$+/F":["HIIJJJ#dl&<"="=>>>3{#3#34444c$*q.6"9::;;;c$+/223333t|'=#>#>???#k"2"2333HHWg(8(88999  'H|* *t|'==BBV{Q7B/!3dl6NNBB
Q,01,23   f*t|3{QGCCVkAo5BT\3a77BB.2<1C79,23 
 f*{Q6EC,01<1S1W=? ,23  (**!"b\\4B<<8	""l5$(L$=&,	 
 


nnT#Y#c((c#hhnGGGGG k)FQY!OE JJJJtzA~6DEEEEEEEs    %%N)r   r   )F)__name__
__module____qualname____doc__container_layerpropertyr   r2   rT   rh   rz   r   r   r,   r   r   r   r   r   r:   r   r   r   r   e   s         O> > X>e
 e
 e
N&< &< &<P	 	 	  :  (  F/ F/ F/P     $  e< e< e< e<NoF oF oF oF oFr   r   __main__)rs   rI   r   argparser   r-   inkex.utilsr   r   r   r   r   inkex.pathsr	   r
   inkex.localizationr   r   rp   GenerateExtensionr   r   runr:   r   r   <module>r      s_  ^ 
			 



  & & & & & &  $ $ $ $ $ $ 8 8 8 8 8 8 8 8 8 8 8 8 " " " " " " " " 1 1 1 1 1 1	 	 	 ONN   SRR  -& &ReF eF eF eF eF' eF eF eFP zIKKOO r   