403Webshell
Server IP : 93.86.61.54  /  Your IP : 216.73.216.206
Web Server : Apache/2.4.62 (Ubuntu)
System : Linux rasin.ddns.net 6.8.0-124-generic #124~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 21:05:19 UTC x86_64
User : www-data ( 33)
PHP Version : 8.4.22
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/share/inkscape/extensions/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/share/inkscape/extensions/__pycache__/gcodetools.cpython-310.pyc
o

0�a<+�@sNdZdZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlZddlZddl
mZmZmZddlmZmZmZmZmZmZmZmZmZejddkrYeZeZd�dd	�Zej dZ!d
Z"d
Z#d
Z$dZ%dZ&ia'd
dd�Z(dZ)dZ*d�dd�Z+e+dd�de+dd�ie+d�e+d�e+d�e+ddd�d�e+d �e+d!�e+d"�e+d#d$d�d�e+d dd�e+d!dd�e+d"dd�e+d#d$d�d�e+d%�e+d&�e+d'�e+d(d$d�d�e+d)�e+d*�e+d+�e+d,d$d�d�e+d-d.d�e+d/d.d�e+d0d.d�e+d,d$d�d�e+d-d.d�e+d/d.d�e+d0d.d�e+d,d$d�d�e+d1d.d�e+d2d.d�e+d3d.d�e+d,d$d�d�ed4d5dd6�ed4d5dd6�ed4d4d7�d8�
Z,d�d:d;�Z-d<d=�Z.d�d>d?�Z/d�dAdB�Z0d�dDdE�Z1dFdG�Z2dHdI�Z3d�dKdL�Z4d�dNdO�Z5d�dQdR�Z6d�dSdT�Z7d�dVdW�Z8dXdY�Z9dZd[�Z:d\d]�Z;d�d_d`�Z<dadb�Z=d�ddde�Z>dfdg�Z?dhdi�Z@d�djdk�ZAd�dldm�ZBdndo�ZCdpdq�ZDdrds�ZEdtdu�ZFdvdw�ZGdxdy�ZHdzd{�ZId|d}�ZJd�d~d�ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d�d��Zcd�d��Zdd�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�d�dÄZmd�d�dɄZnd�d�d̄Zod�d�d΄Zpd�dЄZqd�d҄Zrd�dԄZsd�dքatGd�d؄d�eu�ZvGd�dڄd�eu�Zwd�d܄Zxd�d�dބZyGd�d�d�eu�ZzGd�d�d�eu�Z{Gd�d�d�ej|�Z}e~d�k�r�e}���dSdS)�a�

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)
24 Jan 2017 Removed hard-coded scale values from orientation point calculation
TODO Change line division to be recursive, depending on what line is touched. See line_divide
z1.7�N)�partial)�bezierlength�bezierparameterize�beziertatlength)	�	Transform�PathElement�TextElement�Tspan�Group�Layer�Marker�CubicSuperPath�Style�cCs$t�t�|�tj�}t�||||�S�N)�re�compile�escape�I�sub)�self�old�new�count�pattern�r�,/usr/share/inkscape/extensions/gcodetools.py�ireplaceTsr�-C��6?�H�����z>��h㈵��>z�%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the output dir.)
M3
(Header end.)
z�
(Footer)
M5
G00 X0.0000 Y0.0000
M2
(Using default footer. To add your own footer create file "footer" in the output dir.)
(end)
%)�header�footer�
�DrawCurveMarker�cCst|d|d�|�d�S)z+Set a marker style with some basic defaults�nonezurl(#{}))�stroke�fill�stroke_width�
marker_end)r�format)r'�marker�widthrrr�marker_style}s�r.�#0072a7�InOutPathMarkerz
main curvez#88f�
Arrow2Mendz#8f8z#f88z#777皙�����?�r-)�biarc0�biarc1�line�areaz#33az#3a3z#a33z#222�333333�?z#880z#808z#088z#999z#dd5z#d5dz#5ddz#aaaz#07fg�������?z#0f7z#f44z#7f0z#f70z#744z#ff0000z#ffff00)r'r(r))r'r()
�in_out_path_style�
loft_style�biarc_style�biarc_style_dark�biarc_style_dark_area�
biarc_style_i�biarc_style_dark_i�biarc_style_lathe_feedzbiarc_style_lathe_passing feedzbiarc_style_lathe_fine feed�
area artefact�area artefact arrow�
dxf_pointsFcCsn|r	t�dd|�}d}|ddkr|dd�}|�d�D]}|dkr0|dt�dd|�d7}q|d7}q|S)	Nz[\n\r]+�.�����
�(z[\(\)\\\n\r]�)
)rr�split)�s�replace_new_line�res�arrr�gcode_comment_str�s
rOcCsdd�|D�S)NcS�g|]	}dd�|D��qS)cs"g|]
��fdd�td�D��qS)csg|]}�dd��qSrr��.0�_��pointrr�
<listcomp>��z;csp_from_polyline.<locals>.<listcomp>.<listcomp>.<listcomp>���range�rRrrTrrV��"z0csp_from_polyline.<locals>.<listcomp>.<listcomp>r)rR�sublinerrrrV��z%csp_from_polyline.<locals>.<listcomp>r)r6rrr�csp_from_polyline��r_cCs�g}|D]Q}t|�dkrU|�|dg�t||dd��D]7\}}t|d|d�|krMt|d|d�|krMt|d|d�|krM|d|ddd<q|d�|�qq|S)Nrr%rrF)�len�append�zip�point_to_point_d2)�csp�	tolerancerM�subpath�sp1�sp2rrr�csp_remove_zero_segments�sB�rjTc#Cs�|\}}d}|D�]<}tdt|��D�]1}||d}||}	t||	�\}
}}}
}}}}|
dkr_|dkr_|dkr_||kr_t||	gg�}|dd|krU|ddkr]nn|S	qt||g||dg||	�D]�}|dksw|dk�rt||	|�\}}||kr�|S|dk�rt||	d�d}|dkr�t||	d�d}tdt|�d�D]c}||t|�dkr�q�||d|t|�}|||t|�}t||	�\}}}}}}} }!|dkr�|dkr�|dkr�| |kr�q�t||d�d}"|"dk�rt||d�d}"||"dk�r|d7}nq�qlt||	|�\}}||k�r'|S||k�rCd|
|dd|||dk�rC|d7}qlqq|ddkS)Nrr%rX��G�z��?�{�G�z�?r)rZra�csp_parameterize�csp_true_bounds�csp_line_intersection�csp_at_t�csp_normalized_slope)#�pre�on_the_path�x�y�ray_intersections_countrg�irhri�ax�ay�bx�by�cx�cy�dx�dy�b�t�x1�y1�st_d�j�sp11�sp22�ax1�ay1�bx1�by1�cx1�cy1�dx1�dy1�en_drrr�point_inside_csp�s\
 (
 
��
0���2r����ư>cs�tt���D]_�t��dd��dd�|dkrC��dddd���dd<����fdd�td�D�g7<q��dd��ddkre��dddd���dd<q�S)Nrr%rFrcs$g|]}��dddd��qS)rr%NrrQ�rerxrrrV(�$z*csp_close_all_subpaths.<locals>.<listcomp>rX)rZrard)rerfrr�r�csp_close_all_subpaths$s*$( $�r�cCs�d}d}d}d}|D]H}|D]C}|D]>}|durt||d�n|d}|dur.t||d�n|d}|dur=t||d�n|d}|durLt||d�n|d}qqq
||||fS�Nrr%��min�max)re�minx�miny�maxx�maxyrg�sprsrrr�csp_simple_bound/s ��r�cCs|dd�|dd�S)Nr%rr�rhrirrr�csp_segment_to_bez?�r��r�}Ô%�I�TcCs�gd�}tt|��D]H}tdt||��D]<}t|||d||||dd�}|d|dkr?|d|||dgS|d|dkrQ|d|||dg}qq
|S)N)r�rrrr%rk)�
sample_pointsr)rZra�csp_seg_to_point_distance)rers�dist_bounds�min_distr�rx�drrr�csp_to_point_distanceCs$��r�rkcCs�t||�\}}}}}}	}
}|
|d}
||d}|dkrd}t|d|ddd|d|ddddg|d|ddd|d|ddddg�}t|�D]�}
t|
�|d}d}|dkstt|�dk�r$|dk�r$|d}|d}|||||||
d||d||||||||	||d||d|||	}d	||d||||||||
d||d|||dd	||d||||||	||d||d|||	d}|dk�r|||}nn|d7}|dkstt|�dk�r$|dkstd|k�r0dk�rWnqXt|||�}|d|dd|d|dd}||dk�rW||g}qX|S)
Nrr%r���?r��rX�)rnr�rZ�float�absrq)rhrirsr�ryrzr{r|r}r~rr�r��kr�rx�f�t2�t3�df�p1�d1rrrr�Ps4j p�
�
(�r�rmc,Cs�t|||d|�}|dg7}|d|dkr|St|||d|�}|d|dkr8|dg}|d|dkr8|St|||d|�}|d|dkr\|dd|dg}|d|dkr\|St|||d|�}|d|dkr�|dd|dg}|d|dkr�|S|d8}|dkr�d}t||�\}	}
}}}
}}}t||�\}}}}}}}}t|�D�]2}t|�D�]*}t|d�|d}t|�|d}||}|||}||}|||} d}!ddg}"ddgddgg}#d}$|	||||
|||| |||||}%|
|||||||| |||||}&|!dk�s3t|$|'�|k�r�|!dk�r�d|	|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|#�}#|#du�r�||#dd|"d|#dd|"d8}||#dd|"d|#dd|"d8}||}|||}||}|||} |	||||
|||| |||||}%|
|||||||| |||||}&|$}'|%|%|&|&}$nn|!d7}!|!dk�s3t|$|'�|k�r�|!dk�s3|$|dk�r�d|k�r�dk�r�nq�d|k�r�dk�r�nq�|$||g}|d|dk�r�|Sq�q�|S)Nr%r�rr�rr��rX���r�)r�rnrZr�r��inv_2x2),rhri�sp3�sp4r�r�rf�distr�r�r�r�r�r�r�r�r��ax2�ay2�bx2�by2�cx2�cy2�dx2�dy2r�r��t1r��t12�t13�t22�t23rx�F1�F2�Frurv�Flast�f1x�f1y�f2x�f2yrrr�csp_seg_to_csp_seg_distancels�

88&X  X
,,88&�F
��-r�c
Cs�gd�}tt|��D]�}tdt||��D]�}tt|��D]�}tdt||��D]�}t|||d||||||d|||�}	|	d|dkrNq(|	d|dkri|	d||d||dgSt|||d||||||d|||||d�}	|	d|dkr�|	d|||	d|||	dg}|d|dkr�|Sq(q|d|dkr�|Sqq
|S)N)r�rrrrrrr%r)rfr)rZra�/csp_seg_bound_to_csp_seg_bound_max_min_distancer�)
�csp1�csp2r�rfr��i1�j1�i2�j2r�rrr�csp_to_csp_distance�s,6&<����r���?cCs0|d\}}|d\}}|d\}}|d\}	}
||||}||||}||||}
||||}||	||}||
||}||
||}||||}|
||
|}||||}||||}||||}|d|d||gg||g||g||gg||g|d|dgfS�Nr%rrr)rhrir�r�r��x2�y2�x3�y3�x4�y4�x12�y12�x23�y23�x34�y34�x1223�y1223�x2334�y2334rurvrrr�	csp_split�s"@r�c
Cs�td�dddg}td�dddg}td�dddg}td�dddg}tt|��D�]}tdt||��D�]}t|||dd|||dd|||d|||df�\}}}	}
}}}
}tdd|d|	|�ddg}|D]\}t|�tur�t|j�dkr�|j	}t|�tur�d|kr�dkr�nqr||d|
|d|||}||d|	|d|||
}t
|||||g|�}t|||||g|�}qrtdd|d|
|�ddg}|D]]}t|�tur�|jdkr�|j	}t|�tu�r=d|k�rdk�r=nq�||d|
|d|||}||d|	|d|||
}t
|||||g|�}t|||||g|�}q�q2q&|d|d|d<|d<|d|d|d<|d<||||fS)N�infr�-infr%rrX绽���|�=)r�rZrar�cubic_solver�type�complexr��imag�realr�r�)rer�r�r�r�rxr�ryrzr{r|r}r~�x0�y0�roots�rootrvrurrrro�s@X$$$�*$$���roc		s�t||�}t||�}tfdd�}�fdd��ga�||ddddtt�t}tt|��D]#}t||�dks=||dd	krN|||||d
||d�||<q+|S)NcSs�t|�\}}}}}	}
}}t|�\}
}}}}}}}d}ddg}ddgddgg}|dksBt|d�dt|d�d|k�rf|dk�rf|d}|d}|d}|d}|||||	|||
|||||||d<|||||
||||||||||d<d||d|||	|dd<d|
|d||||dd<d||d|||
|dd<d||d||||dd<|dd|dd|dd|dd}|dk�rB|dd||dd|g|dd||dd|gg}||dd|d|dd|d}||dd|d|dd|d}n	||fS|d7}|dksBt|d�dt|d�d|k�rf|dksB||fS)Nrr�rr%r#rX���)rr�)rNr��ta�tbrfryrzr{r|r}r~rr�r�r�r�r�r�r�r�r�rxr�r��ta3�ta2�tb3�tb2�detrrr�polish_intersections48<<$$$$0
D,.�6�z6csp_segments_intersection.<locals>.polish_intersectionc
s�||krt||||dgg7adS||d}||d}	|dkr�|dkr�t|d�\}
}t|d�\}}
t|
|�rF�|
|||||	|d|d�t||�rZ�||||||	|d|d�t|
|
�rn�|
|
|||	||d|d�t||
�r��||
|||	||d|d�dSdS|dkr�t|d�\}
}t|
|�r��|
||||||d|�t||�r��|||||||d|�dSdS|dkr�t|d�\}}
t||�rֈ||||||	||d�t||
�r�||
|||	|||d�dSdSt|dg|dg|dg|dg�\}}}|�rM|dk�r8tdtd|d��tdtd|d��d}tdtd|d��tdtd|d��d}t||||||||gg7adSdS)N�Overlaprrr�r%rX)�$bezier_intersection_recursive_result�	bez_split�bez_bounds_intersect�straight_segments_intersectionr�r�)rNr��ta0�ta1�tb0�tb1�depth_a�depth_b�tam�tbm�a1�a2�b1�b2�intersectionr�r���	recursionrrr*sL



"�

�

�0
,,*�z,csp_segments_intersection.<locals>.recursionr�r�rk�rrr%)r��INTERSECTION_TOLERANCEr�INTERSECTION_RECURSION_DEPTHrZra)	rhrir�r�rNr�r�
intersectionsrxrrr�csp_segments_intersection
s

' "�rcCs�t||||�}g}|D]d}t|�dkrN|ddkrNd|dkr%dks4nd|dkr2dkrNnnd|dkr@dksjnd|dkrMdksjnd|dkrZdkronqd|dkrhdkronq||g7}q|S)Nrkrrrr%rrX)rra)rhrir�r�rrMrrrr�csp_segments_true_intersectionZs�8
�r�cCs.|dkrd}d}g}t||�\}}}}	}
}}}
t|�D]�}t|�|d}d}d}|dks7t|�|kr�|dkr�z�||}d||d|||
}d||d|	||}d||d|}d||d|	}d|}d|}|d|dd	}|||||||||d
|||||d|dd|d|dd}||||||}|||8}WnYn|d7}|dks7t|�|kr�|dks7d|kr�dk�rnq||k�rt|�dkr�|�|�|D]
}t||�dk�rnq�t||�dk�s|�|�q|S)
Nrr�r%rr��rXr���?�@r����MbP?)rnrZr�r�rarb)rhri�cr�rfrMryrzr{r|r}r~rr�r�r�rxr�r�r�r�r�r��f3x�f3yr�r�rrr�csp_get_t_at_curvaturefsPJ���$
�
�r'cCs�t||�\}}}}}}}}	d}
d}d}|dks!||
|
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}n	|S	|S|dks!||
|
kr�|dks!|S)Nrr�rrr#r�rXr�r!r"r%)rn�pow)rhriryrzr{r|r}r~rr�rfr�rxr�r�r�r�r�r�r%r&r�r�rrr�csp_max_curvature�s:  L����r)rXcCshtt||��\}}}}}}	}
}d||dd|||}d||dd|||	}
d||d|}d||d|}|d|
dd}|dkr[|||
||S|||
|}|dkridS|dkrodSd|||||||||	}|dkr�dS|dkr�dS||||}|dkr�dS|dkr�dS|dkr�t|||d|d	�SdS)
NrXrr�r!rr��}Ô%�I��g���Mb�?r%)rr��csp_curvature_at_t)rhrir��depthryrzr{r|r}r~rr�r�r�r�r�r�r�rrrr+�s4  (r+cCs�d}t|dd�t|dd���dkr>|dd|dd<|dd|dd<||dd|dd|ddgg7}|dd}|D]}|D]}||d|d|d|d7}|}qJqF|dkS)NrrFr%r�r)�P�l2)rgrK�plrhrsrrr�csp_subpath_ccw�s(($�r0cCs(|dd}|dd}|dd}|dd}|dd}|dd}|dd}	|dd}
||||}||||}||||}
||	||}||||}|	|
|	|}||
||}||||}|
||
|}||||}||||}||||}||gS)Nr%rrr)rhrir�ryr{r}rrzr|r~r�r�r�r�r�r�r�r�r��x5�y5rurvrrrrq�s*rqcCsT|ddd�|ddd�|ddd�|ddd�f}t|||�}t|||�Sr�)rrq)rhri�lrf�bezr�rrr�
csp_at_lengths<r5cCsF|ddd�|ddd�|ddd�|ddd�f}t||�Sr�)r)rhrirfr4rrr�cspseglengths<
r6cCsp|d}|d|d}|d}|d|d}||kr#dkr$gS|r-||}d}	nd}||}	|ddd�|ddd�|ddd�|ddd�f}
t|
�\}}}
}}}}}|||	|}|||	|
}|||	|}||||	||}t||||�}g}|D])}t|�tur�t|j�dkr�|j}t|�tur�d|kr�dkr�nq�|�|�q�|S)Nrr%rr绽���|۽g8��?)rr�r�r�r�r�r�rb)�l1r.rhri�dd�cc�bb�aa�coef1�coef2r4ryrzr{r|r}r~r�r�rNr�r$r�r��retvalrxrrrrps6�<$
�rpcCs�||kr	||}}||krt|||�\}}}||||gS|dkr*|dkr*||||gS|dkr=t|||�\}}}||||gS|dkrPt|||�\}}}||||gSt|||�\}}}t||||d|�\}}}||||gS)Nr��A��?r%)r�)rhrir�r�r�r�rrr�csp_split_by_two_points)s 
rAc	Cs�t|�tur	|g}|��||g}d}|D],}d|kr!dkrAnqt|d|d||d|�\}}}|}|||g|dd�<q|S)Nrr�r@r�rFr%)r�r��sortr�)	rhri�pointsrM�last_tr�r�r��sp5rrr�
csp_seg_split=s&�rFcCs�|��ddgg|t|�ddgg}g}t||dd��D]�\}}||kr(q|ddkr:|dd7<d|d<||kr?q|ddkrQ|dd8<d|d<|ddkrb|dt|�dkrbq|d|dkr�t||dd||d|d|d�}|d|dkr�||d|dgg7}qt||dd||d|d�\}}}t||dd||d|d�\}	}
}|d|ddkr�|||d|d|	dg|
gg7}q|||g||dd|dd�|	|
gg7}q|S)Nr%r�r�rr)rBrarcrAr�)rgrC�parts�int1�int2r�rErhrir�r�rrr�csp_subpath_split_by_pointsLs6  *�**$4rJcCs\t|dd|ddd�dkrt|�}t|d|d||d|d|g||�S)Nrrr%r�)r��	normalize�arc_from_c_s_l)rK�r�nr3rrr�arc_from_s_r_n_lls$0rOc
Cs�t||�}|dkrgS||}t�|�}t�|�}|d|d|d||d|d||d|d|d||d|d|g}|d|d|d|dg}|dkrat|�nt|�}	t|||||	�Sr�)�point_to_point_d�math�cos�sin�	rotate_cw�
rotate_ccw�csp_from_arc)
r$rKr3rM�alpha�cos_�sin_�erN�sloperrrrLrs


` rLcCsNt|�}t|d|d|d|d�t|d|d|d|d�t}tt|�dtj�d}t|d|d|d|d�}t�|�}t�|�}	dt�||d�d}
t	||	|
|||
|g�dkr||dkrx|t8}n|t7}t||�dkr�gStt|�dtj�d}dt�||d�d}
g}t
|d�D]d}t�||||�}t�||||�}	g|d|||d|	|ggg}
|
dd|	|
||
dd||
|g|
d<|
dd|	|
||
dd||
|g|
d<||
g7}q�|dddd�|dd<|dd|dd<|S)Nrr%rg@r"r#rF)r��atan2�TAU�intrQ�pirRrS�tan�dotrZ)�start�end�centerrM�slope_strW�sectors�alpha_startrXrYr��resultrxr�rrrrVs4H"

