HEX
Server: Apache
System: Linux opal14.opalstack.com 3.10.0-1160.108.1.el7.x86_64 #1 SMP Thu Jan 25 16:17:31 UTC 2024 x86_64
User: curbgloabal_opal (1234)
PHP: 8.1.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/share/inkscape/extensions/gcodetools.pyo
�
��Yc@s�dZdZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZdee
�kr�d�e
_nd�Zee_dd�Zd	�Zejd
e_dZdZdZdZd
Ziaidd6dd6ZdZ d
Z!i
ej"idd6dd6dd6dd6�d6iej"idd6dd6dd6dd6�d6d 6iej"idd6dd6d!d6dd6�d"6ej"id#d6dd6d!d6dd6�d$6ej"id%d6dd6d!d6dd6�d&6ej"id'd6dd6d!d6d(d6�d)6d*6iej"id+d6dd6d!d6dd6�d"6ej"id,d6dd6d!d6dd6�d$6ej"id-d6dd6d!d6dd6�d&6ej"id.d6dd6d!d6d/d6�d)6d06iej"id+d6dd6d!d6d(d6�d"6ej"id,d6dd6d!d6d(d6�d$6ej"id-d6dd6d!d6d(d6�d&6ej"id.d6dd6d!d6d/d6�d)6d16iej"id2d6dd6d!d6dd6�d"6ej"id3d6dd6d!d6dd6�d$6ej"id4d6dd6d!d6dd6�d&6ej"id5d6dd6d!d6d/d6�d)6d66iej"id7d6dd6d!d6dd6�d"6ej"id8d6dd6d!d6dd6�d$6ej"id9d6dd6d!d6dd6�d&6ej"id:d6dd6d!d6d/d6�d)6d;6iej"id<d6dd6d!d6d=d6�d"6ej"id>d6dd6d!d6d=d6�d$6ej"id?d6dd6d!d6d=d6�d&6ej"id:d6dd6d!d6d/d6�d)6d@6iej"id<d6dd6d!d6d=d6�d"6ej"id>d6dd6d!d6d=d6�d$6ej"id?d6dd6d!d6d=d6�d&6ej"id:d6dd6d!d6d/d6�d)6dA6iej"idBd6dd6d!d6d=d6�d"6ej"idCd6dd6d!d6d=d6�d$6ej"idDd6dd6d!d6d=d6�d&6ej"id:d6dd6d!d6d/d6�d)6dE6ej"idFd6dGd6dd6�dH6ej"idFd6dGd6dd6�dI6ej"idFd6dFd6�dJ6Z#e$dK�Z%dL�Z&ddM�Z'e(dN�Z)dOdP�Z*dQ�Z+dR�Z,dS�Z-ddTgdUdV�Z.dWdUdX�Z/ddTgdWdUdY�Z0ddTgdUdZ�Z1d[d\�Z2d]�Z3d^�Z4d_�Z5d`da�Z6db�Z7dcdd�Z8de�Z9df�Z:dg�Z;dh�Z<d[dUdi�Z=d[dUdj�Z>dUdk�Z?dl�Z@dm�ZAeBdn�ZCdo�ZDdp�ZEdq�ZFdr�ZGds�ZHdt�ZIdu�ZJdv�ZKdw�ZLdUdx�ZMdy�ZNdz�ZOd{�ZPd|�ZQd}�ZRd~�ZSd�ZTd��ZUd��ZVd��ZWd��ZXd��ZYd��ZZd��Z[d��Z\d��Z]d��Z^e$d��Z_d��Z`d��Zad��Zbd��Zcd��Zdd��Zed��Zfd��Zgd[d��Zhd��Zid�dTgd��Zjd��Zkd��Zld��Zmd��Znd��Zod��Zpd��Zqd��Zrd��Zsd��Ztd��Zud��Zvd��Zwd��Zxd��Zyd��Zzd��Z{d��Z|eBeBdeBd��Z}d�dd�d�eBeBeBd��Z~d�d�eBd�eBd�d�eBeBeBeBd��Ze(d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��a�d�fd���YZ�d�fd���YZ�d�fd���YZ�d�fd���YZ�d��Z�dd��Z�d��Z�d�d��Z�d�fd���YZ�d�fd���YZ�d�fd���YZ�d�e
j�fd���YZ�e��a�t�j��dS(�s�
Comments starting "#LT" or "#CLT" are by Chris Lusby Taylor who rewrote the engraving function in 2011.
History of CLT changes to engraving and other functions it uses:
9 May 2011 Changed test of tool diameter to square it
10 May Note that there are many unused functions, including:
	  bound_to_bound_distance, csp_curvature_radius_at_t,
        csp_special_points, csplength, rebuild_csp, csp_slope,
        csp_simple_bound_to_point_distance, csp_bound_to_point_distance,
        bez_at_t, bez_to_point_distance, bez_normalized_slope, matrix_mul, transpose
       Fixed csp_point_inside_bound() to work if x outside bounds
20 May Now encoding the bisectors of angles.
23 May Using r/cos(a) instead of normalised normals for bisectors of angles.
23 May Note that Z values generated for engraving are in pixels, not mm.
       Removed the biarc curves - straight lines are better.
24 May Changed Bezier slope calculation to be less sensitive to tiny differences in points.
       Added use of self.options.engraving_newton_iterations to control accuracy
25 May Big restructure and new recursive function.
	   Changed the way I treat corners - I now find if the centre of a proposed circle is
                within the area bounded by the line being tested and the two angle bisectors at
		    its ends. See get_radius_to_line().
29 May Eliminating redundant points. If A,B,C colinear, drop B
30 May Eliminating redundant lines in divided Beziers. Changed subdivision of lines
  7Jun Try to show engraving in 3D
 8 Jun Displaying in stereo 3D.
       Fixed a bug in bisect - it could go wrong due to rounding errors if
			1+x1.x2+y1.y2<0 which should never happen. BTW, I spotted a non-normalised normal
			returned by csp_normalized_normal. Need to check for that.
 9 Jun Corrected spelling of 'definition' but still match previous 'defention' and 	  'defenition' if found in file
	 Changed get_tool to find 1.6.04 tools or new tools with corrected spelling
10 Jun Put 3D into a separate layer called 3D, created unless it already exists
       Changed csp_normalized_slope to reject lines shorter than 1e-9.
10 Jun Changed all dimensions seen by user to be mm/inch, not pixels. This includes
	  tool diameter, maximum engraving distance, tool shape and all Z values.
12 Jun ver 208 Now scales correctly if orientation points moved or stretched.
12 Jun ver 209. Now detect if engraving toolshape not a function of radius
                Graphics now indicate Gcode toolpath, limited by min(tool diameter/2,max-dist)
TODO Change line division to be recursive, depending on what line is touched. See line_divide


engraving() functions (c) 2011 Chris Lusby Taylor, clusbytaylor@enterprise.net
Copyright (C) 2009 Nick Drobchenko, nick@cnc-club.ru
based on gcode.py (C) 2007 hugomatic... 
based on addnodes.py (C) 2005,2007 Aaron Spike, aaron@ekips.org
based on dots.py (C) 2005 Aaron Spike, aaron@ekips.org
based on interp.py (C) 2005 Aaron Spike, aaron@ekips.org
based on bezmisc.py (C) 2005 Aaron Spike, aaron@ekips.org
based on cubicsuperpath.py (C) 2005 Aaron Spike, aaron@ekips.org

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
s1.7i����NterrormsgcCs#tjjt|�djd��S(Ns
sUTF-8(tsyststderrtwritetunicodetencode(tmsg((s,/usr/share/inkscape/extensions/gcodetools.pyt<lambda>]scCs�|\\}}\}}\}}\}}	tj||f||f||f||	ff�\}
}}}
}}}}d|
|dd|||}d||dd|
||}||ko�dknr�d|
|d|}d||d|
}||kodknr�d|
}d|}||koHdknr�td|
|||||
|||f	�t||f||f||f||	ff�d\}}q�q�n||fS(NiiiisTSlope error x = %s*t^3+%s*t^2+%s*t+%s, y = %s*t^3+%s*t^2+%s*t+%s,  t = %s, dx==dy==0i(ii(tbezmisctbezierparameterizetprint_(t.0tttbx0tby0tbx1tby1tbx2tby2tbx3tby3taxtaytbxtbytcxtcytx0ty0tdxtdy((s,/usr/share/inkscape/extensions/gcodetools.pytbezierslopeatt`s'K""

).icCs4tjtj|�tj�}tj||||�S(N(tretcompiletescapetItsub(tselftoldtnewtcounttpattern((s,/usr/share/inkscape/extensions/gcodetools.pytireplacesscCs|t�kp|t�kS(N(tlocalstglobals(tvariable((s,/usr/share/inkscape/extensions/gcodetools.pytissetwsig-C��6?gH�����z>g�h㈵��>s�%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the output dir.)
M3
(Header end.)
theaders�
(Footer)
M5
G00 X0.0000 Y0.0000
M2
(Using default footer. To add your own footer create file "footer" in the output dir.)
(end)
%tfooteri
s#0072a7tstroketnonetfillt1sstroke-widthsurl(#InOutPathMarker)s
marker-midtin_out_path_styles#88fsurl(#Arrow2Mend)s
marker-ends
main curvet
loft_stylesurl(#DrawCurveMarker)tbiarc0s#8f8tbiarc1s#f88tlines#777s0.1tareatbiarc_styles#33as#3a3s#a33s#222s0.3tbiarc_style_darktbiarc_style_dark_areas#880s#808s#088s#999t
biarc_style_is#dd5s#d5ds#5dds#aaatbiarc_style_dark_is#07fs.4s#0f7s#f44tbiarc_style_lathe_feedsbiarc_style_lathe_passing feeds#7f0s#f70s#744sbiarc_style_lathe_fine feeds#ff0000s#ffff00s
area artefactsarea artefact arrowt
dxf_pointscCs�|rtjdd|�}nd}|ddkrA|d }nxQ|jd�D]@}|dkr�|dtjdd|�d7}qQ|d7}qQW|S(	Ns[\n\r]+t.ti����s
t(s[\(\)\\\n\r]s)
(R R$tsplit(tstreplace_new_linetresta((s,/usr/share/inkscape/extensions/gcodetools.pytgcode_comment_str�s
$cCsDg|D]9}g|D]&}gtd�D]
}|^q'^q^qS(Ni(trange(R9tsublinetpointtk((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_from_polyline�scCs�g}x�|D]�}t|�dkr
|j|dg�x�t||d�D]�\}}t|d|d�|kr�t|d|d�|kr�t|d|d�|kr�|d|ddd<qM|dj|�qMWq
q
W|S(Niiii����(tlentappendtziptpoint_to_point_d2(tcspt	toleranceRHtsubpathtsp1tsp2((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_remove_zerro_segments�s
 Wc#Cs^|\}}d}x;|D]3}x*tdt|��D]}||d||}}	t||	�\}
}}}
}}}}|
dkr�|dkr�|dkr�||kr�t||	gg�}|dd|ko�|ddknrH|Sq5xRt||g||dg||	�D]+}|dks7|dkr�t||	|�\}}||kr_|S|dkrDt||	d�d}|dkr�t||	d�d}nx/tdt|�d�D]}||t|�dkr�q�n||d|t|�|||t|�}}t||	�\}}}}}}} }!|dkrx|dkrx|dkrx| |krxq�nt||d�d}"|"dkr�t||d�d}"n||"dkr�|d7}Pq�q�WqDqt||	|�\}}||kr|S||krd|
|dd|||dkr|d7}qqWq5WqW|ddkS(Niiiig�G�z��?g{�G�z�?i(RKRPtcsp_parameterizetcsp_true_boundstcsp_line_intersectiontcsp_at_ttcsp_normalized_slope(#tpRTton_the_pathtxtytray_intersections_countRVtiRWRXRRRRRRRRtbRtx1ty1tst_dtjtsp11tsp22tax1tay1RRtcx1tcy1tdx1tdy1ten_d((s,/usr/share/inkscape/extensions/gcodetools.pytpoint_inside_cspsN
'0,, 5'0
4g���ư>cCs�x�tt|��D]�}t||dd||dd�|dkr�||dd||dd<||cgtd�D]}||dd^q�g7<q||dd||ddkr||dd||dd<qqW|S(Niii����ii(RKRPRS(RTRURdRi((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_close_all_subpaths?s1<$&cCs�d\}}}}x�|D]�}x�|D]�}x�|D]�}|dkrXt||d�n|d}|dkr�t||d�n|d}|dkr�t||d�n|d}|dkr�t||d�n|d}q3Wq&WqW||||fS(Nii(NNNN(tNonetmintmax(RTtminxtminytmaxxtmaxyRVtspR_((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_simple_boundIs


)))5cCs|d|d S(Nii((RWRX((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_segment_to_bezUscCs�d}d}t||�}t||�}x�td�D]~}xutd�D]g}	t||d||||	d||	�\}
}t||
�}t||�}td||�qJWq7W||fS(Ng}Ô%�I�Tiiitbound_to_bound(R~RKtline_to_line_min_max_distance_2RvRwR
(RWRXtsp3tsp4tmin_disttmax_disttpoints1tpoints2RdRitmin_tmax_((s,/usr/share/inkscape/extensions/gcodetools.pytbound_to_bound_distanceYs3g}Ô%�I�Tg{�G�z�?c
Cs�ddddg}x�tt|��D]�}x�tdt||��D]�}t|||d||||dddd�}|d|dkr�|d|||dgS|d|dkrE|d|||dg}qEqEWq%W|S(Ng}Ô%�I�Tiit
sample_pointsiRUg{�G�z�?(RKRPtcsp_seg_to_point_distance(RTR_tdist_boundsRUR�RiRdtd((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_to_point_distancefs 2%icCs�t||�\}}}}}	}
}}||d||d}}|dkrYd}nt|d|ddd|d|ddddg|d|ddd|d|ddddg�}
x*t|�D]}t|�|d}d}x|dks&t|�dkrz|dkrz|d|d}}|||||	||d||d|||	|||||
||d||d|||
}d	||d||||||	||d||d|||	dd	||d||||||
||d||d|||
d}|dkrl|||}nP|d7}q�Wd|ko�dknr�t|||�}|d|dd|d|dd}||
dkr�||g}
q�q�q�W|
S(
Niiigg�?g���ư>iii(RZRvRKtfloattabsR](RWRXR_R�RURRRRRRRRR�RNRRdtftt2tt3tdftp1td1((s,/usr/share/inkscape/extensions/gcodetools.pyR�ss,'	s-r�*c,Cs�t|||d||�}|dg7}|d|dkrA|St|||d||�}|d|dkr�|dg}|d|dkr�|Snt|||d||�}|d|dkr�|dd|dg}|d|dkr�|Snt|||d||�}|d|dkr]|dd|dg}|d|dkr]|Sn|d8}|dkr|d}nt||�\}	}
}}}
}}}t||�\}}}}}}}}x�t|�D]�}x�t|�D]�}t|d�|dt|�|d}}||||||||||f\}}}} d}!ddgddgddggd}"}#}$|	||||
|||| ||||||
|||||||| |||||}%}&x#|!dks+t|$|'�|kr|!dkrd|	|d|||
}(d|
|d|||})d||d|||}*d||d|||}+d|(|%d|)|&|"d<d	|*|%d|+|&|"d<dd
|	|d||%d|(|(dd
|
|d||&d|)|)|#dd<d	|(|*d|)|+|#dd<d	|*|(d|+|)|#dd<d	d
||d||%d|*|*dd
||d||&d|+|+|#dd<t|#�}#|#dkr||#dd|"d|#dd|"d8}||#dd|"d|#dd|"d8}||||||||||f\}}}} |	||||
|||| ||||||
|||||||| |||||}%}&|$}'|%|%|&|&}$nP|!d7}!q�W|$|dkr�d|koGdknr�d|kocdknr�|$||g}|d|dkr�|Sq�q�Wq�W|S(Nigig�?ig}Ô%�I�Tiii����i(R�RZRKR�R�tinv_2x2Ru(,RWRXR�R�R�R�RUtdistR�RlRmRRRnRoRpRqtax2tay2RRtcx2tcy2tdx2tdy2RNRitt1R�tt12tt13tt22tt23RdtF1tF2tFRaRbtFlasttf1xtf1ytf2xtf2y((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_seg_to_csp_seg_distance�sr


	''-6,u1Z""Z..6uHc
Cs�dddddddg}x�tt|��D]�}x�tdt||��D]�}xbtt|��D]N}xEtdt||��D]*}t|||d||||||d|||�}	|	d|dkr�q�n|	d|dkr|	d||d||dgSt|||d||||||d||||d|�}	|	d|dkr�|	d|||	d|||	dg}n|d|dkr�|Sq�WqgW|d|dkrN|SqNWq.W|S(Ng}Ô%�I�TiiRUi(RKRPt/csp_seg_bound_to_csp_seg_bound_max_min_distanceR�(
tcsp1tcsp2R�RUR�ti1tj1ti2tj2R�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_to_csp_distance�s$  =F*g�?cCst|d|d|d|df\\}}\}}\}}\}	}
||||}||||}||||}
||||}||	||}||
||}||
||}||||}|
||
|}||||}||||}||||}|d|d||gg||g||g||gg||g|d|dgfS(Niii((RWRXRRfRgtx2ty2tx3ty3tx4ty4tx12ty12tx23ty23tx34ty34tx1223ty1223tx2334ty2334RaRb((s,/usr/share/inkscape/extensions/gcodetools.pyt	csp_split�sFcCs�td�dddg}td�dddg}td�dddg}td�dddg}x�tt|��D]�}x�tdt||��D]�}tj|||dd|||dd|||d|||df�\}}}	}
}}}
}tdd|d|	|�ddg}x�|D]�}t|�tkrkt|j	�dkrk|j
}nt|�tk	r2d|ko�dknr2||d|
|d|||}||d|	|d|||
}t|||||g|�}t|||||g|�}q2q2Wtdd|d|
|�ddg}x�|D]�}t|�tkr�|j	dkr�|j
}nt|�tk	rVd|ko�dknrV||d|
|d|||}||d|	|d|||
}t|||||g|�}t|||||g|�}qVqVWq�WqsW|d|d|d<|d<|d|d|d<|d<||||fS(Ntinfis-infiiig�����|�=(
R�RKRPRR	tcubic_solverttypetcomplexR�timagtrealRwRv(RTRxRzRyR{RdRiRRRRRRRRtrootstrootRbRa((s,/usr/share/inkscape/extensions/gcodetools.pyR[�s8 k'
'.&&%'
!.&&-c		s�t||�t||�}}td�}�fd��ga�||ddddtt�t}xptt|��D]\}t||�dks�||ddkrx|||||d||d	�||<qxqxW|S(
NcSstj|�\}}}}}	}
}}tj|�\}
}}}}}}}d}ddgddgddgg}}x||dks�t|d�dt|d�d|kr�|dkr�|d|d|d|df\}}}}|||||	|||
|||||||d<|||||
||||||||||d<d||d|||	|dd<d|
|d||||dd<d||d|||
|dd<d||d||||dd<|dd|dd|dd|dd}|dkr�|dd||dd|g|dd||dd|gg}||dd|d|dd|d}||dd|d|dd|d}nP|d7}q|W||fS(Nigiii
ii����(RR	R�(RIRettattbRURRRRRRRRRlRmRRRnRoRpRqRdR�R�tta3tta2ttb3ttb2tdet((s,/usr/share/inkscape/extensions/gcodetools.pytpolish_intersections(''%G.>>&&&&2J.1cs�||kr,t||||dgg7adS||d||d}}	|dkrr|dkrrt|d�\}
}t|d�\}}
t|
|�r��|
|||||	|d|d�nt||�r��||||||	|d|d�nt|
|
�r6�|
|
|||	||d|d�nt||
�r��||
|||	||d|d�q�n|dkrt|d�\}
}t|
|�r��|
||||||d|�nt||�r��|||||||d|�q�n�|dkr�t|d�\}}
t||�rV�||||||	||d�nt||
�r��||
|||	|||d�q�n�t|dg|dg|dg|dg�\}}}|r�|dkrStdtd|d��tdtd|d��d}tdtd|d��tdtd|d��d}nt||||||||gg7andS(NtOverlapiig�?ii(t$bezier_intersection_recursive_resultt	bez_splittbez_bounds_intersecttstraight_segments_intersectionRwRv(RIRetta0tta1ttb0ttb1tdepth_atdepth_bttamttbmta1ta2tb1tb2tintersectionR�R�(t	recursion(s,/usr/share/inkscape/extensions/gcodetools.pyR�1sB***-&)&)<:=gg�?iiR�ii(R~tintersection_toleranceR�tintersection_recursion_depthRKRP(	RWRXR�R�RIReR�t
intersectionsRd((R�s,/usr/share/inkscape/extensions/gcodetools.pytcsp_segments_intersections*0cCs"t||||�}g}x|D]�}t|�dkr�|ddkr�d|dkoedkns�d|dko�dknr�d|dko�dkns
d|dko�dkns
d|dko�dknr"d|dkodknr"||g7}q"q"W|S(NiiR�iiii(R�RP(RWRXR�R�R�RHR�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_segments_true_intersectionXs
�@ic	Cs�|dkrd}nd}g}t||�\}}}}	}
}}}
xBt|�D]4}t|�|d}d
\}}xm|dks�t|�|kr�|dkr�y*||}d||d|||
}d||d|	||}d||d|}d||d|	}d|}d|}|d|dd	}|||||||||d
|||||d|dd|d|dd}||||||}|||8}WnPnX|d7}q~Wd|kodknrU||krUt|�dkr5|j|�nx(|D] }t||�dkr<Pq<q<Wt||�dks�|j|�q�qUqUW|S(Nig�����|�=iig}Ô%�I�Tiiig�?g@g�?g����MbP?(ig}Ô%�I�T(RZRKR�R�RPRQ(RWRXtcR�RURHRRRRRRRRRNRRdR�R�R�R�R�R�tf3xtf3yR�R�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_get_t_at_curvaturedsD	'-


K(
cCs�t||�\}}}}}}}}	d}
d}d}x�|dksd||
|
kr�|dkr�d}d||dd|||}d||dd|||}d||d|}d||d|}d|}d|}t|d|dd	�}|dkr�|}
|||||}|||||||||d
||||t|d|dd�|d|dd}|d7}|dkr�|||8}q�Pq<Pq<W|S(Ng-C��6?giii
g�?iig�?g@i(RZtpow(RWRXRRRRRRRRRUR�RdR�RR�R�R�R�R�R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_max_curvature�s0'+""

P
icCs�tjt||��\}}}}}}	}
}d||dd|||}d||dd|||	}
d||d|}d||d|}|d|
dd}|dkr�|||
||S|||
|}|dkr�dS|dkrdSd|||||||||	}|dkrBdS|dkrRdS||||}|dkrtdS|dkr�dS|dkr�t|||d|d	�SdSdS(
Niiig�?ig}Ô%�I�Tg}Ô%�I��g���Mb�?i(RR	R~tcsp_curvature_at_t(RWRXRtdepthRRRRRRRRR�R�R�R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��s40""*cCs.t|||�}|dkr"dSd|SdS(Nig}Ô%�I�Ti(R�(RWRXRR�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_curvature_radius_at_t�scCs$tj|d|d|d|df�\}}}}}}}}	d||d||}
d||d||}||||}td|
||�}
g}xy|
D]q}t|�tkr�|jdkr�|j}nt|�tk	r�d|kodknr�|j|�q�q�W|S(Niiii(RR	R�R�R�R�R�RQ(RWRXRRRRRRRRRIReR�R�RHRd((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_special_points�sC
!.cCs�d}t|dd�t|dd�j�dkr�|dd|dd<|dd|dd<||dd|dd|ddgg7}n|dd}xK|D]C}x:|D]2}||d|d|d|d7}|}q�Wq�W|dkS(Nii����ig�����|�=i(tPtl2(RVRFtplRWR_((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_subpath_ccw�s21

&cCsd|dd|dd|dd|ddf\}}}}|dd|dd|dd|ddf\}}}	}
||||||||}}||||||	||}
}|||||	|
|	|}}||
||||||}}|
||
|||||}}||||||||}}||gS(Niii((RWRXRRRRRRRRRRfRgR�R�R�R�R�R�tx5ty5RaRb((s,/usr/share/inkscape/extensions/gcodetools.pyR]�s>>%%%%%%cCsK|d|d|d|df}tj|||�}t|||�S(Niii(RtbeziertatlengthR](RWRXtlRUtbezR((s,/usr/share/inkscape/extensions/gcodetools.pyt
csp_at_length�s&cCsK|d|d|d|df}tj|||�}t|||�S(Niii(RR�R�(RWRXR�RURR((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_splitatlengths&cCs6|d|d|d|df}tj||�S(Niii(Rtbezierlength(RWRXRUR((s,/usr/share/inkscape/extensions/gcodetools.pytcspseglengths&cCsyd}g}x`|D]X}xOtdt|��D]8}t||d||�}|j|�||7}q/WqW||fS(Nii(txrangeRPRRQ(RTttotaltlengthsR|RdR�((s,/usr/share/inkscape/extensions/gcodetools.pyt	csplengths

cCs�ddg}}xZ|D]R}xItdt|��D]2}|t||d||�7}||g7}q3WqW|dkr�gtt|��D]}|||^q�}n||fS(Nii(RRPR(RTR�tsegR|Rd((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_segmentss
0cCs|dkr!t|�\}}nt|�t|�kr=dS|}|j�x�tt|��D]�}d}xktt|��D]W}|dkr�tt||||�|g|�nt||||�|g}q�W||d=qaWxtt|��D]
}x5tdt|��D]}||||krPqqW||||ddkr�||||d||||d}t||d|||�\}}	}
||d ||	|
g||d}|| ||dd||||g||}q�q�W||fS(Nii(RuR
RPtsortRRvR�R�(RTtsegsRFR�RdR�RiRRWRXR�((s,/usr/share/inkscape/extensions/gcodetools.pytrebuild_csp#s*
U*''<cCs6|d|d|d|df}tj||�S(Niii(RR(RWRXRR((s,/usr/share/inkscape/extensions/gcodetools.pyt	csp_slope:s&c	Cs�|d}|d|d}|d}|d|d}||koOdknrXgS|rq||}d}	nd}||}	|d|d|d|df}
tj|
�\}}}
}}}}}|||	|}|||	|
}|||	|}||||	||}t||||�}g}x|D]w}t|�tkryt|j�dkry|j}nt|�tk	r@d|ko�dknr@|j|�q@q@W|S(	NiiigH�����z>g�����|۽g�?g�����|�=g8��?(	RR	R�R�R�R�R�R�RQ(tl1R�RWRXtddtcctbbtaatcoef1tcoef2RRRRRRRRRRIReR�R�R�tretvalRd((s,/usr/share/inkscape/extensions/gcodetools.pyR\?s2


	
&'
'.cCs?||kr||}}n||krSt||t�\}}}||||gS|dkr{|dkr{||||gS|dkr�t|||�\}}}||||gS|dkr�t|||�\}}}||||gSt|||�\}}}t||||d|�\}}}||||gSdS(Ng�����|�=g�?ig�A��?g�A��?(R�R(RWRXR�R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_split_by_two_points[s 'c	Cs�t|�tkr|g}n|j�||g}d}xu|D]m}d|ko^dknrAt|d|d||d|�\}}}|}|||g|d)qAqAW|S(Nig�����|�=g�?i����i����ig�A��?(R�R�RR�(	RWRXtpointsRHtlast_tRR�R�tsp5((s,/usr/share/inkscape/extensions/gcodetools.pyt
csp_seg_splitms

/cCsn|j�ddgg|t|�ddgg}g}x-t||d�D]\}}||krlqNn|ddkr�|dcd7<d|d<n||kr�qNn|ddkr�|dcd8<d|d<n|ddkr|dt|�dkrqNn|d|dkr�t||dd||d|d|d�}|d|dkrf||d|dgg7}qfqNt||dd||d|d�\}}}t||dd||d|d�\}	}
}|d|ddkr.|||d|d|	dg|
gg7}qN|||g||dd|dd!|	|
gg7}qNW|S(Nigg�?ii(RRPRRRR�(RVRtpartstint1tint2R|RRWRXR�R�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_subpath_split_by_points|s4
* 

*1!33.<cCsot|dd|ddd�dkr9t|�}nt|d|d||d|d|g||�S(Niiig�����|�=(R�t	normalizetarc_from_c_s_l(RFtrtnR�((s,/usr/share/inkscape/extensions/gcodetools.pytarc_from_s_r_n_l�s*c
Cs
t||�}|dkrgS||}tj|�tj|�}}|d|d|d||d|d||d|d|d||d|d|g}|d|d|d|dg}|dkr�t|�n	t|�}	t|||||	�S(Nii(tpoint_to_point_dtmathtcostsint	rotate_cwt
rotate_ccwtcsp_from_arc(
R�RFR�R"talphatcos_tsin_teR#tslope((s,/usr/share/inkscape/extensions/gcodetools.pyR!�s
d$$cCs�t|�}t|d|d|d|d�t|d|d|d|d�tj}tt|�dtj�d}t|d|d|d|d�}tj|�tj|�}}	dtj||d�d}
t	||	|
|||
|g�dkr=|dkr-|tj8}q=|tj7}nt||�dkrWgStt|�dtj�d}dtj||d�d}
g}x�t
|d�D]�}tj||||�tj||||�}}	g|d|||d|	|ggg}
|
dd|	|
||
dd||
|g|
d<|
dd|	|
||
dd||
|g|
d<||
g7}q�W|dd|dd<|dd|dd<|S(Niiig@g@g����MbP?i����(R�tatan2R&tpi2tinttpiR'R(ttantdotRK(tstarttendtcenterR"tslope_stR,tsectorstalpha_startR-R.RNtresultRdR|((s,/usr/share/inkscape/extensions/gcodetools.pyR+�s0S!',!7-88cCsi|\}}}}d}t|�}||j�}|dkre|||j�|}||j�||j�}	||	dkr�|	dkr�|	tj}	q�tj|	}	nt|	d|�s�tt	|	�t	|	|��t
kr	||j�|j|jgfS||j�||j�}
}|
|krL|
|j|jgfS||j|jgfSndS(Ni(
RuR�tmagtunittangleR&R2tbetweenRvR�tstraight_toleranceRaRb(R_tarctP0tP2R�RIR�R"RdR,R�td2((s,/usr/share/inkscape/extensions/gcodetools.pytpoint_to_arc_distance�s"7 !c
Cs�d\}}ddfddfd}}}	x�|dkset|d|	d�|kr�|dkr�|d7}|d}	xjt|d�D]X}
t|
�|}t|||�}tt||�t||��}t||�}q�W|d}q/W|dS(	Ni
iiii(i
i(ii(ii(R�RKR�R]RvRGRw(
RWRXtarc1tarc2RUR#RdR�R�tdlRiRR_((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_to_arc_distance�s 9

!c	Cs:d\}}}}x�|D]�}x�|D]�}x�|D]�}|dkrXt||d�n|d}|dkr�t||d�n|d}|dkr�t||d�n|d}|dkr�t||d�n|d}q3Wq&WqWtjt||d|d|d�dt||d|d|d�d�S(Niii(NNNN(RuRvRwR&tsqrt(	R_RTRxRyRzR{RVR|tp_((s,/usr/share/inkscape/extensions/gcodetools.pyt"csp_simple_bound_to_point_distance�s


)))5cCs/|d|d|d|dg}|\}}d}d}d}x�td�D]�}	||	d||	\}
}\}}
t||
�}t||
�}|
|dkrM||||
||
|
|krM|t|
|�krM|t|
|�krM|d7}qMqMW||ko|kno.|ddkS(Niiig}Ô%�I�Tg}Ô%�I��i(RKRvRw(RWRXR_RRaRbR�txmintxmaxRdRRRfRg((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_point_inside_bound�s"%^cCs|t|||�rdSt||�}d}xJtdd�D]9}t|||d||�}||kr;|}q;q;W|S(Ngg}Ô%�I�Tiii(RQR~RKt point_to_line_segment_distance_2(RWRXR_RR�RdR�((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_bound_to_point_distances
c	CsD|d|dkr(|d|dksP|d|dkrT|d|dkrTtS|d|d|d|d|d|d|d|d}|dkr�|d|d|d|d|d|d|d|dkr�|d|dkr�|d|d|d|d}|d|d|d|d}|d|d|d|d}|d|d|d|d}n�|d|d|d|d}|d|d|d|d}|d|d|d|d}|d|d|d|d}d|ko$dknsEd|ko@dknr�d|ko\dkns}d|koxdknr�dStStSn�d|d|d|d|d|d|d|d|d|ko�dkno?d|d|d|d|d|d|d|d|d|ko=dkSSdS(NiiR�(tFalse(	R�tp2tp3tp4Ratt11R�tt21R�((s,/usr/share/inkscape/extensions/gcodetools.pytline_line_intersects$PBD"""%""""x\cCsJ|d|dkr(|d|dksP|d|dkrT|d|dkrTgS|d|d|d|d|d|d|d|d}|dkrA|d|d|d|d|d|d|d|dkr:|d|dkr�|d|d|d|d}|d|d|d|d}|d|d|d|d}|d|d|d|d}n�|d|d|d|d}|d|d|d|d}|d|d|d|d}|d|d|d|d}g}	d|ko*dknsKd|koFdknr6d|kobdkns�d|ko~dknr6d|ko�dknr�|	|g7}	nd|ko�dknr�|	|g7}	nd|ko�dknr|	|g7}	nd|kodknr6|	|g7}	q6n|	SgSn|d|d|d|d|d|d|d|d|}
|d|d|d|d|d|d|d|d|}d|
ko�dknrBd|kodknrB|dd|
|d|
|dd|
|d|
ggSgSdS(Nii((R�RURVRWRaRXR�RYR�RHR�R�((s,/usr/share/inkscape/extensions/gcodetools.pytline_line_intersection_points-s>PBD"""%""""pFF8=cCs(|d|dd|d|ddS(Niii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyRSKscCs1tj|d|dd|d|dd�S(Niii(R&RL(RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyR%OscCs0|d|d|d|dg}|d|d|d|dg}|d|d|d|d}|dkr�|d|d|d|dS|d|d|d|d}||kr�|d|dd|d|ddS|d|d|d||d|d|d|d||S(Niii((R�RURVtw0tvtc1tc2((s,/usr/share/inkscape/extensions/gcodetools.pyRRSs$$" "(cCs\t||||�rdStt|||�t|||�t|||�t|||��S(Ni(RZRvRR(R�RURVRW((s,/usr/share/inkscape/extensions/gcodetools.pytline_to_line_distance_2ascCs@t||�}t||�}d}d}xJtd�D]<}t||||�sit||||�r7d}Pq7q7Wx�td�D]�}x�td�D]�}	t||d||||	d||	�}
|
|kr�|
}n||	d||dd||	d||dd}
||
kr�|
}q�q�Wq�W||fS(Ng}Ô%�I�Tgiiii(R~RKRQR`(RWRXR�R�tbez1tbez2R�R�RdRiR�((s,/usr/share/inkscape/extensions/gcodetools.pyR�js",-	:cCslxett|��D]Q}g}x7||D]+}|d|d|dgg|}q*W|||<qW|S(Niii(RKRP(RTRdR#Ri((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_reverse|s)cCs3tj|d|d|d|df�\}}}}}}}	}
|d|dkoy|dkoy|dknr�ddgSd|||d|||}d|||d|||}t||||�dkrtj||||�}
||
||
gS|dkr|dd|dd}|dd|dd}t||||�dkr�tj||||�}
||
||
gS|dd|dd}|dd|dd}||||dkr/tj||||�}
||
||
gSn|dkr%|dd|dd}|dd|dd}t||||�dkr�tj||||�}
||
||
gS|dd|dd}|dd|dd}||||dkr/tj||||�}
||
||
gSn
ddgSdS(Niiig�?gig��&�.>(RR	R�R&RL(RWRXRRRRRRRRRR�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR^�s>G7
""cCs#t|||�\}}||gS(N(R^(RWRXRtnxtny((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_normalized_normal�scCstjt||��S(N(RR	R~(RWRX((s,/usr/share/inkscape/extensions/gcodetools.pyRZ�scGskd�}t|�dkrgSt|�dkr9|dS|d}x!|dD]}|||�}qNW|S(NcSs|gkr|S|gkr |S|ddd|dddd|ddd|dddddkr�|d |dd|dd|ddg|dd|dd|ddgg|dS|d |dd|dd|ddgg|dSdS(Ni����iiig�h㈵��>((ts1ts2((s,/usr/share/inkscape/extensions/gcodetools.pytconcat�sP\ii(RP(RFRiR=Rg((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_concat_subpaths�s	
cCsH|ddd|dddd|ddd|ddddS(Ni����iii((RgRh((s,/usr/share/inkscape/extensions/gcodetools.pyt#csp_subpaths_end_to_start_distance2�sc
CsXg}xKtt|��D]7}||}g}x[tdt|��D]D}|gt||||d||�D]}||g^qp7}qEWt||�}	x�|	D]�}t}
xyt|g�D]h}|d|d|d|d|d|d|d|d|d|ddkr�t}
Pq�q�W|
r�|	j|�q�q�W||	7}qW|S(Niig{�G�z��(RKRPR\RRTR[tTruetremove(RTRR�R=RdRFR�Ritint_t
splitted_stclipR_((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_clip_by_line�s"
BXcCsDt|�dkr@|s�t|�dkrD|dd|dd<nt|d�tddg�kr�x@|D]}||||gg7}qmWq=||||gg7}q@t|�dkr�|dd|dd<nt|d�tddg�kr'x@|D]}|||gg|}qWq@|||gg|}n|S(Nii����ii(RPR�(RVRtprependR_((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_subpath_line_to�s"
 "
 cCs1|}t}g}x|r,t}x�t|�dkr|d}|d=d}t}x�|t|�kr�t|||�dkr�t|||�||<t}t}Pnt|||�dkr�t|||�||<t}t}Pn|d7}qXW|s%||g7}q%q%W|r|}g}qqW|S(Nii����g���ư>i(RlRTRPRkRj(RTR=tdone_smft
joined_resultRgRit
joined_smf((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_join_subpaths�s8	
cCs@|d|d|d|d|d|d|d|dS(Nii((RIReR�((s,/usr/share/inkscape/extensions/gcodetools.pyttriangle_crosssc
Cs�|d|d|d|df\}}}}t|||�}t|||�}t|||�}t|||�}	|dkr�|dkr�t||||�t||||�gS|dkr�|t|||�t|||�gS|dkr|t|||�t|||�gS|dkrM|t|||�t|||�gS|	dkr~|t|||�t|||�gS||dk||dk||	dk}
}}|
r�|r�|r�|||gS|
r�|r�|r�||||gS|
r|r|r||||gS|
r8|r8|r8||||gS|
rX|oG|rX|||gS|
oa|rx|rx|||gS|
o�|r�|r�|||gStd�dS(Niiis@csp_segment_convex_hull happend something that shouldnot happen!(RxRvRwt
ValueError(
RWRXRIReR�R�tabctabdtbcdtcadtm1tm2tm3((s,/usr/share/inkscape/extensions/gcodetools.pytcsp_segment_convex_hulls>2(%%%%2



cCstt|�t|��S(N(tbounds_intersectt	bez_bound(RaRb((s,/usr/share/inkscape/extensions/gcodetools.pyR�1sc	Cs�t|dd|dd|dd|dd�t|dd|dd|dd|dd�t|dd|dd|dd|dd�t|dd|dd|dd|dd�gS(Niiii(RvRw(R((s,/usr/share/inkscape/extensions/gcodetools.pyR�5s222cCsO|d|dkpM|d|dkpM|d|dkpM|d|dkS(Niiii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyR�>scCs:|\}}|\}}||||||||gS(N((Rt.1RRfRgR�R�((s,/usr/share/inkscape/extensions/gcodetools.pyttpointBscCs4|d|d|dg|d|d|dgfS(Niiii((R((s,/usr/share/inkscape/extensions/gcodetools.pytbez_to_csp_segmentFscCs�t|d|d|�}t|d|d|�}t|d|d|�}t|||�}t|||�}t|||�}|d|||g||||dgfS(Niiii(R�(RIRR�tatR�R�R�ta3((s,/usr/share/inkscape/extensions/gcodetools.pyR�JscCs:t|d|d|dg|d|d|dg|�S(Niiii(R](RR((s,/usr/share/inkscape/extensions/gcodetools.pytbez_at_tTsgcCstt|�||�S(N(R�R�(RR_tneeded_dist((s,/usr/share/inkscape/extensions/gcodetools.pytbez_to_point_distanceXscCs:t|d|d|dg|d|d|dg|�S(Niiii(R^(RR((s,/usr/share/inkscape/extensions/gcodetools.pytbez_normalized_slope]scCsS|\}}tj|d|d�}|dkr=ddgS||||gSdS(Niig(R&RL(RRaRbR�((s,/usr/share/inkscape/extensions/gcodetools.pyR ds
	
cCs |d|d|d|dS(Nii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pytcrossjscCs |d|d|d|dS(Nii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyR6nscCs|d|dgS(Nii((R�((s,/usr/share/inkscape/extensions/gcodetools.pyR*rscCs|d|dgS(Nii((R�((s,/usr/share/inkscape/extensions/gcodetools.pyR)uscCs&|d|d|d|ddkS(Nii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pytvectors_ccwyscCs"|d|d|d|dgS(Nii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyt
vector_add|scCs|d||d|gS(Nii((RIRe((s,/usr/share/inkscape/extensions/gcodetools.pyt
vector_mulscCsItj|d|d|d|d|d|d|d|d�S(Nii(R&RL(RIRe((s,/usr/share/inkscape/extensions/gcodetools.pytvector_from_to_length�sc
Csgtt|��D]l}gtt|d��D]I}tgtt|d��D] }||||||^qP�^q0^qSy�gtt|��D]l}gtt|d��D]I}tgtt|d��D] }||||||^q��^q�^q�SWndSXdS(Ni(RKRPtsumRu(RIReRdRiRN((s,/usr/share/inkscape/extensions/gcodetools.pyt
matrix_mul�s
��cCsayRgtt|d��D]3}gtt|��D]}|||^q3^qSWndSXdS(Ni(RKRPRu(RIRiRd((s,/usr/share/inkscape/extensions/gcodetools.pyt	transpose�sRcCs�t|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd�S(Niii(R�(RI((s,/usr/share/inkscape/extensions/gcodetools.pytdet_3x3�scCs�t|�}|dkrdS|dd|dd|dd|dd||dd|dd|dd|dd||dd|dd|dd|dd|g|dd|dd|dd|dd||dd|dd|dd|dd||dd|dd|dd|dd|g|dd|dd|dd|dd||dd|dd|dd|dd||dd|dd|dd|dd|ggS(Niii(R�Ru(RIR�((s,/usr/share/inkscape/extensions/gcodetools.pytinv_3x3�s��cCs�|dd|dd|dd|dd}|dkrBdS|dd||dd|g|dd||dd|ggS(Nii(Ru(RIR�((s,/usr/share/inkscape/extensions/gcodetools.pyR��s
2"cCst|�tkS(N(R�tsmall_tolerance(RI((s,/usr/share/inkscape/extensions/gcodetools.pytsmall�scGs�t|�dkr�t|d�tddg�ksPt|d�td�kr�tjdtj|dd|dd�tjSt|�dkr�tjdtj|d|d�tjStd|�dS(NiigisBad argumets for atan! (%s)(gg(RPR�R&R4R1R2Ry(targ((s,/usr/share/inkscape/extensions/gcodetools.pyR1�s
P2*cCs�d}|jdkr>|dkr2|d|jn|j}nxd|D]\}|jtjdd�krE|jdkr�|dkr�|d|jn|j}q�qEqEW|S(Ns
ttspantsvg(RuttextttagtinkextaddNS(tnodetvalueRN((s,/usr/share/inkscape/extensions/gcodetools.pytget_text�s)
0c	CsL|dkrd}n|d|7}it|�d6dtjdd�6t|�d6|d6}|dkr|t|�|d	<n|dkr�tj}ntjj|tjd
d�|�}t|�jd�}xx|D]p}	tjj|tjd
d�it|�d6t|�d6dtjdd�6�}
||7}t|	�|
_	q�WdS(Ns�font-family:DejaVu Sans;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:DejaVu Sans;fill:#000000;fill-opacity:1;stroke:none;sfont-size:%fpx;RatpreservetspacetxmlRbtstylet
gcodetoolsR�R�s
R�R9troletsodipodi(
RutstrR�R�toptionstdoc_roottetreet
SubElementRER�(R�RaRbtgroupR�t	font_sizetgcodetools_tagt
attributesRRFtspan((s,/usr/share/inkscape/extensions/gcodetools.pyt	draw_text�s*	

$



s#f00RCg-����?c	Cs�|dkr"d|||f}nitj|�d6|d6}|dkrX||d<n|dkrptj}ntjj|tjdd�|�S(Ns0fill:%s;fill-opacity:1;stroke:%s;stroke-width:%sR�R�RCtcommenttpathR�(	Rutcubicsuperpatht
formatPathR�R�R�R�R�R�(	RTR1R3R�twidthR�R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pytdraw_csp�s

R�g�������?g$@cs��d�|dkri}n|
dkr4d}
n|
|d<|dkrYtjj}n|dkr�|	dkrzd}	ntjj|tjdd�i|
dd6�}t||d�d	|d
�d|d|	�n|d
kr�d}xIt	d
t
|�d�D].}
|d||
d||
dd
f7}qW|jid|d|d
|fd6d||fd6t|�d6�tjj|tjdd�|�nG|dkrX|dkr�d}nd}d|d|d
ft
jd�fd�d�}|ji|d6d||fd6t|�d6�tjj|tjdd�|�n�|jid|d|d
��d�d�����d�d�fd6d||fd6t|�d6�tjj|tjdd�|�dS( NitPointerR�itgR�s groupig������@iR�R�R9RCs %s, %s sM %s,%s L %sR�s$fill:none;stroke:%s;stroke-width:%f;R�R�R�tarrows#12b3ffs0.8sm %s,%s s([0-9\-.e]+)cs!tt|jd���d�S(Nig@(R�R�R�(tmatch(tsize(s,/usr/share/inkscape/extensions/gcodetools.pyRssX0.88464,-0.40404 c -0.0987,-0.0162 -0.186549,-0.0589 -0.26147,-0.1173 l 0.357342,-0.35625 c 0.04631,-0.039 0.0031,-0.13174 -0.05665,-0.12164 -0.0029,-1.4e-4 -0.0058,-1.4e-4 -0.0087,0 l -2.2e-5,2e-5 c -0.01189,0.004 -0.02257,0.0119 -0.0305,0.0217 l -0.357342,0.35625 c -0.05818,-0.0743 -0.102813,-0.16338 -0.117662,-0.26067 l -0.409636,0.88193 zs$fill:%s;stroke:none;fill-opacity:%s;s)m %s,%s l %f,%f %f,%f %f,%f %f,%f , %f,%fi����(RuR�R%t
current_layerR�R�R�R�R�RKRPtupdateR�R R$(RatcolortfigureR�R�R3R�R�R�R�tpointer_typetattribRFRdtfill_opacityR�((R�s,/usr/share/inkscape/extensions/gcodetools.pytdraw_pointer�s8
		
	/3 ,G%	42%scCs|dd|dd|dd|dd|dd|dd|dd|ddf\}}}}}}}	}
||kr�||ks�||kr�|	|
kr�tddfS|||
|	||||dkr1||kr�||||n||	|
|	}||kr)||||n||	|
|	}||krY||||n|	|||}
||kr�||||n|
|||}d|ko�dknsd|ko�dknsd|
ko�dknsd|kodkns|rdnt||f|
|ffS||	|||||
|	|||
|	||||}||kr�|||||||n||	||||
|	}d|ko�dknr�d|ko�dknp�|||fSdS(NiiR�(RT(RIRettrue_intersectionRRRRRRRRR�R�ttcttd((s,/usr/share/inkscape/extensions/gcodetools.pyR�sv0
(0000�BHcCst|�tko||kS(N(R�R�(Ra((s,/usr/share/inkscape/extensions/gcodetools.pytisnan scCsd}||kp||kS(Ng�((RaR�((s,/usr/share/inkscape/extensions/gcodetools.pytisinf"scCsD|t|ko|tknpC|t|koA|tkSS(N(RB(R�RaRb((s,/usr/share/inkscape/extensions/gcodetools.pyRA$scCs�t||||�}g}xb|D]Z}t|�tkrod|jkoTdknr||j|j�q|q"|j|�q"W|S(Ng�����|۽g�����|�=(R�R�R�R�RQR�(RIReR�R�R�RHR�((s,/usr/share/inkscape/extensions/gcodetools.pytcubic_solver_real's
cCs�|dkr||||||}}}d|dd||d|}|dd|}|dd|d}ddtjd�d	}ddtjd�d	}|dkrY|tj|�}	|	dkr�t|	dd
d�nt|	dd
d�}
|tj|�}	|	dkr=t|	dd
d�nt|	dd
d�}nTtt|tj|�d�d
d�}
tt|tj|�d�d
d�}dd||
|}dd|||
||}
dd|||
||}||
|gS|dkr�|dd||}|dkrp|tj|�d||tj|�d|gS|dkr�|||gS|tj|�d||tj|�d|gSn|dkr�||gSgSdS(Niiii	iig�g�?y�?g�?g�(tcmathRLR&R�R�(RIReR�R�tmRNR#tw1tw2RR~tn1RfR�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR�4s8 "<?**
69cGsjttjd�}x:|D]2}tt|�jd��d}|j|�qW|jd�|j�dS(NRItunicode_escapet s
(topenR�tlog_filenameR�RRRtclose(R�R�RF((s,/usr/share/inkscape/extensions/gcodetools.pyR
Zs

R�cBs�eZdd�Zd�Zd�Zd�Zd�ZeZd�Z	d�Z
d�Zd�Zd	�Z
d
�Zd�Zd�Zd
�Zd�Zd�ZRS(cCsY|dks.t|�t|�|_|_n't|d�t|d�|_|_dS(Nii(RuR�RaRb(R%RaRb((s,/usr/share/inkscape/extensions/gcodetools.pyt__init__gs"cCs!t|j|j|j|j�S(N(R�RaRb(R%tother((s,/usr/share/inkscape/extensions/gcodetools.pyt__add__lscCs!t|j|j|j|j�S(N(R�RaRb(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyt__sub__mscCst|j|j�S(N(R�RaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pyt__neg__nscCsFt|t�r+|j|j|j|jSt|j||j|�S(N(t
isinstanceR�RaRb(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyt__mul__oscCst|j||j|�S(N(R�RaRb(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyt__div__tscCstj|j|j�S(N(R&thypotRaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR>uscCs+|j�}|r||Stdd�SdS(Ni(R>R�(R%th((s,/usr/share/inkscape/extensions/gcodetools.pyR?vscCs|j|j|j|jS(N(RaRb(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyR6zscCsOtj|�}tj|�}t|j||j||j||j|�S(N(R&R'R(R�RaRb(R%tthetaR�RF((s,/usr/share/inkscape/extensions/gcodetools.pytrot{scCstj|j|j�S(N(R&R1RbRa(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR@scCsd|j|jfS(Ns%f,%f(RaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pyt__repr__�scCsd|j|jfS(Ns	%.2f,%.2f(RaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pytpr�scCs|j|jgS(N(RaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pytto_list�scCst|j|j�S(N(R�RbRa(R%((s,/usr/share/inkscape/extensions/gcodetools.pytccw�scCs|j|j|j|jS(N(RaRb(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR��sN(t__name__t
__module__RuR�R�R�R�R�t__rmul__R�R>R?R6R�R@R�R�R�R�R�(((s,/usr/share/inkscape/extensions/gcodetools.pyR�fs"														tArccBs;eZd�Zd�Zd�Zddd�Zd�ZRS(cCs�t|�|_t|�|_t|�|_t|�t|�j�|_|j|jj�|j|jj�tj|_	|dkr�|j	tj8_	ndS(Ni(
R�tstR8R�R>R"R@R&R2RI(R%R�R8R�RI((s,/usr/share/inkscape/extensions/gcodetools.pyR��s4cCs�|jdkr||j7}n
|j|}|jdkr�|j|j|j||j|_|j|j|j||j|_||_ndS(Ni(RIR"R�R�R8(R%R"((s,/usr/share/inkscape/extensions/gcodetools.pytoffset�s
%%cCst|j|j�S(N(R�RIR"(R%((s,/usr/share/inkscape/extensions/gcodetools.pytlength�siicCs�ttj|jj�|t��}ttj|jj�|t��}|j|}	||}
tj	|
j
|
j�tjdtjd}|
j
�}
|	dkr�||	}|d|d}n"|}||	}|d|d}i
|d6t|j
�tjdd�6t|j�tjdd�6t|
�tjd	d�6t|
�tjd
d�6t|�tjdd�6t|�tjdd�6d
tjdd�6dtjdd�6dd6}
|gkr�||
d<ntjj|tjdd�|
�dS(Niisbiarc%ss	biarc%s_rR�RR�RtrxtryR7R8ttrueR�RCR�tPreviewR�t	transformR�R�(R�R�R�R�R�RlR�RIR&R1RaRbR4R>R�R�R�R�R�(R%R�R�tlayerR�tnumt
reverse_angleR�R�RIR"ta_stta_endtattr((s,/usr/share/inkscape/extensions/gcodetools.pytdraw�s4$$

/



cCsgS(N((R%Re((s,/usr/share/inkscape/extensions/gcodetools.pyt	intersect�s(R�R�R�R�R�R�R�(((s,/usr/share/inkscape/extensions/gcodetools.pyR��s
			tLinecBsDeZd�Zd�Zd�Zd�Zddd�Zd�ZRS(cCs�|jtkr|j�}n|jtkr<|j�}nt|�|_t|�|_|j�|_|jdkr�|j|j|jj�|_nddg|_dS(Nii(	t	__class__R�R�R�R8R�R�R�R#(R%R�R8((s,/usr/share/inkscape/extensions/gcodetools.pyR��s#cCs0|j|j|8_|j|j|8_dS(N(R�R#R8(R%R"((s,/usr/share/inkscape/extensions/gcodetools.pyR��scCs|j|jj�S(N(R�R8R�(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR��scCs|j|jj�S(N(R�R8R>(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR��siic
Cs�tj|jj�|t�}tj|jj�|t�}i|dd6d|d|d|d|dfd6dd6}	|gkr�||	d	<ntjj|tj	d
d�|	�dS(NR9R�sM %s,%s L %s,%siiR�R�R�R�R�R�(
R�R�R�R�RlR8R�R�R�R�(
R%R�R�R�R�R�R�R�R8R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��s'

cCs�|jtkr�|jdks-|jdkr1gS|j|j}|j|j}|j|j|j|j}|dkrg}|jj|jj|j|jj|jj|jdkr|jdkr�d|jj|jj|jko�dknr|j|j�nd|jj|jj|jkoBdknrZ|j|j�nd|jj|jj|jko�dknr�|j|j�nd|jj|jj|jko�dknr|j|j�qqd|jj|jj|jkodknr/|j|j�nd|jj|jj|jko]dknru|j|j�nd|jj|jj|jko�dknr�|j|j�nd|jj|jj|jko�dknr|j|j�qn|S|j|jj|jj|j|jj|jj|}|j|jj|jj|j|jj|jj|}tj	|||fd�d|ko�dknr�d|ko�dknr�|j||gSgSngSdS(NgH�����z>iitwarning(
R�R�R�R8R�RaRbRQR�terror(R%Retv1tv2RaRHR�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��sD>33333333==8(R�R�R�R�R�R�R�R�(((s,/usr/share/inkscape/extensions/gcodetools.pyR��s	
			
tBiarccBs]eZd	d�Zd�Zd�Zd�Zd�Zd�Zd	e	dd�Z
d�ZRS(
cCs%|dkrg|_n	||_dS(N(Rutitems(R%R((s,/usr/share/inkscape/extensions/gcodetools.pyR�scCs#tgtD]}|j�^q
�S(N(R�RR�(R%Rd((s,/usr/share/inkscape/extensions/gcodetools.pyR�scCscx\|jD]Q}|dj|djj�dkr
|jt|dj|dj��q
q
WdS(Nii����gV瞯�<(RR�R8R�RQR�(R%tsubitems((s,/usr/share/inkscape/extensions/gcodetools.pyR�s$cCsM|j�x/|jD]$}x|D]}|j|�q!WqW|j|�dS(N(R�RR�tconnect(R%R"Rtitem((s,/usr/share/inkscape/extensions/gcodetools.pyR�s


cCslxe|jD]Z}xQt||d�D]<\}}|j|�}x|D]}t|j��qFWq$Wq
WdS(Ni(RRRR�R�R�(R%R"RRIReRdR_((s,/usr/share/inkscape/extensions/gcodetools.pyRs
 
cCsdS(N((R%((s,/usr/share/inkscape/extensions/gcodetools.pytclip_offset(sR;c	Cs�tj�xsddgD]e}tj|d|�|d|<d|d|d<|d|d=tj|d|�|d|<qW|dkrgdttj�kr�it	j
jtjt
dttj�d�t	jd	d
�idd6�|6t_na|tjkrWt	j
jtjt
dttj�d�t	jd	d
�idd6�tj|<ntj|}ntj|�}|gkr�tj|�}tj|�}nd
d
gdd
gd
dg}}}|d|d|d|d|d|d|d|d}	tj||t�tj||t�tj||t�}}}|d|d|d|d|d|d|d|d|	dkr�d}
nd}
d}xH|jD]=}x4|D],}
|d7}|
j||||||
�q�Wq�WdS(Niisbiarc%ss	biarc%s_rsurl(#DrawCurveMarker_r)smarker-starts
marker-endtpreview_groupsR�R�s
Preview groupR�gg�?i����(R�tset_markerstsimplestylet
parseStyletformatStyleRutdirR�R%R�R�R�tlayersRvRPR�Rtget_transformstreverse_transformtsimpletransformtformatTransformR�RlRR�(R%R�R�R�RdR�RIReR�RNR�R�RR((s,/usr/share/inkscape/extensions/gcodetools.pyR�+s6
#UR&BAL	

cCs�g|_x�|D]�}t|�|ddkrC|jjg�n|ddkr�|jdjt|d|d|d|d��n|dd	kr|jdjt|d|d��qqWdS(
NitmoveRCi����iiiiR9(RR
RQR�R�(R%tcurveR|((s,/usr/share/inkscape/extensions/gcodetools.pytfrom_old_styleOs	

6N(R�R�RuR�R�R�R�RRtstylesR�R(((s,/usr/share/inkscape/extensions/gcodetools.pyRs				
	$c2s1d�d�tj�}|}td|�td|�����fd�}d��d���fd�}���fd	��t|�}x�tt|��D]�}x�tt||��D]�}|||}	t|	d
�t|	d�j�dkr|	d
|||d<nt|	d
�t|	d�j�dkr�|	d
|||d
<q�q�Wq�Wxtt|��D]�}xotd
t||��D]T}t|||d
|||�dkr�||| |||d
||<q�q�Wt||d||d�dkry||dd
||dd
<||c||dd
||dd
||dd
gg7<qyqyW|}
tdtj�|�tdtg|D]}t|�^q���tj�}gt|�D]}g^q�}gt|�D]}g^q�}gt|�D]}g^q}
gt|�D]}g^q=}xOt|�D]A}||}g}d}x�t||d
�D]�\}}||||�}|gkr�|}t|�}nV|||||||||�\}}}t	||d
 |||�}t|�}||}}q�W||||d
 |d|d
|||�\}}}||d
*t	||d
 ||�}|||<q\Wtdtj�|�tj�}da
d}d}x�t|�D]�}x�t||�D]�}||}||}xhtd
t|��D]Q}xH||krTt|t|��ntt|��D]}||kr�||kr�t||d
||d�\}}} t|||| �}!|d
7}x�|!D]�}"|d
7}t
|"dd
�ot
|"d
�r�d|"dkod
knr�d|"d
ko?d
knr�||c||"dd
g||"d
d
dgg7<q�q�Wqdt||d
||||d
||�}!|d
7}x�|!D]�}"|d
7}t|"�d
kr�d|"dko�d
knr�d|"d
kod
knr�||ko�||d
t|�d
dkrvt
|"dd
�rvt
|"d
�p�||d
t|�d
dko�t
|"d
d
�o�t
|"d�r�||c||"dgg7<||c||"d
gg7<q�t|"�dkr�|"ddkr�||c||"dg||"d
gg7<||c||"d
g||"dgg7<q�q�WqdWq*Wq�Wq�Wtdtj�|�td|�td|�tj�}g}#x�t|�D]�}||}t||�dkr�	t|||�}$d
dg||krs	|$ddd|$ddd<t	|$d|$d�|$d<|#|$d 7}#q�	|#|$7}#q�|#|g7}#q�Wtdtj�|�tj�}g}%x�tt|#��D]�}t}&|#|}'xXtt|#��D]D}|#|}(t|'dd
�t|(dd
�j�dkr�
|d
t|#�|kr�
tt|(d|(dd�t|'d|'d
d��|d kr�
t}&Pq�
nt|(dd
�t|'dd
�j�dkr�	|d
t|#�|kr�	tt|(d|(d
d�t|'d|'dd��|dkr=t}&Pq=q�	q�	W|&sX|%|'g7}%q�	tjr�	t|'gd!d"d#d$�tt|(d|(dd�tt|(d|(dd��tt|(d|(dd��dj�d%d&�tt|'d|'d
d�tt|'d|'d
d��tt|'d|'d
d��dj�d"d&�q�	q�	Wt|%�})x�|)D]�}*t|*|*�dkr�tjr�t|*gd!d'd#d
�t|*dd
d(t|*|*��t|*dd
d(t|*|*��n|)j|*�qit|*g�\}+},}-}.|+d|-dd
|,d
|.d
d
d$kri|)j|*�qiqiWtd)tj�|�tj�}t |d�d
kr�
d*|d
d+|d
fn%t |�d
d
t |�d
d
f\}/}0x#|)D]}*t!|
|*t"t|*�d
�d
d,|/|0gd-d.�}1|/|1dko@|0kns�
|)j|*�tjrt|*gd(t#j$|1d��tt||1d
|1d
d
||1d
|1d
|1d�|*t"t|*�d
�d
d/d&d(t#j$|1d�|||	g�qq�
q�
Wtd0�td1tj�|�t�|)S(2Ng�������?i
sOffset start at %ssOffset radius %sc
sdg}t||d|�}t|�dkr=ddg}n|j�|ddkrgdg|}n|ddkr�|jd�nx�t||d�D]�\}}t||||d�}t||||�}|d|dkr�|d|kr|dks"|d|krE|dkrE�|d|d|���}	n �|d|d|���}	|gkr{|	}q\t||	�d	kr�t||	�}q\�||	�}
|
gkr\|
\}}}
}t	||d|||�\}}}||d ||g}t	|	|
d|	|
|�\}}}t|||g|	|
d�}q\q�q�W|S(
Niigg�?g:�0�yE>i����gG������?ig-C��6?(
R�RPRRQRRR�RRkRjR�(RWRXR"R=RR�R8R�R|R�R�RdR�RiR�tsp1_tsp2_tsp3_(t(csp_get_subapths_last_first_intersectiontoffset_segment_recursiontoffset_subdivision_depthtoffset_tolerance(s,/usr/share/inkscape/extensions/gcodetools.pytcsp_offset_segmentqs:
 8# 
''$cSst|d�t|d�t|d�t|d�f\}}}}||||||}}}	|j�dkr�|j�j�ntt||d��}
|	j�dkr�|	j�j�ntt||d��}|j�dkr|j�j�n|
j�|j�j�}|||
|||}
}t||d�}|
||dt|�dkrv||nd}t||d�}|||dt|�dkr�||nd}|
j�|
j�|j�g|j�|j�|j�ggS(Niiiid(R�R�R�R?RfR�R�R�(RWRXR"tp0R�RURVts0Rgts3tn0tn3R�tq0tq3R�tq1tq2((s,/usr/share/inkscape/extensions/gcodetools.pytcreate_offset_segment�sF <<@22c
Ss�t}x�tdt|��D]�}||d||}}xatdt|��D]J}||d||}}t||||�}	|	gkrSt}PqSqSW|rPqqW|r�t|	�}	t|�||	d||	dgSgSdS(Nii(RTRKRPR�RlRw(
RgRht_breakRdRjtsp12Ritsp21RkR�((s,/usr/share/inkscape/extensions/gcodetools.pyR�s"c	sgt|�dkrt|dd�t|dd�j�dkrQ|g|fS�||�}|gkr|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}||d ||
gg||g||
dfSntt||d��|tt||d��j�}tt||d��|tt||d��j�}t|||d|t||d��}|gkr�|g|fSt	||�dkrw�||�}|gkrw|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}||d ||
g}||g||
d}qwn|gkr�|g|fSt	||�dkrV�||�}|gkrV|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}||d ||
g}||g||
d}qVn|||fSdS(Nii����ig����MbP?g�?gg�h㈵��>(
RPR�R�R�R]RfR�R+R^Rk(tprevtnextRWRXtsp1_ltsp2_lR"R�RdR�RiR�RRRtsp4_tsp5_R7R8RC(R(s,/usr/share/inkscape/extensions/gcodetools.pytcsp_join_offsets�sB2
''488(
''
''cs��|||�\}}tt||tt||d��tt||d��|j��dt||tt||d��tt||d��|j��dt||tt||d��tt||d��|j��d�}||dkr�|dkr�|�dkrFt||�}tdtd|��}nd}t|||�\}	}
}�|	|
||d|�}�|
|||d|�}
|d	 |d	d|d	d|
ddgg|
dS||gSdS(
Ng�?ig�?g�?ig�������?g�������?ii����(	RwR�R�R]RfR�R�RvR�(RWRXR"R�RUtsp1_rtsp2_rterrRR�R�Rtr1tr2(R(RR(s,/usr/share/inkscape/extensions/gcodetools.pyR�sEEK8iig����MbP?ii����sOffset prepared the path in %ssPath length = %ssOffsetted path in %sg{�G�z�?g�?iiR�isIntersections found in %ssExamined %s segmentssfound %s intersectionsgsSplitted in %sg-C��6?i����g�?g-C��6�R�tRedR�g�������?tGreenR9tOrangeR�sClipped and joined path in %sg�G�z��?g)\��(�?R�RUg���ư>tblues-----------------------------sTotal offset time %s(%ttimeR
RPRR�R>RR�RRRjR�R�R�R�RRKRTR�R6RfR^RlR�toffset_draw_clippend_pathR�R�R]R�RwRkRmR[R�R�R3R&RL(2RTR"ttime_t
time_startRR2tcsp_lenRdRiR|toriginal_csptunclipped_offsettoffsets_originaltjoin_pointsR�RVtsubpath_offsettlast_offset_lenRWRXtsegment_offsettprev_lR.R/R,RCR-tsummtsumm1t	subpath_it	subpath_jtsubpath1R�R�Rtsplitted_offsetRR=RpRgRhRuRFRxRyRzR{R6R7R�((R(RRRRs,/usr/share/inkscape/extensions/gcodetools.pyt
csp_offseths&%		,**! ))%G-
 ,8

:'


e@-


RFG "*A


LALA	PW	!$0`9 
	 �
c*Csd�}t|d�t|d�}}t|d�|t|d�|||}}	}
|j�|	j�|
j�}}}
|	j�tkr�|j�tkr�|dddd|d||gggS|	j�tkr||
j�}	|j�|
j�d}nZ|j�tkrT|	|
j�}d|	j�|
j�d}n|j�|	j�}|j�|	j�}}	||tjtkp�tj||tjtk}|rI|
j�tks"|	j�tks"|j�tks"dt||
|j�|
j��tkrI|dddd|d||gggS|
|
d|
|||	d|||	d}}}|
j�dkr�||||||�St|�d
kt|�dkt|�dk}}}|r|dkr||}n�|r!|dkr!||}n�|s�||d||}|dkrat	||||f�n|d	}||d|}||d|}||dkr�t	||||||f�nt
||�}n"|r�|r�||||||�S||}||}|||}|||	}||||||}d
�} | |||�\}!}"| |||�\}#}$|!dks�|#dks�|!|j�tks�|#|j�tkr�|dddd|d||gggSt|||||!|"g|||#|$g�}%|%t
jkrB|t
jkrB||||||�S|#j�|$dkra|}&nJ|||t|!j�|"�t|#j�|$�t|!j�|"�}&||j�}'|'tdks�|'td|!j�dkr|dddd|j|jg||&gg}(n:|dd|!j|!jg|"|j|jg||&gg}(||j�}'|'tdks�|'td|#j�dkr�|j|jgddd|j|jg|&|gg})nB|j|jgd|#j|#jg|$|j|jg|&|gg})|(|)gSdS(Nc	Ss�|tjkr�t||�\}}}t||�t||�}}||dkr_|}n||||||}t|||||d�t|||||d�S|dddd|d||gggSdS(NiiR9(R�tbiarc_max_split_depthR�Rtbiarc(	RWRXtz1tz2R�R�RR�tzm((s,/usr/share/inkscape/extensions/gcodetools.pytbiarc_split�s	4iiiR9i
i����ig�?c		Ssn||d}||j�dkr(dS|||j�d||j�||j�}||j�dtj||j�dtj||j�dtj}}}||dtj}||kr�||ks||ks||ko�|knrdtj|}nt|j�dks\t|j�dks\||jt	j
dkr`dS||fSdS(Niii����i@B(NN(NN(R>RuR?R@R&R4R�RaRbR�tmin_arc_radius(	RDtP1REtDtRtp0atp1atp2aR,((s,/usr/share/inkscape/extensions/gcodetools.pytcalculate_arc_params'	s4S@DidRCg�����|�=g�����|�=g�����|�=(R�R@R>tstraight_distance_toleranceR?R&R4RBR�RyRwRuRKR�tbiarc_toleranceRPR�tEMC_TOLERANCE_EQUALRaRb(*RWRXRRRSR�RURDtP4tTStTER]ttsatteatvaR"ttang_are_parallelR�ReRItasmalltbsmalltcsmalltbetatdiscrtdisqtbeta1tbeta2R,tabRWtP3RER]tR1R�tR2R�R�RTR�RHRI((s,/usr/share/inkscape/extensions/gcodetools.pyRQ�s�		!5&$'!56.'88


	D'-	J.1:.9BcCs�|ddkrYtj|dd|ddd|dd|ddd�|dS|ddkr�tj|dd|ddd|dd|ddd�SdSdS(NiRCiiiR9i(R&RL(R	((s,/usr/share/inkscape/extensions/gcodetools.pytbiarc_curve_segment_lengthN	s
IAtstrictcCsDgdt}}}x�|D]�}|ddkr7|sG|ddkrKPn|ddkrdt}n|t|�7}|ddks�|ddkr||g7}qqW||kr�|dkr�gSd}|dd	d|dddd
|dd	d|dddd
dkr#t}nd}	t}
x||kr?||	}|
r�|ddkr�|d	ddd|d|d
g}q�|ddkr�|d	d|d
|d|d|d
g}q�nt|�}|dkr�|||kr||g7}q�|ddkr^tj|dd|d
dd
|dd|d
dd
�}
|dd|d
d|dd|d
d}}|d|||}|tj|�|tj|�|tj|�|tj|�}}||d
d||d
d}}||dd|d
|||g|d
d|d
d|||ggg7}n|ddkr�||dddd|d	d|dd||||d	d|dd|||g|d
d|d
d|||ggg7}q�n|	d7}	|	t|�kr,|r,|
}
n|	t|�}	q2W|S(NiiRR8RCR9Rui����iii
i����iigH�����z>(RTRlRtR&RLR'R(RP(RR�t	clip_typetsubcurvet
subcurve_ltmovedR	tlctsubcurve_closedRdtreversetlsRHR"RaRbRI((s,/usr/share/inkscape/extensions/gcodetools.pytbiarc_curve_clip_at_lW	sR
&	 P	
'3C5I%R�

t
PostprocessorcBsweZd�Zd�Zd�Zd�Zd�Zed�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�ZRS(cCsp||_i	|jd6|jd6|jd6|jd6|jd6|jd6|jd6|jd6|jd	6|_	dS(
NtremaptremapitscaleRtflipt	flip_axistroundtparameterizetregex(
R�R�R�R�RR�tround_coordinatesR�tre_sub_on_gcode_linest	functions(R%terror_function_handler((s,/usr/share/inkscape/extensions/gcodetools.pyR��	s	







cCs�tjdd|�}tjdd|�}|jd�}x`|D]X}tjdd|�}tjdd|�}|j�}|dkr@|j|�q@q@WdS(	Ns\\\\s:#:#:slash:#:#:s\\;s:#:#:semicolon:#:#:t;s\\s\;RC(R R$REtstript
parse_command(R%tcommandRF((s,/usr/share/inkscape/extensions/gcodetools.pytprocess�	s
cCs�tjd|�}|s/|jd|d�n|jd�j�|jd�}}||jkr�td||f�|j||�n|jd||fd�dS(Ns([A-Za-z0-9_]+)\s*\(\s*(.*)\)s1Parse error while postprocessing.
(Command: '%s')R�iis(Postprocessor: executing function %s(%s)s@Unrecognized function '%s' while postprocessing.
(Command: '%s')(R R�R�R�tlowerR�R
(R%R�R"tfunctiont
parameters((s,/usr/share/inkscape/extensions/gcodetools.pyR��	s%cCs�|jjd�}d|_y2x+|D]#}|jtd|�d7_q%WWn-tk
r|}|jd||fd�nXdS(Ns
RCsre.sub(%s,line)s�Bad parameters for regexp. They should be as re.sub pattern and replacement parameters! For example: r"G0(\d)", r"G\1" 
(Parameters: '%s')
 %sR�(tgcodeREtevalt	ExceptionR�(R%R�R�R9tex((s,/usr/share/inkscape/extensions/gcodetools.pyR��	s	
%cCs|j|dt�dS(Ntcase_sensitive(R�Rl(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��	scCsS|jdd�}|jd�}gg}}x{|D]s}|jdd�}tjd|�}|s||jd|d�n||jd�g7}||jd�g7}q5Wxctt|��D]O}|r�t|j	||d	|�|_	q�|j	j||d	|�|_	q�Wx:tt|��D]&}|j	jd	|||�|_	q%WdS(
Ns\,s:#:#:coma:#:#:t,s$\s*('|")(.*)\1\s*->\s*('|")(.*)\3\s*s,Bad parameters for remap.
(Parameters: '%s')R�iis:#:#:remap_pattern%s:#:#:(
treplaceRER R�R�R�RKRPR*R�(R%R�R�R)R�RFR"Rd((s,/usr/share/inkscape/extensions/gcodetools.pyR��	s 

#$cCsnddddg}|d|d|ddk}d}g}|d}d	}x�|jjd
�D]�}	tjdd|	�}
tjd|
�}|r�|jd�j�}|d	kr�|d}n|d
kr�|d}n|dkr�|d}q�n||kr�tjd|
�}|r�|d	krN|d|dkrN|jdd�n|d
kr�|d|dkr�|jdd�n|dkr�|d|dkr�|jdd�n||g7}q�nx�tt	|��D]�}||dks||dkr�x�||D]�}
tjd|
d|	�}|r|jd�dkrtjd|
ddt
|jd�|jd��|||
dkr�||nd|	�}	qqWq�q�W|dkr9tjd|	�}|r9|jd�dkr9y=tjddt
|jd�|jd��||	�}	Wq6q6Xq9n||	d
7}qaW||_|rj|jd�ndS(NtxityjtzkRIiiiRCtg17s
s
\([^\)]*\)s(?i)(G17|G18|G19)tg18tg19s
(?i)(G02|G03)sePost-processor: Scale factors for X and Y axis are not the same. G02 and G03 codes will be corrupted.R�sePost-processor: Scale factors for X and Z axis are not the same. G02 and G03 codes will be corrupted.sePost-processor: Scale factors for Y and Z axis are not the same. G02 and G03 codes will be corrupted.s(?i)(s)\s*(-?)\s*(\d*\.?\d*)is\1 %fRdRiRNs(?i)(r)\s*(-?\s*(\d*\.?\d*))s(?i)(r)\s*(-?)\s*(\d*\.?\d*)s'G02'->'G03', 'G03'->'G02'(RdRiRN(R�RER R$tsearchR�R�R�RKRPR�R�(R%RR�taxisR�R�twarnedtr_scaletplaneRFt
s_wo_commentsR"RdRI((s,/usr/share/inkscape/extensions/gcodetools.pyR��	sX 


    m=
	c
Cs:g}i}g}d}idd6dd6dd6dd6dd6dd6dd6}xN|jjd	�D]:}tjd
d|�}tjd|�}	|	r�|	jd�j�}
|
|kr�||
g7}q�ntjd
|�}	|	r3t|	jd�|	jd��}||kr3dtt	|�d�||<q3nxfdD]^}tjd|d|�}	|	r:||	jd�j�}||kr�||g7}q�q:q:WqbWidd6dd6dd6dd6}
x,|D]$}|d|
||j
�f7}q�W|gkr	dg}nt	|�dkr_|d7}idd6dd6dd6dd6dd6dd6dd6}n�|didd6d d!6d"d#6|d$7}|d%id&d6d'd!6d(d#6|d$7}idd6dd6dd6dd6dd6dd6dd6}d|krd)|d<d)|d<nd!|kr2d)|d<d)|d<nd#|krUd)|d<d)|d<nd|krx|d*7}d+|d<nx&|D]}|d,|||f7}qWx�|jjd	�D]u}tjd
|�}	|	r)t	|	jd��d$kr)tjd
d-|t|	jd�|	jd��|�}nx{d.D]s}tjd/|d0|�}	|	r0t	|	jd1��d$kr0tjd|d2d3|||
|f|�}q0q0Wxqd4D]i}tjd/|d0|�}	|	r�t	|	jd1��d$kr�tjd|d2d5|||�}q�q�W||d	7}q�W||_dS(6NRCRaRbtzRdRiRNRIs
s
\([^\)]*\)s(?i)(G17|G18|G19)is(?i)(F)\s*(-?)\s*(\d*\.?\d*)iit#itxyzijkas(?i)(s)\s*(-?)\s*(\d*\.?\d*)s#6s#7s#8s#9s%s  = 0 (%s axis offset)
R�s#10 = 1 (Scale factor)
s#10R"s#10 = 1 (%s Scale factor)
tXYtXZR�tYZR�is#11 = 1 (%s Scale factor)
tZtYtXs#11s#12  = 1 (A axis scale)
s#12s%s = %f (Feed definition)
sF [%s]txyzas(?i)((s)\s*(-?)\s*(\d*\.?\d*))is)\s*((-?)\s*(\d*\.?\d*))s\1[\2*%s+%s]tijkrs	\1[\2*%s](R�RER R$R�R�R�R�R�RPtupper(R%R�tplanestfeedstcoordsR�t
coords_defRFR�R"R�tfeedR�R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR�
s|7"$
"
"
:++7








!<
!6
!,c	Csyt|�}Wn|jd|d�nXd}x�|jjd�D]�}x�dD]�}tjd|d|�}|rT|jd�dkr�tjd|d	|d
kr�dt|�dnd
t	t
|jd��|�|�}q�qTqTW||d7}qGW||_dS(NsIBad parameters for round. Round should be an integer! 
(Parameters: '%s')R�RCs
txyzijkafs(?i)(s)\s*(-?\s*(\d*\.?\d*))is)\s*(-?)\s*(\d*\.?\d*)is\1 %0.R�s\1 %d(R3R�R�RER R�R�R$R�R�R�(R%R�tround_R�RFRIR"((s,/usr/share/inkscape/extensions/gcodetools.pyR�V
s 
?cCs�|jd�}ddddg}ybx[tt|��D]G}t||�dkrj|jd|d�nt||�||<q7WWn|jd|d�nX|jddddg|�dS(NR�g�?isPBad parameters for scale. Scale should not be 0 at any axis! 
(Parameters: '%s')R�s,Bad parameters for scale.
(Parameters: '%s')(RERKRPR�R�R�(R%R�R�Rd((s,/usr/share/inkscape/extensions/gcodetools.pyR�j
scCs�|jd�}ddddg}y5x.tt|��D]}t||�||<q7WWn|jd|d�nX|j|ddddg�dS(NR�gs+Bad parameters for move.
(Parameters: '%s')R�g�?(RERKRPR�R�R�(R%R�RRd((s,/usr/share/inkscape/extensions/gcodetools.pyRw
scCs�|j�}idd6dd6dd6dd6}xR|D]J}|dkrMq5n|dkrp|jd|d
�n||||<q5W|jd|d|d|d|df�dS(Ng�?RaRbR�RIR�R�t	s
t't"s_Bad parameters for flip_axis. Parameter should be string consists of 'xyza' 
(Parameters: '%s')R�s%f,%f,%f,%f(R�R�R�s
R�R�(RaRbR�RI(R�R�R�(R%R�R�R_((s,/usr/share/inkscape/extensions/gcodetools.pyR��
s"
(R�R�R�R�R�R�R�RTR�R�R�R�R�RR�(((s,/usr/share/inkscape/extensions/gcodetools.pyR�	s						/	S		
	tPolygoncBs�eZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
ed�Zd	d
dd�Z
d�Zd
�Zd�ZRS(cCs |dkrgn||_dS(N(Rutpolygon(R%R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��
scCs~xwtt|j��D]`}xWtt|j|��D]<}|j||dc|7<|j||dc|7<q6WqWdS(Nii(RKRPR�(R%RaRbRdRi((s,/usr/share/inkscape/extensions/gcodetools.pyR�
s cCs�d\}}}}x�|jD]�}x�|D]z}||dkrL|d}n||dkri|d}n||dkr�|d}n||dkr)|d}q)q)WqW|d|d|d|dfS(Ng�g�ii(g�g�g�g�(R�(R%RxRyRzR{tpolyR_((s,/usr/share/inkscape/extensions/gcodetools.pytbounds�
s



cCs|j�}|d|dS(Nii(R�(R%Re((s,/usr/share/inkscape/extensions/gcodetools.pyR��
scCsdg|jD]M}g|D]:}|d||d||d||d|g^q^q
|_dS(Nii(R�(R%R(R'tsubpolyRM((s,/usr/share/inkscape/extensions/gcodetools.pytrotate_�
scCs3tj|�tj|�}}|j||�dS(N(R&R'R(R�(R%RIR'R(((s,/usr/share/inkscape/extensions/gcodetools.pytrotate�
scCs�t|j�dks.t|jd�dkr2dS|dd|dddkrVdSt|�}|d|d}}|j||�|j||�|j|dt�|j||�|j||�dS(Niiig�����|�=tzerro_plane(RPR�R R�t	drop_downRT(R%t	directiontsurfaceR(R'((s,/usr/share/inkscape/extensions/gcodetools.pytdrop_into_direction�
s. c
Cs�g}d}x
|jD]}d\}}}x�tt|��D]}}||d||\}}	\}
}|||
|||
|	7}||	||||
|	7}||||
|	7}q>W|d9}t|�dkr||:}||:}|t|�7}||||gg7}qqW|dkr2ddgSd\}}x:|D]2}||d|d7}||d|d7}qEW||:}||:}||gS(Niig@gi(iii(gg(R�RKRPR�(
R%t	centroidstsaR�RRRIRdRfRgR�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pytcentroid�
s0%






cCs;t|j�dks.t|jd�dkr2dS|j�d}|rZtd|�}n|j�d}|jd||d�d}xx|jD]m}xdtt|��D]P}xG|jD]<}x3tt|��D]}	||d||}
}||	}|
d|dko |dknsM|d|dkoH|
dknr�|
d|dkr�t|d|
d|d|d�}
nB|d|
d|d|
d|d|
d|d|
d}
||
kr�|
}q�n||	d||	}
}||}|
d|dko+|dknsX|d|dkoS|
dknr�|
d|dkr�t|d|
d|d|d�}
nC|d|
d|d|
d|d|
d|d|
d}
||
kr�|
}q�q�q�Wq�Wq�Wq�W|r&|d|kr&d|}n|jd|�dS(Niiii
g�u�<�7~(RPR�R�RwRRKRv(R%R�R�ttoptbottomR�R�Rdtpoly1R�R�R8tvertexR�((s,/usr/share/inkscape/extensions/gcodetools.pyR��
s>.
P*B
P,C
s#075g�������?cCsPg|jD] }tg||dg�^q
}t|d|d|d|�dS(NiR�R�R�(R�RsR�(R%R�R�R�R�RT((s,/usr/share/inkscape/extensions/gcodetools.pyR�s0cCsBt|�tg�kr+|j|7_n|j|j7_dS(N(R�R�(R%tadd((s,/usr/share/inkscape/extensions/gcodetools.pyR�scCs�t}x�|jD]�}x�tt|��D]n}||d||}}||ks`||krdtS|d|dkr�||}}n|d|d|d|d|d|d|d|d}|d|dko�|dknr|dkr|}q�|dkr�tSq)|d|dko>|dknr)|d|dkof|dkns�|d|dko�|dknr)tSq)WqW|S(Nii(RTR�RKRPRl(R%R_tinsideR�RdR�R8R�((s,/usr/share/inkscape/extensions/gcodetools.pytpoint_insides"B(
xc	sJg}x�tt|j��D]�}|j|}g}x�tt|��D]�}||d||}}||g7}x�t|dt|��D]}||d||}	}
t|||	|
�}xH|D]@}t||�dkr�t||�dkr�||g7}q�q�Wq�Wx�tt|j��D]�}
||
kr?q'n|j|
}x�tt|��D]}||d||}	}
t|||	|
�}xH|D]@}t||�dkr�t||�dkr�||g7}q�q�Wq_Wq'WqHW||g7}qWi}xN|jD]C}x:tt|��D]&}t||d�t||�}}t||�dkrjq$ntt}}xf|D]^}t||�dkr�t}|}nt||�dkr�t}|}n|r~|r~Pq~q~Wt||�}|r,|r,|||gg||<|||gg||<q$||kr�x/||D]#}t|d|�dkrCPqCqCWt|d|�dkr�||c|||gg7<q�n|||gg||<||kr4x/||D]#}t|d|�dkr�Pq�q�Wt|d|�dkrJ||c|||gg7<qJq$|||gg||<q$WqWd���fd���fd�}g|_t	g|D]}t||�^q��}d}x|t|�dkr/g}||kr�t
d�n|d7}d}x'|D]}t|t||��}q�W|ddd|ddf|ddg}t}d}xz|d|dkst|r�t}||kr�t
d�n|d7}|||d|�}|}|t|d�g7}qZW|j|g7_t
|g�}x4|j�D]%}|jt|��r||=qqWq�W|jd	d
dd�dS(
Nig���ư>cSst|dkr|dkrdS|dkr8|dkr8dS|dkrT|dkrTdS|dkrp|dkrpdSdS(Niiiii((R(R'((s,/usr/share/inkscape/extensions/gcodetools.pytangle_quadrantsscs||gddgkrtS||gddgkr8tS�||��||�krZtS�||��||�kr|tS|dkr�|dkr�||kS|dkr�|dkr�||kS|dkr�|dkr�||kS|dkr|dkr||kSdS(Nii(RlRT(R(R'tsin1tcos1(R�(s,/usr/share/inkscape/extensions/gcodetools.pyt
angle_is_less{s 


c	sddg}|}|dd|dd|d|dd|dd|dg}x�|D]�}|dd|dd|d|dd|dd|dg}t||�t||�}}�|||d|d�r]||g}|}q]q]W|S(Niii(R6R�(	tedgestlastt	min_angleR-t	last_edgeR_tcurR'R((R�(s,/usr/share/inkscape/extensions/gcodetools.pytget_closes_edge_by_angle�sD
D
is
Hull errorg}Ô%�I�TR�R9R�(g}Ô%�I�Ti(RKRPR�R[RSttupleRTRlR%R�RyRvtlistR�tkeysR�R�(R%thullR�R�tpoly_R�RFR/R�Rgte1RnR_R�tpoly2R�R�Rdtbreak_stbreak_eR�tedgeR�t	len_edgestloopsR7R�t	first_runtloops1R-((R�R�s,/usr/share/inkscape/extensions/gcodetools.pyR�*s�

 
*

* %

		""		)

-
N(R�R�RuR�RR�R�R�R�R�R�RlR�R�R�R�R�(((s,/usr/share/inkscape/extensions/gcodetools.pyR��
s								'		tArangement_GeneticcBsbeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�ZRS(
cCsIg|_t|�|_||_||_d|_d|_d|_dS(Ng�������?g�?(t
populationRPtgenes_counttpolygonsR�tmutation_factortorder_mutate_factortmove_mutate_factor(R%R�tmaterial_width((s,/usr/share/inkscape/extensions/gcodetools.pyR��s					cCs�x�t|�D]s}g}t|j�}tj|�x0|D](}||tj�tj�gg7}q<W|jd|gg7_q
WdS(N(RKR�trandomtshuffleR�Ru(R%R(RdtspecimentorderRi((s,/usr/share/inkscape/extensions/gcodetools.pytadd_random_species�s

&cCs�d}xxt|j�D]g}|||d||d|jd||d||dd||d||dd7}qW|S(Niii(RKR�(R%RWRXRFRi((s,/usr/share/inkscape/extensions/gcodetools.pytspecies_distance2�secCsEd}x.|D]&}|tjt||d��7}q
W|t|�S(Nii(R&RLR�RP(R%RWR�tsimRX((s,/usr/share/inkscape/extensions/gcodetools.pyt
similarity�s
$cCs�|jj�tj|jd�g}|jd=x�t|d�D]�}g}xQtd�D]C}tjdt|j�d�}||j|d|gg7}qZW|j�|tj|j|dd�g7}|j|dd=qAW||_||_dS(Niii(R�RtcopytdeepcopyRKR�trandintRP(R%R(RHRdRRiR�((s,/usr/share/inkscape/extensions/gcodetools.pytleave_top_species�s

"
%	
cCsx|jj�d|_x[t|�D]M}tjd|d�}tjd|d�}||krr|d|}n|j|d|j|d}}d	\}}g}gt|j�D]}	dddg^q�}
d|_d|_|j	||�d|jkr'|jd7_d|_d|_ntjd|j�}t
dtjd|j�t|jd��||j}||kr�||}}||}}nx�t||�D]�}	d}
d}||	d||	d|
||	dd|
||	d|||	dd|g|
|	<|||	dg7}q�Wx�td|�t||j�D]�}	d}
d}|	}x)||d|kr�|d|j}qoW||d||	d|
||	dd|
||	d|||	dd|g|
|	<|||dg7}qTWxIttj|jd|jd|j��D]}	tj�|j
|jkr�tjd|jd�tjd|jd�}}|
|d|
|d|
|d<|
|d<ntj�|j|jkr:tjd|jd�}|
|dtj�tj|jd|
|d<|
|dtj�|jd|
|d<q:q:W|jd|
gg7_q#WdS(
Niigg�?g{�G�z�?g@ii(ii(R�RtincRKR�R�R�tincest_mutation_multiplyert incest_mutation_count_multiplyerR�RwR3tmutation_genes_countR�tmove_mutation_factorR&R2tmove_mutation_multiplierRu(R%R(tparent_countR�tparent1tparent2R�R�tgenes_orderRdR�t
start_genetend_genettrttpRi((s,/usr/share/inkscape/extensions/gcodetools.pytpopulate_speciessX
	#+			9
[&[43022cCs�t�}x�|D]�}tj�}ttj|j|dj��}|j|dtj�|j	�}|j
�d}|j||j	||dd�|j|�|j
|�qW|S(Niii(R�R<R�R�R�R�R�R&R2R�R�RR�R�(R%tspieceR�R_R>R�twtleft((s,/usr/share/inkscape/extensions/gcodetools.pyttest_spiece_drop_down?s	
#$
cCs�tj�}x�tt|j��D]p}|j|ddkr"||j|d�}|j�}|d|d|d|d|j|d<q"q"W|jj�dS(Niiii(R<RKRPR�RuR�R(R%t
test_functionR>RdR�Re((s,/usr/share/inkscape/extensions/gcodetools.pyttestMs4cCs<t|j|ddj�}|j|ddtj�t|j�}x�|dD]�}t|j|dj�}|j�}|j|d|d�|j�}|j|d|d�|j|dtj|dtj�|j|dtj�|j|�|j	|�|j|dtj�qUW|S(Niii(
R�R�R�R�R&R2R�RR�R�(R%RR�R�R_R�R^((s,/usr/share/inkscape/extensions/gcodetools.pyttest_spiece_centroidVs'

cCs�y|dkWnHy$ddlm}ddlm}WqYtjjdd�qYXnXggg}}}x�|jD]�}|j	}|t
|�t
|�t
|�dg7}xe|D]]}|t
|�t
|�t
|�ddg7}x|D]}	||	7}q�W||d7}q�WqwWg}
g}xW|jD]L}|
j|ddkrX|dnd�x|dD]}
||
7}qjWq2Wt
|�t
|�t
|�t
|
�f\}}}}t
d	d
�}|j�}|j�t
dd
�}|j�}|j�tj}d}|t_|j|d
ddddddddg	ddd|�}|dkrutjj|d�n|t_x/tt
|
��D]}|
||j|d<q�WdS(Ni����(tweave(t
converterssUFor this function Scipy is needed. See http://www.cnc-club.ru/gcodetools for details.R�iiis
inline_test.cR"sinline_test_functions.cRCtpoints_tsubpoly_R�tlp_tls_tl_tlt_ttest_tpopulation_tcompilertgcctsupport_codeR�(RutscipyRtscipy.weaveRR�R%R�R�R�RPR�RQR�treadR�RtstdouttinlineRK(R%RRR�RRR�R_R�RMRRRR|RRRRR�tcodeR�tstdout_RFRRd((s,/usr/share/inkscape/extensions/gcodetools.pyttest_inlinehsV	*
.
'6

		!		(R�R�R�R�R�R�R�R
RRRR)(((s,/usr/share/inkscape/extensions/gcodetools.pyR��s	
	
					:				t
GcodetoolscBs�eZed�Zd�Zd�Zd�Zeed�Zeeddded�Z	ee
d	d
�Zd�Zd�Z
d
�Zd�Zed�Zed�Zed�Zed�Zdd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd �Z d!�Z!d"�Z"ed#�Z#ed$�Z$d%�Z%d&�Z&d'�Z'd(�Z(d)�Z)d*�Z*d+�Z+d,�Z,RS(-cCs�|jjdks$|jjdkr�t|j�}||_|jjdkrd|j|jj�n|jjdkr�|j|jj�q�n|s�|j|j|j|_nt	|jj
|jjd�}|j|j�|j
�dS(NRCR(R�t
postprocessortpostprocessor_customRR�R�R�R/R0R�t	directorytfileRR�(R%R�t
no_headersR+R�((s,/usr/share/inkscape/extensions/gcodetools.pytexport_gcode�s$	c#Cs�tddd�}tddd�}tddd�}|jjrm|jjrm|jjrm|jd�dSt|j�dkr�|jjs�|jjr�|jjr�|jjr�d|j_|j	�n|jjs�|jjr�|j
�i|d6|d	6|d
6|jj}|jjdkra|jj|jj
ddtjkra|jd
d�n|jikr�|jjr�|j|_|jtd�d�n|jikr�|jtd�d�n|jj}tddgtj|�tj|�g�}x�|jD]�}||jkr|j|jj|dt�}|j|jj|dt�}	|j|jj|dt�}
|j|jj
|dt�}t|	|ddtj�}	x|j|D]�}|j|tj |j!d���}
t"|
�}
g}x^|
D]V}|jjr�t#|dd|dd�dkr�ddddg}xY|jD]N}t$|g|dd|gdd�}|d|dkr[|}|}q[q[W|d|dkr|dd|dd<|d=ddg}x�t&t|��D]�}||d||d||}}}t#|d|�|dkr�t'||d�t'||d�}}t(|t||�|dg�}q�q�W|j)|d�|ddkr|d|kr|d}|dkr�|d8}n|dkryt*||||d �}qyq||\}}}}t+||d|||�\}}}t*||g|||| ||g�}qq�n|jjr�|dg}xHt,|d|d�D]/\}}|d}t'||d�t'||d�}}t||�|kr�t-|�t-|�}}||j.�|
} t-|d�}!|!| }"||d|d|!||
j/�g|"| j0�dj/�|"j/�|"| j0�dj/�g|!||
j/�|d|dgg7}q�||g7}q�W||g7}|}n|jjrQt*||d|dt|	|�|||d|dt|	|��}n||g7}qW|jj1r�|j2dtj3|j||t���q�t4|dddt5d �q�WqqWndS(!Ng$@cSsj|s=t||d�}tt|d|||�g�dSt||d�}t|d|||�SdS(Ngiig�?(RfRcR$(RWRXR8R�R"R#((s,/usr/share/inkscape/extensions/gcodetools.pytadd_arc�s
%cSs�|sct||d�}|d||dd|d||ddg}tg||dg�St||d�}|d||dd|d||ddg}tg|d|g�SdS(Ngiig�?(RfRs(RWRXR8R�R"R#R_((s,/usr/share/inkscape/extensions/gcodetools.pyt
add_normal�s44cSs�|set||d�}|d||dd|d||ddg}tg||dg�St||d�}|d||dd|d||ddg}tg|d|g�SdS(Ngiig�?(R^Rs(RWRXR8R�R"R#R_((s,/usr/share/inkscape/extensions/gcodetools.pytadd_tangent�s64s�Warning! Extenstion is not said to do anything! Enable one of Create in-out paths or Prepare corners checkboxes or disable Do not add in-out referense point!isin-out reference pointtRoundt
PerpendiculartTangentiisDIn-out len is to big for in-out radius will cropp it to be r*3/2*pi!R�s=No paths are selected! Trying to work on all available paths.s-Nothing is selected. Please select something.g�?gR|R�ii����g�����|�=g}Ô%�I�TR�RUg{�G�z�?g}Ô%�I��i����R�R�R5(6RTR�tin_out_pathtplasma_prepare_cornerst&in_out_path_do_not_add_reference_pointR�RPtin_out_reference_pointstorientation_points_counttorientationR	tin_out_path_typetin_out_path_lentin_out_path_radiusR&R4tselected_pathstauto_select_pathstpathst_t plasma_prepare_corners_toleranceR�R'R(Rttransform_scalartin_out_path_point_max_distRltplasma_prepare_corners_distanceRvtapply_transformsR�t	parsePathtgetRYRSR�RuRKR^RwRQRjR�RRR�R?R�R�t!in_out_path_replace_original_pathtsetR�R�R(#R%R1R2R3tadd_funcRItcorner_toleranceR�R�R�tplasma_lR"R�RTRHRVR�R_R�RMt	max_crossRiRWRXR�RgRhRdRtres_tS1tS2tNtSP2RW((s,/usr/share/inkscape/extensions/gcodetools.pytplasma_prepare_path�s�&
!


%9-$
%$
(%) 

!'2
$
%
":,
	&+cCs�|j}t�}g}tj�}td|�g}x�|jD]�}||krBx�||D]�}tj|jd��}t�}	xK|D]C}