$
&44rVcCs�|\}}}}t|�}||��}|dkr||||��|}||��||��}||dkr=|dkr9|t}nt|}t|d|�sPtt|�t||��tkr\||��|j	|j
gfS||��}	||��}
|	|
krt|	|j	|j
gfS|
|j	|j
gfSdS�Nr)r-�mag�unit�angler]�betweenr�r��STRAIGHT_TOLERANCErurv)rs�arc�P0�P2r$rNrMrxrWr��d2rrr�point_to_arc_distance�s$
&�rsc
Cs�d}d}dddgf}dddgf}d}	|dks&t|d|	d�|krk|dkrk|d7}|d}	t|d�D]}
t|
�|}t|||�}tt||�t||��}t||�}q4|d}|dks&t|d|	d�|krk|dks&|dS)Nr#rr%rr)r�rZr�rqr�rsr�)
rhri�arc1�arc2rfrNrxr�r��dlr�r�rsrrr�csp_to_arc_distance�s ((�	rwcCs�|d|d|d|dg}|\}}d}d}d}td�D]B}	||	d\}
}||	\}}
t||
�}t||
�}|
|dkr^||||
||
|
|kr^|t|
|�kr^|t|
|�kr^|d7}q||koh|knop|ddkS)Nr%rrr�r*r)rZr�r�)rhrirsr4rurvr$�xmin�xmaxrxr�r�r�r�rrr�csp_point_inside_bound�s

H�$rzc	Cs|d|dkr|d|dks |d|dkr"|d|dkr"dS|d|d|d|d|d|d|d|d}|dk�r-|d|d|d|d|d|d|d|dk�r+|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|kr�dk�snd|k�r	dk�r)nnd|k�rdk�s'nd|k�r%dk�r)dSndSdSdSd|d|d|d|d|d|d|d|d|k�oWdkn�o�d|d|d|d|d|d|d|d|d|k�o�dkSS)Nrr%Frr)	r��p2�p3�p4ru�t11r��t21r�rrr�line_line_intersect�s*@@
B   "    t\R��r�cCs�|d|dkr|d|dks |d|dkr"|d|dkr"gS|d|d|d|d|d|d|d|d}|dk�r{|d|d|d|d|d|d|d|dk�ry|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|kr�dk�snd|k�rdk�rwn|	Sd|k�rdk�s*nd|k�r'dk�rwn|	Sd|k�r6dk�r=nn|	|g7}	d|k�rIdk�rPnn|	|g7}	d|k�r\dk�rcnn|	|g7}	d|k�rodk�rwn|	S|	|g7}	|	SgS|d|d|d|d|d|d|d|d|}
|d|d|d|d|d|d|d|d|}d|
k�r�dk�r�ngSd|k�r�dk�r�ngS|dd|
|d|
|dd|
|d|
ggSgSr�r)r�r{r|r}rur~r�rr�rMr�r�rrr�line_line_intersection_points�sL@@
B   "    2	4�	�



�DD�:�r�cCs(|d|dd|d|ddS�Nrrr%r�rNr�rrrrds(rdcCs.t�|d|dd|d|dd�Sr��rQ�sqrtr�rrrrPs.rPcCs|d|d|d|dg}|d|d|d|dg}|d|d|d|d}|dkrD|d|d|d|dS|d|d|d|d}||krl|d|dd|d|ddS|d|d|d||d|d|d|d||S�Nrr%rr)r�r{r|�w0�v�c1�c2rrr� point_to_line_segment_distance_2#s     (Dr�cCs@t||||�r	dStt|||�t|||�t|||�t|||��Sri)r�r�r�)r�r{r|r}rrr�line_to_line_distance_21s



�r�cCs�t||�}t||�}d}d}td�D]}t||||�s$t||||�r(d}nqtd�D]D}td�D]=}	t||d||||	d||	�}
|
|krN|
}||	d||dd||	d||dd}
||
krp|
}q3q-||fS)Nr�r�rr%rr)r�rZrzr�)rhrir�r��bez1�bez2r��max_distrxr�r�rrrr�;s(

 �&8��r�cCsltt|��D]-}g}||D]}|ddd�|ddd�|ddd�gg|}q|dd�||<q|S)Nrr%r�rZra)rerxrNr�rrr�csp_reverseOs6r�cCs�t|ddd�|ddd�|ddd�|ddd�f�\}}}}}}}	}
|d|dkrB|dkrB|dkrCddgSd|||d|||}d|||d|||}t||||�dkr�t�||||�}
||
||
gS|dkr�|dd|dd}|dd|dd}t||||�dkr�t�||||�}
||
||
gS|dd|dd}|dd|dd}||||dkr�t�||||�}
||
||
gSdS|dk�ri|dd|dd}|dd|dd}t||||�dk�r1t�||||�}
||
||
gS|dd|dd}|dd|dd}||||dk�rgt�||||�}
||
||
gSdSddgS)Nr%rrr�r�rXg��&�.>)rr�rQr�)rhrir�ryrzr{r|r}r~rr�r�r�r3rrrrrXsDP,�  �
�rrcCst|||�\}}||gSr)rr)rhrir��nx�nyrrr�csp_normalized_normal~s
r�cCstt||��Sr)rr�r�rrrrn�r`rncGsTdd�}t|�dkrgSt|�dkr|dS|d}|dd�D]}|||�}q |S)NcSs�|s|S|s|S|ddd|dddd|ddd|dddddkr\|dd�|dd|dd|ddg|dd|dd|ddgg|dd�S|dd�|dd|dd|ddgg|dd�S)NrFr%rrr r��s1�s2rrr�concat�sL\<z#csp_concat_subpaths.<locals>.concatrr%�ra)rKr�rhr�rrr�csp_concat_subpaths�s
r�cCsH|ddd|dddd|ddd|ddddS)NrFr%rrrr�rrr�#csp_subpaths_end_to_start_distance2�sHr�c

sg}tt|��D]y}||}g}tdt|��D]�|�fdd�t|||�d|��D�7}qt||�}|dd�D]A}d}t|g�D]0}	|d|d|	d|d|d|	d|d|d|d|ddkrtd}nqD|r||�|�q;||7}q|S)Nr%c�g|]}�|g�qSrr)rR�int_�r�rrrV��z$csp_clip_by_line.<locals>.<listcomp>Frg{�G�z��T)rZrarprJro�remove)
rer8r.rhrxrKr�
splitted_s�cliprsrr�r�csp_clip_by_line�s&.
T�
�
r�cCs$t|�dkr�|sMt|�dkr|dddd�|dd<t|d�tddg�krC|D]}||dd�|dd�|dd�gg7}q*|S||||gg7}|St|�dkra|dddd�|dd<t|d�tddg�kr�|D]}|dd�|dd�|dd�gg|}qo|S|||gg|}|S)NrrFr%r)rar�)rgrC�prependrsrrr�csp_subpath_line_to�s$*�	�*�r�cCs|dd�}d}g}|r~d}t|�dkrr|ddd�}|d=d}d}|t|�krat|||�dkr@t|||�||<d}d}n!t|||�dkrWt|||�||<d}d}n
|d7}|t|�ks)|sl||dd�g7}t|�dks|r||dd�}g}|s|S)NTFrrFr�r%)rar�r�)rerh�done_smf�
joined_resultr�r��
joined_smfrrr�csp_join_subpaths�s>���r�cCs@|d|d|d|d|d|d|d|dSr�r)rNr�r$rrr�triangle_cross��@r�c
Cs�|ddd�}|ddd�}|ddd�}|ddd�}t|||�}t|||�}t|||�}t|||�}	|dkrN|dkrNt||||�t||||�gS|dkr_|t|||�t|||�gS|dkrp|t|||�t|||�gS|dkr�|t|||�t|||�gS|	dkr�|t|||�t|||�gS||dk}
||dk}||	dk}|
r�|r�|r�|||gS|
r�|r�|s�||||gS|
r�|s�|r�||||gS|
s�|r�|r�||||gS|
r�|r�|s�|||gS|
r�|s�|r�|||gS|
r�|s�|r�|||gStd��)Nr%rrzJcsp_segment_convex_hull happened which is something that shouldn't happen!)r�r�r��
ValueError)
rhrirNr�r$r��abc�abd�bcd�cad�m1�m2�m3rrr�csp_segment_convex_hull�sH



r�cCstt|�t|��Sr)�bounds_intersect�	bez_bound)r�r�rrrr�rc	Cs�t|dd|dd|dd|dd�t|dd|dd|dd|dd�t|dd|dd|dd|dd�t|dd|dd|dd|dd�gS�Nrr%rrXr�)r4rrrr� s
,,,,�r�cCsB|d|dkp|d|dkp|d|dkp|d|dkS)Nrrr%rXrr�rrrr�)sBr�cCs0|\}}|\}}||||||||gSrr)�xy1�xy2r�r�r�r�r�rrr�tpoint-s r�cCs�t|d|d|�}t|d|d|�}t|d|d|�}t|||�}t|||�}t|||�}|d|||g||||dgfSr�)r�)rNr�r�atrrr�a3rrrr3s rcCs>|\}}t�|d|d�}|dkrddgS||||gS)Nrrr�r�)�xyrurvr3rrrrKAs
rKcCs |d|d|d|dS�Nr%rrr�rrr�crossJ� r�cCs |d|d|d|dSr�rr�rrrraNr�racCs|d|dgSr�r�r�rrrrURr�rUcCs|d|dgSr�rr�rrrrTVr�rTcCs$|d|d|d|ddkSr�rr�rrr�vectors_ccwZ�$r�cCs�|dd|dd|dd|dd}|dkrdS|dd||dd|g|dd||dd|ggSr�r)rNrrrrr�bs0  �r�cCst|�tkSr)r��small_tolerance�rNrrr�smalllsr�cGs�t|�dkr1t|d�tddg�kst|d�td�kr1tjdt�|dd|dd�tSt|�dkrHtjdt�|d|d�tStdj|���)Nr%rr�)r�r�rzBad argumets for atan! ({}))rar�rQr_r\r]r�r+)�argrrrr\qs
8*"r\cCs�|durd}|d�|�7}t|�t|�|d�}|dur!t|�|d<|dur(tj}|�tdi|���}|�dd�t|��d�}|D]}	|�tt|�t|�d��}
|
�d	d
�||7}t|	�|
_	qAdS)Nz�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;zfont-size:{:f}px;)rurv�style�
gcodetoolsz	xml:space�preserverG�rurvz
sodipodi:roler6r)
r+�str�options�doc_root�addr�setrJr	�text)r�rurv�groupr��	font_size�gcodetools_tag�
attributes�	text_elem�string�spanrrr�	draw_textzs"�r��#f00r&rE�-����?cCsX|durtj}|�t��}|dur|n|d||d�|_t|�|_|dkr*|�d|�|S)Nr%)r(�fill-opacityr'zstroke-widthrE�comment)r�r�r�rr�r
�pathr�)rer'r(r�r-r�r��noderrr�draw_csp�s�
r��$@cs��d�|dur
i}|
durd}
|
|d<|durtjj��}|durE|	dur(d}	|�t|
dd��}t||d�d|d	�||	d
�|dkr�d}td	t|�d�D]}
|d
�	||
d||
dd	�7}qT|�
d�	|d|d	|�d�	||�t|�d��n[|dkr�|dur�d}d}d�	|d|d	�t�
d�fdd�d�}|�
|d�	||�t|�d��n*|�
d�	|d|d	��d�d�����d�d��d�	||�t|�d��|�tdi|���dS)Nr�Pointerr��z group�r�rg������@r%)r�r�r6rEz {}, {} zM {},{} L {}z&fill:none;stroke:{};stroke-width:{:f};)r�r�r��arrowz#12b3ffz0.8zm {},{} z([0-9\-.e]+)cstt|�d���d�S)Nr%�@)r�r�r�)�match��sizerr�<lambda>�r^zdraw_pointer.<locals>.<lambda>aX0.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 zz$fill:{};stroke:none;fill-opacity:{};z=m {},{} l {:f},{:f} {:f},{:f} {:f},{:f} {:f},{:f} , {:f},{:f}r�r)r�r�svg�get_current_layerr�r
r�rZrar+�updater�rrr)ru�color�figurer�r�r(r-r�r�r��pointer_type�attribrKrx�fill_opacityr�rr�r�draw_pointer�s4&&2* Tr�cCs�|dd}|dd}|dd}|dd}|dd}|dd}|dd}	|dd}
||kr8||ks@||krB|	|
krBdS|||
|	||||dkr�||kr`||||n||	|
|	}||krt||||n||	|
|	}||kr�||||n|	|||}
||kr�||||n|
|||}d|kr�dks�nd|kr�dks�nd|
kr�dks�nd|kr�dks�n|s�dnd||f|
|ffS||	|||||
|	|||
|	||||}||k�r|||||||n
||	||||
|	}d|k�o(dkn�r:d|k�o6dkn�p<|||fS)Nrr%)FrrrFr)rNr��true_intersectionryr{r}rrzr|r~r�r�r��tc�tdrrrr	�s& $((((r@BDr	cCs@|t|ko
|tknp|t|ko|tkSSr)rn)r$rurvrrrrm�r�rmcCs^t||||�}g}|D]!}t|�tur'd|jkrdkr&nq|�|j�q|�|�q|S)Nr7r�)r�r�r�r�rbr�)rNr�r$r�r�rMr�rrr�cubic_solver_real�s�r�cCsD|dkr�||||||}}}d|dd||d|}|dd|}|dd|d}ddt�d�d	}ddt�d�d	}|dkr�|t�|�}	|	dkr`t|	dd
�nt|	dd
�}
|t�|�}	|	dkr{t|	dd
�nt|	dd
�}ntt|t�|�d�d
�}
tt|t�|�d�d
�}d||
|}d|||
||}
d|||
||}||
|gS|dk�r|dd||}|dkr�|t�|�d||t�|�d|gS|dkr�|||gS|t�|�d||t�|�d|gS|dk�r ||gSgS)NrrrX�	�rg�r�y�?gUUUUUU�?gUUUUUUտ)�cmathr�rQr(r�)rNr�r$r��mr�rN�w1�w2r�r��n1r�r�r�rrrrr��s8 (*

00
r�cGsbttjd��!}|D]}t|��d�d}|�|�q	|�d�Wd�dS1s*wYdS)N�ab�unicode_escape� �
)�openr��log_filename�unicode�encode�write)r�r�rKrrr�print_s"�r	c@s�eZdZd$dd�Zdd�Zdd�Zdd	�Zd
d�ZeZdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)%r-NcCs@|durt|�|_t|�|_dSt|d�|_t|d�|_dSr�)r�rurv)rrurvrrr�__init__s

z
P.__init__cCst|j|j|j|j�Sr�r-rurv�r�otherrrr�__add__ �z	P.__add__cCst|j|j|j|j�Srrrrrr�__sub__#rz	P.__sub__cCst|j|j�Srr�rrrr�__neg__&r�z	P.__neg__cCs8t|t�r|j|j|j|jSt|j||j|�Sr)�
isinstancer-rurvrrrr�__mul__)s
z	P.__mul__cCst|j||j|�Srrrrrr�__div__0sz	P.__div__cCs
|�|�Sr)rrrrr�__truediv__3s
z
P.__truediv__cC�t�|j|j�Sr)rQ�hypotrurvrrrrrj6�zP.magcCs|��}|r
||Stdd�Sri)rjr-)r�h_magrrrrk9s
zP.unitcCs|j|j|j|jSrr�rrrrra?r�zP.dotcCs>t�|�}t�|�}t|j||j||j||j|�Sr)rQrRrSr-rurv)r�thetar$rKrrr�rotBs

*zP.rotcCrr)rQr\rvrurrrrrlGrzP.anglecC�d�|j|j�S)Nz	{:f},{:f}�r+rurvrrrr�__repr__Jrz
P.__repr__cCr)Nz
{:.2f},{:.2f}rrrrr�prMrzP.prcCs|j|jgSrr�rrrr�to_listPsz	P.to_listcCst|j|j�Sr)r-rvrurrrr�ccwSrzP.ccwcCs|j|j|j|jSrr�rrrrr.Vr�zP.l2r)�__name__�
__module__�__qualname__r
rrrr�__rmul__rrrjrkrarrlrr r!r"r.rrrrr-s&
r-c@s>eZdZdd�Zdd�Zdd�Zdd�Zddd�Zd
d�ZdS)�LinecCsv|jtkr	|��}|jtkr|��}t|�|_t|�|_|��|_|jdkr4|j|j|j��|_dSddg|_dSr�)	�	__class__r-r!�strc�lengthr3r"rN)rr)rcrrrr
[s





z
Line.__init__cCs,|j|j|8_|j|j|8_dSr)r)rNrc)rrMrrr�offsethszLine.offsetcC�|j|j��Sr)r)rcr.rrrrr.lrzLine.l2cCr,r)r)rcrjrrrrr*orzLine.lengthrr%c
Csxt�|j��|d�}t�|j��|d�}|dd�|d|d|d|d�dd�}	|r0||	d<|�td	i|	���dS)
NTr6�M {},{} L {},{}rr%�Preview)r�r�r��	transformr)r�r/r)r!rcr+r�r)
rr�r��layerr/�num�
reverse_angler)rc�attrrrr�drawrs�z	Line.drawcCs.|jtk�r�|jdks|jdkrgS|j|j}|j|j}|j|j|j|j}|dk�r1g}|jj|jj|j|jj|jj|jdk�r/|jdkr�d|jj|jj|jkrbdkrjnn|�|j�d|jj|jj|jkr}dkr�nn|�|j�d|jj|jj|jkr�dkr�nn|�|j�d|jj|jj|jkr�dkr�n|S|�|j�|Sd|jj|jj|jkr�dkr�nn|�|j�d|jj|jj|jkr�dkr�nn|�|j�d|jj|jj|jk�r	dk�rnn|�|j�d|jj|jj|jk�r&dk�r/n|S|�|j�|S|j|jj|jj|j|jj|jj|}|j|jj|jj|j|jj|jj|}t�	t
|||f��d|k�rydk�r�ngSd|k�r�dk�r�ngS|j||gSgSgS)Nrrr%)r(r'r3rcr)rurvrbr��errorr�)rr��v1�v2rurMr�r�rrr�	intersect~sP
2
***(�
*�*.,�22��zLine.intersectN�rr%)	r#r$r%r
r+r.r*r4r8rrrrr'Zs

r'c/sHd�d�t��}|}td�|��td�|������fdd�}dd��d	d
���fdd�}���fd
d��t|�}tt|��D]G}tt||��D]<}|||}	t|	d�t|	d���dkrm|	d|||d<t|	d�t|	d���dkr�|	d|||d<qKqAtt|��D]n}tdt||��D]'}t|||d|||�dkr�||d|�|||dd�||<q�t||d||d�dkr�||dd||dd<||||dd||dd||ddgg7<q�|dd�}
td�t��|��td�tdd�|D����t��}dd�t|�D�}dd�t|�D�}t|�D]�}||}
g}t	|
|
dd��D]E\}}||||�}|�s\|}t|�}n$|||d�||||||�\}}}t
|d|d�|||�}t|�}|dd�}|dd�}�qH|||d�|dd�|
d|
d|||�\}}}|dd�|dd�<t
|d|d�||�}|dd�||<�q7td�t��|��t��}dad}d}t|�D�]�}t||�D�]�}||}
||}tdt|
��D�]m}||k�rt|t|��ntt|��D�]V}||k�r�||k�r�t|
|d|
|d�\}}}t
||||�}|d7}|D]Q}|d7}t|dd��rPt|d��s�d|dk�r^dk�r�n�q:d|dk�rodk�r�n�q:||||ddg||dddgg7<�q:�qt
|
|d|
|||d||�}|d7}|D]�}|d7}t|�dk�r3d|dk�r�dk�r3nnod|dk�r�dk�r3nn_||k�r||dt|
�ddk�r�t|dd��r�t|d��s3||dt|
�ddk�rt|dd��rt|d��s3||||dgg7<||||dgg7<�q�t|�dk�re|ddk�re||||dg||dgg7<||||dg||d gg7<�q��q�q��q�q�td!�t��|��td"�|��td#�|��t��}g} t|�D]V}||}
t||�dk�r�t|
||�}!dd$g||v�r�|!ddd|!ddd<t
|!d|!d�|!d<| |!dd�7} �q�| |!dd�7} �q�| |
dd�g7} �q�td%�t��|��t��}g}"tt| ��D�]}d&}#| |}$tt| ��D]�}| |}%t|$dd�t|%dd���d'k�rS|dt| �|k�rStt|%d(|%dd)�t|$d|$dd$��|d*k�rSd+}#n@t|%dd�t|$dd���d'k�r�|dt| �|k�r�tt|%d|%dd$�t|$d(|$dd)��|d'k�r�d+}#n�q|#�s�|"|$dd�g7}"�qtj�rt|$gd,d-�tt|%d(|%dd)�tt|%d(|%dd)��tt|%d(|%dd)��d��d.d/�tt|$d|$dd$�tt|$d|$dd$��tt|$d|$dd$��d��d0d/��qt|"�}&|&dd�D]\}'t|'|'�dk�rBtj�r;t|'gdd-�t|'ddt|'|'�d1�t|'ddt|'|'�d1�|&�|'��qt|'g�\}(})}*}+|(d|*dd|)d|+ddd,k�rg|&�|'��qtd2�t��|��t|d�dk�r�d3|d},d4|d}-nt|�dd},t|�dd}-|&dd�D]o}'t |
|'t!t|'�d�d|,|-gd5�}.|,|.dk�r�|-k�sn|&�|'�tj�rt|'gt"�#|.d�d1�tt||.d|.dd||.d|.d|.d �|'t!t|'�d�dd6d/t"�#|.d�|||	gd1��q�td7�td8�t��|��t�|&S)9Ng�������?r#zOffset start at {}zOffset radius {}cs�g}t||d|�}t|�dkrddg}|��|ddkr#dg|}|ddkr.|�d�t||dd��D]�\}}t||||d�}t||||�}|d|dkr�|d|kr^|dksh|d|kru|dkru�|d|d|���}	n�|d|d|���}	|s�|	dd�}q7t||	�d	kr�t||	�}q7�||	�}
|
r�|
\}}}
}t	||d|||�\}}}|d|d�||g}t	|	|
d|	|
|�\}}}t|||g|	|
dd��}q7	q7|S)
Nr%rr�r��:�0�yE>rFgG������?rr)
r'rarBrbrcr+rAr�r�r�)rhrirMrhr�r)rcr$r�r+rrxr�r�r��sp1_�sp2_�sp3_)�(csp_get_subapths_last_first_intersection�offset_segment_recursion�offset_subdivision_depth�offset_tolerancerr�csp_offset_segment�s<

(
 �z&csp_offset.<locals>.csp_offset_segmentcSspt|d�}t|d�}t|d�}t|d�}||}||}||}	|��dkr0|����ntt||d��}
|	��dkrD|	����ntt||d��}|��dkrX|����n	|
��|����}|||
}
|||}t||d�}|
||dt|�dkr�||nd}t||d�}|||dt|�dkr�||nd}|
��|
��|��g|��|��|��ggS)Nr%rr�d)r-r.r"rkr�r+r�r!)rhrirM�p0r�r{r|�s0r��s3�n0�n3r��q0�q3r$�q1�q2rrr�create_offset_segment�s"((,((,z)csp_offset.<locals>.create_offset_segmentc
Ss�d}tdt|��D]3}||d}||}tdt|��D]}||d}||}t||||�}	|	r7d}nq|r<nq	|rQt|	�}	t|�||	d||	dgSgS�NFr%Tr)rZrarr�)
r�r��_breakrxr��sp12r��sp21r�rrrrr>�s&
��z<csp_offset.<locals>.csp_get_subapths_last_first_intersectionc	s�t|�dkrct|dd�t|dd���dkr|g|fS�||�}|rc|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}|d|d�||
gg||g||
dd�fStt||d��|tt||d����}tt||d��|tt||d����}t|||d|t||d��}|s�|g|fSt	||�dkr�||�}|r�|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}|d|d�||
g}||g||
dd�}|s�|g|fSt	||�dk�r=�||�}|�r=|\}}	}
}t||d|||	�\}}
}t||
d||
|�\}}}|d|d�||
g}||g||
dd�}|||fS)Nr%rFrr#r�r�r )
rar-r.r�rqr�r!rVrrr�)�prev�nextrhri�sp1_l�sp2_lrMrrxr�r�r�r;r<r=�sp4_�sp5_rbrcro)r>rr�csp_join_offsets
sB(

2((




z$csp_offset.<locals>.csp_join_offsetscsj�|||�\}}tt||tt||d��tt||d��|���dt||tt||d��tt||d��|���dt||tt||d��tt||d��|���d�}||dkr�|dkr�|�dkrtt||�}tdtd|��}nd}t|||�\}	}
}�|	|
||d|�}�|
|||d|�}
|dd	�|d	d|d	d|
ddgg|
dd�S||gS)
Ng�?rr�g�?rr2��������?r%rF)	r�r�r-rqr�r!r)r�r�)rhrirMr,rf�sp1_r�sp2_r�errr�r�r�rE�r1�r2)rMr?r@rrr?6s 222�
<z,csp_offset.<locals>.offset_segment_recursionr%rr#rrFzOffset prepared the path in {}zPath length = {}cSsg|]}t|��qSrr��rRrxrrrrVjr�zcsp_offset.<locals>.<listcomp>cS�g|]}g�qSrrr_rrrrVq�cSr`rrr_rrrrVsrazOffsetted path in {}rmr�rkrrrXzIntersections found in {}zExamined {} segmentszfound {} intersectionsr�zSplit in {}Frr�r�g-C��6�Tr2r3�Greenr6�Red�r�zClipped and joined path in {}rlg)\��(�?�r��bluez-----------------------------zTotal offset time {})$�timer	r+ra�xranger-rjr6�sumrcr�r�r�rr�rJrZr.rar�rrr��offset_draw_clippend_pathr�r�rqr!r�r�r�ror�r�r^rQr�)/rerM�time_�
time_startrBrX�csp_lenrxr�r��original_csp�unclipped_offsetrrg�subpath_offsetrhri�segment_offset�prev_lrTrUrRrorS�summ�summ1�	subpath_i�	subpath_j�subpath1r�rr��splitted_offsetrGrhr�r�r�r�rKr�r�r�r�r]r^r�r)rMr>r?r@rAr�
csp_offset�sR%)  ��"(�<�
$4	*d0��&N
>>$$�����!@4@4�6��6���.
�&
j�ryc*Cshdd�}t|d�}t|d�}t|d�|}t|d�|}	||}
|��}|	��}|
��}
|	��tkrL|��tkrL|dddd|d||gggS|	��tkrd||
��}	|��|
��d}n"|��tkr~|	|
��}d|	��|
��d}n|��|	��}|��}|	��}	||tjtkp�tj||tjtk}|r�|
��tks�|	��tks�|��tks�dt||
|��|
���tkr�|dddd|d||gggS|
|
}d|
|||	}d|||	d}|
��dkr�||||||�St|�dk}t|�dk}t|�dk}|�r|dk�r||}na|�r,|dk�r,||}nS|�sq||d||}|dk�rEt	||||��|d	}||d|}||d|}||dk�rkt	||||||��t
||�}n|�r|�r||||||�S||}||}|||}|||	}||||||}d
d�} | |||�\}!}"| |||�\}#}$|!du�s�|#du�s�|!|��tk�s�|#|��tk�r�|dddd|d||gggSt|||||!|"g|||#|$g�}%|%tj
k�r|tjk�r||||||�S|#��|$dk�r
|}&n|||t|!��|"�t|#��|$�t|!��|"�}&||��}'|'tdk�sE|'td|!��dk�rV|dddd|j|jg||&gg}(n|dd
|!j|!jg|"|j|jg||&gg}(||��}'|'tdk�s�|'td|#��dk�r�|j|jgddd|j|jg|&|gg})|(|)gS|j|jgd
|#j|#jg|$|j|jg|&|gg})|(|)gS)Nc	Ss�|tjkr@t||�\}}}t||�}t||�}||dkr |}n||||||}t|||||d�t|||||d�S|dddd|d||gggS)Nrr%r6)r��biarc_max_split_depthr�r6�biarc)	rhri�z1�z2r,r�r8r.�zmrrr�biarc_split(s


(zbiarc.<locals>.biarc_splitr%rrr6r�rr�c	Ss||d}||��dkrdS|||��d||��||��}||��dtj}||��dtj}||��dtj}||dtj}||kr\||ksh||ksh||krf|kronndtj|}t|j�dks�t|j�dks�||��tj	dkr�dS||fS)Nrr�NNr�i@B)
rjrkrlrQr_r�rurvr��min_arc_radius)	rp�P1rq�D�R�p0a�p1a�p2arWrrr�calculate_arc_paramsrs,02z#biarc.<locals>.calculate_arc_paramsrCro)r-rlrj�STRAIGHT_DISTANCE_TOLERANCErkrQr_rnr�r�r�rwr��biarc_tolerancerzr.�EMC_TOLERANCE_EQUALrurv)*rhrir|r}r,rrp�P4�TS�TEr��tsa�tea�varM�tang_are_parallelr$r�rN�asmall�bsmall�csmall�beta�discr�disq�beta1�beta2rWrr��P3rqr��R1r�R2rr�r~r3rtrurrrr{'s�
*$$
8<("(($,�r{c@sneZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zddd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�
Postprocessorc
Cs6||_|j|j|j|j|j|j|j|j|jd�	|_	dS)N)	�remap�remapi�scale�move�flip�	flip_axis�round�parameterize�regex)
r5r�r�r�r�r��round_coordinatesr��re_sub_on_gcode_lines�	functions)r�error_function_handlerrrrr
�s�zPostprocessor.__init__cCsjt�dd|�}t�dd|�}|�d�}|D]}t�dd|�}t�dd|�}|��}|dkr2|�|�qdS)	Nz\\\\z:#:#:slash:#:#:z\\;z:#:#:semicolon:#:#:�;z\\z\;rE)rrrJ�strip�
parse_command)r�commandrKrrr�process�s

��zPostprocessor.processcCs~t�d|�}|s|�d�|�d�|�d���}|�d�}||jvr3td�||��|j||�dS|�d�||�d�dS)Nz([A-Za-z0-9_]+)\s*\(\s*(.*)\)z1Parse error while postprocessing.
(Command: '{}')r5r%rz(Postprocessor: executing function {}({})z@Unrecognized function '{}' while postprocessing.
(Command: '{}'))rr�r5r+r��lowerr�r	)rr�rM�function�
parametersrrrr��s

zPostprocessor.parse_commandc
Csz|j�d�}d|_z|D]}|jtd�|��d7_qWdSty<}z|�d�||�d�WYd}~dSd}~ww)NrGrEzre.sub({},line)z�Bad parameters for regexp. They should be as re.sub pattern and replacement parameters! For example: r"G0(\d)", r"G\1" 
(Parameters: '{}')
 {}r5)�gcoderJ�evalr+�	Exceptionr5)rr�r�r6�exrrrr��s�
���z#Postprocessor.re_sub_on_gcode_linescCs|j|dd�dS)NT)�case_sensitive)r�)rr�rrrr��r�zPostprocessor.remapiFcCs�|�dd�}|�d�}g}g}|D])}|�dd�}t�d|�}|s*|�d�|�d�||�d�g7}||�d�g7}qtt|��D]}|rSt	|j
||d	�|��|_
qA|j
�||d	�|��|_
qAtt|��D]}|j
�d	�|�||�|_
qgdS)
Nz\,z:#:#:coma:#:#:�,z$\s*('|")(.*)\1\s*->\s*('|")(.*)\3\s*z,Bad parameters for remap.
(Parameters: '{}')r5rrz:#:#:remap_pattern{}:#:#:)�replacerJrr�r5r+r�rZrarr�)rr�r�rr�rKrMrxrrrr��s$
�zPostprocessor.remapc
Csjgd�}|d|d|ddk}d}g}|d}d}|j�d�D�]}	t�dd|	�}
t�d	|
�}|rS|�d���}|dkrC|d}|d
krK|d}|dkrS|d}||vr�t�d|
�}|r�|dkrp|d|dkrp|�d
�|d
kr�|d|dkr�|�d�|dkr�|d|dkr�|�d�||g7}tt	|��D]N}||dks�||dkr�||D];}
t�d|
d|	�}|r�|�d�dkr�t�d|
dd�
t|�d�|�d��|||
dvr�||nd�|	�}	q�q�|dk�rt�d|	�}|�r|�d�dk�rzt�dd�
t|�d�|�d��|�|	�}	WnY||	d7}q"||_|�r3|�d�dSdS)N)�xi�yj�zkrNrr%rrE�g17rG�
\([^\)]*\)�(?i)(G17|G18|G19)�g18�g19z
(?i)(G02|G03)zePost-processor: Scale factors for X and Y axis are not the same. G02 and G03 codes will be corrupted.zePost-processor: Scale factors for X and Z axis are not the same. G02 and G03 codes will be corrupted.zePost-processor: Scale factors for Y and Z axis are not the same. G02 and G03 codes will be corrupted.�(?i)(�)\s*(-?)\s*(\d*\.?\d*)rXz\1 {:f})rxr�r�z(?i)(r)\s*(-?\s*(\d*\.?\d*))z(?i)(r)\s*(-?)\s*(\d*\.?\d*)z'G02'->'G03', 'G03'->'G02')
r�rJrr�searchr�r�r5rZrar+r�r�)rr�r��axisr�r��warned�r_scale�planerK�
s_wo_commentsrMrxrNrrrr/�s\



L�
0�zPostprocessor.transformcCsng}i}g}d}dddddddd�}|j�d�D]h}t�dd|�}t�d	|�}	|	r9|	�d
���}
|
|vr9||
g7}t�d|�}	|	r]t|	�d�|	�d
��}||vr]dtt	|�d�||<dD] }t�d|d|�}	|	r||	�d
���}||vr||g7}q_qddddd�}
|D]}|d�
|
||���7}q�|s�dg}t	|�d
kr�|d7}dddddddd�}nL|d�
ddd d!�|d"�7}|d#�
d$d%d&d!�|d"�7}dddddddd�}d|vr�d'|d<d'|d(<d)|vr�d'|d<d'|d*<d+|vr�d'|d<d'|d,<d|v�r|d-7}d.|d<|D]
}|d/�
|||�7}�q|j�d�D]�}t�d|�}	|	�rMt	|	�d
��d"k�rMt�dd0�
|t|	�d�|	�d
���|�}d1D]-}t�d2|d3|�}	|	�r{t	|	�d4��d"k�r{t�d|d5d6�
|||
|�|�}�qOd7D]*}t�d2|d3|�}	|	�r�t	|	�d4��d"k�r�t�d|d5d8�
||�|�}�q||d7}�q"||_dS)9NrErurv�zrN)rurvr�rxr�r�rNrGr�r�r%z(?i)(F)\s*(-?)\s*(\d*\.?\d*)rrX�#r��xyzijkar�r�z#6z#7z#8z#9�rurvr�rNz{}  = 0 ({} axis offset)
r�z#10 = 1 (Scale factor)
z#10)rurxrvr�r�r�rMz#10 = 1 ({} Scale factor)
�XY�XZ�YZ)r�r�r�rz#11 = 1 ({} Scale factor)
�Z�Y�Xz#11r�r�r�r�rxz#12  = 1 (A axis scale)
z#12z{} = {:f} (Feed definition)
zF [{}]�xyzaz(?i)((z)\s*(-?)\s*(\d*\.?\d*))rz)\s*((-?)\s*(\d*\.?\d*))z\1[\2*{}+{}]�ijkrz	\1[\2*{}])r�rJrrr�r�r�r�r�rar+�upper)rr��planes�feeds�coordsr��
coords_defrKr�rMr��feedr$r+r�r�rrrr�"	s�

��
,&� �
zPostprocessor.parameterizecCs�zt|�}Wn
|�d�|�d�Yd}|j�d�D]A}dD]6}t�d|d|�}|rV|�d�dkrVt�d|d	|d
krHdt	|�dnd
t
t|�d��|�|�}q ||d7}q||_dS)NzIBad parameters for round. Round should be an integer! 
(Parameters: '{}')r5rErG�xyzijkafr�z)\s*(-?\s*(\d*\.?\d*))rr�rz\1 %0.r�z\1 %d)r^r5r+r�rJrr�r�rr�r�r�)rr��round_r�rKrNrMrrrr�u	s$
.��
zPostprocessor.round_coordinatescCs�|�d�}gd�}z$tt|��D]}t||�dkr#|�d�|�d�t||�||<qWn
|�d�|�d�Y|�gd�|�dS)Nr��r�r�r�r�rzPBad parameters for scale. Scale should not be 0 at any axis! 
(Parameters: '{}')r5z,Bad parameters for scale.
(Parameters: '{}'))rrrr�rJrZrar�r5r+r/)rr�r�rxrrrr��	s
�zPostprocessor.scalecCsh|�d�}gd�}ztt|��D]
}t||�||<qWn
|�d�|�d�Y|�|gd��dS)Nr��r�r�r�r�z+Bad parameters for move.
(Parameters: '{}')r5r�r�)rr�r�rxrrrr��	s
�zPostprocessor.movec	Cs||��}ddddd�}|D]}|dvrq
|dvr!|�d�|�d�||||<q
|�d�|d|d|d	|d
��dS)Nr�r�)r�� z    �
�'�"z_Bad parameters for flip_axis. Parameter should be string consists of 'xyza' 
(Parameters: '{}')r5z{:f},{:f},{:f},{:f}rurvr�rN)r�r5r+r�)rr�r�rsrrrr��	s*zPostprocessor.flip_axisN�F)r#r$r%r
r�r�r�r�r�r/r�r�r�r�r�rrrrr��s
4S
r�c@szeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
d dd�Zd!dd�Zdd�Z
dd�Zdd�ZdS)"�PolygonNcCs$|dur	g|_dS|dd�|_dSr��polygon)rr�rrrr
�	r�zPolygon.__init__cCsdtt|j��D](}tt|j|��D]}|j||d|7<|j||d|7<qqdSr�)rZrar�)rrurvrxr�rrrr��	s��zPolygon.movecCs�d}d}d}d}|jD]/}|D]*}||dkr|d}||dkr%|d}||dkr/|d}||dkr9|d}qq|d|d|d|dfS)Ng�g�rr%r�)rr�r�r�r��polyrsrrr�bounds�	s"
��	zPolygon.boundscCs|��}|d|dS)Nrr)r�)rr�rrrr-�	sz
Polygon.widthcs��fdd�|jD�|_dS)Ncs g|]}��fdd�|D��qS)cs<g|]}|d�|d�|d�|d�g�qSr9r�rRrU�rRrSrrrV�	s0�z.Polygon.rotate_.<locals>.<listcomp>.<listcomp>r)rR�subpolyr�rrrV�	s���z#Polygon.rotate_.<locals>.<listcomp>r�)rrSrRrr�r�rotate_�	s�zPolygon.rotate_cCs$t�|�}t�|�}|�||�dSr)rQrRrSr�)rrNrRrSrrr�rotate�	s

zPolygon.rotatecCs�t|j�dkst|jd�dkrdS|dd|dddkr"dSt|�}|d}|d}|�||�|�||�|j|dd�|�||�|�||�dS)Nrrr%r�F)�zerro_plane)rar�rKr��	drop_down)r�	direction�surfacerSrRrrr�drop_into_direction�	s 
zPolygon.drop_into_directionc
Cs<g}d}|jD]e}d}d}d}tt|��D]6}||d\}}	||\}
}|||
|||
|	7}||	||||
|	7}||||
|	7}q|d9}t|�dkrl||}||}|t|�7}||||gg7}q|dkruddgSd}d}|D]}||d|d7}||d|d7}q{||}||}||gS)Nrr%r"r�r)r�rZrar�)
r�	centroids�sar�r}r~rNrxr�r�r�r�r$rrr�centroid�	s:
�zPolygon.centroidTc	Cs�t|j�dkst|jd�dkrdS|��d}|rtd|�}|��d}|�d||d�d}|jD�]}tt|��D]�}|jD]�}tt|��D]�}	||d}
||}||	}|
d|dkrj|dks}n|d|dkr{|
dkr�nn@|
d|dkr�t|d|
d|d|d�}
n |d|
d|d|
d|d|
d|d|
d}
||
kr�|
}||	d}
||	}||}|
d|dkr�|dks�n|d|dkr�|
dk�r4nqJ|
d|dk�rt|d|
d|d|d�}
n!|d|
d|d|
d|d|
d|d|
d}
||
k�r4|
}qJqBq=q4|�rF|d|k�rFd|}|�d|�dS)NrrXr%r#g�u�<�7~)rar�r�r�r�rZr�)rr�r��top�bottomr�r�rx�poly1r�r)rc�vertexr�rrrr�
sJ 

F$@H(B
����zPolygon.drop_down�#075r2cCs"dd�|jD�}t|||d�dS)NcSs g|]}tg||dg��qS�r)r�)rRr�rrrrV8
� z Polygon.draw.<locals>.<listcomp>)r-r�)r�r�)rr�r-r�rerrrr47
szPolygon.drawcCsFt|�tg�kr|j|dd�7_dS|j|jdd�7_dSr)r�r�)rr�rrrr�;
szPolygon.addcCsjd}|jD]�}tt|��D]�}||d}||}||ks!||kr%dS|d|dkr2||}}|d|d|d|d|d|d|d|d}|d|dkrb|dkrunn|dkrl|}q
|dkrtdSq
|d|dkr�|dkr�nq
|d|dkr�|dks�n|d|dkr�|dkr�dSq
dSq
q|SrN)r�rZra)rrs�insider�rxr)rcr$rrr�point_insideA
s.

@$�d���zPolygon.point_insidec	s�g}tt|j��D]�}|j|}g}tt|��D]�}||d}||}||g7}t|dt|��D]+}||d}	||}
t|||	|
�}|D]}t||�dkr\t||�dkr\||g7}qGq2tt|j��D]>}
||
krlqe|j|
}tt|��D]+}||d}	||}
t|||	|
�}|D]}t||�dkr�t||�dkr�||g7}q�qwqeq||g7}q	i�|jD]�}tt|��D]�}t||d�}t||�}t||�dkr�q�d}d}�D]}t||�dkr�d}|}t||�dkr�d}|}|r�|r�nq�t||�}|�s|�s|||gg�|<|||gg�|<q�|�v�rA�|D]}t|d|�dk�r(n�qt|d|�dk�r@�||||gg7<n|||gg�|<|�v�ry�|D]}t|d|�dk�r`n�qRt|d|�dk�rx�||||gg7<q�|||gg�|<q�q�dd���fdd���fd	d
�}g|_t�fdd��D��}d
}t��d
k�rGg}||k�r�td��|d7}d}�D]}t	|t	�|��}�q�|d
d
d|d
df|d
dg}d}d
}|d|d
k�s�|�rd}||k�r�td��|d7}|�|d|�}|}|t
|d
�g7}|d|d
k�s�|�s�|j|g7_t|g�}���dd�D]}|�
t
|���r>�|=�q1t��d
k�s�|jddd�dS)Nr%r�FTcSsX|dkr
|dkr
dS|dkr|dkrdS|dkr|dkrdS|dkr(|dkr*dSdSdS)Nrr%rrXrr)rSrRrrr�angle_quadrant�
s�z$Polygon.hull.<locals>.angle_quadrantcs�||gddgkr
dS||gddgkrdS�||��||�kr dS�||��||�kr,dS|dkr8|dkr8||kS|dkrD|dkrD||kS|dkrP|dkrP||kS|dkr\|dkr^||kSdSdS)Nrr%TFr)rSrR�sin1�cos1)rrr�
angle_is_less�
s"�z#Polygon.hull.<locals>.angle_is_lessc	s�ddg}|}|dd|dd|d|dd|dd|dg}|D]=}|dd|dd|d|dd|dd|dg}t||�}t||�}�|||d|d�re||g}|}q(|Sr�)rar�)	�edges�last�	min_anglerS�	last_edgers�currRrS)rrr�get_closes_edge_by_angle�
s@@

�z.Polygon.hull.<locals>.get_closes_edge_by_anglecsg|]}t�|��qSrr�)rRrs)rrrrV�
rWz Polygon.hull.<locals>.<listcomp>rz
Hull error)r�r%rb)r�r-)rZrar�r�rd�tuplerPrir�r��listr��keysrr4)r�hullr�r��poly_r�rKrZr�r��e1r�rsr��poly2r�rx�break_s�break_er3�edger�	len_edges�loopsrbr�	first_run�loops1rSr)rrrrrU
s�


��

����
�

��
���&
&
�	
��zPolygon.hullr�T)r�r2N)r#r$r%r
r�r�r-r�r�r�r�r�r4r�rrrrrrr��	s


/r�cs�eZdZdZd]dd�Zdd�Zdd�Z�fd	d
�Zd^dd
�Zd_dd�Z	de
dfdd�Zdd�Zdd�Z
dd�Zdd�Zd]dd�Zd]d d!�Zd]d"d#�Zd]d$d%�Zd`d'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d@�Z dadAdB�Z!dadCdD�Z"dEdF�Z#dGdH�Z$dIdJ�Z%dKdL�Z&dMdN�Z'dOdP�Z(dQdR�Z)dSdT�Z*dUdV�Z+dWdX�Z,dYdZ�Z-d[d\�Z.�Z/S)b�
GcodetoolsTFcCs�|jjdks|jjdkr.t|j�}||_|jjdkr!|�|jj�|jjdkr.|�|jj�|s:|j|j|j|_t	t
j�|jj
|jj�d��}|�|j�Wd�dS1sZwYdS)NrE�w)r��
postprocessor�postprocessor_customr�r5r�r�r!r"r�osr��join�	directory�filer)rr��
no_headersrr�rrr�export_gcode�
s
"�zGcodetools.export_gcodec#Cs�|��d dd�}d dd�}d dd�}|jjs&|jjs&|jjr&|�d	�dSt|j�d
kr1|jjs9|jjsA|jjsA|jjsAd|j_|jjsJ|jj�r�|�	�|||d�|jj
}|jj
d
krr|jj|jjddt
jkrr|�d�|jikr�|jjr�|j|_|�d�|jikr�|�d�|jj}tddgt
�|�t
�|�g�}|jD�]}||jv�r�|j|jj|dd�}|j|jj|dd�}	|j|jj|dd�}
|j|jj|dd�}t|	|ddt
j�}	|j|D�]�}|�||j���}
t|
�}
g}|
D�]�}|jj�r�t|d
d|dd�dk�r�gd�}|jD]}t |g|d
|gd�}|d
|d
k�r6|dd�}|}�q|d
|dk�r�|dd
|d
d
<|d=ddg}t!t|��D]7}||d}||d}||}t|d|�|dk�r�t"||d�}t"||d�}t#|t||�|dg�}�qX|�$|d
�|ddu�r�|d
|k�r�|d}|d
k�r�|d8}|d
k�r�t%||d�|d|d��}n(|\}}}}t&||d|||�\}}}t%||g||d�|d|�||g�}|jj�r�|d
g}t'|dd�|dd��D]t\}}|d}t"||d�}t"||d�}t||�|k�rtt(|�}t(|�}||�)�|
} t(|d�}!|!| }"||d
|d|!||
�*�g|"| �+�d�*�|"�*�|"| �+�d�*�g|!||
�*�|d|dgg7}�q||g7}�q||g7}|}|jj�r�t%||d
|dd|	|�|||d|dd|	|��}||g7}q�|jj,�r�t-|�||d��|_q�t.|dt/dd�q�q�dSdS)!NFr�cSsL|st||d�}tt|d|||�g�dSt||d�}t|d|||�S)Nr�r%rr�)r�r�rO)rhrircr3rMrNrrr�add_arcs
z3Gcodetools.tab_plasma_prepare_path.<locals>.add_arccSs�|s)t||d�}|d||dd|d||ddg}tg||dg�St||d�}|d||dd|d||ddg}tg|d|g�S�Nr�rr%r�)r�r��rhrircr3rMrNrsrrr�
add_normals00z6Gcodetools.tab_plasma_prepare_path.<locals>.add_normalcSs�|s+t||d�}|d||dd|d||ddg}tg||dg�St||d�}|d||dd|d||ddg}tg|d|g�Sr&)rrr�r'rrr�add_tangent"s40z7Gcodetools.tab_plasma_prepare_path.<locals>.add_tangentz�Warning! Extension is not said to do anything! Enable one of Create in-out paths or Prepare corners checkboxes or disable Do not add in-out reference point!r�in-out reference point)�Round�
Perpendicular�Tangentr+rXrzDIn-out len is to big for in-out radius will cropp it to be r*3/2*pi!�=No paths are selected! Trying to work on all available paths.z-Nothing is selected. Please select something.r�r�T��reverser%rFr�)r�r%r%r�rer*r�r9)r-r�)Fr�r�)0�
get_info_plusr��in_out_path�plasma_prepare_corners�&in_out_path_do_not_add_reference_pointr5ra�in_out_reference_points�orientation_points_count�set_markers�in_out_path_type�in_out_path_len�in_out_path_radiusrQr_�selected_paths�auto_select_paths�paths� plasma_prepare_corners_tolerancer�rRrS�layers�transform_scalar�in_out_path_point_max_dist�plasma_prepare_corners_distancer��apply_transformsr��to_superpathrjrdr�rZrrr�rbr�r�rcr-rkr!r"�!in_out_path_replace_original_pathr
r��MARKER_STYLE)#rr%r(r)�add_funcrN�corner_tolerancer0r�r3�plasma_lrMr�rerMrgr�rsr��p_�	max_crossr�rhrir�r�r�rxr��res_�S1�S2�N�SP2r�rrr�tab_plasma_prepare_paths�



���*





 
��

�&

",
�

�
��z"Gcodetools.tab_plasma_prepare_pathcCs�|j}|ddddd�|dddd	d
d�|dtjd
dd�|dtddd�|dtddd�|ddtddd�|ddtddd�|ddtdd d�|d!tdd"d�|d#d$td%d&d�|d'td(d)d�|d*td+d,d�|d-d.d/d�|d0d1d2d�|d3tjd
d4d�|d5d6d7d�|d8tjd9d:d�|d;td<d=d�|d>td?d@d�|dAtdBdCd�|dDtdEdFd�|dGdHdId�|dJ|�dK�|jdLd�|dMtdBdNd�|dOtdBdPd�|dQdRdSd�|dTtd(dUd�|dVdWdXd�|dYtjd
dZd�|d[d\d]d�|d^d_d`d�|datdbdcd�|ddtdedfd�|dgtdhdid�|djtd\dkd�|dltd+dmd�|dntjd9dod�|dpdqdrd�|dstdtdud�|dvtdwdxd�|dytdwdzd�|d{d|d}d�|d~dd�d�|d�d�d�d�|d�td+d�d�|d�tjd�d9d�d��|d�d6d�d�|d�dbd�d�|d�d�d�d�|d�d�d�d�|d�d�d�d�|d�tdtd�d�|d�tdtd�d�|d�tjd9d�d�|d�tjd9d�d�|d�d6d�d�|d�d6d�d�|d�tdwd�d�|d�tdtd�d�|d�d�d�d�|d�tjd
d�d�|d�tjd
d�d�|d�td�d�d�|d�td�d�d�|d�tjd
d�d�|d�tjd9d�d�|d�tdtd�d�|d�d�d�d�|d�tdtd�d�|d�tjd9d�d�|d�tdtd�d�|d�tjd
d�d�|d�tdtd�d�|d�tdtd�d�dS)�Nz-dz--directoryz/home/zDirectory for gcode file)�default�helpz-fz
--filenamer"z-1.0z	File name)�destrRrSz --add-numeric-suffix-to-filenameTzAdd numeric suffix to filename)r�rRrSz--Zscalez1.0zScale factor Zz	--Zoffsetz0.0zOffset along Zz-sz--Zsafez0.5zZ above all obstaclesz-zz
--ZsurfacezZ of the surfacez-cz--Zdepthz-0.125zZ depth of cutz--ZstepzZ step of cuttingz-pz--feedz4.0zFeed rate in unit/minz--biarc-tolerance�1z4Tolerance used when calculating biarc interpolation.z--biarc-max-split-depth�4zDDefines maximum depth of splitting while approximating using biarcs.z--path-to-gcode-order�path by pathz5Defines cutting order path by path or layer by layer.z--path-to-gcode-depth-function�zdzPath to gcode depth function.z--path-to-gcode-sort-pathsz$Sort paths to reduce rapid distance.z--comment-gcoderEz
Comment Gcodez--comment-gcode-from-propertiesFz.Get additional comments from Object Propertiesz--tool-diameter�3z#Tool diameter used for area cuttingz--max-area-curves�100z!Maximum area curves for each areaz--area-inkscape-radius�0z;Area curves overlapping (depends on tool diameter [0, 0.9])z--area-tool-overlapz-10z*Radius for preparing curves using inkscapez--unit�G21 (All units in mm)�Unitsz--active-tab�tabzDefines which tab is activez--area-fill-anglez'Fill area with lines heading this anglez--area-fill-shiftz!Shift the lines by tool d * shiftz--area-fill-method�zig-zagz'Filling method either zig-zag or spiralz--area-find-artefacts-diameterzArtefacts seeking radiusz--area-find-artefacts-action�mark with an arrowzArtefacts action typez--auto_select_pathsz(Select all paths if nothing is selected.z--loft-distances�10zDistances between paths.z--loft-direction�	crosswisez"Direction of loft's interpolation.z--loft-interpolation-degree�2zKWhich interpolation use to loft the paths smooth interpolation or staright.z--min-arc-radiusz.1zKAll arc having radius less than minimum will be considered as straight linez"--engraving-sharp-angle-tollerance�150zTAll angles thar are less than engraving-sharp-angle-tollerance will be thought sharpz--engraving-max-distz^Distance from original path where engraving is not needed (usually it's cutting tool diameter)z--engraving-newton-iterationsz2Number of sample points used to calculate distancez"--engraving-draw-calculation-pathsz0Draw additional graphics to debug engraving pathz!--engraving-cutter-shape-functionrz)Cutter shape function z(w). Ex. cone: w. z
--lathe-widthr�zLathe widthz--lathe-fine-cut-widthr�zFine cut widthz--lathe-fine-cut-countzFine cut countz--lathe-create-fine-cut-using�	Move pathzCreate fine cut usingz--lathe-x-axis-remapr�zLathe X axis remapz--lathe-z-axis-remapr�zLathe Z axis remapz --lathe-rectangular-cutter-widthzRectangular cutter widthz--create-log�log_create_logzCreate log files)r�rTrRrSz--log-filenamez--orientation-points-countzOrientation points countz--tools-library-type�cylinder cutterzCreate tools definitionz--dxfpoints-actionr�zdxfpoint sign togglez--help-languagez4http://www.cnc-club.ru/forum/viewtopic.php?f=33&t=35zOpen help page in webbrowser.z--offset-radiusz
Offset radiusz
--offset-stepzOffset stepz--offset-draw-clippend-pathzDraw clipped pathz--offset-just-get-distancez!Don't do offset just get distancez--postprocessorzPostprocessor command.z--postprocessor-customzPostprocessor custom command.z--graffiti-max-seg-lengthz Graffiti maximum segment length.z--graffiti-min-radiusz$Graffiti minimal connector's radius.z--graffiti-start-posz(0;0)zGraffiti Start position (x;y).z'--graffiti-create-linearization-previewz&Graffiti create linearization preview.z--graffiti-create-previewzGraffiti create preview.z--graffiti-preview-sizei zGraffiti preview's size.z--graffiti-preview-emmitzPreview's paint emmit (pts/s).z
--in-out-pathzCreate in-out pathsz(--in-out-path-do-not-add-reference-pointzJust add reference in-out pointz--in-out-path-point-max-distz+In-out path max distance to reference pointz--in-out-path-typer+zIn-out path typez--in-out-path-lenzIn-out path lengthz#--in-out-path-replace-original-pathzReplace original pathz--in-out-path-radiusz!In-out path radius for round pathz--plasma-prepare-cornerszPrepare cornersz!--plasma-prepare-corners-distancezStepout distance for cornersz"--plasma-prepare-corners-tolerancez$Maximum angle for corner (0-180 deg))�add_argument�inkex�Booleanr�r^�
arg_method�tab_help)r�parsrhrrr�
add_arguments�s�zGcodetools.add_argumentscs�tt|���idd�dd�dd�dd�d	d
�dd�d
d�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�ddddd��|_gd�|_dS) N�namezDefault tool�idzdefault tool�diameterr��shapera�penetration angleg�V@�penetration feed�Y@�
depth stepr�r�gy@�in trajectotryrE�out trajectotry�gcode before path�gcode after path�sog�spinlde rpm�	CW or CCW�tool change gcoder��4th axis meaningr��800)�4th axis scale�4th axis offset�passing feed�	fine feed)rorprqr�rrrsrtr�rvrwrxryrzr{r|r}r~)�superrr
�default_tool�tools_field_orderr�r(rrr
sT��������	�
���
�����
�zGcodetools.__init__Nc

s�g}t|�dkr
gS|�||�}ttdt|���}dg}t|�dkro||ddd}d}	tt|��D]&�||�dd}
t|d|
dd|d|
dd�f|	�}	q4|||	dg7}||	d=t|�dks"|D]z}||�|�ddd�dddgdddgg7}tdt���D]>���fdd�td�D�}��fd	d�td�D�}||dur�t||dd�nt|||||�d�|||���7}q�|�ddd�dddgd
ddgg7}qq|S)Nrr%rFrr�cs4g|]}��d|d��d|dg�qS�r%rr�rRr��rxrgrrrVH�4z*Gcodetools.parse_curve.<locals>.<listcomp>rXcs,g|]}��|d��|dg�qSr9rr�r�rrrVI�,rc)ra�
transform_cspr
rZr�r{)
rrsr0rr�r$r�rrcr�rbrhrirr�r�parse_curve3s06
�.J0zGcodetools.parse_curver&�#178ader�cCs�|dur|j||dd�}|dur|dur|j��}n
|dur$|dur$|}|j||dd�}|dur7t|||d�St|||||d�S)NTr/)r�r�)r�r(r'r-)r��document�getrootrCr�)rrer0r�r(r'r-r�rrrr�RszGcodetools.draw_cspr;cCs|��dD]}d�|�}|d�|���||<d||d<||d=q|durU|jtdt|j�d��tdd	��}t|d
�sF||i|_	n
||j	vrP||j	|<|j	|}d}d}|�
|�}	|	rk|�|	�}	tt
|	��}	d
d
g}
dd
g}d
dg}|d|
d|d|
d|d|
d|d|
d}
|�|
|d�}
|�||d�}|�||d�}|d|
d|d|
d|d|
d|d|
d|
dkr�d}nd}|D�]&}|dd�}|�|d|d�|d<t|d�tg�k�rt|d�dk�r|�|d|d�n|d|d<|dk�r�|ddk�rD|�tdd	��}|	|_|d|_d�|dd|dd|dd|dd�|_n�|ddk�r�|d7}|d}|d}|d||d<t|d�t|���t|d�t|���t}
|d|
dk�r�|
dk�r�|
t}
nt|
}
t�|d|dd|d|dd�}t�|d|d|d|d�tjdtjd}|
dk�r�||
}|d�|d�}n|d}||
}|d�|d�}|�tj||||ddd��}|	|_||_|}q�dS)Nr9z	biarc{}_rzbiarc{}zurl(#DrawCurveMarker_r)zmarker-startz
marker-endr%z
Preview groupr��preview_groupsrErr�r�TrFrr6r.r-rorX)rbrcrr�)r7r+�copyr?r�rar�r
�hasattrr��get_transforms�reverse_transformr�rr/r�rr�r�r-rlr]rQr�r\r_ro)r�curver0r�r�rx�sidrK�arcnr/rNr�r$r�r2�sk�si�elemr�rM�a_st�a_endr)rrr�
draw_curve_s�
&





@H
F

44

.:
��zGcodetools.draw_curvec	Csbtd�|jj��tj�|jj�r�tj�tj�|jjd��r?t	tj�|jjd���
}|�
�|_Wd�n1s9wYntd|_tj�tj�|jjd��rrt	tj�|jjd���
}|�
�|_
Wd�n1slwYntd|_
|j|jjd7_n|�dd�dS|jjr�t�|jj�}d|jjvr�t�d	|jj�}|�d
�}|�d�}nd}|jj}d
}|D]}t�d�t�|�t�|��|�}|r�t|t|�d���}q�|dddtt|d��t|d�|}||j_z$t	tj�|jj|jj�d��
}Wd�WdS1�swYWdS|�d�tj�|jj|jj��d�YdS)NzChecking directory: '{}'r!r"rGzODirectory does not exist! Please specify existing directory at Preferences tab!r5FrDz^(.*)(\..*)$rr%rErz^{}_0*(\d+){}$rSr[rrz#Can not write to specified file!
{}T)r	r+r�r!rr��isdir�isfiler r�readr!�defaultsr"rkr5�add_numeric_suffix_to_filename�listdirr"rr�r�rr�r^rar�)	rr��dir_listrM�extro�max_nrK�filenamerrr�	check_dir�sV��
��

 �0���$zGcodetools.check_dirc
s��j|��j|d}d}��fdd�}dd�}t|�dkr!dSz�jduWnd�_Ytd�t|�|�jkrQ|d�t�d	d
|d��|dd
7}d}�jj	}	d�|d�}
d}d|dd|	g�d
}d�|d�}
t
dt|��D�]]}||d}||}|dvr�|
nd}|ddkr�||d||d�d
|dd
7}d}qy|ddkr�|||dd
7}d}qy|ddk�r.|ddkr�t|dd|dd|dd|dd�}|||�}|d�||d|d�7}|}|dk�r|d|dd|d d|g�|
d!7}|d||d|d d|g�|d
7}d}qy|dd"k�r�|d#d|dd|d#d|ddg}|ddk�r�|d$dk�ryt|d#d|dd|d#d|dd�tj
}nt|d#d|dd|d#d|dd�tj
}|||�}|d�||d|d�7}|}d%�||d$|d|d�}||d$}nd}|dk�r�|d|dd|d d|g�|
d!7}|dd#|dd#�jjd#k�r�t|d�t|d#�}t|d�t|d#�}t|��|���d&k�rQ||d$dk�r"d'nd(||d|d d||d#d|dd|d#d|ddg�||d
7}n1|��|��d#}||d$dk�red'nd(||d|d d|g�d)�|�||d
7}d'}qy|ddk�r�t|dd|dd|dd|dd�tj
}|||�}|d�||d|d�7}|}|d||d|d d|g�|d
7}d}qy|ddk�r�|||dd
7}|S)*NrrEcs��fdd�td�D���ddkrd�d<gd�}gd�}dd�jj�dd�jj�g}dd�jjdddg}d	}td�D]!}�|dur^|||d
��|||||�||7}q=|S)Ncs$g|]}|t��kr�|nd�qSrr�r_�r$rrrV�r�z8Gcodetools.generate_gcode.<locals>.c.<locals>.<listcomp>r�rkr)z Xz Yz Zz Iz Jz K)rErErErErErEr%rEz{:f})rZr��Zscale�Zoffsetr+)r$rKr�r�rNrMrx��Zauto_scalerr�rr$�s 2�z$Gcodetools.generate_gcode.<locals>.ccSsttt||tt�|||ttgt||tt�|||ttgt||t�|||tg�dS)Nr%)r�r�r])rN�	current_arrr�calculate_angle�s&&��z2Gcodetools.generate_gcode.<locals>.calculate_anglezworking on curve�(Change tool to {})
�"'\(\)\\r�ror~rG�G00z F{:f}r�z F{}rtr%)�G01�G02�G03r�ryrcrzr6r�
tangent knifezG01 A{}
r�r�r�rkz(Penetrate)
rorrXz A{}r#r�r�� R{:f})r��toolsra�last_used_toolr	r+rrr��ZsaferZr\rQr_r�r-r�rj)rr�r0r,�tool�gr$r��lg�zsr�r��go_to_safe_distance�penetration_feedrxrKr�r�rNrMr�axis4r]r^rr�r�generate_gcode�s�

((2

*.0<:
"
*&rN8
.�zGcodetools.generate_gcodecCsp|j��}g}||kr6d|��vr.|�d�}t|�j}|gkr(t|�t|�jn|}t|�|��}||ks|S)Nr/)r�r�r�getr�matrixr	�	getparent)rr�r��transr�rrrr�D
s


�zGcodetools.get_transformscCsDt�|gd�f�}tj�|�dkr tj�|���dd�}|S|S)N)rrr%rr)�numpy�array�linalgr�inv�tolist)rr/r�rrrr�Q
s
zGcodetools.reverse_transformcCs�|�|�}|rF|s'|D]}|D]}|D]}t|��|�\|d<|d<qqq|S|D]}|D]}|D]}t|�|���|�\|d<|d<q1q-q)|Sr�)r�r�apply_to_pointr�)rr�rer0r��comp�ctl�ptrrrrCY
s"
��
�"��zGcodetools.apply_transformscCs,|�|dg||�d|�ddg||�dSri)r/)rrur0r0rrrr@k
s,zGcodetools.transform_scalarcsr||jv�rwt|j�|�dd�D]}|j||jvrnq|j||jvr2|�d|j�d�d��n|j||jvrR|j|j||j|<|j|j||j|<�n�|j|}t|j|�dkrj|�d|j�d��|j|d}t|�d	kr�||ddd|ddd|ddd|ddd|ddd|dddg|ddd|ddd|ddd|ddd|ddd|dddggg7}t|�d
k�rAt	d�|D]}t	|�q�t
|ddd	|ddd	�t|ddd	|ddd	�g|j|<t�
|ddd|ddddddddddg	ddd|ddd|dddddddg	dddddd|ddd|ddddg	|ddd|ddddddddddg	ddd|ddd|dddddddg	dddddd|ddd|ddddg	|d	dd|d	dddddddddg	ddd|d	dd|d	ddddddg	dddddd|d	dd|d	dddg	g	�}tj�|�dk�r:tj�|t�
|dddg|dddgdg|dddg|dddgdg|d	ddg|d	ddgdgg	������fdd
�td
�D�|j|<n
|�dd�n|�dd�tj�|j|���|j|<t	d|j�d��t	|j�t	|j�d|j|<t	d�|j|��|d}	|d}
|�s�|j|}n|j|}|dd|	|dd|
|dd	|dd|	|dd|
|dd	gS)NrFzOrientation points for 'zQ' layer have not been found! Please add orientation points using Orientation tab!r5r%z5There are more than one orientation point groups in 'z' layerrrrXz6Layer '{orientation_layer.label}' Orientation points: cs$g|]���fdd�td�D��qS)cs g|]}��d|d�qS)rXrrr_)r�r�rrrV�
r�z3Gcodetools.transform.<locals>.<listcomp>.<listcomp>rXrYr[�r�r�rrV�
r�z(Gcodetools.transform.<locals>.<listcomp>z�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.)z	
 Layer 'z' transformation matrixes:z>Z automatic scale = {} (computed according orientation points))�transform_matrixrZr?�index�orientation_pointsr5�label�Zcoordinatesrar	r�r�r�r�r�r�solver�r��transform_matrix_reverser�r+)r�source_pointr0r0rx�orientation_layerrCrUr�rurvr�rr�rr/n
sn�
�
J,,,,,,,,,�n���



XzGcodetools.transformcs��fdd�tt���D�}tt|��D]-}tt||��D]"}tt|||��D]}|�||||||�||||<q)qq|S)Ncs,g|]���fdd�tt����D��qS)csRg|]%}��|ddd���|ddd���|ddd�g�qS)rNr%rrr�)�csp_rxrrrV�
sRz7Gcodetools.transform_csp.<locals>.<listcomp>.<listcomp>r�r[�r�)rxrrV�
r�z,Gcodetools.transform_csp.<locals>.<listcomp>)rZrarhr/)rr�r0r0rerxr�r�rr�rr��
s(��zGcodetools.transform_csp�warningcCs\|dkrt|�t�|d�dS|dkrt|�t�|��td�|��t|�t�|��)z�
        Errors handling function
        warnings are printed into log file and warning message is displayed but
        extension continues working,
        errors causes log and execution is halted
        r�rGr5zUnknown message type: {}N)r	ri�errormsg�AbortExtensionr+)rrK�msg_typerrrr5�
s

zGcodetools.errorcs>d�fdd�	}|d�|d�|d	d
ddd�|dd
d�dS)z#Make sure all markers are available���rE�-�#000044c	s\�j�|�dur,�jj�t|dt|�ddd��}|�td�||�d��}d�|�|_dSdS)N�autoz	-1.687441zoverflow:visible)rp�orient�refX�refYr�zlm {0}4.588864,-1.687441 0.0,0.0 L {0}9.177728,0.0 c {1}0.73311,-0.996261 {1}0.728882,-2.359329 0.0,-3.374882r�z&fill:{};fill-rule:evenodd;stroke:none;)	r��getElementById�defsr�rr�rr+r�)�elem_idru�polA�polBr(r,r�rrr�
ensure_marker�
s
���z-Gcodetools.set_markers.<locals>.ensure_marker�CheckToolsAndOPMarkerr$�DrawCurveMarker_rr)rur�r�r0r/)r(N)r�rEr�r�r)rr�rrrr7�
s
zGcodetools.set_markerscs�i�_i�_i�_i�_i�_�j��g�_i�_i�_	i�_
i�_g�_d�_
d
��fdd�	���j���j���t�j�dkrH��dd��j��}|�jvsW|�jvr\��d�|�jvr��jd	�jvr}�j�jd	�j|dd�7<n�j|dd��j�jd	<�j|=|�jvrƈjd	�jvr��j�jd	�j|dd�7<n�j|dd��j�jd	<�j|=dSdS)z Get Gcodetools info from the svgNFc
	s�|��}|��|D�]i}|r|�jj|�d�<t|t�r4|jdkr&|�_q
�j	|g7_	�||�q
|�d�dkrv��
|�}|durk|�jvrU�j||dd�gn|dd�g�j|<td|j�d|���q
��
d|j�d��q
|�d�d	ks�|�d�d	kr���|�}|�jvr��j||��gn|��g�j|<td
|j�d|���q
|�d�dkr݈�|�}|r�|�jvrˈj||dd�gn|g�j|<q
��
d|j�d��q
t|tj��rd|��v�r|�jvr��j||gn|g�j|<|�d��jjjv�r|�jv�r�j||gn|g�j|<q
|�d�d
k�rP|��}|��|D]}	|	�d�dk�rM�j���|	|	j���ddd��q0q
t|tj��re�|||�d��jjv�q
|�d��jjv�rt��
d�q
dS)Nrp�3Dr��Gcodetools orientation groupzFound orientation points in 'z	' layer: z*Warning! Found bad orientation points in 'z*' layer. Resulting Gcode could be corrupt!�Gcodetools tool definitionzFound tool in '�#Gcodetools graffiti reference pointz0Warning! Found bad graffiti reference point in 'zIn-out reference point group�In-out reference pointrr%a: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.)�getchildrenr0r��selectedr�rrr��	my3Dlayerr?�get_orientation_pointsr�r	r5�get_toolr�r��get_graffiti_reference_points�graffiti_reference_pointsrirrr=�idsr;r5rbrCr�rDr
)
r�r0r��itemsrxrCr�rU�items_r���recursive_searchrrrr�
sZ



6
.
0&(�&��
��z-Gcodetools.get_info.<locals>.recursive_searchr%zPDocument has no layers! Add at least one layer using layers panel (Ctrl+Shift+L)r5zrWarning! There are some paths in the root of the document, but not in any layer! Using bottom-most layer for them.rFr�)r;r=r�r�r�r�r�r?r�r�r�r�r5r�rar5)rr�rrr�get_info�
s<:


(
(�zGcodetools.get_infocCs�|��}|��g}g}d}|D] }t|tj�r0|�d�dkr$||g7}|�d�dkr0||g7}qt|�dkr:|}nt|�dkrB|}|durHdSg}|D]\}ggg}|D]B}	|	�d�dkrq|	j�|	�	���
�}
|
ddd|d<|	�d�d	kr�t�d
|	�
��}t|�d��t|�d��t|�d��g|d<qT|dgkr�|dgkr�||g7}qLt|�t|�kr�dks�nt|�t|�kr�dkr�|SdS|SdS)Nr�z'Gcodetools orientation point (2 points)z'Gcodetools orientation point (3 points)rrX�"Gcodetools orientation point arrowrr%�!Gcodetools orientation point textzd(?i)\s*\(\s*(-?\s*\d*(?:,|\.)*\d*)\s*;\s*(-?\s*\d*(?:,|\.)*\d*)\s*;\s*(-?\s*\d*(?:,|\.)*\d*)\s*\)\s*)r�r0rrir
r�rar�r/�composed_transformrDrr��get_textr�r�)rr�r�r{r|rsrxrCrUr�rerMrrrr�@sL

�,�
�8��z!Gcodetools.get_orientation_pointscCs|gdg}|D]'}|�d�dkr |�||j���ddd|d<|�d�dkr-|��|d<q|dgkr<|ddkr<|SgS)NrEr��)Gcodetools graffiti reference point arrowrr%�(Gcodetools graffiti reference point text)r�rCr�rDr)rr�rUr�rrrr�cs"�z(Gcodetools.get_graffiti_reference_pointscCsF|j��}||d<|D]�}|�d�dkr"ttj�|�d���|d<q|�d�dkr�d}d}|D],}|�d�dks?|�d�dkrC|��}|�d�dksQ|�d�d	kr[|��}|d
kr[d}q/|dusd|dureq||j��vr�z
t	|j|�|�||<Wq|j|||<|�
d�|||j|��Yq|||<|�
d
�||��q|S)N�
self_groupr��Gcodetools tool backgroundr��Gcodetools tool parameter�%Gcodetools tool definition field namez$Gcodetools tool defention field name�&Gcodetools tool definition field valuez%Gcodetools tool defention field value�(None)rEzhWarning! Tool's and default tool's parameter's ({}) types are not the same ( type('{}') != type('{}') ).zEWarning! Tool has parameter that default tool has not ( '{}': '{}' ).)r�r�r��dictrir�	parse_strrrr�r5r+)rr�r�rx�key�valuer�rrrr�os8
��zGcodetools.get_toolcCs�t|j�|�dd�D]}|j||jvrnq
|j||jvrN|j||kr1|j|j||j|<t|j|�dkrI|j|j}|�d|�d��|j|S|�d|j�d�d�dS)NrFr%zLayer 'z' contains more than one tool!zCan not find tool for 'z/' layer! Please add one with Tools library tab!r5)rZr?r�r�rar�r5)rr0rxr�rrr�set_tool�s�
zGcodetools.set_toolc#
s����dd��dd��dd�����fdd�}d	d
���fdd�}��fd
d�}�fdd�}�jikrA�jjrA�j}��d�n�j}���d}�jrTt�j�dn�jd}|�	t
��}td�jf�td|f�i}	�jD�]߉�|v�rQtd�f���ddgddgddggddgddgddgggg����
��g}
g}z
td�jj�d��}Wn	��d�Y|�D]�}
d|
��vr̈�d�q�|
j��}��|
|�}|
�d�}dd�}�jjdkr�t�dt||
d ��jj�}|�d!d"�}t|�}nd}�jj�r||
�}|D]}|td#�|||��7}�qttj �!|
�d$���}t�"d%|v�r8|d%d&k�r8|d%nd'��#�|	|<|
�d(�d)k�rq��|��}|dddd}|dddd*}td+�||��|||gg7}q��j$�d*}�j$�d}d,t%t&|	|��d-d.}|
|||||�|g��fd/d0�|D�gg7}
q�||�}|||�7}|
D]��d*D]	}��'|���q��q��jj(d1k�r�g}|
D]�|�fd2d0��d*D�7}�q�|}
d3�j_(�jj(d3k�r��jj)�r�|d4d0�|
D��}nt*t+|
��}|D]�}|
|dd*}t*dt,t-�.t/||�j0�dd5����D]]} t1||t/�j0�dd5| d*��}!|td6�|
|dd��7}|
|dd7d8k�r]||
|dd77}|
|d*D]�|��2��|!�7}�qc|td9�|
|dd��7}�q#�qqqt3d:d0�|
D��}"t*dd*t,t-�.t/||"�j0�dd5����D]�} |t/�j0�dd5| �}!g}|
D]��dd*|!k�r�|�4���q�|t/�j0�dd5| d*�}!|d;�|!�7}�jj)�r�|d<d0�|D��}nt*t+|��}|D]R}|td=�|
|dd��7}|
|dd7d8k�r"||
|dd77}||d*D]}|��2|�t1|!||dd*��7}�q(|td9�|
|dd��7}�q��q�qq��5|�dS)>NcSs:d}d}d}d}ggggg}|D]�}||dkr!|d|g7<|dus+|d|kr4|d}|g|d<||dkrC|d|g7<|dusM|d|krV|d}|g|d<||dkre|d|g7<|duso|d|krx|d}|g|d<||dkr�|d|g7<|dus�|d|kr�|d}|g|d<q|Sr�r)rCr�r�r�r��outrsrrr�get_boundaries�s8



�z4Gcodetools.tab_path_to_gcode.<locals>.get_boundariescSs`d}g}|D]#}t|t|��D]}|||krddg||<q|ddgkr)||g7}q|d7}|Sr�)rhra)rCrxrrsr�rrr�remove_duplicates�s�
�z7Gcodetools.tab_path_to_gcode.<locals>.remove_duplicatesc	Ssfd}tdt|��D]'}|t�||d||ddd||d||ddd�7}q	|Sr�)rhrarQr�)rCr3rxrrr�get_way_len�sLz1Gcodetools.tab_path_to_gcode.<locals>.get_way_lenc
	s��|�}ddgddgddgddgddgddgddgddgg}g}d}|D]=}|dd�}g}tdt|��D]}��|�|d�|d}|�|d�||7}q5�|�}	|dus]|	|kra|	}|}q$|S)NrXrrr%)rhrar�)