x:t|
|
d�D]%\}}|	j	t
||�g�q�Wq�W|	j�||g7}||	g7}q_WqBqBWtdtj�|�tdt|�t
tg|D].}	tg|	jD]}
t|
�^qJ�^q7��t|�f�tj�}|jj}t||�}td|�tj�}tj�}|jd�tdtj�|�tj�}tj|�}|jj}d	}d
}x\t|�D]N}|jd�tj�d|_d
|_d|_ddg|_|jdd�tdtj�|�|jjr�|j �n|j!|j"�tdtj�|�t#}t�|j$d
d
|kr9t%}||j$d
d
}|j$d
d
d}ntd|tj�|f�tj�}td|j&�t�|d
ks�||dks�|r2dg}|j"|j$d
d�}|j'�}d|ddt(|d�}}|j)||d
||d�|j*ddd|d
�t+d||d|d
|d|d|tj�|f||d�|d7}q2q2WdS(NsArrangement start at %sR�isPaths hull computed in %s sec.s-Got %s polygons having average %s edges each.sGenetic algorithm start at %si2sInitial population done in %si����iiig�������?g�?i�sPopulate done at %ssTest done at %ssCicle %s done in %ss%s incests been foundR;i�i
i�R�R�sBStep = %s
Square = %f
Square improvement = %f
Time from start = %fi(,R@R�R<R
RR�RIRJRRR�R�R�RPR�R�R�R�tarrangement_material_widthR�R�R�R�tarrangement_population_countRKR�R�Rtorder_mutation_factorRRR
tarrangement_inline_testR)RRRTR�RlR�R�R3RR�R�(R%RBR�R�R>toriginal_pathsR�R�RTR�RVRWRXR�R�R�t
start_timetpoptpopulation_countt
last_champtchampions_countRdtdraw_new_champtimprovetcolorsReRaRb((s,/usr/share/inkscape/extensions/gcodetools.pytarrangement]
s�			
 !

e

		
"	# J
"cCs�tjj|�|jjddddddddd	d
dd�|jjd
dddddddd	ddd�|jjddddddddd	tdd�|jjddddddddd	ddd�|jjddddddddd	ddd�|jjd d!dddddd"d	d#dd$�|jjd%d&dddddd'd	ddd(�|jjd)d*dddddd+d	d,dd-�|jjdd.dddddd/d	d,dd0�|jjd1d2dddddd3d	d4dd5�|jjdd6dddddd7d	d8dd9�|jjdd:dddd;dd<d	d=dd>�|jjdd?dddddd@d	dAddB�|jjddCddddddDd	dEddF�|jjddGddddddHd	tddI�|jjddJddddddKd	dddL�|jjddMddddddNd	tddO�|jjddPddddddQd	dRddS�|jjddTdddd;ddUd	dVddW�|jjddXddddddYd	dZdd[�|jjdd\dddddd]d	d^dd_�|jjdd`ddddddad	dbddc�|jjddddddddded	dddf�|jjddgddddddhd	dZddi�|jjddjddddddkd	dZddl�|jjddmddddddnd	doddp�|jjddqddddddrd	d8dds�|jjddtddddddud	dvddw�|jjddxddddddyd	tddz�|jjdd{dddddd|d	d}dd~�|jjdddddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d}dd��|jjdd�dddd;dd�d	d=dd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddd;dd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d=dd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	ddd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	d�dd��|jjdd�dddd;dd�d	d�dd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	ddd��|jjdd�dddddd�d	ddd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	d�dd��|jjdd�dddddd�d	tdd��|jjdd�dddddd�d	tdd��|jjdd�dddd;dd�d	d�dd��|jjdd�dddd;dd�d	d�dd��|jjdd�dddddd�d	tdd�|jjddddddddd	tdd�|jjddddddddd	d�dd�|jjddddddddd	d	dd
�|jjddddddddd	d�dd
�|jjddddddddd	tdd�|jjddddddddd	d�dd�|jjddddddddd	tdd�|jjddddddddd	d�dd�|jjddddddddd	d�dd�idd6dd 6d�d!6d}d"6d#d$6d%d&6d�d'6d(d36dd)6dd*6dd+6dd,6dd-6dd.6dd/6d0d16d0d26d�d36d4d56d6d76d6d86|_dd d!d3d"d$d&d7d'd)d*d+d,d-d.d/d1g|_dS(9Ns-ds--directorytactiontstoreR�tstringtdestR-tdefaults/home/thelpsDirectory for gcode files-fs
--filenameR.s-1.0s	File nameRCs --add-numeric-suffix-to-filenametinkbooltadd_numeric_suffix_to_filenamesAdd numeric suffix to filenames--ZscaleR�tZscales1.0sScale factor Zs	--ZoffsettZoffsets0.0sOffset along Zs-ss--ZsafetZsafes0.5sZ above all obstacless-zs
--ZsurfacetZsurfacesZ of the surfaces-cs--ZdepthtZdepths-0.125sZ depth of cuts--ZsteptZstepsZ step of cuttings-ps--feedR�s4.0sFeed rate in unit/mins--biarc-toleranceR_R4s4Tolerance used when calculating biarc interpolation.s--biarc-max-split-depthR3RPt4sDDefines maximum depth of splitting while approximating using biarcs.s--path-to-gcode-ordertpath_to_gcode_orderspath by paths5Defines cutting order path by path or layer by layer.s--path-to-gcode-depth-functiontpath_to_gcode_depth_functiontzdsPath to gcode depth function.s--path-to-gcode-sort-pathstpath_to_gcode_sort_pathss$Sort paths to reduse rapid distance.s--comment-gcodet
comment_gcodes
Comment Gcodes--comment-gcode-from-propertiestcomment_gcode_from_propertiess.Get additional comments from Object Propertiess--tool-diametert
tool_diametert3s#Tool diameter used for area cuttings--max-area-curvestmax_area_curvest100s!Maximum area curves for each areas--area-inkscape-radiustarea_inkscape_radiust0s9Area curves overlaping (depends on tool diameter [0,0.9])s--area-tool-overlaptarea_tool_overlaps-10s*Radius for preparing curves using inkscapes--unitR?sG21 (All units in mm)tUnitss--active-tabt
active_tabsDefines which tab is actives--area-fill-angletarea_fill_angles'Fill area with lines heading this angles--area-fill-shifttarea_fill_shifts!Shift the lines by tool d * shifts--area-fill-methodtarea_fill_methodszig-zags'Filling method either zig-zag or spirals--area-find-artefacts-diametertarea_find_artefacts_diametersArtefacts seeking radiuss--area-find-artefacts-actiontarea_find_artefacts_actionsmark with an arrowsArtefacts action types--auto_select_pathsRAs(Select all paths if nothing is selected.s--loft-distancestloft_distancest10sDistances between paths.s--loft-directiontloft_directiont	crosswises"Direction of loft's interpolation.s--loft-interpolation-degreetloft_interpolation_degreet2sKWhich interpolation use to loft the paths smooth interpolation or staright.s--min-arc-radiusRVs.1sKAll arc having radius less than minimum will be considered as straight lines"--engraving-sharp-angle-tollerancet engraving_sharp_angle_tollerancet150sTAll angles thar are less than engraving-sharp-angle-tollerance will be thought sharps--engraving-max-disttengraving_max_dists]Distanse from original path where engraving is not needed (usualy it's cutting tool diameter)s--engraving-newton-iterationstengraving_newton_iterationss2Number of sample points used to calculate distances"--engraving-draw-calculation-pathst engraving_draw_calculation_pathss0Draw additional graphics to debug engraving paths!--engraving-cutter-shape-functiontengraving_cutter_shape_functionRs)Cutter shape function z(w). Ex. cone: w. s
--lathe-widthtlathe_widthg$@sLathe widths--lathe-fine-cut-widthtlathe_fine_cut_widthg�?sFine cut widths--lathe-fine-cut-counttlathe_fine_cut_countsFine cut counts--lathe-create-fine-cut-usingtlathe_create_fine_cut_usings	Move pathsCreate fine cut usings--lathe-x-axis-remaptlathe_x_axis_remapR�sLathe X axis remaps--lathe-z-axis-remaptlathe_z_axis_remapR�sLathe Z axis remaps --lathe-rectangular-cutter-widthtlathe_rectangular_cutter_widthsRectangular cutter widths--create-logtlog_create_logsCreate log filess--log-filenameR�s--orientation-points-countR;sOrientation points counts--tools-library-typettools_library_typescylinder cuttersCreate tools definitions--dxfpoints-actiontdxfpoints_actionR�sdxfpoint sign toggles--help-languaget
help_languages4http://www.cnc-club.ru/forum/viewtopic.php?f=33&t=35sOpen help page in webbrowser.s--offset-radiust
offset_radiuss
Offset radiuss
--offset-steptoffset_stepsOffset steps--offset-draw-clippend-pathR=sDraw clipped paths--offset-just-get-distancetoffset_just_get_distances!Don't do offset just get distances--arrangement-material-widthRWi�sMaterials width for arrangements--arrangement-population-countRXids#Genetic algorithm populations counts--arrangement-inline-testRZs:Use C-inline test (some additional packets will be needed)s--postprocessorR+sPostprocessor command.s--postprocessor-customR,sPostprocessor custom command.s--graffiti-max-seg-lengthtgraffiti_max_seg_lengths Graffiti maximum segment length.s--graffiti-min-radiustgraffiti_min_radiuss$Graffiti minimal connector's radius.s--graffiti-start-postgraffiti_start_poss(0;0)sGraffiti Start position (x;y).s'--graffiti-create-linearization-previewt%graffiti_create_linearization_previews&Graffiti create linearization preview.s--graffiti-create-previewtgraffiti_create_previewsGraffiti create preview.s--graffiti-preview-sizetgraffiti_preview_sizei sGraffiti preview's size.s--graffiti-preview-emmittgraffiti_preview_emmitsPreview's paint emmit (pts/s).s
--in-out-pathR7sCreate in-out pathss(--in-out-path-do-not-add-reference-pointR9sJust add reference in-out points--in-out-path-point-max-distRFs+In-out path max distance to reference points--in-out-path-typeR=R4sIn-out path types--in-out-path-lenR>sIn-out path lengths#--in-out-path-replace-original-pathRKsReplace original paths--in-out-path-radiusR?s!In-out path radius for round paths--plasma-prepare-cornersR8sPrepare cornerss!--plasma-prepare-corners-distanceRGsStepout distance for cornerss"--plasma-prepare-corners-toleranceRDs$Maximum angle for corner (0-180 deg)sDefault tooltnamesdefault tooltidtdiametertshapeg�V@spenetration anglegY@spenetration feeds
depth stepgy@sin trajectotrysout trajectotrysgcode before pathsgcode after pathtsogsspinlde rpms	CW or CCWR�stool change gcodes4th axis meanings4th axis scalegs4th axis offsett800spassing feeds	fine feed(	R�tEffectR�tOptionParsert
add_optionRlRTtdefault_toolttools_field_order(R%((s,/usr/share/inkscape/extensions/gcodetools.pyR��
s�11111111111111111111111111111111111111111111111111111111111111111111111111111
c
Cs�g}t|�dkrgS|j||�}tdt|��}dg}x�t|�dkr
||ddd}d}	xjtt|��D]V}
|||
dd}t|d|dd|d|dd|
f|	�}	q�W|||	dg7}||	d=qOWx�|D]|}||}||ddd|dddgdddgg7}x�tdt|��D]�}
gtd�D]2}
||
d|
d||
d|
dg^q�}gtd�D]*}
||
|
d||
|
dg^q�}||dkrt||dd�n4t||||||
d�||||
��7}qrW||ddd|dddgdddgg7}qW|S(Niii����iRiR8(RPt
transform_cspRKRuRwRQ(R%R_R�RR�R�RNR�R8R�RdR7RVRiRWRX((s,/usr/share/inkscape/extensions/gcodetools.pytparse_curve|s.	>

7E=`;R2s#178adeg-����?cCs�|dkr'|j||dt�}n|dkrQ|dkrQ|jj�}n!|dkrr|dkrr|}n|j||dt�}|dkr�t|d|d|�St|d|d|d|d|�SdS(NR|R�R�R3R1R�(RuR�RltdocumenttgetrootRHR�(R%RTR�R�R3R1R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR��s	R;c	Cs�|j�xsddgD]e}tj|d|�|d|<d|d|d<|d|d=tj|d|�|d|<qW|dkrddt|�kr�itjj|j	t
dt|j	�d�tjd	d
�idd6�|6|_
na||j
krTtjj|j	t
dt|j	�d�tjd	d
�idd6�|j
|<n|j
|}nd%\}}|j|�}|gkr�|j|�}tj|�}nddgddgddg}	}
}|
d|	d|d|	d|d|	d|
d|	d}|j|	|t�|j|
|t�|j||t�}	}
}|
d|	d|d|	d|d|	d|
d|	d|dkr�d}
nd}
x�|D]�}|}|j|d|t�t|d�tg�kr%t|d�dkr%|j|d|t�n|d|d<|d<|d
kr�|ddkr�i|dd6d|dd|dd|dd|ddfd6dd6}|gkr�||d<ntjj|tjdd
�|�q�|ddkr�|d7}|d}|d}|d|
|d<t|d�t|�j�t|d�t|�j�tj}	|d|	dkr�|	dkr�|	tj}	q�tj|	}	ntj|d|dd|d|dd�}tj|d|d|d|d�tjdtjd}|d|d}|	dkr[||	}|d|d}n&|d}||	}|d|d}i
|d6t|d�tjdd�6t|d�tjdd�6t|�tjdd�6t|�tjdd�6t|�tjd d�6t|�tjd!d�6d"tjd#d�6dtjd$d�6dd6}|gkrr||d<ntjj|tjdd
�|�q�n|}q�WdS(&Niisbiarc%ss	biarc%s_rsurl(#DrawCurveMarker_r)smarker-starts
marker-endRR�R�s
Preview groupR�RCgg�?i����iR9R�sM %s,%s L %s,%sR�R�R�R�RCiRR�RR�R�R7R8R�R�R�(RCi(R	R
RRRuR
R�R�R�RRvRPR�RRRRRR�RlR�R�R@R&R2RLR1R4R�(R%RR�R�R�RdRFtarcnR�RIReR�RNR�tsktsiR�R|R"R�R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyt
draw_curve�s�
#UR&BAL	
w7

%


E3A




(c	CsY|jjddkrRd|jjkr=|jjd7_qR|jjd7_ntd|jj�tjj|jj�rVtjj|jjd�r�t|jjdd�}|j�|_	|j
�n
td|_	tjj|jjd�r-t|jjdd�}|j�|_|j
�n
td|_|j	|jj
d7_	n|jtd	�d
�tS|jjr�tj|jj�}d|jjkr�tjd|jj�}|jd
�}|jd�}nd}|jj}d}xc|D][}tjdtj|�tj|�f|�}|r�t|t|jd���}q�q�W|dddtt|d��t|d�|}||j_n|jjddkr�d|jjkr�|jjd7_q�|jjd7_ny-t|jj|jjd�}|j
�Wn2|jtd|jj|jj�d
�tSXtS(Ni����t/s\sChecking directory: '%s'R/R"R0s
sODirectory does not exist! Please specify existing directory at Preferences tab!R�RBs^(.*)(\..*)$iiRCis^%s_0*(\d+)%s$RCRiRs#Can not write to specified file!
%s(R�s\(R�s\(R�R-R
tosR�tisdirtisfileR�R$R/R�tdefaultsR0R?R�RCRTRltlistdirR.R R�R�R"RwR3RPR�Rl(	R%R�tdir_listR"textR�tmax_nRFtfilename((s,/usr/share/inkscape/extensions/gcodetools.pyt	check_dirsZ




.%8*c
s��j|��j|d}d}��fd�}d�}t|�dkrUdSy�jdkWnd�_nXtd�t|�|�jkr�|dtjdd|d	�|d
d7}nd�jj	d
|d}}	}
d}d|dd|	g�d}d|d}
x�t
dt|��D]�}||d||}}|d'krf|
nd}|ddkr�||d||d�d|dd7}d}q5|ddkr�|||dd7}d}q5|ddkr�|ddkrmt|dd|dd|dd|dd�}|||�}|d||d|d7}|}n|dkr�|d|dd|dd|g�|
d 7}n|d||d|dd|g�|d7}d}q5|dd!kr5|d"d|dd|d"d|ddg}|ddkr4|d#dkr�t|d"d|dd|d"d|dd�tj
}n?t|d"d|dd|d"d|dd�tj
}|||�}|d||d|d7}|}d$||d#|d|d}||d#}nd}|dkrz|d|dd|dd|g�|
d 7}n|dd"|dd"�jjd"kr�t|d�t|d"�t|d�t|d"�}}t|j�|j��d%kr�||d#dkrdnd||d|dd||d"d|dd|d"d|ddg�||d7}no|j�|j�d"}||d#dkr�dnd||d|dd|g�d&|||d7}d}q�|ddkr}t|dd|dd|dd|dd�tj
}|||�}|d||d|d7}|}n|d||d|dd|g�|d7}d}q5q5W|ddkr�|||dd7}n|S((NiRCcs:gtd�D](}|t|�kr/||nd^q
}|ddkrXd|d<ndddddd	gd
d
d
d
d
d
g}}dd�jj�dd�jj�gdd�jjdddg}}d
}xYtd�D]K}||dkr�|||d||||||||7}q�q�W|S(
Niiis Xs Ys Zs Is Js KRCis%f(RKRPRuR�RmRn(R�RdRFRgR�RIR"(tZauto_scaleR%(s,/usr/share/inkscape/extensions/gcodetools.pyR�Gs;
1K9cSs�tt||tjtj�|||tjtjgt||tjtj�|||tjtjgt||tj�|||tjg�dS(Ni(RvR�R&R2(RIt	current_a((s,/usr/share/inkscape/extensions/gcodetools.pytcalculate_angleRs77sworking on curves(Change tool to %s)
s"'\(\)\\R�R�stool change gcodes
tG00s F%fR�s F%sspenetration feeditG01tG02tG03Rsgcode before pathR8sgcode after pathR9s4th axis meanings
tangent knifesG01 A%s
s4th axis scales4th axis offsetis(Penetrate)
RCiis A%sg����MbP?s R%f(R�R�R�(R�ttoolsRPtlast_used_toolRuR
R R$R�RoRKR1R&R4RVR�R�R>(R%RR�R�ttoolR�R�R�tlgtzsR�R�tgo_to_safe_distancetpenetration_feedRdRFR�R�RIR"R�taxis4R6R7((R�R%s,/usr/share/inkscape/extensions/gcodetools.pytgenerate_gcodeBs�
	


0",		7	43	4B?"4*="~U	>	3
cCs�|jj�}g}x}||kr�d|j�kr�|jd�}tj|�}|gkrrtj||�n|}t|�n|j�}qW|S(NR�(	R�R�R�RJRtparseTransformtcomposeTransformR
t	getparent(R%R�R�ttransR((s,/usr/share/inkscape/extensions/gcodetools.pyR�s$
cCs_tj|dddgg�}tjj|�dkrWtjj|�j�d }|S|SdS(Niii(tnumpytarraytlinalgR�tinvttolist(R%R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR�s
cCsT|j|�}|gkrP|s4tj||�qPtj|j|�|�n|S(N(RRtapplyTransformToPathR(R%R�RTR|R�((s,/usr/share/inkscape/extensions/gcodetools.pyRH�scCs:|j|dg||�d|jddg||�dS(Ni(R�(R%RaR�R|((s,/usr/share/inkscape/extensions/gcodetools.pyRE�scCs'||jkr�x@t|jj|�dd�D] }|j||jkr.Pq.q.W|j||jkr�|jtd�|jtj	dd��d�ns|j||jkr�|j|j||j|<|j
|j||j
|<n$|j|}t|j|�dkrA|jtd�|jtj	dd��d�n|j|d	}t|�d
kr8||dd	d|d	d	d|d	d	d	|dd	d	|d	d	d	|d	d	dg|ddd|d	dd|d	dd	|ddd	|d	dd	|d	ddggg7}nt|�dkr�td|jtj	dd���x|D]}t|�qtWt
|d	dd
|ddd
�t|d	dd
|ddd
�g|j
|<tj|d	d	d	|d	d	ddd	d	d	d	d	d	g	d	d	d	|d	d	d	|d	d	ddd	d	d	g	d	d	d	d	d	d	|d	d	d	|d	d	ddg	|dd	d	|dd	ddd	d	d	d	d	d	g	d	d	d	|dd	d	|dd	ddd	d	d	g	d	d	d	d	d	d	|dd	d	|dd	ddg	|d
d	d	|d
d	ddd	d	d	d	d	d	g	d	d	d	|d
d	d	|d
d	ddd	d	d	g	d	d	d	d	d	d	|d
d	d	|d
d	ddg	g	�}tjj|�d	kr�tjj|tj|d	dd	g|d	ddgdg|ddd	g|dddgdg|d
dd	g|d
ddgdgg	��j�}	gtd�D]5}
gtd�D]}|	|
d|d	^q�^q�|j|<q
|jtd
�d�n|jtd
�d�tjj|j|�j�|j|<td|jtj	dd���t|j�t|j�d|j|<td|j|�n|d	|d}}|s�|j|}
n
|j|}
|
d	d	||
d	d||
d	d
|
dd	||
dd||
dd
gS(Ni����skOrientation points for '%s' layer have not been found! Please add orientation points using Orientation tab!tlabeltinkscapetno_orientation_pointsis>There are more than one orientation point groups in '%s' layert&more_than_one_orientation_point_groupsiiisLayer '%s' Orientation points: s�Orientation points are wrong! (if there are two orientation points they should not be the same. If there are three orientation points they should not be in a straight line.)twrong_orientation_pointss%
 Layer '%s' transformation matrixes:s>Z automatic scale = %s (computed according orientation points)(ttransform_matrixRKRtindextorientation_pointsR�RCRJR�R�tZcoordinatesRPR
RwRvR�R�R�R�tsolveR�R�ttransform_matrix_reverseR�(R%tsource_pointR�R|Rdtorientation_layerRRMtmatrixR�RiRaRbR((s,/usr/share/inkscape/extensions/gcodetools.pyR��s`%2
2�#
U66666666?�R&#



cCsgtt|��D]_}gtt||��D]<}|||d|||d|||dg^q0^q}x�tt|��D]y}xptt||��D]X}xOtt|||��D]3}|j||||||�||||<q�Wq�Wq�W|S(Niii(RKRPRR�(R%tcsp_R�R|RdRiRTRN((s,/usr/share/inkscape/extensions/gcodetools.pyR�sx!9tWarningcCsd}d}d}t|�}|j�tjd|j��krjt|�tj|d�tj�n�|j�tjd|j��kr�t|�tj|d�nR|j�tjd|j��kr�t|�n!t|�tj|�tj�dS(NsNote s�
						Warning tools_warning
						orientation_warning
						bad_orientation_points_in_some_layers
						more_than_one_orientation_point_groups
						more_than_one_tool
						orientation_have_not_been_defined
						tool_have_not_been_defined
						selection_does_not_contain_paths
						selection_does_not_contain_paths_will_take_all
						selection_is_empty_will_comupe_drawing
						selection_contains_objects_that_are_not_paths
						Continue
						s�
						Error 	
						wrong_orientation_points	
						area_tools_diameter_error
						no_tool_error
						active_layer_already_has_tool
						active_layer_already_has_orientation_points
					s	[\s
,\.]+s
(	R�R�R RER
R�RRtexit(R%RFttype_tnotestwarningsterrors((s,/usr/share/inkscape/extensions/gcodetools.pyR�s $

$
$


cCs�|j�d|jkr�tjj|jj�tjdd��}tjj|tjdd�idd6dd6dd	6d
d6dd
6�}tjj|tjdd�idd6dd
6�nd|jkrptjj|jj�tjdd��}tjj|tjdd�idd6dd6dd	6d
d6dd
6�}tjj|tjdd�idd6dd
6�nd|jkr#tjj|jj�tjdd��}tjj|tjdd�idd6dd6dd	6d
d6dd
6�}tjj|tjdd�idd6dd
6�nd|jkr�tjj|jj�tjdd��}tjj|tjdd�idd6dd6dd	6d
d6dd
6�}tjj|tjdd�idd6dd
6�ndS(NtCheckToolsAndOPMarkertdefsR�tmarkerR�tautotorients-4trefXs	-1.687441trefYsoverflow:visibleR�R�sc	m -4.588864,-1.687441 0.0,0.0 L -9.177728,0.0 c 0.73311,-0.996261 0.728882,-2.359329 0.0,-3.374882R�s,fill:#000044; fill-rule:evenodd;stroke:none;tDrawCurveMarkersbm -4.588864,-1.687441 0.0,0.0 L -9.177728,0.0 c 0.73311,-0.996261 0.728882,-2.359329 0.0,-3.374882tDrawCurveMarker_rRssbm 4.588864,-1.687441 0.0,0.0 L 9.177728,0.0 c -0.73311,-0.996261 -0.728882,-2.359329 0.0,-3.374882tInOutPathMarkers,fill:#0072a7; fill-rule:evenodd;stroke:none;(tget_defsR�R�R�R�R�R�R�(R%R�R�((s,/usr/share/inkscape/extensions/gcodetools.pyR	=s2
*G
*G
*G
*G
cs2i�_��fd����jj��dS(Ncs�x{|D]s}|jtjdd�krRx'|D]}|�j|jd�<q/Wn|jtjdd�kr�|�qqWdS(NR�R�R�R�(R�R�R�R�RJ(R�RdRi(t	recursiveR%(s,/usr/share/inkscape/extensions/gcodetools.pyRhs

(R�R�R�(R%((RR%s,/usr/share/inkscape/extensions/gcodetools.pyRfs	cs
i�_i�_i�_i�_i�_�jj�g�_i�_i�_	i�_
i�_g�_d�_t��fd����jj��jj��t�j�dkr��jtd�d�n�jj�}|�jks|�jkr �jtd�d�n|�jkr��jd�jkrj�j�jdc�j|7<n�j|�j�jd<�j|=n|�jkr�jd�jkr��j�jdc�j|7<n�j|�j�jd<�j|=ndS(Nc

s�|j�}|j�xn|D]f}|rB|�j|jd�<n|jtjdd�kr�|jtjdd��dkr�|jtjdd��dkr�|�_q��j|g7_�||�q|jd	�d
kr��j	|�}|dkr^|�jkr!�j||gn|g�j|<td|jtjdd��|f�q��j
td�|jtjdd��d
�q|jd	�dks�|jd	�dkr4�j|�}|�jkr��j||j�gn|j�g�j|<td|jtjdd��|f�q|jd	�dkr��j|�}|gkr�|�jkr��j||gn|g�j|<q��j
td�|jtjdd��d
�q|jtjdd�kr�d	|j�kr�|�jkr�j||gn|g�j|<|jd��jkr~|�jkrh�j||gn|g�j|<q~q�q|jd	�dkr|j�}|j�x�|D]X}	|	jd	�dkr��jj�j|	tj|	jd���ddd�q�q�Wq|jtjdd�krR�|||jd��jk�q|jd��jkr�j
td�d�qqWdS(NR�R�R�t	groupmodeR�R�R�t3DR�sGcodetools orientation groups*Found orientation points in '%s' layer: %ssVWarning! Found bad orientation points in '%s' layer. Resulting Gcode could be corrupt!t%bad_orientation_points_in_some_layerssGcodetools tool definitionsGcodetools tool defenitionsFound tool in '%s' layer: %ss#Gcodetools graffiti reference points\Warning! Found bad graffiti reference point in '%s' layer. Resulting Gcode could be corrupt!R�sIn-out reference point groupsIn-out reference pointR�iis:This extension works with Paths and Dynamic Offsets and groups of them only! All other objects will be ignored!
Solution 1: press Path->Object to path or Shift+Ctrl+C.
Solution 2: Path->Dynamic offset or Ctrl+J.
Solution 3: export all contours to PostScript level 2 (File->Save As->.ps) and File->Import this file.t-selection_contains_objects_that_are_not_paths(tgetchildrenR|tselectedRJR�R�R�t	my3DlayerRtget_orientation_pointsRuR�R
R�RCtget_toolR�R�tget_graffiti_reference_pointstgraffiti_reference_pointsR�RBR@R:RQRHR�RI(
R�R�RRRdRR�RMtitems_Ri(trecursive_searchR%(s,/usr/share/inkscape/extensions/gcodetools.pyR�sP

<!5,2*?,723<

D%isPDocument has no layers! Add at least one layer using layers panel (Ctrl+Shift+L)tErrorsrWarning! There are some paths in the root of the document, but not in any layer! Using bottom-most layer for them.t
tools_warningi����(R@RBR�R�RR�R�RR�R�R�R�R:RuRRTRPR�RC(R%R�((RR%s,/usr/share/inkscape/extensions/gcodetools.pytget_infows:											8%
%cCs||j�}|j�gg}}d}x�|D]�}|jtjdd�krv|jd�dkrv||g7}n|jtjdd�kr0|jd�dkr0||g7}q0q0Wt|�dkr�|}nt|�dkr�|}n|dkrdSg}x|D]}ggg}x�|D]�}	|	jd�dkrx|j|	t	j
|	jd	���d
d
d|d
<n|	jd�dkr&tjd
t
|	��}
t|
jd��t|
jd��t|
jd��g|d<q&q&W|d
gkr
|dgkr
||g7}q
q
Wt|�t|�koCdknspt|�t|�kokdknrt|SdSdS(NR�R�R�s'Gcodetools orientation point (2 points)s'Gcodetools orientation point (3 points)iis"Gcodetools orientation point arrowR�iis!Gcodetools orientation point textsd(?i)\s*\(\s*(-?\s*\d*(?:,|\.)*\d*)\s*;\s*(-?\s*\d*(?:,|\.)*\d*)\s*;\s*(-?\s*\d*(?:,|\.)*\d*)\s*\)\s*(RR|RuR�R�R�RJRPRHR�RIR R�R�R�R�(R%R�RRURVR_RdRRMR�R"((s,/usr/share/inkscape/extensions/gcodetools.pyR	�s:


00		

7G PcCs�gdg}x�|D]z}|jd�dkre|j|tj|jd���ddd|d<n|jd�dkrt|�|d<qqW|dgkr�|ddkr�|SgSdS(NRCR�s)Gcodetools graffiti reference point arrowR�iis(Gcodetools graffiti reference point text(RJRHR�RIR�(R%R�RMR�((s,/usr/share/inkscape/extensions/gcodetools.pyR�s
7 cCs�|jj�}||d<x�|D]�}|jd�dkrZtj|jd��|d<q |jd�dkr d}d}x�|D]�}|jd�dks�|jd�dkr�t|�}n|jd�dks�|jd�d	kr�t|�}|d
krd}qq�q�W|dks |dkr1q n||jj�kr�y!t|j|�|�||<Wq�|j|||<|j	t
d�|||j|fd
�q�Xq�|||<|j	t
d�||fd
�q q W|S(Nt
self_groupR�sGcodetools tool backgroundR�sGcodetools tool parameters%Gcodetools tool definition field names$Gcodetools tool defention field names&Gcodetools tool definition field values%Gcodetools tool defention field values(None)RCshWarning! Tool's and default tool's parameter's (%s) types are not the same ( type('%s') != type('%s') ).RsEWarning! Tool has parameter that default tool has not ( '%s': '%s' ).(R�R�RJR
RRuR�R�R�R�RC(R%R�R�RdtkeyR�Ri((s,/usr/share/inkscape/extensions/gcodetools.pyR
�s4


**!1
'cCsx@t|jj|�dd�D] }|j||jkrPqqW|j||jkr�|j||kr�|j|j||j|<nt|j|�dkr�|jtd�|j|jtj	dd��d�n|j|S|jtd�|jtj	dd��d�dS(	Ni����is'Layer '%s' contains more than one tool!R�R�tmore_than_one_toolsHCan not find tool for '%s' layer! Please add one with Tools library tab!t
no_tool_error(
RKRR�R�RPR�RCRJR�R�(R%R�Rd((s,/usr/share/inkscape/extensions/gcodetools.pytset_tools%9c%
sL	ddlm}d��d��d�����fd�}d���fd�}��fd	�}tid
tjdd�6d
tjdd�6�fd�}�jikr��jjr��j}�j	t
d�d�n	�j}�j�d}tjj
t�jj��dkr2�jj�dn
�jdtjdd��}td�jf�td|f�i}	x��jD]���|kr�td�f��jddgddgddggddgddgddgggg���j��g}
g}y#td�jjjd��}Wn�j	d�nXx�|�D]}}
d|
j�kr��j	t
d�d�qSntj|
jd��}�j|
|�}|
jd�}d�}�jjdkr#tjd ||d!|
��jj�}|jd"d#�}t|�}nd}�jj rs||
�}x/|D]$}|td$|||f�7}qHWnt!j"|
jd%��}t!j#d&|kr�|d&d'kr�|d&nd(�|	|<|
jd)�d*krA�j|��}|dddd}|dddd+}td,||f�|||gg7}qS�j$�d+�j$�d}}d-t%t&|	|��d.d/}|
|||||�|gg|D]}�j'|g��^q�gg7}
qSW||�}|||�7}x3|
D]+}x"|d+D]}�j(|��qWq�W�jj)d0kr�g}x<|
D]4}|g|d+D]}|d|gg^qY7}qEW|}
d1�j_)n�jj)d1kr'�jj*r�|g|
D]}|d+^q��}nt+t|
��}xI|D]1} |
| dd+}!xt+dt,t-j.t/||!�j0�dd2����D]�}"t1|!|t/�j0�dd2|"d+��}#|td3|
| dd�7}|
| dd4d5kr�||
| dd47}nx/|
| d+D]}|�j2|�|#�7}q�W|td6|
| dd�7}qCWq�Wq7	t3g|
D]}|dd+^q1�}$x�t+dt,t-j.t/||$�j0�dd2����D]�}"|t/�j0�dd2|"�}#g}x2|
D]*}|dd+|#kr�|j4|�q�q�W|t/�j0�dd2|"d+�}#|d7|#7}�jj*rU|g|D]}|d+^q9�}nt+t|��}x�|D]�} |td8|
| dd�7}|
| dd4d5kr�||
| dd47}nxD|| d+D]4}|�j2|�t1|#|| dd+��7}q�W|td6|
| dd�7}qnWq�Wq�q�W�j5|�dS(9Ni����(tpartialcSs�d\}}}}ggggg}x~|D]v}||dkrW|dc|g7<n|dkss|d|kr�|d}|g|d<n||dkr�|dc|g7<n|dks�|d|kr�|d}|g|d<n||dkr|dc|g7<n|dks+|d|krE|d}|g|d<n||dkrk|dc|g7<n|dks�|d|kr+|d}|g|d<q+q+W|S(Niiii(NNNN(Ru(RRxRyRzR{toutR_((s,/usr/share/inkscape/extensions/gcodetools.pytget_boundaries/s0




cSs�d}g}xs|D]k}x@t|t|��D])}|||kr/ddg||<q/q/W|ddgkr||g7}qqW|d7}|S(Nii(RRPRu(RRdRR_Ri((s,/usr/share/inkscape/extensions/gcodetools.pytremove_duplicatesMs

cSsyd}xltdt|��D]U}|tj||d||ddd||d||ddd�7}qW|S(Niii(RRPR&RL(RR�Rd((s,/usr/share/inkscape/extensions/gcodetools.pytget_way_lenXsSc	s$�|�}ddgddgddgddgddgddgddgddgg}g}d}d}x�|D]�}|}g}xZtdt|��D]C}��|�|d�|d}	|j|	d�||	7}q�W�|�}
|dks|
|krs|
}|}|}qsqsW|S(Niiii(RuRRPRm(Rtwaystminimal_waytminimal_lentminimal_way_typeRttpointstcwRiR_tcurlen(RRR(s,/usr/share/inkscape/extensions/gcodetools.pytsort_dxfpoints_s2							
"
cSs
t|�dkrgSgtt|��D]}|g||^q)}dg}|dd}td|d|�|d=x�t|�dkrgtt|��D]&}t|||dd!�|g^q�}t|�d}|j||d�||d}||=qzW|S(Niis!!!s
i(RPRKR
RSRvRQ(tlinesRR�t	end_pointRdR�((s,/usr/share/inkscape/extensions/gcodetools.pyt
sort_lines�s0	?csJg}x7|D]/}||ddd|dddg7}q
W�|�S(Nii����((tcurvesR$R(R&(s,/usr/share/inkscape/extensions/gcodetools.pytsort_curves�s
-c
sld}x_|D]W}|d�jj|d|d�j�d�j�ddd�jjf7}q
W|S(NRCsD(drilling dxfpoint)
G00 Z%f
G00 X%f Y%f
G01 Z%f F%f
G04 P%f
G00 Z%f
iispenetration feedg�������?(R�RoR�R�(RR�RM(R�R%(s,/usr/share/inkscape/extensions/gcodetools.pytprint_dxfpoints�s
UtDescriptiontdescR�tTitlettitlecs�i}t}�jj�}xf|r�||kr�x@|j�D]2}|j|krj|j|||j<nt}q>W|j�}qW|S(N(RTR�R�RR�R�RlR�(R�RttagsRHtdoneR�Rd(R%(s,/usr/share/inkscape/extensions/gcodetools.pytget_path_properties�s
s=No paths are selected! Trying to work on all available paths.R�RCiR�sself.layers=spaths=R�slambda c,d,s: R�s@Bad depth function! Enter correct function at Path to Gcode tab!R�svWarning: One or more paths do not have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!RR�cSs9|jd�|j�kr1|j|jd��SdSdS(NiRu(R�R�RJ(R�R�((s,/usr/share/inkscape/extensions/gcodetools.pytset_comment�ss\[([A-Za-z_\-\:]+)\]R�s	:newline:s
s%s: %sR�R1R2s#000tdxfpointR4is got dxfpoint (scaled) at (%f,%f)g�?i�issubpath by subpathspath by paths
depth steps
Start cutting path id: %sis()sEnd cutting path id: %s

s
(Pass at depth %s)
sStart cutting path id: %s(6t	functoolsRRlR�R�R@R�RARBR�RCR�R�R�RPR�RR
R�RR�RuR�R�RIRJRHRxR R$R�RJRyR
Rt
parseColorR�R�R�R�R�RtRwRKR3R&tceilR�R�RwR�RvRQR0(%R%RR#R(R)R0RBR�tbiarc_groupRcR't	dxfpointst
depth_funcR�RTtid_R1R�R.R�R�t	tmp_curveRaRbRvR�R�RVRRwtcurves_R�RR�tstepR�tmind((RRR�RR%R&s,/usr/share/inkscape/extensions/gcodetools.pyt
path_to_gcode-s�			#	;		
VO
#	'
%9#"3

2&
B0 +'B#
'&
 2/cCsb|jikr(|jtd�d�nx3|jD](}||jkr2x|j|D]�}|jjdkr�|jdd�tjd|j	d��}|dkr�td|jd	�f�|jdd
|jd	��|jdt
d�q�n|jjd
kr|jdd�n|jjdkrU|j	d�dkrU|jdd�qUqUWq2q2WdS(NsfNothing is selected. Please select something to convert to drill point (dxfpoint) or clear point sign.R�R�R2R4s
^\s*.\s*(\S+)R�s	got path=is�m %s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 zR�RAtsavetclearR(R@R�RCRR�R�RLR R�RJRuR
R�R(R%R�R�R"((s,/usr/share/inkscape/extensions/gcodetools.pyR77s 'cCs1|jikr=|jjr=|j}|jtd�d�n	|j}x�|D]�}x�||D]�}|j�}d|j�kr�|jd�nd}d|j�kr�|jtd�d�q^nt	j
|jd��}g}x�tt|��D]�}g||D] }	g|	D]
}
|
^q^q}|j
||g�d}t|g�}|d	|dd	|d
|dd	|jjd	kr�|jjdkr.t	j
d
|ddd|dddf�}
|j
||
t�}
tjj|tjdd�it	j|
�d6tdd6dd6�q�|jjdkr�tjj|tjdd�it	j||�d6tdd6�|j|�q�|jjdkr�|j|�td|�q�q�q�W|j�x|D]
}||=q�Wt|�dkr|j|�q^|jdt	j|��q^WqMWdS(Ns=No paths are selected! Trying to work on all available paths.R�R�RCR�svWarning: One or more paths do not have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!Riiiismark with an arrows�m %s,%s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 zR�R�sarea artefact arrowR�smark with styles
area artefacttdeletesDeleted artefact %s(R@R�RARBR�RCR�R�RJR�RIRKRPRHR}R�R�RlR�R�R�R�R�RRQR
R|RmRL(R%RBR�R�tparentR�RTRmRdRRMRVR�R�((s,/usr/share/inkscape/extensions/gcodetools.pytarea_artefactsVsN		
'1:1A


!cCsFt|j�dkr/|jtd�d�dSx|jD]}||jkr9|j|�|j|dddkr�|jtd�|jtj	dd��d�nx�|j|D]�}t
d	|jd
�|jd�f�tjj|j
�tj	dd
��}|jd�}t
|�|dkrSt
d�|jtd�d�q�ntj|�}|jtj	dd��dkrMt
d|jd��t|�d\}}}}	}
|td�kr�||}||=|	}|
d,kr�|
dkr|d}n|dd|dd|dd<|dd<||d||d||dgg||d|| ||d||d||dgg}n�t||d|||
�\}
}}|dd|dd|dd<|dd<|d|d|dgg|g||d||d |
g|d|d|dgg}|g|}t|d�r�xhtt|��D]Q}g}x7||D]+}|d|d|dgg|}q�W|||<q�Wq�ntj|�}t
d|f�tjdd|�}tjdd|�}tjdd |�}t
d!|f�n|jddg|�}|jddg|�}t|�t|�j�}|dkr�d"}n
d"|}t
|�|j|dd|}|jj|}|dkr�dnd}t
d#||f�|jjd$kr8d$|j_nx�t|jj�D]�}||d|jjd%|}t |�t |�kr�|}ntjj|tj	d&d
�idtj	dd�6t!|�tj	d'd�6|tj	d(d�6t"d)d*d
6�t
d+||t"d)d*f�||krKPqKqKWq�Wq9q9WdS(-Nis3This extension requires at least one selected path.R�R�sCTool diameter must be > 0 but tool's diameter on '%s' layer is not!R�R�tarea_tools_diameter_errors
doing pathR�R�R�R�somitting non-pathsWarning: omitting non-pathRR�R�sinkscape:offsets.Path %s is not an offset. Preparation started.R�is-infi����isoriginal  d=s
(?i)(m[^mz]+)s\1 Z s(?i)\s*z\s*z\s*s Z s(?i)\s*([A-Za-z])\s*s \1 sformatted d=g�?sTool diameter = %s, r = %sg�������?g�?R�tradiustoriginalR>R:sadding curve(ii(#RPR@R�RCRRR�RJR�R�R
R�R�R�RuR�RIR[R�R�R�RKR�R R$R�R�R>R�R~R�R|R�R�R(R%R�R�t
area_groupR�RTtmin_xtmin_ytmin_itmin_jtmin_ttsubpRiRWRXR�RdR#RR�R�ttool_dR"tsignRE((s,/usr/share/inkscape/extensions/gcodetools.pyR:�s�
2%'

!

-i'-`
)	

!

c
sHd�fd��x/|jD]$}||jkrx|j|D]�}|jd�}|dkr�td�|jtd�d�q?ntj|�}|j	||�}|j
||�}g|D]#}g|D]}|d^q�^q�}|jg|D](}g|D]}|||g^q^q�|�x|D]}t|�dkr/|d|dgg}	x�t
||d|d�D]�\}
}}t|
d|d|
d|d�t|d|d|d|d�}
}t|
|�tkr|	||gg7}	qy|	d	j|�qyWx|	D]}t|�qWq/q/Wq?WqqWdS(
Nic's!�fd�}ttd�ttd�}}ttd�|ttd�|||}}}|j�|j�|j�}}	}
|j�tkr�|j�tkr�tddddtdttgggS|j�tkr||j�}|j�|j�d}nZ|j�tkrZ||j�}d|j�|j�d}n|j�|j�}|j�|j�}}||	t	j
tkp�t	j
||	t	j
tk}|rO|j�tks(|j�tks(|j�tks(dt|||j�|j��tkrOtddddtdttgggS||d||||d|||d}
}}|j�dkr�|tttt|�St|�d
kt|�dkt|
�dk}}}|r|dkr|
|}n�|r'|dkr'||}n�|s�||d||
}|dkrgt
|||
|f�n|d	}||d|}||d|}||dkr�t
|||
|||f�nt||�}n"|r�|r�|tttt|�S||}||}|||}|||}||||||}d
�}||||�\}}||||�\} }!|dks�| dks�||j�tks�| |j�tkr�tddddtdttgggSttt||||g||| |!g�}"|"tjkrH|tjkrH|tttt|�S| j�|!dkrgt}#nJtttt|j�|�t| j�|!�t|j�|�}#||j�}$|$tdks�|$td|j�dkr tdddd|j|jgt|#gg}%n:tdd|j|jg||j|jgt|#gg}%||j�}$|$tdks�|$td| j�dkr�|j|jgddd|j|jg|#tgg}&nB|j|jgd| j| jg|!|j|jg|#tgg}&|%|&gSdS(Nc	s�|tjkr�t||�\}}}t||�t||�}}||dkr_|}n||||||}�|||||d��|||||d�S|dddd|d||gggSdS(NiiR9(R�RPR�R(	RWRXRRRSR�R�RR�RT(RQ(s,/usr/share/inkscape/extensions/gcodetools.pyRU�s	4iiiR9i
i����ig�?c		Ssn||d}||j�dkr(dS|||j�d||j�||j�}||j�dtj||j�dtj||j�dtj}}}||dtj}||kr�||ks||ks||ko�|knrdtj|}nt|j�dks\t|j�dks\||jt	j
dkr`dS||fSdS(Niii����i@B(NN(NN(R>RuR?R@R&R4R�RaRbR�RV(	RDRWRERXRYRZR[R\R,((s,/usr/share/inkscape/extensions/gcodetools.pyR]*s4S@DidRCg�����|�=g�����|�=g�����|�=(R�RWRXR@R>R^RRRSR?R&R4RBR�RyRwRuRKR�R_RPR�R`RaRb('tsmR�RURDRaRbRcR]RdReRfR"RgR�ReRIRhRiRjRkRlRmRnRoR,RpRWRqRER]RrR�RsR�R�RTR�RHRI(RQ(s,/usr/share/inkscape/extensions/gcodetools.pyRQ�s�	!5&$'!56.'88


	D'-	J.1:.9BR�somitting non-pathsWarning: omitting non-pathRiii����(RR@RJRuR
R�RCR�RIRHR�R�RPRRR R�RNRQtsmooth_polyline_to_biarc(R%R�R�R�RTRVRMR�R�tsmoothR�RURVRgRhRP((RQs,/usr/share/inkscape/extensions/gcodetools.pytpolyline_to_biarc�s0d
0?
*O
c(Cs9
|jjtjd|j_t|j�dkrL|jtd�d�dSx�	|jD]�	}||jkrV|j	|�|j
|dddkr�|jtd�|jtj
dd��d	�n|j
|d}xX	|j|D]F	}g}td
|jd�|jd�f�tjj|j�tj
d
d��}|jd�}|dkr}td�|jtd�d�q�ntj|�}|j||�}t|�}|j||�}|jj}g|D]�}	g|	D]q}
g|
D]^}|dtj|�|dtj|�|dtj|�|dtj|�g^q�^q�^q�}t|�}
ddddg}xrtd�D]d}|
|d|
|d|
|d}}}t|||d||||�|d||<q�W|dd|jj}|dkr%|jdd�dS|gg7}|jjdkrG|d|jj|}t }t }x�||dks�|rC||dkr�t!}n|dgkr�|dc||dgg7<n|r|dc||dg|||dgg7<n.|dc||dg|||dgg7<|}||7}qkWn|d|d|jj||d|d|jj|}}|d|jj||d|jj|}}|dc||gg7<d}t }x�|dkr�|dkr�|dd}|dkr*||8}||8}nx|dkr\||7}|sS||8}nt!}nF|dkr||7}||8}n#|dkr�||8}||8}n|dc||gg7<q�W|dd}|dkr|dkr|dkr�||n||}n|dkrC|dkrC|dkr6||n||}n|dc||gg7<|jj}g|D]q}	g|	D]^}|dtj|�|dtj|�|dtj|�|dtj|�g^q|^qo}|ddgg}i}xRt"|d|dd�D]5\}}g} |d|dkr\|d|dkr\qnxtt|��D]k}xbtdt||��D]G}|||d|||}!}"t#|||!|"�}#x|#D]}t$t|!|"|��}$|d|dkr)|$d|d|d|d}%n"|$d|d|d|d}%d|%kobdknr�| |%|$d|$d|||gg7} |$|kr�||$c|||gg7<q�|||gg||$<q�q�Wq�WqoW| j%�xM| D]E}|dc|d|dgg7<||d|dggg7}q�W|dc|g7<d}qWt|�x�|t|�kr�	||d||d}}|d|dd|d|ddg}$t&|$|�s�	||=qb	|d7}qb	W|jjdk}&t'|�}'|j|'|t �}'|j(|'d|�q�WqVqVWdS(Ni�is3This extension requires at least one selected path.R�R�sCTool diameter must be > 0 but tool's diameter on '%s' layer is not!R�R�RDs
doing pathR�R�R�R�somitting non-pathsWarning: omitting non-pathRigiiis&Tools diameter must be greater than 0!R�szig-zagi����tspiralR�()R�R�R&R4RPR@R�RCRRR�RJR�R�R
R�R�R�RuR�RIRHRtR�R'R(R[RKR]R�R�R�RlRTRRR\R�RRsROR�((R%R�R�R�R$RGR�RTRIRVR|RMtrotated_pathR�ReRNRdRiRR"R�tlast_oneRR�RaRbtstageR7t
splitted_lineR�RR�tintsRWRXR�R_R�tdo_not_change_ordertcsp_line((s,/usr/share/inkscape/extensions/gcodetools.pyt	area_fill~s�
2%'

�,6
	 1.A1



	



##~(( !
%"'%

!"

,
cGs)da�fd�}d��d����fd����fd����fd��d�}���fd	�}d
}dX\�}}dY\}}}	}
g}g}t�j�dkr��jtd�d
�dS�j�s�dSd}
�jjdkrd}
n+�jjdkr9�jtd�d
�ntd�jj	�d�jj
}x��jD]�}|�jkrf�j|dd}�j|dd}t
j|dd|dd|dd|dd�}t
j|dd|dd|dd|dd�}td||||�||}�j|��j|dd}tjd|�r�td|jd��}n2�jtd��j|ddd�d�}�j|dd|d }td!|�t�j|ddd �jj	�}||atd"t�tjj�j|dj�tjd#d$����jjr��jdkr�tjj�jj �d#��_�jj!tjd%d&�d'��jj!tjd(d&�d)�n�jjr>tjj�jtjd#d$�id*d+6�a"tjj�jtjd#d$�id,d+6�a#nx��j|D]�}|j$tjd-d$�krLt%j&|j'd.��}ga(x�t)t|��D]�a*da+x�t+t|t*�krtt,|t*t+ddd|t*t+dd�t-krgt,|t*t+ddd|t*t+dd�t-krg|t*t+d |t*t+dd <|t*t+=q�t+d7a+q�Wq�Wx�|D]�}td/|�g}g}td0|�t(j.g�xft/dt|��D]Oa+|t+d |t+d|t+}}} �jjr�g}!g}"xqt/dd1�D]`a*| t*dt| t*dg}#| t*dt| t*dg}$|!|#g7}!|"|$g7}"q%W||!g7}||"g7}n|d\}%}&t0|| d�\}'}(t,dt
j|'|(��d2krtd3|'|(|| ��jtd4�d
�nt0||d�\})}*t,dt
j|)|*��d2kr�td5|)|*|| ��jtd4�d
�n||)|*f|'|(f�\}+},}-t(d6c|%|&g|+|,gt1|-gg7<|d|d kr+| d| dkr+t(d6c|d|'|(gt2t+gg7<q��|d|d | d| d�}.t1}/x�|.D]�}0x�t/d1�D]�}1|1dks�|/r.	|0|1d|0|1dd}'|0|1dd|0|1d}(t
j|'|(�}2|2t-kr�qpn|'|2}'|(|2}(t(d6c|0|1|'|(gt2t+gg7<t2}/n|1d krp|'})|(}*|0|1dd|0|1d d}'|0|1d d|0|1dd}(t
j|'|(�}2|2t-kr�	qpn|'|2}'|(|2}(||)|*f|'|(f�\}+},}-t(d6c|0|1d|+|,gt1d7gg7<qpqpWq]Wq�Wtd8�jjf��jjr�||dg7}||dg7}tjjt"tjd-d$�it%j3|g�d.6d9d:6d;d+6�tjjt#tjd-d$�it%j3|g�d.6d9d:6d;d+6�x0t(d6D]!}3|3d r�tjj�tjd-d$�id<|3dd|3dd|3dd|3ddd=|3dd|3ddd=fd.6d>d:6d?d+6�q�
tjj�tjd-d$�id<|3dd|3dd|3dd|3ddd=|3dd|3ddd=fd.6d@d:6dAd+6�q�
Wq�q�Wt2}4x�t)tt(��D]�a*ga4ga5d}�x�t)tt(t*��D]�a+t(t*t+d }5t(t*t+d}6t(t*t+}7|6d\}8}9|6d\}	}
|7d\}:};|6d t1kr(d}<d}=|}>t}|6d1dkr�t
j|5dd|6dd|5dd|6dd�}?t+tt(t*�dkr�
t
jt(t*t+ddd|6ddt(t*t+ddd|6dd�}@nJt
jt(t*ddd|6ddt(t*ddd|6dd�}@t
j6t|?|@��|6d1}q�n�|5d1dkrV�jjrV�|5d1}=nd7}=t
j|:|8|9|;�}At|A|=�}=t7|A|=|�}<|=|A|=||<d 7}=x$t)|<�D]}B|8|
|B||=}|9|	|B||=}�||f|	|
f�\}C}D}tdBt+t*|C|D|�t8||�}|4rt2}4||>kr|||f|5dd|5dd||5dd|5dd|f||>|d �||5dd|5dd||5dd|5dd|f|t+t*|D|C�qn|6d t1kr,|6d1dkr�|||	|||
|f|t+t*|D|C�|||f||fdd�|||fdt+t*|D|C�qx|6d1dkrx||>kr)|||f||	|>||
|>f|||>d �t8||�}|||	|||
|f|t+t*|D|C�q)qxnL|Bdkrx|7d1dkrx�jjrx|Ct*krx|Dt+d krxPqxn|||f||	|||
|f||�|||	|||
|f|t+t*|D|C�q�W|6d t1kr|6d1dkrt1}4n|}>qoWt4t4dg7a4tdCt4�t5t5dg7a5tdDt5��jjt1kr�tjj�tjd-d$�it%j3t4g�d.6t9dEdFd:6dGd+6�}x�t)tt4��D]�a+tjj�tjd-d$�idGd+6dHd:6t:t4t+dd�tjdIdJ�6t:t4t+dd�tjdKdJ�6t:t5t+�tjdLdJ�6t:t5t+�tjdMdJ�6dNtjdOdJ�6�q�Wn|t4g7}g}Ext5D]}|E||g7}Eq�WtdPt5�tdQ|E�||Eg7}q<WqLqLW|gkrR�j;||||�}F�j<|F|��|�j=|F|�jj>�7}qRqfqfW|d
kr�j?dRt:d ||�|
dS7_?�j?dT�j|dddS7_?�j?dUt:�jj@�|
dS7_?�j?dVt:�jj>�|
dS7_?�jA|�n�jtdW�d
�dS(ZNidc
s^|\}}|\}}tjtdd||||d��}t||�tkslt|�tkr�t||�tkr�||dfStjd|�}n|||||}||||}|dkr�|d|ddfS||||}	|dkr|	}	nd|	dko;d�jjknrId}	n|||||	fS(	spLT Find angle bisecting the normals n1 and n2

			Parameters: Normalised normals
			Returns: nx - Normal of bisector, normalised to 1/cos(a)
				   ny -
				   sinBis2 - sin(angle turned/2): positive if turning in
			Note that bisect(n1,n2) and bisect(n2,n1) give opposite sinBis2 results
			If sinturn is less than the user's requested angle tolerance, I return 0
			ig�?g@giidgfffff�\@i�(R&RLRwR�tengraving_tolerancetcopysignR�R�(
RR�tnx1tny1tnx2tny2tcosBistsinBistcosturntsinturn(R%(s,/usr/share/inkscape/extensions/gcodetools.pytbisectBs ,(

*	cSs:|\}}|\}	}
|\}}|\}
}|\}}|\}}|\}}|
|||}
}||||}}|
|||}|dkr�tSd||	||
}|tkr�tS||}||	}||
}|
|||||dkr	tS||||||dkr-tSt|t�S(sXLT find biggest circle we can engrave here, if constrained by line 2-3

			Parameters:
				x1,y1,nx1,ny1 coordinates and normal of the line we're currently engraving
				nx2,ny2 angle bisector at point 2
				x2,y2 coordinates of first point of line 2-3
				nx23,ny23 normal to the line 2-3
				x3,y3 coordinates of the other end
				nx3,ny3 angle bisector at point 3
			Returns:
				radius or self.options.engraving_max_dist if line doesn't limit radius
			This function can be used in three ways:
			- With nx1=ny1=0 it finds circle centred at x1,y1
			- with nx1,ny1 normalised, it finds circle tangential at x1,y1
			- with nx1,ny1 scaled by 1/cos(a) it finds circle centred on an angle bisector
				 where a is the angle between the bisector and the previous/next normals

			If the centre of the circle tangential to the line 2-3 is outside the
			angle bisectors at its ends, ignore this line. 

			# Note that it handles corners in the conventional manner of letter cutting
			# by mitering, not rounding.
			# Algorithm uses dot products of normals to find radius
			# and hence coordinates of centre
			ig�?g-C��6?(R�R]Rv(RR�t.2t.3t.4t.5t.6RfRgR_R`RaRbR�R�tnx23tny23R�R�tnx3tny3R�tdenomR"RR((s,/usr/share/inkscape/extensions/gcodetools.pytget_radius_to_line`s"Q


  cSs*|\}}|\}}|\}}||||}}|d|dd}	|	tkr�|	dkr�tj|d|d�S||||dkr�tS|d|dd||||S||||d|	|d|d}
|
dkr�tS||||tj|
�|	}t|t�S(s]LT find biggest circle we can engrave here, constrained by point x2,y2

			This function can be used in three ways:
			- With nx=ny=0 it finds circle centred at x1,y1
			- with nx,ny normalised, it finds circle tangential at x1,y1
			- with nx,ny scaled by 1/cos(a) it finds circle centred on an angle bisector
				 where a is the angle between the bisector and the previous/next normals

			Note that I wrote this to replace find_cutter_centre. It is far less
			sophisticated but, I hope, far faster.
			It turns out that finding a circle touching a point is harder than a circle
			touching a line.
			iii����i(R]R&RLR�Rv(RR�RhRfRgRdReR�R�Rqt
discriminatorR"((s,/usr/share/inkscape/extensions/gcodetools.pytget_radius_to_point�s!$*#cs�|d|d}|d|d}|d|d}|d|d}|d|d}|d|d}	dtj||	��jj}
t||||	�|
kr�t||||	�|
kr�||||ggS|d|dd}|d|dd}|d|dd}
|d|dd}|d|dd}|d|dd}||
d}||d}|
|d}||d}||d||dg}�|||g||g|��|||g||g|�S(smLT recursively divide a Bezier.

			Divides until difference between each
			part and a straight line is less than some limit
			Note that, as simple as this code is, it is mathematically correct.
			Parameters:
				a,b,c and d are each a list of x,y real values
				Bezier end points a and d, control points b and c
			Returns:
				a list of Beziers.
					Each Bezier is a list with four members,
						each a list holding a coordinate pair
				Note that the final point of one member is the same as
				the first point of the next, and the control points
				there are smooth and symmetrical. I use this fact later.
			iiig@(R&R�R�R�R�(RIReR�R�RRRRRRtlimittabxtabytbcxtbcytcdxtcdytabcxtabcytbcdxtbcdyR�(t
bez_divideR%(s,/usr/share/inkscape/extensions/gcodetools.pyR��s* <cs[|\}}|\}}tttd}d}d}t}	||	||	||	||	}
}||	||	||	||	}}
x�tdtt��D]�}x�tdtt|��D]�}t||ddrX|tkr't|t�dks�t|t�ttt�dkr'q�q'n�||f||ft||dd�}ns|tkr)t|t�dks�t|t�ttt�dkr�q�nt|t�dkr�tt|tddddkr�q�nt|t�ttt�dkr)ttdddkr)q�q)nt||dd\}}t||dd\}}t||dd\}}t||d\}}t||d\}}t||dddkr�|}|}nt||ddkr�|}|}nt||�t||�}}t||�t||�}}|dt	kr�||
ks�||ks�||ks�||
kr�q�n�||f||f||f||f||f||f||f�}d|ko�|	knr�|}	|}|}||	||	||	||	}
}||	||	||	||	}}
q�q�Wq�W|||	fS(s3LT Find biggest circle we can draw inside path at point x1,y1 normal nx,ny

			Parameters:
				point - either on a line or at a reflex corner
				normal - normalised to 1 if on a line, to 1/cos(a) at a corner
			Returns:
				tuple (j,i,r)
				..where j and i are indices of limiting segment, r is radius
			ii����iii(
tnlLTRiRdR�RRPR�RvRwRT(RR�RfRgRdReR�tjjmintiiminR"RORPtymintymaxtjjtiiR�RaRbR�R�RmRnR�R�RoRptx23mintx23maxty23minty23max(RrRt(s,/usr/share/inkscape/extensions/gcodetools.pytget_biggest�sX%% :	1::<			@H%0c
s�|\}}	|\}
}|\}}
||
d}|	|d}�||f||
f�\}}}|tkr�|||ggS||kr�||kr�|||g�||f|||
|f||||
f|d�gS||kr8||kr8�||	f||||f||||
f|d�|||ggS�||	f||||f||||
f|d��||f|||
|f||||
f|d�gS(sLT recursively divide a line as much as necessary

			NOTE: This function is not currently used
			By noting which other path segment is touched by the circles at each end,
			we can see if anything is to be gained by a further subdivision, since
			if they touch the same bit of path we can move linearly between them.
			Also, we can handle points correctly.
			Parameters:
				end points and indices of limiting path, normal, length
			Returns:
				list of toolpath points
					each a list of 3 reals: x, y coordinates, radius

			i(tlmin(Rtj0ti0RiR�R�RlR�RRRfRgRdReR�R�R�R�R7(R�tline_divide(s,/usr/share/inkscape/extensions/gcodetools.pyR�#s!$DDcSsb|\}}t|d�}t|d�}t|d�}tt�dkrtd\}}	}
}}}
}td}||kr||kr||
kr||krtd\}}}
}}}
}td}||kr||kr||
kr||krtj|	d||	d|�}tj|d||d|�}tj|d|	d|d|	d�}||kr||krt|d||	d||	d||d|�|}|tkr||||||}t|�tkrtj�tj�qqqqqnt||g||g||g||||gg7at|g7adS(s�LT Save this point and delete previous one if linear

			The point is, we generate tons of points but many may be in a straight 3D line.
			There is no benefit in saving the imtermediate points.
			iii����i����iN(	R�RPtcspmtwlR&R�R�R]R](RRRdRiR�R�RaRbtxy1atxy1txy1bR�R�tii1tjj1R�txy2R�tlength1tlength2tlength12txydisttwdist((s,/usr/share/inkscape/extensions/gcodetools.pyt
save_point>s.	
0
0""*<
4c

s�|\}}|\}}�jjr�tjj�tjdd�idd6dd6t|�tjdd�6t|�tjd	d�6td
�tjdd�6td
�tjdd�6d
tjdd�6�|r�tjj�tjdd�idd6dd6t|�tjdd�6t|�tjd	d�6t|�tjdd�6t|�tjdd�6d
tjdd�6�tj||||�}dj	t
ddtj|d���}	tjjttjdd�id|t
||t
d||fd6d|	dt|d�dd6dd6�tjjttjdd�id|t
||t
d�|fd6d|	dt|d�dd6dd6�q�ndS(sLT Draw this point as a circle with a 1px dot in the middle (x,y) 
			and a 3D line from (x0,y0) down to x,y. 3D line thickness should be t/2 

			Note that points that are subsequently erased as being unneeded do get
			displayed, but this helps the user see the total area covered.
			R�R�sEngraving calculation toolpathR�sBfill:#ff00ff; fill-opacity:0.46; stroke:#000000; stroke-width:0.1;R�RR�RiR�R�RCR�sEngraving calculation pathss?fill:none; fill-opacity:0.46; stroke:#000000; stroke-width:0.1;s
#{0:x}0000ieg�?g�?sM %f,%f L %f,%fg�Q���?R�sstroke:s!; stroke-opacity:1; stroke-width:is ; fill:nones	Gcode G1Rs	Gcode G1LN(R�R�R�R�R�R�R�R&R1tformatR3R(tgcode_3Dleftteye_distt
gcode_3Dright(
RR�RRRRRaRbRFRh(tengraving_groupR"R%(s,/usr/share/inkscape/extensions/gcodetools.pyt
draw_point_s"��**!*!RCis9Please select at least one path to engrave and run again.R�s mmsG20 (All units in inches)s inchessG21 (All units in mm)s!Unknown unit selected. mm assumedsengraving_max_dist mm/inchiisOrientation2 p1 p2 ol oluuR�Rs
lambda w: R�s/Tool '%s' has no shape. 45 degree cone assumed!R�tContinuecSs|S(N((R((s,/usr/share/inkscape/extensions/gcodetools.pyR�sR�istool radius in pixels=smax_dist pixelsR�R�R�R�RRR�s
Gcode 3D LR�s
Gcode 3D RR�R�s
csp is zz scsp isig�h㈵��>scsp_normalised_normal error t=0s%csp_normalised_normal error. See log.scsp_normalised_normal error t=1i����gs!engraving_draw_calculation_paths=s=stroke:#808080; stroke-opacity:1; stroke-width:0.6; fill:noneR�sG1L outlinesM %f,%f L %f,%fi
s@stroke:#f000af; stroke-opacity:0.46; stroke-width:0.1; fill:nonesEngraving normalss@stroke:#0000ff; stroke-opacity:0.46; stroke-width:0.1; fill:nonesEngraving bisectorssi,j,jjmin,iimin,wR�R�R>R8sEngraving calculation pathss?fill:none; fill-opacity:0.46; stroke:#000000; stroke-width:0.1;RR�RR�R�RCR�swl in pixelsswl in user unitss"(Tool diameter should be at least s)
s+(Depth, as a function of radius w, must be s(Rapid feeds use safe Z=s(Material surface at Z=s No need to engrave sharp angles.(iii(iiii(BR�RPR@R�RCR�R�R?R
R�R�RR�R&R�RR�R R�R�R�RvR�R�R�R�R�R�R�RRuR�R�RLR�R�R�R�RIRJR�RRiRdR�R]RQRKRfRlRTR�R�R�RLR3RwRR�R�R�R�RpR/RoR0(GR%RgR�R�R�RtwmaxRfRgRdRetcspetweR?tbitlenR�R�RUtoltoluutorientation_scaleR�t	toolshapettoolrt
max_distuuR�tcspiRTtcspltcsprtsp0RWRXtspltsprR�R�RRR_R`tnx0tny0RRRFtnntfirsttbLTR	RR_treflexR"R�tn2tx1aty1atx1bty1btbitstbit0tlastwtlen1tlen2R�ReR�R�twluuR((R�R�R�RrRtR�R"R%s,/usr/share/inkscape/extensions/gcodetools.pyt	engraving8s�	<	$):	! 	::

)	
(

2!".1t"



(  

""$+(,%


)	""

$<
ZZ
:UJ&$WU/"78)/3 	



�



))&''c
Cs�|dkr6|jdk	r$|jn|jj�}n|j|�}|gkrr|j|�}tj|�}n|jj	dkr�t
|j�t
d�||jkr�t|j|�}nd}ddddg|d}id	d
6}|gkr||d<nt
jj|t
jdd
�|�}t
jj|t
jdd
�idd6d|ddfd6dd
6�t||dddd|dd�n�|jj	dkr�td|jd|jddddd d!�n�t
d"�||jkr|jtd#�d$�nid%d
6}|gkr.||d<nt
jj|t
jdd
�|�}|j|jj�jd&��}|jj�jd&�d'kr�d(}t
d)|�n|jjd*krd+d+|jjgd,d+|jjgd+d,d+gg}	d-}
t
d.|
�n_|jjd/krfd+d+|jjgd0d+|jjgd+d0d+gg}	d1}
t
d2|
�n|jj	d3kr�|	d4 }	nt
d5|
d6|	f�x�|	D]�}|d|
|d7|
g}t
jj|t
jdd
�id8|jj	d
6�}t
jj|t
jdd
�id9d6d|d|d7|fd6d:d
6�td;|d|d7|d4f|dd|d7d|d|dd<�q�WdS(=NtgraffitisInserting graffiti pointsiR�R�R�tAis#Gcodetools graffiti reference pointR�R�R�R�R�sstroke:none;fill:#00ff00;R�s�m %s,%s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 z zidR�s)Gcodetools graffiti reference point arrowi
i����R�R�s(Gcodetools graffiti reference point textsin-out reference pointRaR�R�R�sIn-out reference pointR�sIn-out pointsInserting orientation pointssQActive layer already has orientation points! Remove them or select another layer!t+active_layer_already_has_orientation_pointssGcodetools orientation grouptheights100%g����rq�@s)Overruding height from 100 percents to %ssG21 (All units in mm)ggY@g�>`�X@s7orientation_scale < 0 ===> switching to mm units=%0.10fsG20 (All units in inches)g@iZs;orientation_scale < 0 ===> switching to inches units=%0.10fR�isusing orientation scalesi=is(Gcodetools orientation point (%s points)sstroke:none;fill:#000000;s"Gcodetools orientation point arrows(%s; %s; %s)s!Gcodetools orientation point text(RuR�R�R�RRRRR�R;R
RRPR�R�R�R�R�R�tview_centerR�R�RCtunittouuRJR?RpRq(
R%R�R�tgraffiti_reference_points_countR�R�R�torientation_groupt
doc_heightRR�RdR�((s,/usr/share/inkscape/extensions/gcodetools.pyR<�sp*



$'.


$!66

5c
Cs|dkr6|jdk	r$|jn|jj�}n||jkr^|jtd�d�n|jjdkr�idd6dd6dd	6d
d6dd
6dd6dd6dd6}n�|jjdkri
dd6dd6dd	6d
d6dd
6dd6dd6dd6dd6dd6}nU|jjdkreidd6dd6dd	6dd6dd
6dd6dd6dd6}n|jjdkr�i	d d6d!d6dd
6dd6dd6dd"6d#d$6d%d&6dd6}n�|jjd'krid(d6d)d6dd	6d*d6d+d
6d,d-6d.d/6}n\|jjd0kr^id1d6d2d6dd	6d*d6d+d
6d3d-6d4d/6d5d6}n	|j	}t
g|jD]}t|j|�^qt�}d6d7d8d9d:d;d<d=d>d?d@dAg}tj
j|tjdBdC�idDdE6�}tj
j|tjdFdC�idG||t|�dH6dIdE6�}d%}g}	x-|jD]"}
|
|krE|	|
g7}	qEqEWx*|D]"}
|
|	krr|	|
g7}	qrqrWx|	D]}
tj
j|tjdBdC�idJdE6�}t|
d%|dK|dLdMdN|
dkr�dndO�||
}t|�tkr;tjdP|�r;dQ}nt|dR|dK|dLdSdN|
dkrhdndO�t|�jdT�}
||
dkr�dUt|
�n
dOt|
�7}q�W|jdVdW|dX�g}|jdYtjdZd%|jd%dRgd%dZ|jdZgg��dS([NsCActive layer already has a tool! Remove it or select another layer!tactive_layer_already_has_toolscylinder cuttersCylindrical cutterR�sCylindrical cutter 0001R�i
R�iZspenetration anglet400R�R}spenetration feedR4s
depth stepR�stool change gcodeslathe cuttersLathe cuttersLathe cutter 0001R�spassing feeds	fine feedscone cuttersCone cuttersCone cutter 0001RR�s
tangent knifes
Tangent knifesTangent knife 0001s4th axis meaningg�?s4th axis scaleis4th axis offsets
plasma cutters
Plasma cuttersPlasma cutter 0001idi�s�G31 Z-100 F500 (find metal)
G92 Z0 (zero z)
G00 Z10 F500 (going up)
M03 (turn on plasma)
G04 P0.2 (pause)
G01 Z1 (going to cutting z)
sgcode before pathsM05 (turn off plasma)
sgcode after pathR�tGraffitis
Graffiti 0001sM03 S1(Turn spray on)
 sM05 (Turn spray off)
 s+(Add G00 here to change sprayer if needed)
t00ff00t0000fftff0000tfefe00t00fefetfe00fetfe7e00t7efe00t00fe7et007efet7e00fetfe007eR�R�sGcodetools tool definitionR�R�s;fill:#%s;fill-opacity:0.5;stroke:#444444; stroke-width:1px;R�sGcodetools tool backgroundsGcodetools tool parameterR�R�s%Gcodetools tool definition field nameR�is^\s*$s(None)i�s&Gcodetools tool definition field values
iR�s m -20,-20 l 400,0 0,%f -400,0 z i2R�i(RuR�R�R�R�R�RCR�R�R�R�RPR�R�R�R�R�R�R�R�R R�RERLRRR�(R%R�R�Rdttool_numRcttools_grouptbgRbR�RR�tparamR]((s,/usr/share/inkscape/extensions/gcodetools.pyt
tools_library�s�*





	/*+)

+4
$	44c	Cs-t|j�dkr7|jtd�d�|j}n	|j}tjjt|jj	��dkrw|jj	�dn
|j
dtjdd��}dddgdddgg}|j�t
d	�t
d	�t
d
�t
d
�g}i}x|j
D]t}||kr�|j|�|j|d}||kr>||nt
d	�t
d
�g||<tj|d�}x�||D]�}	dd
|dkr�|dd
ndd|dkr�|ddndf}|jdtjj|	j|	j��|j�d}
|
jd|�|j|	�}tj||gkr9|ndddgdddgg�}tj|	jd��}tj||�t|�}
tj |�}t!|d|
d�t!|d|
d�t"|d|
d�t"|d|
d�g}t!||d|
d�t"||d|
d�g||<|
jd|�|ddcd7<qxW|ddcd7<q�q�Wx�|j
D]�}||jkrz||kr%|j|d}t#j$|d�}d|jd<dd|dgdd||dgg}|jdtj |��|jd|�q%qzqzWdS(Nis/Selection is empty! Will compute whole drawing.t&selection_is_empty_will_comupe_drawingR�R�ig333333�?g�?R�s-infR�safill:%s; fill-opacity:%s; stroke:#000044; stroke-width:1; marker-mid:url(#CheckToolsAndOPMarker);R3s#00ff00sfill-opacitys0.5g�?gR�iiR�iidRsCheck tools and OP asignmentR�(%RPRR�RCRBR@R�R�R�R�RR�R	R�RR�R
RtinserttElementR�R�RRLRRR�R�RIRJR�R}RRvRwR�R�(R%RBR�ttrans_R�ttools_boundsR�R�R�R�R'R�RTtpath_boundsR�((s,/usr/share/inkscape/extensions/gcodetools.pytcheck_tools_and_optsT	V
*
2!(%<V:
*cCs|jtd�d�dS(Ns�Tutorials, manuals and support can be found at
English support forum:
	http://www.cnc-club.ru/gcodetools
and Russian support forum:
	http://www.cnc-club.ru/gcodetoolsruR�(R�RC(R%((s,/usr/share/inkscape/extensions/gcodetools.pyRj�scCs�t|�dkrdSd|j|}|jj|jj}}|j�|j�d&krbdnd}id	d
6dd6d
d6dd6dd6dd6}||||}	}
|ddddddgg}x:t||d�D]%\}}
|t||
dd�7}q�Wx8tdt|��D]!}||d||dd<q W||ddddddgg7}|j	||dt
d|�d||ddd||dddf|d}x|D]}|ddkr|d||dd||ddf|d7}q�|ddkr�|dd|dd|dd|ddg}|dd|dd|jjdkr�t|d�t|d�t|d�t|d�}}t
|j�|j��dkrc||d |dkr�d!nd"d#||dd||dd|	|dd|dd|
|dd|ddf|d7}q�|j�|j�d}||d |dkr�d!nd"d$||dd|tddfd%||d7}q�q�q�W|S('NiRCs F %ftxztyxtzyi����iR#R�tJR�tKR�RdRaRiRbRNR�iRiR8R�sbiarc_style_lathe_%ssG01 %s %f %s %fs
R9RCg����MbP?iR�R�s %s %f %s %f %s %f %s %fs %s %f %s %fs R%f(R�R�R�(RPR�R�R�R�R�RRRQRKR�RRVR�R�R>Rb(R%RVR�t	feed_typeR�RaR�t
flip_angletaliasti_tk_R�RWRXRdR�RFR"R6R7((s,/usr/share/inkscape/extensions/gcodetools.pytgenerate_lathe_gcode�s6(0  $6
54*="�bc&
Cs�|j�sdS|jj|jj}}tjdd|�}tjdd|�}|d+ksk|d,kr�|jtd	�d
�dS|j�|j�kr�|jtd�d
�dS|j�|j�d-kr�d}n|j�|j�d.krd}n|j�|j�d/kr&d}n|||j_|j_|j	}g|_
d}xf
|jD][
}||kra|j|�|j
|j
|dkrj|j
|d|_
td|j
kr�|j
dn
|j
d�|j
d<t|j
d�|j
d<td|j
kr|j
dn
|j
d�|j
d<|dtjdd|j
d�|j
dd7}nxO	||D]@	}|jtj|jd ��|�}x	|D]	}	|	}
|jjdkr�|jj}|jjd!kr$g|	D]1}g|D]}
|
d|
d"|g^q�^q�}	q�t|	g�}t|	g�\}}}}t|	|	d#d"d|d"|d$g|	dd"d|d"|d$g|	dd"d|	dd"d"gg�}|	d#d"d|	dd"d}}||kr||}}nt|gt|�s|n|�}t||d$g|dg�}t||dg|d$g�}t|d|d"|gd$|d"|g�}t|�d}	nt|	g�}|	dd"d|jj|jj|jjg|	d#d"d|jj|jj|jjg}}|d%||d"|j
df7}|d&||d||d"|j
df7}ttg||	dd"g�|	�}	t|	||g�}	td|jjtd|d"��}|j
d'}t t!j"||��}xt#|d"�D]�}|jj||}g}x�t#d"t$|	��D]�}|	|d"|	|}} |gt%|dd$|g|d(d$|g|| �D]}!||!g^q�7}|gt%|dd$||g|d(d$||g|| �D]}!||!g^q�7}q4Wt&|	|�}"x�|"D]�}#t|#g�\}}}}|d"|d"d(}$|$||krt||j'|#|d�7}q||$ko�||knr�||j'|#|d�7}qtg|#dd"|#d#d"g�}#||j'|#|d�7}qWq�W|
dd"d|jj|jj|jjg|
d#d"d|jj|jj|jjg}}|d)|jj7}x?t#|jj(�D]+}|jjd"t|d"�|jj(}|dkr�|
}%n�|jjd!kr	g|
D]1}g|D]}
|
d|
d"|g^q�^q�}%nnt|
g�\}}}}t|
|
d#d"d|d"|d$g|
dd"d|d"|d$g|
dd"d|
dd"d"gg�}|
d#d"d|
dd"d}}||kr�	||}}nt|gt|�s
|n|�}t||d$g|dg�}t||dg|d$g�}t|d|d"|gd$|d"|g�}t|�d}%|d*|d"7}|d&||d||d"|j
df7}|d&||%dd"d||%dd"d"|jj|j
df7}|d&||%dd"d||%dd"d"|j
df7}||j'|%|d�7}|d%||d"|j
df7}|d&||d||d"|j
df7}q�Wq�WquWqaqaW|j)|�dS(0Ns^\s*([XYZxyz])\s*$s\1R�R�R�RaRbR�s>Lathe X and Z axis remap should be 'X', 'Y' or 'Z'. Exiting...R�s7Lathe X and Z axis remap should be the same. Exiting...txyR�sG17 (Using XY plane)
R�tzxsG18 (Using XZ plane)
R�tyzsG19 (Using YZ plane)
RCispassing feedR�s	fine feeds(Change tool to %s)
s"'\(\)\\R�R�stool change gcodes
R�s	Move pathii����i
sG01 %s %f F %f 
sG01 %s %f %s %f F %f 
s
depth stepis6
(Fine cutting start)
(Calculating fine cut using %s)
s
(Fine cut %i-th cicle start)
(R�R�R�RaRbR�(R�R�R�RaRbR�(R�syx(sxzR�(szyR�(*R�R�R�R�R R$R�RCR�R@R�RRR�R�R�R�RIRJR�R�R}R[RsROR�RqRwR�RoRjRwR3R&R5RKRPR\RR�R�R0(&R%RaR�tgcode_plane_selectionRBR�R�R�RTRVtfine_cutR"R�R�tboundRxRyRzR{toffsetted_subpathRtrightt	top_startttop_endR�R<tstepsRdt
current_widthR�RiRWRXRNRtpartRbtcurrent_pass((s,/usr/share/inkscape/extensions/gcodetools.pytlathe�s�					
666$
As%%.e",&&
NZ
 %!e(	As%%.,F<"?cCsG|jikr=|jjr=|j}|jtd�d�n	|j}x�|jD]�}||krP|jj}x�||D]�}|jt	j
|jd��|�}g}xo|D]g}|ddd|dddk}d}	d}
g}x�t
||d�D]�\}}
t||
�\}}}}}}}}tdd|d||�}|tdd|d||�7}t|t||
|��}qW|}g}t}xt
||d�D]�\}}
t||
d�}tj|d|d�}|dks|tjkr t||
d�}ntj|d|d�}|dkr�|tjkr�d|kostjdkns�tj|ko�tjdknr�dnd}|s�d|}n|r|gkrgtd�D]2}|d|d|||d|dg^q�g}nt|gtd�D]*}||d||||dg^q0gtd�D]*}|
|d|||
|dg^qjg�}nt}q�W|dks�|tjkr�|gtd�D]2}|d|d|||d|dg^q�g7}q�q�W||g7}|j||�qyWqPqPWdS(	Ns=No paths are selected! Trying to work on all available paths.R�R�i����iiii(R@R�RARBR�RCRR�R�R�RIRJRuRRRZR�RjRRlRfR&R1R4RKRTR�(R%RBR�R�R�RTtnew_cspRVR<tlast_ntlast_otnew_subpathRWRXRRRRRRRRR�t	first_segR#RItoRd((s,/usr/share/inkscape/extensions/gcodetools.pytlathe_modify_pathSsX		$
$!'!!W
K:F
S
cCs�y�ddl}|jdd|j��}|j�}xw|jd�D]f}tjd|�}|rF|jd�j�}|t	kr�|j
dd�n|j
d	d�dSqFW|j
d
t	d�Wn|j
d
t	d�nXdS(Ni����s0http://www.cnc-club.ru/gcodetools_latest_versiontproxiess
s(Gcodetools\s+latest\s+version\s*=\s*(.*)is�There is a newer version of Gcodetools you can get it at: 
http://www.cnc-club.ru/gcodetools (English version). 
http://www.cnc-club.ru/gcodetools_ru (Russian version). R�s<You are currently using latest stable version of Gcodetools.s�Can not check the latest version. You can check it manualy at 
http://www.cnc-club.ru/gcodetools (English version). 
http://www.cnc-club.ru/gcodetools_ru (Russian version). 
Current version is Gcodetools %s(turllibturlopent
getproxiesR$RER R�R�R�tgcodetools_current_versionR�(R%RR�RIRFR"tver((s,/usr/share/inkscape/extensions/gcodetools.pyR��sc-$s{
�fd�}d�fd���fd��dMd���fd	�}�fd
�}�j�sjdS�jikr��jjr��j}�jtd�d�n	�j}g�_d
}td�td�td�td�f\}}}}	x��j	D]�}
|
|kr�|
�j
kr�d}xot�j	j
|
�dd�D]O}�j	|�j
krE�j
�j	|}�j
�j	|�j
|
<PqEqEW|dkr��jd|
d�q�nx�tt�j
|
��D]r}�j�j
|
|d|
��j
|
|d<�j
|
|}
|d|
dd|
dd|
df7}q�W�jjr�xw�j
|
D]h}
t||
dd�t||
dd�t||
dd�t|	|
dd�f\}}}}	qhWx�||
D]�}tj|jd��}�j||�}�j||
�}t|�}t||d�t||d�t||d�t|	|d�f\}}}}	q�Wq�q�q�W�jjr�tgt�jj�D]}dgd�jj^q���_||||	g�_nx�j	D]}
|
|kr�tjd�jj�}|rWt|j d��t|j d��g}nddg}gtd�D]}|d|ddg^qp}gtd�D]}|^q�}�j!|
��j"|
d�_|dtj#dd�jd��jd d!7}g}xX||
D]L}tj|jd��}�j||�}�j||
�}||7}qWg}xjt|�dkr�tgtt|��D]+}t$|d||dd�|f^q��d}||}||=|d"||d|ddt%||d#�t%|d|dd��gg7}g}d}d}xm|t|�dkr�t&||||d�d$kr�||dd||d<||d=qF|d7}qFWx�t'||d�D]�\}}|dkr~t(t)t%||d#�t%||d���d%kr~||g7}|d&|gg7}|d"||d|dt%||d#�t%||d��gg7}g}n||g7}t*|�t*|�|}q�W||g7}|d&|gg7}||}}qqW|gkr�q�n|d'gtd�D]}|dddd^qgtd�D]}|^q,ggg7}xEtt|��D]1}g}d}t*d(|�t*||�x�t'||d||dd�D]�\}}t*||�t&||�}|d$kr�||dg7}t+t,j-|�jj.��}x=td|�D])}|t/||t|�|�g7}q 	Wq�q�W|d$krt	||dg7}nt*|�|||d<q[Wd}d} xc|D]X}!|!d}�jj0rA
|d7}gtt|��D]!}||||||g^q�	}t1�j|g|
d)t2�d*|!dd&kr7
d+nd,�n||d|
�\}"}#|d}$|!dd&kr�
| d&kr�
|�jd-d!7}nx"|D]}
||
|
�\}%}#t3gtt|"��D]}|%||"|d^q�
�}&|$d|
dd|$d|
dd}|dkr�
�jd.t,j4|&|�}'|d/|#d0|'7}�jjr�||
|%|"|'d*|!dd&kr�dNndOd2�jj5�n|%}"|
}$q�
q�
W|!dd&kr�| d&kr�|�jd3d!7}n|!d} q�	Wq�q�W�j6|d4t2��jjrw
y5xd�j
D]Y}
xP�j
|
D]A}
�|
dd|
dd�\}(})�|(|)dPd5d6�qFWq2Wddl7}*|*j8d7�jjd8�jjd9dd:t9d;t2d<d=d>dd?dd@ddAddBddCt9dDddEddFddGddHdI�}+t:�jj;�jj<dJdK�},|+j=|,�j�|,j>�Wqw
�jdLd�qw
XndS(QNcs�d}g}xu�j|D]f}tj|d|ddd|d|ddd�}|d|d|f7}||g7}qW||fS(NRCiiis %s %f(RR&RL(RMR�R�tpost	ref_pointR�(R%(s,/usr/share/inkscape/extensions/gcodetools.pytget_gcode_coordinates�s;g�?csb�j�_|\}}}}x=tt|dtj|��t|dtj|�d��D]�}x�tt|dtj|��t|dtj|�d��D]�}	|dkr�|	dkr�|	t�j�kr�|dt�jd�kr�tj||d||	d�}
t|�|
|krGtdd|
|�ndd}t||d|�j|	|d��j|	|d<t||d|�j|	|dd��j|	|dd<t||d|�j|	|dd��j|	|dd<t	dt�j|	|dd|d���j|	|dd<q�q�Wq`WdS(Niiiiii�i(
tgraffiti_previewRKR3R&R5RPRLR�RwRv(RfRgR�RER"R�Reta_RaRbR�RI(R%(s,/usr/share/inkscape/extensions/gcodetools.pytgraffiti_preview_draw_point�sHHJ#7:BBcs��j}t|d|dd|d|dd�}||dd�jj|�jj||dd�jj|gS(Niiii(tgraffiti_preview_transformRwR�R�(RaRbRR�(R%(s,/usr/share/inkscape/extensions/gcodetools.pyR�s	/ii�i(i�cs}tjtgtt|��D]}||||d^q��}||}�j|dd�j|dd}	}
tj|	d|
dd|	d|
dd�}|dkr�td�nx�tt||d��D]�}|||}|dd||d||dd||d|}
}|
d|d|dd|}tj|
d|d�}|	d||
d|	d|}|	d||
d|	d|}|||
d|	d|}|||
d|	d|}|||
d|	d|}|||
d|	d|}||kr;|n|}t||�}�||�\}}�|||�q�WdS(Niiis/Error! Reference points should not be the same!(	R&RLR�RKRPRRyR3Rv(R�R7R8R�R�temmitRdR�R>R^R_R�RR6R7RIR�txatyaRfR�RgR�RaRb(RRR%(s,/usr/share/inkscape/extensions/gcodetools.pytdraw_graffiti_segment�s*D
+3!="""cs�t|�t|�}}tt|��tt|��}}�jj}||||||}	}
t||	j�|�t||
j�|�krt||�r�||||||j�||dfqh||||||j�||dfnft||�r>||||||j�||dfn*||||||j�||df\}}}}tj|�}||||||}	}
|
|	}
|dkr�t	|||	j�||�S|
j
||
j|}}|	j
||||	j|||g}|
j
||||
j|||g}t||�dkr�t||�dkr�|||g|||ggSt	|||	j�||�}t	|||
j�|||g�}t
||�S(Nii����ig-C��6?(R�R*R�R�R�R�R�R&RLR+RaRbRSRj(R�RUR�R�RWREtN1tN2R"tC1tC2tdcR�tDcR'R(tp1_endtp2_stRHRI(R%(s,/usr/share/inkscape/extensions/gcodetools.pytcreate_connector�s(%�<9
***$s=No paths are selected! Trying to work on all available paths.R�s[(Header)
(Generated by gcodetools from Inkscape.)
(Using graffiti extension.)
(Header end.)R�s-infi����s3There are no graffiti reference points for layer %sR�s$(Reference point %f;%f for %s axis)
iR�iiis/\s*\(\s*([0-9\-,.]+)\s*;\s*([0-9\-,.]+)\s*\)\s*gi
s(Change tool to %s)
s"'\(\)\\R�R�stool change gcodes
t	connectorg�?g:�0�yE>g�������?R�tconnect1t	polylinesR|R�s#00cc00;s#ff5555;sgcode before pathR�sG01 s F %f
i�Rsgcode after pathR/REiR�R�R�t	greyscaleR,tbitdepthitpalettettransparentt
backgroundtgammatcompressiont	interlacetbytes_per_sampleR�tcolormaptmaxvaltchunk_limitis.pngtwbsPng module have not been found!(ii�ii((iii�i�(i�iii�(ii�ii�(?R�R@R�RARBR�RCR�R�RRRuRKR�RPR�R�RvRwR�RIRJRHR�R}R�R�RRR R�R�R�RR�R$RSR^RRRR�R�R
R3R&R5R�RR�R�RlR�RLR�R0tpngtWriterRTR�R-R.RR�(-R%RRR&RBR�RxRyRzR{R�treference_pointsRdRMR�RTR�R"tstart_pointtlast_sp1tlast_sp2tsubpathsR)RVtpolylineR�RWRXR�RRiRt
last_statet	polyline_t
last_real_posR�tlast_postreal_postreal_lR�RaRbR7twriterR�((RRR%s,/usr/share/inkscape/extensions/gcodetools.pyR��s6

)			6% 0/f`?-1
3N$! ?
	




[
0
.



:>

;*>%~#c
Cs[tj�}|ja|t_|jj�t_|jjr�y�tjj	|jj
�rmtj|jj
�nt|jj
d�}|j
dtjd�tj
f�|j
d|jj�|j�Wq�d�aq�Xn	d�a|jjdkr|j�dS|jjdkr&|j�dS|jjd	krE|j�n�|jjd6krz|jtd|jj�d�n�|j�|jjd7kr]|jikr�|jtd�d�|j|jtdt|j�d��|j�n|jikr]|jtd�d�d|j_|j|jtdt|j�d��|j�q]n|jjdkr||j�n�|jjdkr�|j �n�|jjd
kr�|j!�nd|jjdkr�|j"�nE|jjd
kr�|j#�n&|jjdkr|j$�n|jjdkr6|j�n�|jjdkrU|j%�n�|jjdkr�|jjd kr�|j�q|j&�n�|jjdkr�|j'�nl|jjdkr�|j(�nM|jjdkr�|j)�n.|jjdkr�|jj*r=x(|j+D]}t|j+|�d!krt,j-|j+|d"j.d#��t,j-|j+|dj.d#��}}t/||�}t|�t0t1t2||d|d!d||d|d!|d$��t1t2||d%|d&d||d%|d&|d'��d(d)d*t3j4|d"��qqWdS|jj5d"krd|jj6|j_5n|jj5|jj6d"kr�|jj5d+9_5ntj�}d"}x�|j+D]�}x�|j+|D]�}	|jj5d!}
x�t7|
�t7|jj6�kr�t8t,j-|	j.d#��|
�}|d7}|gkr`x9|D]}t9|gd,d-d.d�q:Wntd/|
�P|
|jj57}
q�Wq�Wq�Wt�td0�td0�td0�t�td1tj�|�td2|�n>|jjdkr�|j:�n|jjdkr|j;�ntd3�td4tj�|�td5tjd��dS(8NRIs'Gcodetools log file.
Started at %s.
%s
s%d.%m.%Y %H:%M:%Ss%s tab is active.
cWsdS(N(Ru(Ra((s,/usr/share/inkscape/extensions/gcodetools.pyR�scWsdS(N(Ru(Ra((s,/usr/share/inkscape/extensions/gcodetools.pyR�ss"help"s"about"s"test"s"dxfpoints"s"path-to-gcode"s"area_fill"s"area"s"area_artefacts"s"engraving"s
"orientation"s"tools_library"s"lathe"s"offset"s
"arrangement"s"update"s
"graffiti"s"lathe_modify_path"s"plasma-prepare-path"s�Select one of the action tabs - Path to Gcode, Area, Engraving, DXF points, Orientation, Offset, Lathe or Tools library.
 Current active tab id is %sR�skOrientation points have not been defined! A default set of orientation points has been automatically added.R�isOCutting tool has not been defined! A default tool has been automatically added.RitcheckiiR�iiiitredR9R�i����R�R9R�s-------------Reached empty offset at radius %ssS-----------------------------------------------------------------------------------s
Done in %ssTotal offsets count %ss*------------------------------------------sDone in %f secondss
End at %s.(s"dxfpoints"s"path-to-gcode"s"area_fill"s"area"s"area_artefacts"s"engraving"s
"orientation"s"tools_library"s"lathe"s"offset"s
"arrangement"s"update"s
"graffiti"s"lathe_modify_path"s"plasma-prepare-path"(	s"dxfpoints"s"path-to-gcode"s"area_fill"s"area"s"area_artefacts"s"engraving"s"lathe"s
"graffiti"s"plasma-prepare-path"(<R<R�R%R�R�R�R�R�R�R�R�RmR�RtstrftimeR�R�R
RjRR�RCRR�R<RRvRPR�R�R�R>R\R:RCR7R�R�R�RRR�R�R@R�RIRJR�R�R�R]R&RLR�R�R�ROR�RdRV(
R%R\R�R�R�R�R�R>t
offsets_countR�R�toffset_tiii((s,/usr/share/inkscape/extensions/gcodetools.pyteffect�s�		#	


#
*
*












G
@b!!

 





(-R�R�RTR0RVRdR�RuR�R�RR�R�R�RRRHRER�R�R�R	RRR	RR
RR>R7RCR:RSR\R�R<R�R�RjR�RRR�R�RL(((s,/usr/share/inkscape/extensions/gcodetools.pyR*�sX	�	�	�#Q	B	[			B+	)		^		
			�		4	b	�	�	��|Lv	7		 	�	J		�3(�t__doc__RR�R&RR R�RR<R�R�tcodecsR�R�R
t
simplepathR�RR
RRR*R.R4R2RBR^R]tloft_lengths_toleranceR`R�R�R�R�RRRTRJRORYRlRsRtR}R~R�R�R�R�R�R�R[R�R�R�R�R�R�R�R�R]RRRRR
RuR
RR\RRRR$R!R+RGRKRNRQRSRZR[RSR%RRR`R�RcR^RfRZRjRkRqRsRwRxR�R�R�R�R�R�R�R�R�R�R R�R6R*R)R�R�R�R�R�R�R�R�R�R�R1R�R�R�R�R�R�R�RAR�R�R
R�R�R�RRORQRtR~RR�R�R�R*R�taffect(((s,/usr/share/inkscape/extensions/gcodetools.pyt<module>?s�			
,0,,,0,,,0,,,0,,,0,,,0,,,0,,,0,,,0%%!
	8
			

;	)	B	(												 																		%														
															
						

*				
	&	!;Ea	��a		-��0���������������