rC�ways�minimal_way�minimal_lenr�tpoints�cwr�rs�curlen)rrrrr�sort_dxfpoints�s2�
�z4Gcodetools.tab_path_to_gcode.<locals>.sort_dxfpointscs�t��dkrgS�fdd�tt���D��dg}�ddd��td�d���d=t��dkr^��fdd�tt���D�}t|�d}|��|d��|dd���|=t��dks0|S)	Nrcsg|]	}|g�|�qSrr)rRr)�linesrrrV�r^zDGcodetools.tab_path_to_gcode.<locals>.sort_lines.<locals>.<listcomp>rXz!!!rGcs&g|]}t��|dd��|g�qS)r%rX�rdr_��	end_pointr rrrV�s&r%)rarZr	r�rb)r rr�rxrr"r�
sort_lines�s�z0Gcodetools.tab_path_to_gcode.<locals>.sort_linescs<g}|D]}||ddd|dddg7}q�|�S)NrrFr)�curvesr r�)r$rr�sort_curvess(z1Gcodetools.tab_path_to_gcode.<locals>.sort_curvescsTd}|D]#}|d��jj|d|d�j�d�j�ddd�jj�7}q|S)NrEzR(drilling dxfpoint)
G00 Z{:f}
G00 X{:f} Y{:f}
G01 Z{:f} F{:f}
G04 P{:f}
G00 Z{:f}
rr%rtg�������?)r+r�r�r�r�)rCr�rU�r0rrr�print_dxfpointssDz5Gcodetools.tab_path_to_gcode.<locals>.print_dxfpointscspi}d}|s6|�jkr6|��D]}t|tj�r|j|d<nt|tj�r(|j|d<d}q|��}|s6|�jks|S)NF�Description�TitleT)r�r�rri�Descr�r*r�)r�rM�donerxrrr�get_path_propertiess
�z9Gcodetools.tab_path_to_gcode.<locals>.get_path_propertiesr.rErzself.layers=zpaths=r0zlambda c,d,s: r�z@Bad depth function! Enter correct function at Path to Gcode tab!r��vWarning: One or more paths do not have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!rpcSs&|�d�|��vr|�|�d��SdS)Nr%�None)r�rr�)r�r�rrr�set_comment?sz1Gcodetools.tab_path_to_gcode.<locals>.set_commentz\[([A-Za-z_\-\:]+)\])r�z	:newline:rGz{}: {}r�r'r&z#000�dxfpointrUr%z$got dxfpoint (scaled) at ({:f},{:f})r��rXcsg|]	}��|g���qSr)r��rRrgr'rrrV`r^z0Gcodetools.tab_path_to_gcode.<locals>.<listcomp>zsubpath by subpathcsg|]	}�d|gg�qSr�r)rR�subcurve)r�rrrVmr^rWcS�g|]}|d�qS�r%r�rRr�rrrrVtr�rvz
Start cutting path id: {}rz()zEnd cutting path id: {}

cSsg|]}|dd�qSr9rr7rrrrV�rWz
(Pass at depth {})
cSr5r6rr7rrrrV�r�zStart cutting path id: {})6r1r;r�r<r=r5r�r
r?r�r
r	r�rr��path_to_gcode_depth_functionr�rr�rDrCr��
comment_gcoderrrr�rO�comment_gcode_from_propertiesr+rrirr�Color�to_rgbr�r�rir��path_to_gcode_order�path_to_gcode_sort_pathsrZrar^rQ�ceilr�r�r�r�r�rbr$)#rrr&r(r-r=r��parent�biarc_group�colorsr%�	dxfpoints�
depth_funcr�re�id_r0r��tags�tagr��	tmp_curverurvrXr�r$r4�curves_rrr��stepr��mindr)r�rrr0rrr$r�tab_path_to_gcode�s� 

6





2���
2("��6
�"
("��zGcodetools.tab_path_to_gcodec
Cs�|��|jikr|�d�|jD]d}||jvru|j|D]W}|jjdkrU|�dd�t�d|�	d��}|durUt
d|�d�f�|�dd	�|�d���|�d
t
d�|jjdkra|�dd�|jjd
krt|�	d�dkrt|�dd�qqdS)NzfNothing is selected. Please select something to convert to drill point (dxfpoint) or clear point sign.r�r1rUz
^\s*.\s*(\S+)r�z	got path=r%z�m {} 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�rC�save�clearr[)r1r;r5r?r��dxfpoints_actionr�rr�r�r	r�r+rF)rr0r�rMrrr�
tab_dxfpoints�s&



��zGcodetools.tab_dxfpointsc	Cs�|��|jikr|jjr|j}|�d�n|j}|D]�}||D]�}|��}d|��vr3|�d�q!|j�	�}g}t
t|��D]�}dd�||D�}|�||g�d}t
|g�}	|	d|	dd|	d|	d	d|jjdkr�|jjd
kr�td�|dd	d|dd	d	���	�}
|�||
d�}
|�t��}t|
�|_td
|_|�dd
�q@|jjdkr�|�t��}t||�|_td|_|�|�q@|jjdkr�|�|�td�|��q@|��|D]}||=q�t|�dkr�|�|�q!t|�|_q!qdS)Nr.r�r.cSrP)cSsg|]}|dd��qSrrr�rrrrV�rWz<Gcodetools.tab_area_artefacts.<locals>.<listcomp>.<listcomp>r)rRrCrrrrV�r^z1Gcodetools.tab_area_artefacts.<locals>.<listcomp>rrrXr%r`��m {},{} 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 zTrBr�zmark with stylerA�deletezDeleted artefact {})r1r;r�r<r=r5r�rr�rDrZrarCr��area_find_artefacts_diameter�area_find_artefacts_action�Pathr+r�rr
rFr�r�rbr	r0r�)rr=r0r�r@rer�rxrgr�r�r�rrr�tab_area_artefacts�sT


4,



��#zGcodetools.tab_area_artefactsc
Cs�|��t|j�dkr|�d�dS|jD�]D}||jv�rZ|�|�|j|dddkr9|�d|j�d�d�|j|D�]}td|�	d	�|�	d
�f�|�
��t��}|j
��}t|�|sktd�|�d�q>|�	d
�dk�r�td�|�	d���t|�d\}}}}}	|td�k�r�||}
||=|}|	dvr�|	dkr�|d}|
dd|
dd|
dd<|
dd<|
|d|
|d|
|dgg|
|dd�|
d|�|
|d|
|d|
|dgg}
nRt|
|d|
||	�\}}
}|
dd|
dd|
dd<|
dd<|
d|
d|
dgg|g|
|dd�|
d|d�|g|
d|
d|
dgg}
|
g|}t|d��r�tt|��D]/}g}||D]}|ddd�|ddd�|ddd�gg|}�qX|dd�||<�qPtt|��}td|f�t�dd|�}t�dd|�}t�dd|�}td|f�|�ddg|�}|�ddg|�}t|�t|���}|dk�r�d}nd|}t|�|j|dd|}|jj|}|dk�r�dnd}td�||��|jjd k�r�d |j_t|jj�D]T}||d|jjd!|}t |�t |�k�r!|}|�t!tt"d"d#�d$��}|�#d
d�|�#d%|�|�#d&|�td'||tt"d"d#�f�||k�rWn�qq>qdS)(zCalculate area curvesr�3This extension requires at least one selected path.Nrq�2Tool diameter must be > 0 but tool's diameter on '�' layer is not!r5�
doing pathr�r��omitting non-path�Warning: omitting non-pathz
sodipodi:typezinkscape:offsetz.Path {} is not an offset. Preparation started.rpr%r�r9rFrzoriginal  d=z
(?i)(m[^mz]+)z\1 Z z(?i)\s*z\s*z\s*z Z z(?i)\s*([A-Za-z])\s*z \1 zformatted d=r�zTool diameter = {}, r = {}rYr�r>r7�r�zinkscape:radiuszinkscape:originalzadding curve)$r1rar;r5r?rr�r�r	r�r�r�r
r�rDr+ror�r�r0rZr�r
rrr/r-rjr��area_inkscape_radius�area_tool_overlap�max_area_curvesr�rrFr�)rr0r��
area_groupre�min_x�min_y�min_i�min_j�min_t�subpr�rhrir�rxrNr�rDr�r��tool_drM�sign�radiusr�rrr�tab_area�s�



*f*\
8
���zGcodetools.tab_areac"
sN|��|jjtjd|j_t|j�dkr|�d�dS|jD�]�}||jv�r�|�	|�|j
|dddkrD|�d|j�d�d�|j
|d}|j|D�]R}g}td	|�
d
�|�
d�f�|���t��}|j��}|s{td�|�d
�qP|�||�}t|�}|�||�}|jj��fdd�|D�}t|�}gd�}	td�D]*}
||
d}||
d}||
d}
t|||d||||
�|
d|	|
<q�|dd|jj}|dkr�|�dd�dS|gg7}|jjdk�re|	d|jj|}d}d}||	dk�s|�rd||	dk�rd}|d�s'|d||	dgg7<|�r?|d||	dg|||	dgg7<n|d||	dg|||	dgg7<|}||7}||	dk�s|�sn�|	d|	d|jj|}|	d|	d|jj|}|	d|jj|}|	d|jj|}|d||gg7<d}d}|dk�r|dk�r|dd}|dk�r�||8}||8}n.|dk�r�||7}|�s�||8}d}n|dk�r�||7}||8}n
|dk�r�||8}||8}|d||gg7<|dk�r|dk�s�|dd}|dk�r"|dk�r"|dk�r||n||}|dk�r9|dk�r9|dk�r5||n||}|d||gg7<|jj��fdd�|D�}|ddgg}i}t|d|ddd��D]�\}}g}|d|dk�r�|d|dk�r��qhtt|��D]�}tdt||��D]�}|||d}|||}t||||�}|D]n}
tt|||
��}|d|dk�r�|d|d|d|d} n|d|d|d|d} d| k�r�dk�rn�q�|| |d|d|||
gg7}||v�r|||||
gg7<�q�|||
gg||<�q��q��q�|��|D]}|d|d|dgg7<||d|dggg7}�q%|d|g7<d}�qht|�|t|�k�r�||d}||d}|d|dd|d|ddg}t ||��s�||=n|d7}|t|�k�s\t!|�}!|�|!|d�}!|j"|!|d�qPq dS)zFills area with lines�rrWNrqrXrYr5rZr�r�r[r\c�g|]}�fdd�|D��qS)crm)c�Tg|]&}|dt���|dt���|dt���|dt���g�qSr9�rQrRrSr�r�rrrVj�TzBGcodetools.tab_area_fill.<locals>.<listcomp>.<listcomp>.<listcomp>r)rRr�r�rrrVj��7Gcodetools.tab_area_fill.<locals>.<listcomp>.<listcomp>rr3r�rrrVjrqz,Gcodetools.tab_area_fill.<locals>.<listcomp>r�rrrXr%z&Tools diameter must be greater than 0!r_TFrFcrm)crnr9ror�r�rrrV�rprrrr3r�rrrV�rq)r�)#r1r��area_fill_anglerQr_rar;r5r?rr�r�r	r�r�r�r
r�rDrCr�r�rorZrqr_�area_fill_method�area_fill_shiftrcrprrBr�r_r�)"rr0r�r�r rare�rotated_pathr�r�r�rxr�r�rMr��last_oner�hrurv�stagerb�
splitted_linerr8r.�intsrhrir�rsr��csp_linerr�r�
tab_area_fillMs




.

*(��





�"$" 
���(����zGcodetools.tab_area_fillcI
s����da�fdd�}dd��dd����fdd	����fd
d����fdd
��dd�}���fdd�}d}d�d}d}g}g}�jsK��d�dS���sQdSd}	�jjdkr\d}	n�jjdkrg��d�td�jj�d�jj	}
�j
D�]�}|�jv�rg|�jv�rg�j|dd}�j|dd}
t�
|dd|
dd|dd|
dd�}t�
|dd|
dd|dd|
dd�}td||
||�||}��|��j|dd}t�d|�r�td |�d!��}n��d"��j|dd#��d$d%�}�j|dd&|d'}td(|�t�j|dd&d'�jj�}||atd)t��j|d���t����jj�rU�jdu�rU�j�t�d*���jj�rl�j�td+d,��a�j�td-d,��a �j|D�]�}t!|t"j#��rH|j$�%�}ga&t't(|��D]ga)da*t*t(|t)�k�r�t+|t)t*ddd|t)t*dd�t,k�r�t+|t)t*ddd|t)t*dd�t,k�r�|t)t*d'|t)t*dd'<|t)t*=nt*d7a*t*t(|t)�k�s��q�|D�]z}td.|�g}g}td/|�t&�-g�t.dt(|��D�]�a*|t*d'}|t*d}|t*}�jj�rdg}g}t.dd0�D])a)|t)dt|t)dg}|t)dt|t)dg} ||g7}|| g7}�q0||g7}||g7}|d\}!}"t/||d�\}#}$t+dt�
|#|$��d1k�r�td2|#|$||���d3�t/||d�\}%}&t+dt�
|%|&��d1k�r�td4|%|&||���d3�||%|&f|#|$f�\}'}(})t&d5|!|"g|'|(gd6|)gg7<|d|d'k�r�|d|dk�r�t&d5|d|#|$gd7t*gg7<�q�|d|d'|d|d�}*d6}+|*D]�},t.d0�D]�}-|-dk�s|+�rW|,|-d|,|-dd}#|,|-dd|,|-d}$t�
|#|$�}.|.t,k�r<�q	|#|.}#|$|.}$t&d5|,|-|#|$gd7t*gg7<d7}+|-d'k�r�|#}%|$}&|,|-dd|,|-d'd}#|,|-d'd|,|-dd}$t�
|#|$�}.|.t,k�r��q	|#|.}#|$|.}$||%|&f|#|$f�\}'}(})t&d5|,|-d|'|(gd6d8gg7<�q	�q�qtd9�jjf��jj�rl||dg7}||dg7}d:}/t�t#|/d;d<��}0t0|g�|0_$t �t1|/d=d<��}0t0|g�|0_$t&d5D]r}1|1d'�r6��t#d>d,��}0d?�|1dd|1dd|1dd|1ddd@|1dd|1ddd@�|0_$dA|0_2�q���t#dBd,��}0d?�|1dd|1dd|1dd|1ddd@|1dd|1ddd@�|0_$dC|0_2�q��q�d7}2t't(t&��D�]�a)ga3ga4d}�t't(t&t)��D�]Fa*t&t)t*d'}3t&t)t*d}4t&t)t*}5|4d\}6}7|4d\}8}9|5d\}:};|4d'�rCd}<d}=|}>t}|4d0dk�rBt�
|3dd|4dd|3dd|4dd�}?t*t(t&t)�dk�rt�
t&t)t*ddd|4ddt&t)t*ddd|4dd�}@n"t�
t&t)ddd|4ddt&t)ddd|4dd�}@t�5t|?|@��|4d0}n8|3d0dk�rV�jj�sV�|3d0}=nd8}=t�
|:|6|7|;�}At|A|=�}=t6|A|=|
�}<|=|A|=|
|<d'7}=t'|<�D�]<}B|6|9|B|
|=}C|7|8|B|
|=}D�|C|Df|8|9f�\}E}F}tdDt*t)|E|F|�t7||�}|2�rd7}2||>k�r||C|Df|3dd|3dd||3dd|3dd|f||>|d'�||3dd|3dd||3dd|3dd|f|t*t)|F|E�|4d'�rv|4d0dk�r:||C|8||D|9|f|t*t)|F|E�||C|Df|C|Dfdd�||C|Dfdt*t)|F|E�n[|4d0dk�ru||>k�ru||C|Df|C|8|>|D|9|>f|||>d'�t7||�}||C|8||D|9|f|t*t)|F|E�n|Bdk�r�|5d0dk�r��jj�s�|Et)k�r�|Ft*d'k�r�n(||C|Df|C|8||D|9|f||
�||C|8||D|9|f|t*t)|F|E��q|4d'd6k�r�|4d0dk�r�d6}2|}>�q�t3t3dg7a3tdEt3�t4t4dg7a4tdFt4��jj�r#��t#dGt8dHdIdJ��}t0t3g�|_$t't(t3��D]a*��t#�9t3t*dt4t*��}0|0�:dKdG�dL|0_2�q|t3g7}g}Gt4D]
}|G||g7}G�q,tdMt4�tdN|G�||Gg7}�qv�qq|�rg��;||||�}H��<|H|��|��=|H|�jj>�7}qw|dk�r��j?dOt@d'||�|	dP7_?�j?dQ�j|dddP7_?�j?dRt@�jjA�|	dP7_?�j?dSt@�jj>�|	dP7_?��B|�dS��dT�dS)UNrCc
s|\}}|\}}t�tdd||||d��}t||�tks(t|�tkr<t||�tkr5||dfSt�d|�}n
|||||}||||}|dkr\|d|ddfS||||}	|dkrk|	}	d|	dkr{d�jjkrnnd}	|||||	fS)	a�LT 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
            rr�r�r�r%rCgfffff�\@rl)rQr�r�r��ENGRAVING_TOLERANCE�copysignr�� engraving_sharp_angle_tollerance)
�nxy1�nxy2�nx1�ny1�nx2�ny2�cosBis�sinBis�costurn�sinturnrrr�bisect
s"
$
$z(Gcodetools.tab_engraving.<locals>.bisectcSs�|\}}|\}	}
|\}}|\}
}|\}}|\}}|\}}|
|||}
}||||}}|
|||}|dkr=tSd||	||
}|tkrMtS||}||	}||
}|
|||||dkritS||||||dkrytSt|t�S)a$LT 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
            rr�r)r�r~r�)r��n_xy1�n_xy2r��n_xy23�xy3�n_xy3r�r�r�r�r�r�r�r��nx23�ny23r�r��nx3�ny3r��denomrMr}r~rrr�get_radius_to_line+s.
z4Gcodetools.tab_engraving.<locals>.get_radius_to_linecSs�|\}}|\}}|\}}||}||}|d|dd}	|	tkrO|	dkr1t�|d|d�S||||dkr=tS|d|dd||||S||||d|	|d|d}
|
dkritS||||t�|
�|	}t|t�S)a�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.
            rr%rFr)r~rQr�r�r�)r��n_xyr�r�r�r�r�r�r�r��
discriminatorrMrrr�get_radius_to_pointos"$(
z5Gcodetools.tab_engraving.<locals>.get_radius_to_pointcs�|d|d}|d|d}|d|d}|d|d}|d|d}|d|d}	dt�||	��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)aLT 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.
            rr%�r�)rQrr��engraving_newton_iterationsr�)rNr�r$r�r{r|r}r~rr��limit�abx�aby�bcx�bcy�cdx�cdy�abcx�abcy�bcdx�bcdyr�)�
bez_dividerrrr��s*0,z,Gcodetools.tab_engraving.<locals>.bez_dividecsX|\}}|\}}tttd}d}d}t}	||	||	}
||	||	}||	||	}||	||	}
tdtt��D�]h}tdtt|��D�][}t||ddr�|tkrqt|t�dkspt|t�ttt�dkrqqI�||f||ft||dd�}n�|tkr�t|t�dks�t|t�ttt�dkr�qIt|t�dkr�tt|tddddkr�qIt|t�ttt�dkr�ttdddkr�qIt||dd\}}t||dd\}}t||dd\}}t||d\}}t||d\}}t||dddk�r|}|}t||ddk�r)|}|}t||�}t||�}t||�}t||�}|ddk�rY||
k�sX||k�sX||k�sX||
k�rYqI�||f||f||f||f||f||f||f�}d|k�r}|	k�r�nqI|}	|}|}||	||	}
||	||	}||	||	}||	||	}
qIq=|||	fS)a~LT 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
            r%rFrrrXF)	�nlLTr�rxr�rhrar�r�r�)r�r�r�r�r�r�r��jjmin�iiminrMrxry�ymin�ymax�jj�iir�r�r�r�r�r�r�r�r�r�r��x23min�x23max�y23min�y23max)r�r�rr�get_biggest�sj
,&,00



60��
+z-Gcodetools.tab_engraving.<locals>.get_biggestcs(|\}}	|\}
}|\}}
||
d}|	|d}�||f||
f�\}}}|tkr.|||ggS||krN||krN|||g�||f|||
|f||||
f|d�gS||krn||krn�||	f||||f||||
f|d�|||ggS�||	f||||f||||
f|d��||f|||
|f||||
f|d�gS)a�LT 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

            r)�lmin)�xy0�j0�i0r�r�r�r�r*r�r�r�r�r�r�r�r�r�r�r^)r��line_dividerrr�s00Lz-Gcodetools.tab_engraving.<locals>.line_dividecSs�|\}}t|d�}t|d�}t|d�}tt�dkr�td\}}	}
}}}
}td}||kr�||kr�||
kr�||kr�td\}}}
}}}
}td}||kr�||kr�||
kr�||kr�t�|	d||	d|�}t�|d||d|�}t�|d|	d|d|	d�}||kr�||kr�t|d||	d||	d||d|�|}|tkr�||||||}t|�tkr�t��t��t||g||g||g||||gg7at|g7adS)z�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 intermediate points.
            rr%rFr�rN)	r�ra�cspm�wlrQrr�r~�pop)r�rrxr�r�r�rurv�xy1ar��xy1br�r��ii1�jj1r�r�r��length1�length2�length12�xydist�wdistrrr�
save_point)s.


  $8$z,Gcodetools.tab_engraving.<locals>.save_pointc	s$|\}}|\}}�jjr���t�||fd��}|�dd�d|_|r���t�||f|��}|�dd�d|_t�||||�}	d�	t
dd	t�|	d
���}
d�	|
|d�}t�t|d
d��}d�	|t
||t
d||�|_t�t|dd��}
d�	|t
||t
d�|�|
_dSdSdS)aALT 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�zEngraving calculation toolpathzBfill:#ff00ff; fill-opacity:0.46; stroke:#000000; stroke-width:0.1;�Engraving calculation pathsz?fill:none; fill-opacity:0.46; stroke:#000000; stroke-width:0.1;z
#{0:x}0000�er!r�z5stroke:{}; stroke-opacity:1;stroke-width:{};fill:nonerz	Gcode G1R�r�r��M {:f},{:f} L {:f},{:f}g�Q���?z	Gcode G1LN)r�� engraving_draw_calculation_pathsr�rror�r�rQr\r+r^rS�gcode_3Dleft�eye_distr��
gcode_3Dright)r�r�rr�r�r�rurvr�rKr�r��right�left)�engraving_grouprMrrr�
draw_pointKs. �
��z,Gcodetools.tab_engraving.<locals>.draw_pointrErz9Please select at least one path to engrave and run again.z mm�G20 (All units in inches)z inchesr\z!Unknown unit selected. mm assumedzengraving_max_dist mm/inchr�r%zOrientation2 p1 p2 ol oluurrrz
lambda w: r�z/Tool '{}' has no shape. 45 degree cone assumed!rocSs|Srr)rrrrr���z*Gcodetools.tab_engraving.<locals>.<lambda>rqrztool radius in pixels=zmax_dist pixelsr�z
Gcode 3D Lr�z
Gcode 3D Rz
csp is zz zcsp isrXr zcsp_normalised_normal error t=0z%csp_normalised_normal error. See log.zcsp_normalised_normal error t=1rFTFr�z!engraving_draw_calculation_paths=z=stroke:#808080; stroke-opacity:1; stroke-width:0.6; fill:nonezG1L outliner�zG1R outlinezEngraving normalsr�r#z@stroke:#f000af; stroke-opacity:0.46; stroke-width:0.1; fill:nonezEngraving bisectorsz@stroke:#0000ff; stroke-opacity:0.46; stroke-width:0.1; fill:nonezi,j,jjmin,iimin,wr�r�r�r>r5)r�r�r�z<fill:none;fill-opacity:0.46;stroke:#000000;stroke-width:0.1;zwl in pixelszwl in user unitsz"(Tool diameter should be at least rIz+(Depth, as a function of radius w, must be z(Rapid feeds use safe Z=z(Material surface at Z=z No need to engrave sharp angles.)Cr1r�r;r5r�r�rkr	�engraving_max_distr�r?r�rQrrr�rr�r�r�r+r�r�r�r�r
r�r�r�rrr�r�rrirr�rDr�rhrar�rxr�r~rbrZr�r
�Pathelementr�r�r�r�r^r�rFror�r�r�r��Zsurfacer!r�r�r$)Irr�r�r�r�r�wmax�cspe�werk�bitlenr0r�r{�ol�oluu�orientation_scalerr�	toolshape�toolr�
max_distuur��cspire�cspl�cspr�sp0rhri�spl�sprr/r r�r�r�r��nx0�ny0r{r|rK�nn�first�bLT�segr8r�r�rs�reflexrGr��n2�x1a�y1ar�r��x1b�y1b�bits�bit0�lastw�len1�len2r*r�r�r�r�r��wluur�r)r�r�r�r�r�r�rMrr�
tab_engraving�s�
!D&)I""#

44

 


l ��









"$&
"
  
&���

4�
4�
�
4ND�


NF
&
.
&�"&*



�



��
&$""zGcodetools.tab_engravingcCs�|��|dur|j��dur|j��n|j��}|�|�}|r+|�|�}tt|��}|j	j
dkr�t|j�td�||jvrGt
|j|�}nd}gd�|d}ddi}|r[||d<|�td0i|���}|�td	d
��}|�dd�d�|d
d�|_t||d
dd|dd�dS|j	j
dkr�t|j��|jjjdddd�dStd�||jvr�|�dd�ddi}|r�||d<|�td0i|���}|j�|j���d��}	|j���d�dkr�d}	td�|	��|j	jdkr�d d |j	jgd!d |j	jggd"�g}
n|j	jd#k�rd d |j	jgd$d |j	jggd%�g}
|j	j
d&k�r!|
dd'�}
|
D]M}d(�|j	j
�}|�t|d)��}
|
�td*d
��}|�dd+�d,�|d|d-|	�|_td.�|d|d-|d'�|dd|d-d|	|
d/d��q#dS)1N�graffitizInserting graffiti pointsr)r�r�r��Arr�r�r/zstroke:none;fill:#00ff00;r]rz�m {},{} 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 zrCr#i����r	)r�r�r*r�r�zIn-out point)r�rur�r�r�zInserting orientation pointszQActive layer already has orientation points! Remove them or select another layer!r5r��heightz100%g����rq�@z)Overriding height from 100 percents to {}r\r�ru)r�rur�r��@)r�r�r�rcrz(Gcodetools orientation point ({} points)r�zstroke:none;fill:#000000;rrQr%z({}; {}; {})rr)rr�r�r�r�r�r�r�rr�r6r	r�rar�r
rr�r+r�r�r��	namedviewrdr�r5�unittouur�rkr��Zdepth)rr0r/�graffiti_reference_points_countr�r3r�r��orientation_group�
doc_heightrCrxro�grprrr�tab_orientation�sn"



�"
$"��B�zGcodetools.tab_orientationc
s�����jjdkr���S|dur#�j��dur�j��n�j��}|�jvr.��	dd��jjdkr@ddddd	d
ddd
�}n_�jjdkrTddddd	dd
d
ddd�
}nK�jjdkrfddddd	d
ddd�}n9�jjdkryddd	d
d
ddddd�	}n&�jjdkr�dd dd!d"d#d$d%�}n�jjd&kr�d'd(dd!d"d)d*d+d,�}n�j
}t�fd-d.��jD��}gd/�}|�t
d0d1��}|�td2d1��}d3|_||t|�|jd4<d}g}�jD]}	|	|vr�||	g7}q�|D]}	|	|vr�||	g7}q�|D]Z}	|�t
d5d1��}
t|	d||
d6|	d7k�rdnd8d9�||	}t|�tk�rt�d:|��rd;}t|d<||
d=|	d7k�r,dnd8d9�t|��d>�}||	d7k�rCd?t|�nd8t|�7}q�|�d@dA�|dB��|jj�jjj�|j�dCd�dS)DN�checkzCActive layer already has a tool! Remove it or select another layer!r5rgzCylindrical cutterzCylindrical cutter 0001r#�Z�400rZrUr�)rorprqrsr�rtrvr~zlathe cutterzLathe cutterzLathe cutter 0001r�)
rorprqrsr�r�r�rtrvr~zcone cutterzCone cutterzCone cutter 0001r)rorprqrrr�rtrvr~r�z
Tangent knifezTangent knife 0001r�r)	rorpr�rtrvrr�r�r~z
plasma cutterz
Plasma cutterzPlasma cutter 0001rCi�z�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)
zM05 (turn off plasma)
)rorprqrtr�ryrzr��Graffitiz
Graffiti 0001zM03 S1(Turn spray on)
 zM05 (Turn spray off)
 z+(Add G00 here to change sprayer if needed)
)rorprqrtr�ryrzr~csg|]	}t�j|��qSr)rar�r_rrrrV:r^z0Gcodetools.tab_tools_library.<locals>.<listcomp>)�00ff00�0000ff�ff0000�fefe00�00fefe�fe00fe�fe7e00�7efe00�00fe7e�007efe�7e00fe�fe007er�r�rz fill-opacity:0.5;stroke:#444444;r(rr
ror�)r�r�r�z^\s*$r�rrG�r�z"m -20,-20 l 400,0 0,{:f} -400,0 z �2ij���)rr��tools_library_type�check_tools_and_opr�r�r�r�r�r5r�rir�r
rr�rar�r�r�r�rr�rJr�r+r/�
add_translater�rd)
rr0r��tool_numrB�tools_group�bgrvrrr��paramr�rrr�tab_tools_library�s�"
�
��
���


�
�""(zGcodetools.tab_tools_librarycCs�t|jj�dkr|�d�|j}n|j}t|j���dkr$|j��dn|jd}|�t	��}gd�gd�g}|�
�td�td�td�td�g}i}|jD]�}||v�r|�|�|j
|d}||vri||ntd�td�g||<||D]�}	|�dtdi|	j���|��d}
tddd	|d
�dd�|d
�d
d�d�|
_||�|	�}|	j�|���}t|�}
tt|��}t|d|
d�t|d|
d�t|d|
d�t|d|
d�g}t||d|
d�t||d|
d�g||<|
�d|�|ddd7<qw|ddd7<qN|jD]A}||j
v�rS||v�rS|j
|d}t� |d�}d|jd<dd|dgdd||dgg}|�dtt|���|�d|��qdS)Nrz/Selection is empty! Will compute whole drawing.)r%r8r)rr�rr�r�r�r%zurl(#CheckToolsAndOPMarker)r�r(z#00ff00r�r�)r'r)�
marker_midr(r�rrXr/r�rCr
zCheck tools and OP assignmentr�r8r)!rar�r�r5r=r;rr?r�r
r7r�rr��insertrr�r�rr�r�r�r�r/rDr�r�rr�r�r�r��deepcopy)rr=r@r��trans_r��tools_boundsr0r�r�rr�re�path_boundsr�rrrr]sZ
*


$�D0�


 ��zGcodetools.check_tools_and_opcCs|�d�dS)NaSwitch to another tab to run the extensions.
No changes are made if the preferences or help tabs are active.

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/gcodetoolsru)r5rrrrrl�s
zGcodetools.tab_helpcC�|��Sr�rlrrrr�	tab_about��zGcodetools.tab_aboutcCr'rr(rrrr�tab_preferences�r*zGcodetools.tab_preferencescCr'rr(rrrr�tab_options�r*zGcodetools.tab_optionscCs t|�dkrdSd�|j|�}|jj}|jj}|��|��dvr$dnd}ddd	d
ddd
�}||}	||}
|ddddddgg}t||dd��D]
\}}
|t||
dd�7}qLt	dt|��D]}||ddd�||dd<qa||ddddddgg7}|j
||td�|�d�d�||ddd||ddd�|d}|D]�}|ddkr�|d�||dd||dd�|d7}q�|ddk�r�|dd|dd|dd|ddg}|dd|dd|jjdk�r�t
|d�t
|d�}t
|d�t
|d�}t|��|���dk�r[||d|dk�r+dndd�||dd||dd|	|dd|dd|
|dd|dd�|d7}q�|��|��d}||d|dk�rqdndd�||dd||dd�d�|�|d7}q�|S)NrrEz F {:f})�xz�yx�zyrFr%r�J�Krxr�r��r�r�r�rurvr�rr�rrczbiarc_style_lathe_{}r]zG01 {} {:f} {} {:f}rGr6ror#rXr�r�z  {} {:f} {} {:f} {} {:f} {} {:f}z {} {:f} {} {:f}r�)rar+r�r��lathe_x_axis_remap�lathe_z_axis_remapr�rcr{rZr�rFr�r-r�rj)rrgr0�	feed_typer�rur��
flip_angle�alias�i_�k_r$rhrirxr�rKrMr]r^rrr�generate_lathe_gcode�s>"0.0&xP�zGcodetools.generate_lathe_gcodec 
s�|��|��s
dS|jj}|jj}t�dd|�}t�dd|�}|dvs(|dvr/|�d�dS|��|��kr>|�d�dS|��|��dvrJd}|��|��dvrVd	}|��|��d
vrbd}||j_||j_|j	}g|_
d}|jD�]�}||v�ri|�|�|j
|j
|d
kr�|j
|d
|_
td|j
vr�|j
dn|j
d�|j
d<t|j
d�|j
d<td|j
vr�|j
dn|j
d�|j
d<|d�t�dd|j
d��|j
dd7}||D�]�}|�|j��|�}|D�]x}	|	dd�}
|jjd
k�r�|jj�|jjdk�r�fdd�|	D�}	n�t|	g�}t|	g�\}}
}}t|	dd�|	ddd
|
d�dg|	d
dd
|
d�dg|	d
dd
|	d
ddgg�}|	ddd
}|	d
dd
}||k�rq||}}t|gt|��s{�n��}t||dg|d
g�}t||d
g|dg�}t|d
|
d�gd|
d�g�}t|�d
}	t|	g�}|	d
dd
|jj|jj|jjg}|	ddd
|jj|jj|jjg}|d�||d|j
d�7}|d�||d
||d|j
d�7}ttg||	d
dg�|	�}	t|	||g�}	td
|jjtd
|d���|j
d}t t!�"�|��}t#|d�D]�}|jj||}g}t#dt$|	��D]I�|	�d}|	�}|�fd d�t%|d
d|g|d!d|g||�D�7}|�fd"d�t%|d
d||g|d!d||g||�D�7}�qBt&|	|�}|D][}t|g�\}}
}}|d|
dd!}|||k�r�||�'||d�7}�q�||k�r�||k�r�nn||�'||d�7}�q�tg|d
d|ddg�}||�'||d�7}�q��q/|
d
dd
|jj|jj|jjg}|
ddd
|jj|jj|jjg}|d#�|jj�7}t#t |jj(��D�];}|jjdt|d�|jj(��d
k�rE|
}n�|jjdk�rV�fd$d�|
D�}n�t|
g�\}}
}}t|
dd�|
ddd
|
d�dg|
d
dd
|
d�dg|
d
dd
|
d
ddgg�}|
ddd
}|
d
dd
}||k�r�||}}t|gt|��s��n��}t||dg|d
g�}t||d
g|dg�}t|d
|
d�gd|
d�g�}t|�d
}|d%�|d�7}|d�||d
||d|j
d�7}|d�||d
dd
||d
dd|jj|j
d�7}|d�||d
dd
||d
dd|j
d�7}||�'||d�7}|d�||d|j
d�7}|d�||d
||d|j
d�7}�q*q�q�qu|�)|�dS)&Nz^\s*([XYZxyz])\s*$z\1r2z>Lathe X and Z axis remap should be 'X', 'Y' or 'Z'. Exiting...z7Lathe X and Z axis remap should be the same. Exiting...)r�r.zG17 (Using XY plane)
)r-�zxzG18 (Using XZ plane)
)r/�yzzG19 (Using YZ plane)
rErr�r�r�r�r�r�ror~rGrecrm)c� g|]}|d|d�g�qSr9r�rRr��rMrrrV�r��3Gcodetools.tab_lathe.<locals>.<listcomp>.<listcomp>r�rRr�r?rrrV�rqz(Gcodetools.tab_lathe.<locals>.<listcomp>rFr%r#zG01 {} {:f} F {:f} 
zG01 {} {:f} {} {:f} F {:f} 
rvcr�rr�rRr�r�rrrVr�rcr�rrrBr�rrrV r�z6
(Fine cutting start)
(Calculating fine cut using {})
crm)cr=r9rr>r3rrrV7r�r@rrAr3rrrV7rqz 
(Fine cut {:d}-th cicle start)
)*r1r�r�r3r4rrr5r�r;r�r?rr�r�r+r�r�rD�lathe_fine_cut_width�lathe_create_fine_cut_usingr�ror�ryr0r�r��lathe_widthr�r�r�r^rQr?rZrarprJr:�lathe_fine_cut_countr$) rrur��gcode_plane_selectionr=r�r0r�rerg�fine_cut�boundr�r�r�r��offsetted_subpathr�r��	top_start�top_endrJ�stepsrx�
current_widthrrhrirG�partrv�current_passr)r�rMr-r�	tab_lathe�s�



((,

l

$
(($
8D
 �(( 
l

$$<4(���[zGcodetools.tab_lathecs�|��|jikr|jjr|j}|�d�n|j}|jD�]H}||v�re|jj�||D�]7}|�|j	�
�|�}g}|D�]��ddd�dddk}g}t�dd��dd��D]2\��t���\}}	}
}}}
}}t
dd|d|
|�}|t
dd|	d||
�7}t|t��|��}q^|�g}d}t�dd��dd��D]�\��t��d�}t�|d|d�}|dks�|tjkr�t��d�}t�|d|d�}|dk�r:|tjk�r:d|kr�tjdks�ntj|kr�tjdkr�nndnd�|�sd��|�s|gk�r���fdd	�td�D�g}t|���fd
d	�td�D����fdd	�td�D�g�}d}q�|dk�sH|tjk�rX|���fd
d	�td�D�g7}q<||g7}|�||�q,qdS)Nr.rFr%rrXrTcs4g|]}�d|d���d|dg�qSr9rr_��orgr-rrrVr�z4Gcodetools.tab_lathe_modify_path.<locals>.<listcomp>c�,g|]}�|d���|dg�qSr9rr_)rSrhr-rrrV�r�crTr9rr_)rSrir-rrrV�r�Fcs4g|]}�d|d���d|dg�qS)rFrr%rr_rRrrrV�r�)rr;r�r<r=r5r?�lathe_rectangular_cutter_widthr�r�rDrcrnr�r�rFr�rQr\r_rZr�)rr=r0r�re�new_csp�orientation�new_subpathryrzr{r|r}r~rr�r��	first_segrNrNr)rSrhrirgr-r�tab_lathe_modify_pathWs`

 ""H�� �
��z Gcodetools.tab_lathe_modify_pathc&s
����fdd�}dW�fdd�	��fdd��dX���fd
d�	}�fdd
�}���s,dS�jikr>�jjr>�j}��d�n�j}g�_d}td�}td�}td�}td�}	�j	D]�}
|
|v�rB|
�j
vr�d}t�j	�|
�dd�D]}�j	|�j
vr��j
�j	|}�j
�j	|�j
|
<nqq|dur���d�
|
�d�tt�j
|
��D]0}���j
|
|d|
��j
|
|d<�j
|
|}
|d�
|
dd|
dd|
d�7}q��jj�rB�j
|
D]&}
t||
dd�}t||
dd�}t||
dd�}t|	|
dd�}	q�||
D]4}|j��}��||�}��||
�}t|�}t||d�}t||d�}t||d�}t|	|d�}	�q
qY�jj�r_t�fdd�t�jj�D���_||||	g�_�j	D�]�}
|
|v�rPt�d�jj�}|�r�t|�d��t|�d��g�nddg��fdd�td�D�}�fdd�td�D���� |
��j!|
d�_|d �
t�"d!d"�jd#���jd$d%7}g�	||
D]}|j��}��||�}��||
�}�	|7�	�q�g�t�	�dk�r�t��	fd&d�tt�	��D��d}�	|dd�}�	|=�d'|�d|ddt#|�d(�t#|d|dd��gg7�g�d}d}|t|�dk�r`t$||||d�d)k�rS||dd||d<||d=n|d7}|t|�dk�s3t%||dd��D]U\}}|du�r�t&t't#||d(�t#||d���d*k�r��|g7��d+�dd�gg7��d'||d|dt#||d(�t#||d��gg7�g��|g7�t(��t(|�|}�qi�|g7��d+�dd�gg7�|}|�t�	�dk�s��sߐqb�d,�fd-d�td�D��fd.d�td�D�ggg7�tt���D]v}g�d}t(d/��t(�|�t%�|d�|ddd��D]<\}}t(||�t$||�}|d)k�r]�|dg7�t)t*�+|�jj,��}td|�D]}�t-||t|�|�g7��qL�q"|d)k�rk�|dg7�t(|���|d<�qd}d}�D]�}|d��jj.�r�|d7}�fd0d�tt���D�}t/�j|g|
d1d2��|�d|
�\�}�d}|dd+k�r�|d+k�r�|�jd3d%7}�D]l}
||
|
�\�}t0��fd4d�tt���D��}|d|
dd|d|
dd}|dk�r3�jd5t*�1||�} |d6|d7�
| �7}�jj�r+||
��| |dd+k�r$d8nd9�jj2d:���|
dd�}�q�|dd+k�rJ|d+k�rJ|�jd;d%7}|d}�q}�qb�j3|d1d<��jj�r�z��j
D]#}
�j
|
D]}
�|
dd|
dd�\}!}"�|!|"d=d>d?��qi�qbddl4}#|#j5dYid@�jj�dA�jj�dBd�dCdD�dEd1�dFdG�dHd�dId�dJd�dKd�dLd�dMdD�dNd�dOd�dPd�dQd�dRdS��}$t6t7j�8�jj9�jj:dT�dU��}%|$�;|%�j�Wd�WdS1�s�wYWdS��dV�YdSdS)ZNcstd}g}�j|D],}t�|d|ddd|d|ddd�}|d�|d|�7}||g7}q	||fS)NrErrr%z {} {:f})r�rQr�r+)rUr0r��pos�	ref_pointr$rrr�get_gcode_coordinates�s6z6Gcodetools.tab_graffiti.<locals>.get_gcode_coordinatesr�cs��j�_|\}}}}tt|dt�|��t|dt�|�d��D]�}tt|dt�|��t|dt�|�d��D]�}	|dkr�|	dkr�|	t�j�kr�|dt�jd�kr�t�||d||	d�}
t|�|
|krytdd|
|�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#dS)Nr%rrr�r2rX)
�graffiti_previewrZr^rQr?rar�r�r�r�)r�r�r�rjrMr�r��a_rurvr�rNrrr�graffiti_preview_draw_point�s664*4<<:���z<Gcodetools.tab_graffiti.<locals>.graffiti_preview_draw_pointcsp�j}t|d|dd|d|dd�}||dd�jj|�jj||dd�jj|gS)NrrrXr%)�graffiti_preview_transformr�r��graffiti_preview_size)rurv�trr�rrrrb�s*@z;Gcodetools.tab_graffiti.<locals>.graffiti_preview_transform�rr2r�(��cst�t��fdd�tt���D���}||}�j|dd}�j|dd}	t�|d|	dd|d|	dd�}
|
dkrHtd��tt||d��D]�}|||}�dd|�d|}
�dd|�d|}|
d|d|
dd|
}t�|
d|d�}|d||	d|d|
}|d||	d|d|
}|||	d|d|
}|||	d|d|
}|||	d|d|
}|||	d|d|
}||kr�|n|}t||�}�||�\}}�|||�qRdS)Nc� g|]}�|�|d�qS�rrr_�rcrbrrrV�r�zJGcodetools.tab_graffiti.<locals>.draw_graffiti_segment.<locals>.<listcomp>rr%rz/Error! Reference points should not be the same!)	rQr�rirZrar�r�r^r�)r0rbrcr�r��emmitr3rkr�r�r�rxr�r]r^rNrx�xa�yar�r�r�r�rurv)rarbrrjr�draw_graffiti_segment�s0&.   
�z6Gcodetools.tab_graffiti.<locals>.draw_graffiti_segmentcs(t|�}t|�}tt|��}tt|��}�jj}|||}	|||}
t||	��|�t||
��|�krat||�rO||||||��||dfn<||||||��||dfn*t||�ry||||||��||dfn||||||��||df\}}}}t�|�}|||}	|||}
|
|	}
|dkr�t	|||	��||�S|
j
|}|
j|}|	j
||||	j|||g}|
j
||||
j|||g}t||�dkr�t||�dkr�|||g|||ggSt	|||	��||�}t	|||
��|||g�}t
||�S)Nr%rFrr)r-rUr��graffiti_min_radiusr�r!r.rQr�rVrurvrdr�)r�r{r�r�r�rq�N1�N2rM�C1�C2�dcr��DcrRrS�p1_end�p2_strtrurrr�create_connector�s<$�*�$(�$
�



$$
z1Gcodetools.tab_graffiti.<locals>.create_connectorr.z[(Header)
(Generated by gcodetools from Inkscape.)
(Using graffiti extension.)
(Header end.)r�r�rFz3There are no graffiti reference points for layer {}r5rz((Reference point {:f};{:f} for {} axis)
r%rrXcsg|]}dgd�jj�qS)r2r)r�rcrQrrrrV1rqz+Gcodetools.tab_graffiti.<locals>.<listcomp>z/\s*\(\s*([0-9\-,.]+)\s*;\s*([0-9\-,.]+)\s*\)\s*r�cs g|]}�d�ddg�qS)rr%r#rrQ��start_pointrrrV<r�c�g|]}��qSrrrQryrrrV=rar�r�r�ror~rGcs*g|]}t�d�|dd�|f�qSr�r!r_)�last_sp2�subpathsrrrVNs*�	connectorr�r:r2r4�connect1cs g|]}�dddd�qS)rFr%rrQ)�	polylinesrrrV�r�cr{rrrQryrrrV�rar�cs"g|]
}�|�|�|g�qSrrr_)�polylinerrrV�r\Tr/rycrhrirr_)�
last_real_pos�real_posrrrV�r�r�zG01 z F {:f}
)rrr2��)r2rrr�)r�rkrz)r#)rr2rr2rk)rjr-r�r��	greyscaleFrW�bitdepthr��palette�transparent�
background�gamma�compression�	interlace�bytes_per_sampler��colormap�maxval�chunk_limitiz.png�wbzPng module have not been found!�r�)rergr)<r1r�r;r�r<r=r5r�r�r?r�rZr�r+rar/�graffiti_create_previewr�r�r�rDrCr�r�r
rcr_rbrr��graffiti_start_posr�rr�rrrr6rcr�r�r	r^rQr?�graffiti_max_seg_lengthr5�%graffiti_create_linearization_previewr�rir��graffiti_preview_emmitr$�png�Writerrrr r!r"r)&rr]rnrxr=r�r�r�r�r�r0�reference_pointsrxrUr�rer�rM�last_sp1rgr�rhrir3rGr�r��
last_state�	polyline_r��last_pos�real_lr�rurvr��writerr�r)
rarbr�r|r�r�r�rrzr}r�tab_graffiti�sf	
+


�((

�
 

,
$

���.


��

�36
*


�

 (

*��

�z"(��zGcodetools.tab_graffiticCs�|��|jikr"|�d�|�|jtdt|j�d��|��|jikrF|�d�d|j_	|�
|jtdt|j�d��|��dSdS)z.Like get_info(), but checks some of the valueszkOrientation points have not been defined! A default set of orientation points has been automatically added.r%zOCutting tool has not been defined! A default tool has been automatically added.rRN)rr�r5rr?r�rar�r�rr rrrrr1�s

 

 �zGcodetools.get_info_pluscCs�t��}|ja|t_|j��t_|jjrSz5tj�	|jj
�r$t�|jj
�t|jj
d��}|�
d�t�d�tj
��Wd�n1sCwYWn
dd�aYndd�a|j��td�td�t��|��td	�t�d���dS)
NrNz'Gcodetools log file.
Started at {}.
{}
z%d.%m.%Y %H:%M:%ScW�dSrr�rurrrr��r�z#Gcodetools.effect.<locals>.<lambda>cWr�rrr�rrrr��r�z*------------------------------------------zDone in {:f} secondsz
End at {}.)rgr�rr�r�r�rfrr�r�rr�rrr+�strftimer	�
active_tab)r�
start_time�fhlrrr�effect�s*���
zGcodetools.effectc	Cs(|��|jjry|jD]k}t|j|�dkrv|j|dj��}|j|dj��}t||�}t|�t	t
t||d|dd||d|d|d��t
t||d|dd||d|d|d��dd	t�
|d�d
�qdS|jjdkr�|jj|j_|jj|jjdkr�|jjd9_t��}d}|jD]M}|j|D]E}|jjd}t|�t|jj�kr�t|j��|�}	|d7}|	r�|	D]	}
t|
gdd�q�ntd
�|��n||jj7}t|�t|jj�ks�q�q�t�td�td�td�t�td�t��|��td�|��dS)Nrrr%rXrrkr��redr6rdrFr3z-------------Reached empty offset at radius {}zS-----------------------------------------------------------------------------------z
Done in {}zTotal offsets count {})rr��offset_just_get_distancer;rar�rDr�r	r�r
rqrQr��offset_step�
offset_radiusrgr�ryr�r+)rr0r�r�r�rk�
offsets_countr�r+�offset_�iiirrr�
tab_offset�sX

86���
����
zGcodetools.tab_offsetr�r�)NNr&r�r�N)r�r)0r#r$r%�	multi_inxr$rQrnr
r�r�rFr�r�r�r�r�rCr@r/r�r5r7rr�r�r�rrLrPrVrkr}r�rr rrlr)r+r,r:rQrZr�r1r�r��
__classcell__rrr�rr�
sp
`
-

L3f



A
`#-^1

H~6
"=7!r�__main__r�)r$r%r�)rr)r�)r�)rk)r�rkrm)r�rmr�)r)rX)r�rm)rm)NNr#N)r�r&rEr�NN)r�r�NrENr2r�NNNN)��__doc__�__version__r�r�rQrr�sysrg�	functoolsrr�ri�inkex.bezierrrrrrrr	r
rrr
r�version_inforZrhr�rrr_r]rnr�r~�LOFT_LENGTHS_TOLERANCEr�r�r�rrr.rFrOr_rjr�r�r�r�r�r�r�r�r�rorrr'r)r+r0rqr5r6rprArFrJrOrLrVrsrwrzr�r�rdrPr�r�r�r�rrr�rnr�r�r�r�r�r�r�rr�r�r�rrKr�rarUrTr�r�r�r\r�r�r�r	rmr�r�r	�objectr-r'ryr{r�r��EffectExtensionrr#�runrrrr�<module>s|(,

�

�
�
�



�
�
�



�



�



�
�
?


?



L
)P
*
#
 
 
"
&
	&
/	
	

	



'CZ
uzK
I�

Youez - 2016 - github.com/yon3zu
LinuXploit