
    ,jQ                        d dl mZmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlmZ ddlmZ ddlmZm Z  ddl!m"Z" dd	l#m$Z$m%Z% dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ed         Z?ee2ee"e"f         f         Z@dZA edd          ZBee'e1f         ZCdeCde'fdZDde'de+fdZE G d deF          ZG G d deF          ZHdS )    )UnionOptionalListDictCallableTupleIterableIteratorAnySequenceTypeVarcastLiteraloverload
get_origin)tansincospiradians	remainder)productchain)multimethod   )	find_hull)StringSyntaxSelectorSelector)Real)	get_arityinstance_of)	ShapeFaceEdgeWireCompoundVertexedgesToWirescompound
VectorLikeLocationVectorexport)
_importDXF)SketchConstraintSolverConstraintKindConstraintInvariantsDOF	arc_firstarc_last	arc_point)asicrư>TSketch)boundobjreturnc                 N    t          | t                    rt          d          | S )z,
    Make sure that a Shape is selected
    z)Location was provided, Shape is required.)
isinstancer,   
ValueErrorrA   s    I/DATA/AppData/hermes/venv/lib/python3.11/site-packages/cadquery/sketch.py_sanitize_for_boolrH   A   s+    
 #x   FDEEEJ    c                 Z    t          | t                    r| S t          j        | f          S N)rD   r&   makeCompoundrF   s    rG   _to_compoundrM   L   s,    #x   -
$cV,,,rI   c            	           e Zd ZU eedf         ed<   eedf         ed<   eed<   eed<   	 ddeedf         deedf         dedefdZ	dS )	
Constraint.tagsargskindparamNc           	      *   |t           vrt          d| d          t           |         \  }}}|t          |          k    r&t          d| dt          |           d| d          t          fd|D                       r t          dd |D              d	| d          t	          ||          s#t          d
t          |           d| d          || _        || _        || _        |r t          t          |          |          n|| _        d S )NzUnknown constraint .z*Invalid number of entities for constraint z. Provided z, required c              3   D   K   | ]}|                                 vV  d S rK   geomType).0etypess     rG   	<genexpr>z&Constraint.__init__.<locals>.<genexpr>q   s0      77Qqzz||5(777777rI   zUnsupported geometry types c                 6    g | ]}|                                 S  rW   rY   rZ   s     rG   
<listcomp>z'Constraint.__init__.<locals>.<listcomp>s   s     .J.J.Jqzz||.J.J.JrI   z for constraint zUnsupported argument types )r3   rE   lenanyr!   r   rP   rQ   rR   tcastr   rS   )	selfrP   rQ   rR   rS   arity
param_type	converterr[   s	           @rG   __init__zConstraint.__init__^   sk    +++:4:::;;;.B4.H+uj)CIIlTllcRViilldilll   7777$77777 	c.J.JT.J.J.Jcc\`ccc   5*-- 	Yj.?.?YYJYYY  
 			5>I*U3	**5111E


rI   rK   )
__name__
__module____qualname__r   str__annotations__r$   r2   r   rh   r^   rI   rG   rO   rO   W   s         
S/
c	

JJJ !J !JCHo!J D#I!J 	!J
 !J !J !J !J !J !JrI   rO   c                      e Zd ZU dZeed<   ee         ed<   eed<   ee	         ed<   e
ee                  ed<   ee         ed<   eeee         f         ed<   e
eeef                  ed	<   d
 e            fd
fdededee         de
e         fdZdee         ee	         z  fdZdedee         defdZ	 	 	 	 ddedeeee	         eef         dedede
e         dedefdZdg g ddd
fdedededee         dee         dedede
e         defd Z	 	 	 dded!ed"ededede
e         defd#Z dded$edede
e         def
d%Z!	 	 	 dded&ed'ededede
e         defd(Z"	 	 	 	 dded!ed"ed&ed'e
e         dedede
e         defd)Z#	 	 	 dded!ed"ededede
e         defd*Z$	 	 	 dded$ed+e%dedede
e         defd,Z&	 	 	 dded-ee'         dedede
e         defd.Z(ded/ed0ed1e%d2e%defd3Z)dded$ed&ed5ed+e%d6edefd7Z*	 dded+e%d9ed:ed6edefd;Z+	 ddedeeee'f                  de
e         defd<Z,	 	 	 dded=e-egeed ef         f         dede
e         dedefd>Z.ddedede
e         defd?Z/dded@edede
e         def
dAZ0deeee1         f         fdBZ2ded@edefdCZ3ded@edefdDZ4dedefdEZ5dedFee         dee         fdGZ6	 ddedHe
eee7f                  dIe8dJ         de
e         def
dKZ9dededefdLZ:dedMedefdNZ;	 ddedHe
eee7f                  de
e         defdOZ<	 ddedHe
eee7f                  de
e         defdPZ=	 ddedHe
eee7f                  de
e         defdQZ>	 ddedHe
eee7f                  de
e         defdRZ?dedefdSZ@dedefdTZAdeBfdUZCdeBfdVZD	 ddede	de
e         dWedef
dXZEeF	 	 ddedYe'dZe'de
e         dWedefd[            ZGeGjH        	 ddedZe'de
e         dWedef
d\            ZGeGjH        	 	 dded]edede
e         dWedefd^            ZGeF	 	 ddedYe'dZe'd_e'de
e         dWedefd`            ZIeIjH        	 	 ddedZe'd_e'de
e         dWedefda            ZIeIjH        	 	 ddedbe'd$eded5ede
e         dWedefdc            ZIeF	 	 dded-ee'         dde
ee'                  deede
e         dWedefdf            ZJeJjH        	 	 dded-ee'         de
e         dWedef
dg            ZJ	 	 dded-ee'         de
e         dWedef
dhZKddede
e         defdiZLddedede
e         defdjZMeFdededkeNdledef
dm            ZOeOjH        dednedoedkeNdledefdp            ZOdedefdqZPdedefdrZQeRdedsedefdt            ZSeRdeduedvededef
dw            ZSeRdedee         defdx            ZSeR	 	 	 	 	 	 ddedyedzed{ed|ed}ed~edefd            ZSeRdedseTdefd            ZSeRdedueTdveTdeTdef
d            ZSeRdedseeT         defd            ZSdedefdZSdedsedefdZUdefdZVdedefdZWdedee         fdZXdedefdZYdedefdZZdedefdZ[dedefdZ\dedd defdZ]dedd defdZ^dedd defdZ_dedd defdZ`dedee%ee%         eaf         defdZbdede-egef         defdZcdede-egef         fdZddede-ee         gee         f         fdZedede-egef         defdZfdedee-egef         e-egd
f         e-g d
f         f         fdZg	 	 	 ddedededede
eeef                  defdZhd
S )r?   zY
    2D sketch. Supports faces, edges and edges with constraints based construction.
    parentlocs_faces_edges
_selection_constraints_tags_solve_statusNrd   rA   c                     || _         t          |          | _        |r|nt          j        d          | _        g | _        d| _        g | _        i | _	        d| _
        dS )z,
        Construct an empty sketch.
        r^   N)ro   listrp   r&   rL   rq   rr   rs   rt   ru   rv   )rd   ro   rp   rA   s       rG   rh   zSketch.__init__   s^     JJ	 ?cch&;B&?&?
!rI   rB   c                       j         r t           fd j        D                       S t           fd j        D                       S )zq
        Iterate over faces-locations combinations. If not faces are present
        iterate over edges:
        c              3   z   K   | ]5}j                             |                                          D ]}|V  6d S rK   )rq   movedFaces)rY   lfrd   s      rG   r\   z"Sketch.__iter__.<locals>.<genexpr>   sL      SSadk6G6G6J6J6P6P6R6RSSSSSSSSSrI   c              3   V   K   | ]#}j         D ]}|                    |          V  $d S rK   )rr   r{   )rY   r}   rZ   rd   s      rG   r\   z"Sketch.__iter__.<locals>.<genexpr>   s<      KKqt{KK!

KKKKKKKrI   )rq   iterrp   rd   s   `rG   __iter__zSketch.__iter__   sZ     ; 	LSSSS49SSSSSSKKKKDIKKKKKKrI   valtagc                     || j         |<   d S rK   )ru   )rd   r   r   s      rG   _tagzSketch._tag   s    
3rI   r   r8   Fbanglemodeignore_selectionc           
         t          |t                    rt          j        |          nt          |t                    r|nt          |t
                    r't          j        |                                          nst          |t                    rLt          t          t          t                   |                    }t          j        |d         |dd         f nt          d|           |dk    r?                    t          t!                      t!          ddd          |                    |                     fd|||          S )z8
        Construct a face from a wire or edges.
        r   r   NzUnsupported argument c                 .                         |           S rK   )r{   r}   ress    rG   <lambda>zSketch.face.<locals>.<lambda>   s    399Q<< rI   )rD   r%   r#   makeFromWiresr?   r"   r&   rL   r|   r	   r(   rc   r$   rE   r{   r,   r-   each)rd   r   r   r   r   r   wiresr   s          @rG   facezSketch.face   s)    a 
	:$Q''CC6"" 	:CC5!! 	:'		22CC8$$ 	: x~q!9!9::E$uQxqrr&;<CC8Q88999A::))HVXXvaAFFGGCyy////s<LMMMrI   r=   filenametolexcludeincludec                 z    t          j        t          ||||                    }|                     ||||          S )z9
        Import a DXF file and construct face(s)
        )r&   rL   r0   r   )	rd   r   r   r   r   r   r   r   r   s	            rG   	importDXFzSketch.importDXF   s:     #Jxgw$O$OPPyyeT3///rI   whc                     t          j        ||                              t                      t          ddd          |          |                     fd||          S )z/
        Construct a rectangular face.
        r   r   c                 .                         |           S rK   locatedr   s    rG   r   zSketch.rect.<locals>.<lambda>       3;;q>> rI   )r#   	makePlanerotater-   r   )rd   r   r   r   r   r   r   s         @rG   rectzSketch.rect   sV     nQ""))&((F1aOOUKKyy11114===rI   r<   c                     t          j        t          j        |t	                      t	          ddd                              |                     fd||          S )z,
        Construct a circular face.
        r   r   c                 .                         |           S rK   r   r   s    rG   r   zSketch.circle.<locals>.<lambda>  r   rI   )r#   r   r%   
makeCircler-   r   )rd   r<   r   r   r   s       @rG   circlezSketch.circle   sQ    
  FHHfQ1oo!N!NOOyy11114===rI   a1a2c                     t          j        t          j        ||t	                      t	          ddd          t	          ddd          |                    |                     fd||          S )z/
        Construct an elliptical face.
        r   r   )rotation_anglec                 .                         |           S rK   r   r   s    rG   r   z Sketch.ellipse.<locals>.<lambda>  r   rI   )r#   r   r%   makeEllipser-   r   )rd   r   r   r   r   r   r   s         @rG   ellipsezSketch.ellipse  st      B&Aq//6!Q??SX  
 
 yy11114===rI   c           	         t          | dz  | dz            }t          |dz  | dz            }	t          | dz  |t          t          |                    z  z   |dz            }
t          |dz  |t          |rt          |          nt          |                    z  z
  |dz            }|                     ||	||
|f|||          S )z/
        Construct a trapezoidal face.
           )r-   r   r   polygon)rd   r   r   r   r   r   r   r   v1v2v3v4s               rG   	trapezoidzSketch.trapezoid  s     QBFQBF##AEA26""QBFQWR[[!1!1111q599AEA2$FGBKKK72;; G GGGQOO||RRR0%sCCCrI   c                 ,   t          | dz  |dz            }t          |dz  |dz            }t          | dz  | dz            }t          |dz  | dz            }	t          | dz  |dz  z
  d          }
t          |dz  |dz  z   d          }t          j        ||          }t          j        |||	          }t          j        |	|          }t          j        ||
|          }t	          j        ||||f          }|                     ||||          S )z/
        Construct a slot-shaped face.
        r   r   )r-   r$   makeLinemakeThreePointArcr%   assembleEdgesr   )rd   r   r   r   r   r   p1p2p3p4p5p6e1e2e3e4wires                    rG   slotzSketch.slot1  s    QBFAE""AE1q5!!QBFQBF##AEA26""QBFQUNA&&AEAEM1%%]2r""#BB//]2r""#BB//!2r2r"233yyudC000rI   nc                 t    fdt          dz             D             }|                     ||||          S )z5
        Construct a regular polygonal face.
        c           
          g | ]N}t          t          |d z  t          z  z            z  t          |d z  t          z  z            z            OS )r   )r-   r   r   r   )rY   r:   r   r<   s     rG   r`   z)Sketch.regularPolygon.<locals>.<listcomp>Y  se     
 
 
 1s1q52:>***AAEBJN0C0C,CDD
 
 
rI   r   )ranger   )rd   r<   r   r   r   r   ptss    ``    rG   regularPolygonzSketch.regularPolygonM  sU    
 
 
 
 
1q5\\
 
 

 ||Cc222rI   r   c                 r    t          j        d |D             dd          }|                     ||||          S )z-
        Construct a polygonal face.
        c              3   V   K   | ]$}t          |t                    r|nt          | V  %d S rK   )rD   r-   rY   ps     rG   r\   z!Sketch.polygon.<locals>.<genexpr>l  s9      EEA*Q''7QQVQZEEEEEErI   FT)r%   makePolygonr   )rd   r   r   r   r   r   s         rG   r   zSketch.polygon`  sE     EEEEEud
 
 yyE4---rI   xsysnxnyc           
        	 |dk     s|dk     rt          d| d|           g }t          |dz
  |z  |dz
  |z            dz  }t          t          |          t          |                    D ]>\  }}|                    t          t          ||z  ||z            |z
                       ?| j        r| j        	nt                      g	|                     	fd|D                       S )z<
        Generate a rectangular array of locations.
        r   z(At least 1 elements required, requested z,       ?c              3      K   | ]G}D ]B}t          |t                    r||z  n#|t          |                                          z  V  CHd S rK   rD   r,   Center)rY   r}   el	selections      rG   r\   z Sketch.rarray.<locals>.<genexpr>  sz       
 

 
  ""h//NQVVQ"))++9N9N5N
 
 
 
 
 
 
rI   )rE   r-   r   r   appendr,   rs   push)
rd   r   r   r   r   rp   offsetr:   jr   s
            @rG   rarrayzSketch.rarrays  s   
 66R!VVRRRbRRSSSa2Q"}55;E"IIuRyy11 	C 	CDAqKKBB!7!7&!@AABBBB? 	#BF/II
Iyy 
 
 
 

 
 
 
 
 	
rI   Tdar   c                 j   |dk     rt          d|           g }t          t          |d                    t          k     r||z  n|dk    r||dz
  z  nt	          d|          D ]z}|z  z   }|t          t          |                    z  }	|t          t          |                    z  }
t          t          |	|
                    }|
                    |           {| j        r| j        nt                      g|                     fdt          |          D                       S )z6
        Generate a polar array of locations.
        r   'At least 1 element required, requested h  r   c              3      K   | ]T\  }}d  D             D ]B}||z  t          t          dd          t          ddd          r|z  z   nd          z  V  CUdS )c                 ~    g | ]:}t          |t                    r|n t          |                                          ;S r^   r   rY   r   s     rG   r`   z+Sketch.parray.<locals>.<genexpr>.<listcomp>  sK        !X..IHRYY[[4I4I  rI   r   r   Nr+   )rY   r:   r}   r   r   r   r   r   s       rG   r\   z Sketch.parray.<locals>.<genexpr>  s       
 
 1 #  
 
  1aLL&Aq//3VB%!)4D4DUV 
 
 
 
 
 
 
rI   )rE   absr   TOLr   r   r   r   r,   r-   r   rs   r   	enumerate)rd   r<   r   r   r   r   rp   r:   phixylocr   r   s     `  `      @@rG   parrayzSketch.parray  s^   
 q55JqJJKKKyS!!""S((FEE$%EEB!a%LLrEq! 	 	A	"CC%%%AC%%%A6!Q<<((CKK? 	#BF/II
Iyy 
 
 
 
 
 
 
 "$
 
 
 
 
 	
rI   r   startstopc                    dk     rt          d           | j        st          d          dt          z
            z
  t          k     rd}nd}fdt	                    D             }fdt	                    D             }g }| j        D ]}	t          |	t          t          f          r{|	                                r|s|}
n|}
|r+|	                    |	
                    |
d                     f|	                    d	 |	                    |
          D                        t          d
|	           |                     |          S )zE
        Distribute locations along selected edges or wires.
        r   r   z#Nothing selected to distribute overFTc                 ,    g | ]}|z
  z  z  z   S r^   r^   rY   r:   r   r   r   s     rG   r`   z%Sketch.distribute.<locals>.<listcomp>  s,    JJJAdUl!3a!77JJJrI   c                 H    g | ]}d z
  dk    r|z
  z  d z
  z  z   nS )r   r   r^   r   s     rG   r`   z%Sketch.distribute.<locals>.<listcomp>  sQ     
 
 
 56EAIIEA&!a%0005
 
 
rI   )planarc              3   4   K   | ]}t          |          V  d S rK   )r,   rY   vs     rG   r\   z$Sketch.distribute.<locals>.<genexpr>  s(      JJJJJJJJrI   zUnsupported selection: )rE   rs   r   r   r   rD   r%   r$   IsClosedextend	locations	positionsr   )rd   r   r   r   r   trimmedparams_closedparams_openrp   r   paramss    ```       rG   
distributezSketch.distribute  s    q55JqJJKKK 	DBCCCs4%<   3&&GGG KJJJJJqJJJ
 
 
 
 
 
1XX
 
 

 / 	A 	AB"tTl++ A;;== ) )*FF(F KKKVD B BCCCCKKJJR\\&5I5IJJJJJJJ !?2!?!?@@@yyrI   c                 r    d |D             | _         |r#|                     | j         dd         |           | S )zE
        Set current selection to given locations or points.
        c                 t    g | ]5}t          |t                    r|nt          t          |                    6S r^   )rD   r,   r-   )rY   r}   s     rG   r`   zSketch.push.<locals>.<listcomp>  sF     
 
 
FGAx((AAAhvayy.A.A
 
 
rI   N)rs   r   )rd   rp   r   s      rG   r   zSketch.push  sP    
 
KO
 
 
  	/IIdoaaa(#...rI   callbackc                    g }g }| j         r[|sY| j         D ]P}t          |t                    r|}n!t          |                                          }|                    |           Qn!|                    t                                 |D ]} ||          }	t          |	t
                    r-|                    |	j                                                   Ot          |	t                    r(|                    |	                                           |                    |	           |r| 
                    ||           |dk    r | j        j        | | _        n|dk    r | j        j        | | _        ne|dk    r | j        j        | | _        nJ|dk    rt          j        |          | _        n*|dk    r|st          d          nt          d|           | S )z>
        Apply a callback on all applicable entities.
        r8   r9   r:   r<   r;   z3No tag specified - the geometry will be unreachablezInvalid mode: )rs   rD   r,   r   r   r?   r   rq   r|   r&   r   fusecut	intersectrL   rE   )
rd   r  r   r   r   r   rp   r   r   tmps
             rG   r   zSketch.each  s    !? 
	$#3 
	$o ! !b(++ 0CC"299;;//CC    ! KK

### 	  	 C(3--C#v&&  

3:++--....C**  

399;;''''

3 	 IIc33;;*$+*C0DKKS[[)$+/3/DKKS[[/$+/5DKKS[["/44DKKS[[ X !VWWWX 4d44555rI   c                 n   | j         rt          d | j         D                       }nc| j        r1t          d | j                                        D                       }n+| j        rt          | j                  }nt          d          |                     |||t          | j                              | S )zO
        Generate a convex hull from current selection or all objects.
        c              3   D   K   | ]}t          |t                    |V  d S rK   rD   r$   r   s     rG   r\   zSketch.hull.<locals>.<genexpr>1  s1      PP":b$;O;OP2PPPPPPrI   c              3      K   | ]}|V  d S rK   r^   r   s     rG   r\   zSketch.hull.<locals>.<genexpr>3  s"      <<"2<<<<<<rI   z*No objects available for hull constructionr   r   r   )rs   r   rq   Edgesrr   rE   r   bool)rd   r   r   rvs       rG   hullzSketch.hull+  s    
 ? 	KPPPPPPPBB[ 	K<<(9(9(;(;<<<<<BB[ 	K4;''BBIJJJ		"4S4;P;P	QQQrI   dc           	          | j         rVfd| j         D             }t          j        |          D ]-}|                     |||t	          | j                              .nt          d          | S )z1
        Offset selected wires or edges.
        c              3   l   K   | ].}t          |t                    |                              V  /d S rK   )rD   r%   offset2D)rY   r   r  s     rG   r\   z Sketch.offset.<locals>.<genexpr>C  s<      SSRjT>R>RS"++a..SSSSSSrI   r  zSelection is needed to offset)rs   r   from_iterabler   r  rE   )rd   r  r   r   r  r   s    `    rG   r   zSketch.offset=  s    
 ? 	>SSSS4?SSSB)"--  		TsT$/=R=R     
 <===rI   c                     i }| j         rG| j                                        D ],}|                                fd| j         D             ||<   -nt	          d          |S )Nc                 F    g | ]}t          |t                    r|v |S r^   )rD   r'   )rY   r   
f_verticess     rG   r`   z0Sketch._matchFacesToVertices.<locals>.<listcomp>V  s>       !!V,, 23j 1@rI   z.Selection is needed to match vertices to faces)rs   rq   r|   VerticesrE   )rd   r  r~   r  s      @rG   _matchFacesToVerticeszSketch._matchFacesToVerticesN  s    ? 
	O[&&((  ZZ\\
   !_  1 MNNN	rI   c                     |                                  }t          j        fd|                                D                       | _        | S )z:
        Add a fillet based on current selection.
        c              3   R   K   | ]!\  }}|r|                     |          n|V  "d S rK   )fillet2DrY   kr   r  s      rG   r\   z Sketch.fillet.<locals>.<genexpr>g  sP       ,
 ,
-1Q(AJJq!q,
 ,
 ,
 ,
 ,
 ,
rI   r  r&   rL   itemsrq   rd   r  f2vs    ` rG   filletzSketch.fillet`  s_    
 ((**+ ,
 ,
 ,
 ,
58YY[[,
 ,
 ,
 
 
 rI   c                     |                                  }t          j        fd|                                D                       | _        | S )z;
        Add a chamfer based on current selection.
        c              3   R   K   | ]!\  }}|r|                     |          n|V  "d S rK   )	chamfer2Dr"  s      rG   r\   z!Sketch.chamfer.<locals>.<genexpr>t  sP       ,
 ,
.2a)AKK1,
 ,
 ,
 ,
 ,
 ,
rI   r$  r&  s    ` rG   chamferzSketch.chamferm  s_    
 ((**+ ,
 ,
 ,
 ,
69iikk,
 ,
 ,
 
 
 rI   c                 B    | j                                         | _         | S )z(
        Remove internal wires.
        )rq   cleanr   s    rG   r.  zSketch.cleanz  s    
 k''))rI   valsc                 \    d |D             }t          |                                          S )Nc                 .    i | ]}t          |          |S r^   )hashr   s     rG   
<dictcomp>z"Sketch._unique.<locals>.<dictcomp>  s     (((atAww(((rI   )rx   values)rd   r/  r  s      rG   _uniquezSketch._unique  s+    ((4(((CJJLL!!!rI   r9   rR   )r|   Wiresr  r  c                    g }|r<| j         |         D ]-}|                     t          ||                                 .n| j        rK| j        D ]B}t	          |t
                    s+|                     t          ||                                 Cne|                     t          | j        |                                 | j        D ]-}|                     t          ||                                 .|r+t	          |t                    r|	                    |          }n<|r8t	          |t                    r#t          |          	                    |          }n|}|                     |          | _        | S rK   )ru   r   getattrrs   rD   r,   rq   rr   r   filterrl   r   r5  )rd   r9   rR   r   r  r   filtereds          rG   _selectzSketch._select  s     
	/jo / /		+'"d++--..../_ 	/o 3 3!"h// 3II/gb$//112223 II0gdk40022333k / /		+'"d++--.... 	Ax(( 	xx||HH 	:a%% 	+A..55b99HHH,,x00rI   c                 l    | j         rt          | j                   | j        |<   nt          d          | S )z(
        Tag current selection.
        zSelection is needed to tag)rs   rx   ru   rE   rd   r   s     rG   r   z
Sketch.tag  s9    
 ? 	;"4?33DJsOO9:::rI   rP   c                 h    g | _         |D ]'}| j                             | j        |                    (| S )z'
        Select based on tags.
        )rs   r   ru   )rd   rP   r   s      rG   selectzSketch.select  s>    
  	4 	4CO""4:c?3333rI   c                 0    |                      |d|          S )z
        Select faces.
        r|   r;  rd   r9   r   s      rG   faceszSketch.faces       ||Aw,,,rI   c                 0    |                      |d|          S )z
        Select wires.
        r6  rA  rB  s      rG   r   zSketch.wires  rD  rI   c                 0    |                      |d|          S )z
        Select edges.
        r  rA  rB  s      rG   edgeszSketch.edges  rD  rI   c                 0    |                      |d|          S )z"
        Select vertices.
        r  rA  rB  s      rG   verticeszSketch.vertices  s     ||Az3///rI   c                     d| _         | S )z*
        Reset current selection.
        N)rs   r   s    rG   resetzSketch.reset  s    
 rI   c                 T   | j         r}| j         D ]t}t          |t                    r| j                            |           2t          |t
                    r| j                            |           bt          d| d          nt          d          |                                  | S )z)
        Delete selected object.
        zDeletion of z not supportedzSelection is needed to delete)	rs   rD   r#   rq   remover$   rr   rE   rK  )rd   rA   s     rG   deletezSketch.delete  s    
 ? 		> I Ic4(( IK&&s++++T** IK&&s++++$%GC%G%G%GHHHI <===

rI   c                     | j         st          d          | j         d         }|j        }| j         D ]}|j        |k    r|} n|                                S NzNo free edges available)rr   rE   forConstruction
startPoint)rd   rZ   r   r   s       rG   _startPointzSketch._startPoint  sn    { 	86777 KO + 	 	B!T)) * ||~~rI   c                 p    | j         st          d          | j         d         }|                                S rP  )rr   rE   endPoint)rd   rZ   s     rG   	_endPointzSketch._endPoint  s4    { 	86777KOzz||rI   rR  c                 z    ||_         | j                            |           |r|                     |g|           | S )z,
        Add an edge to the sketch.
        )rR  rr   r   r   )rd   r   r   rR  s       rG   edgezSketch.edge  sE     .3 	"IIseS!!!rI   r   r   c                     t          j        t          |          t          |                    }|                     |||          S )z&
        Construct a segment.
        )r$   r   r-   rY  )rd   r   r   r   rR  r   s         rG   segmentzSketch.segment-  s7     mF2JJr

33yyc?333rI   c                     |                                  }t          j        |t          |                    }|                     |||          S rK   )rW  r$   r   r-   rY  )rd   r   r   rR  r   r   s         rG   r[  zSketch.segment=  s@    
 ^^mBr

++yyc?333rI   r}   c           	         |                                  }t          |t          t          |                    z  |t	          t          |                    z            }t          j        |||z             }|                     |||          S rK   )rW  r-   r   r   r   r$   r   rY  )rd   r}   r8   r   rR  r   r  r   s           rG   r[  zSketch.segmentG  so     ^^1s71::&C

OO(;<<mBQ''yyc?333rI   r   c                     t          j        t          |          t          |          t          |                    }|                     |||          S )z#
        Construct an arc.
        )r$   r   r-   rY  )rd   r   r   r   r   rR  r   s          rG   arcz
Sketch.arcV  s@     $VBZZVBZZHHyyc?333rI   c                     |                                  }t          j        t          |          t          |          t          |                    }|                     |||          S rK   )rW  r$   r   r-   rY  )rd   r   r   r   rR  r   r   s          rG   r_  z
Sketch.arcg  sO     ^^$VBZZVBZZHHyyc?333rI   r;   c                    t          |          dk    r,t          j        |t          |          |||dk              }nt          |          }||t          t	          t          |                    t          t          |                              z  z   }	||t          t	          t          ||dz  z                       t          t          ||dz  z                                 z  z   }
||t          t	          t          ||z                       t          t          ||z                                 z  z   }t          j        |	|
|          }|                     |||          S )Nr   r   )angle1angle2orientationr   )	r   r$   r   r-   r   r   r   r   rY  )rd   r;   r<   r8   r   r   rR  r   p0r   r   r   s               rG   r_  z
Sketch.arcu  s)    r77c>>/!VAYYqPRUVPVWWWCCBa&WQZZ#gajj//BBBBBa&WQaZ%8%8!9!93wq2PQ6z?R?R;S;STTTTBa&WQV__!5!5s71r6??7K7KLLLLB(R44Cyyc?333rI   tangentsperiodicc                     t          j        d |D             |rd |D             nd|          }|                     |||          S )z*
        Construct a spline edge.
        c                      g | ]}t          | S r^   r-   r   s     rG   r`   z!Sketch.spline.<locals>.<listcomp>  s    %%%AVQZ%%%rI   c                      g | ]}t          | S r^   rj  )rY   ts     rG   r`   z!Sketch.spline.<locals>.<listcomp>  s    ***AVQZ***rI   N)r$   
makeSplinerY  )rd   r   rf  rg  r   rR  r   s          rG   splinezSketch.spline  s]     o%%%%%.6@******D
 
 yyc?333rI   c                 4    |                      |d d||          S NF)rn  )rd   r   r   rR  s       rG   rn  zSketch.spline  s     {{3eS/BBBrI   c                 l    t          j        d |D                       }|                     |||          S )z
        Construct an bezier curve.

        The edge will pass through the last points, and the inner points
        are bezier control points.
        c                      g | ]}t          | S r^   rj  r   s     rG   r`   z!Sketch.bezier.<locals>.<listcomp>  s    777avqz777rI   )r$   
makeBezierrY  )rd   r   r   rR  r   s        rG   bezierzSketch.bezier  s8     o77377788yyc?333rI   c                 |    |                      |                                 |                                 |           | S )z5
        Connect last edge to the first one.
        )r[  rW  rT  r=  s     rG   closezSketch.close  s5    
 	T^^%%t'7'7'9'93???rI   c                 P    |                      d | j        D             d||          S )z,
        Assemble edges into faces.
        c              3   (   K   | ]}|j         	|V  d S rK   )rR  r_   s     rG   r\   z"Sketch.assemble.<locals>.<genexpr>  s*      ==11+<=Q======rI   r   )r   rr   )rd   r   r   s      rG   assemblezSketch.assemble  s3    
 yy=====q$
 
 	
rI   
constraintargc                     | j                             t          |f| j        |         d         f||                     | S )z#
        Add a constraint.
        r   rt   r   rO   ru   )rd   r   rz  r{  s       rG   	constrainzSketch.constrain  sG     	  v
3 24j#FF	
 	
 	
 rI   tag1tag2c                     | j                             t          ||f| j        |         d         | j        |         d         f||                     | S )Nr   r}  )rd   r  r  rz  r{  s        rG   r~  zSketch.constrain  s`    
 	  tD!!$dj&6q&9:	 	
 	
 	
 rI   c                    g }i }g }t          t          d | j                                                            D ]\  }\  }}t	          t
          |d                   }|                                dk    rD|                                }|                                }	|j	        |j
        |	j	        |	j
        f}
n|                                dk    r |                                }|                                |z
  }|                                |z
  }	|                    d          |z
  }t          dd                              |          }|                    |	          }|                    |          }|dk    r|dk     r|dt          z  z  }n|dk     r|dk    r|dt          z  z  }|                                }|j	        |j
        |||f}
n|                    |
           |||<   |                    |                                           g }| j        D ]d}||j        d                  t)          |j                  dk    r||j        d                  ndf}|                    ||j        |j        f           et/          |||          }|                                \  }| _        || j        d	<   t5          ||                                          D ]\  }\  }}||         }|dk    rNt          |d         |d                   }t          |d         |d
                   }	t          j        ||	          }n_|dk    rYt          t9          |           }t          t;          |d           }	t          t=          |           }t          j        ||	|          }|j         | j        |         d         _         | S )zF
        Solve current constraints and update edge positions.
        c                 D    t          | d         d         t                    S )Nr   r   r  )kvs    rG   r   zSketch.solve.<locals>.<lambda>  s    jAq488 rI   r   LINECIRCLEr   r   r   Nr      )!r   r9  ru   r%  rc   r$   rX   rS  rV  r   r   	arcCenter
positionAtr-   getSignedAngler   radiusr   rt   rP   ra   rR   rS   r1   solverv   zipr   r5   r7   r6   r   wrapped)rd   entitiese2igeomsr:   r#  r   v0r   r   entr   pmr   r   a3r  constraintsr;   ixsolverr   gr   rZ   r   s                             rG   r  zSketch.solve  s~   
  #88$*:J:J:L:LMM
 
 !	( !	(IAv1 tQqT""B {{}}&&]]__[[]]D"$bd3(**LLNN]]__q([[]]Q&]]3''!+Aq\\0044&&r**&&r**66b1ff!b&LBB!VVQ!b&LBsACR0 OOC   CFLL'''' " 	6 	6AafQi.CKK14D4D#afQi..$OBAFAG45555 (+uEE"(,,..T"%3 UCIIKK00 	1 	1IAv1QB F{{BqE2a5))BqE2a5))M"b))hYr]]+Yr3//0Xb\\**2r266 ()yDJqM!$$rI   c                 j    |                                  }| j                                        |_        |S )z6
        Create a partial copy of the sketch.
        	__class__rq   copyrd   r  s     rG   r  zSketch.copy8  s-    
 ^^K$$&&		rI   r   c                     d S rK   r^   rd   r   s     rG   r{   zSketch.movedB      rI   loc1loc2c                     d S rK   r^   rd   r  r  rp   s       rG   r{   zSketch.movedF  r  rI   c                     d S rK   r^   )rd   rp   s     rG   r{   zSketch.movedJ  r  rI   r   r   zrxryrzc                     d S rK   r^   )rd   r   r   r  r  r  r  s          rG   r{   zSketch.movedN  s	     	rI   c                     d S rK   r^   r  s     rG   r{   zSketch.movedZ  r  rI   c                     d S rK   r^   r  s       rG   r{   zSketch.moved^  r  rI   c                     d S rK   r^   r  s     rG   r{   zSketch.movedb  r  rI   c                 \    |                                  } | j        j        |i ||_        |S )zH
        Create a partial copy of the sketch with moved _faces.
        )r  rq   r{   )rd   rQ   kwargsr  s       rG   r{   zSketch.movedf  s3    
 ^^%DK%t6v66		rI   c                 p    |                      |f          }| j                                        |_        |S )zJ
        Create a partial copy of the sketch with a new location.
        )rp   r  )rd   r   r  s      rG   r   zSketch.locatedp  s3    
 ^^#^((K$$&&		rI   c                     | j         S )zC
        Finish sketch construction and return the parent.
        )ro   r   s    rG   finalizezSketch.finalizez  s    
 {rI   c                 v    | j         | j         d         }n#| j        s| j        r| j        d         }n| j        }|S )zT
        Return the first selected item, underlying compound or first edge.
        Nr   )rs   rq   rr   r  s     rG   r   z
Sketch.val  sF    
 ?&#BB 	 	QBBB	rI   c                     | j         t          | j                   }n7| j        s| j        rt          | j                  }nt          | j                  }|S )zN
        Return all selected items, underlying compound or all edges.
        )rs   rx   rq   rr   r  s     rG   r/  zSketch.vals  sU     ?&do&&BB 	# 	#dk""BBdk""B	rI   c                     | j         r0t          d | j         D                                                       S t          d          )z6
        Helper for returning selected faces.
        c                 <    g | ]}t          |t                    |S r^   )rD   r"   r   s     rG   r`   z*Sketch._selected_faces.<locals>.<listcomp>  s'    GGGB1F1FGGGGrI   zNothing is selected)rs   r)   rC  rE   r   s    rG   _selected_faceszSketch._selected_faces  sM    
 ? 	4GGdoGGG egg 2333rI   c                 |    | j         r4t          t          | j        |                                 z             | _        | S )z8
        Add selection to the underlying faces.
        rs   rc   r&   rq   r  r   s    rG   addz
Sketch.add  8    
 ? 	P$+8L8L8N8N*NOODKrI   c                 |    | j         r4t          t          | j        |                                 z
            | _        | S )z?
        Subtract selection from the underlying faces.
        r  r   s    rG   subtractzSketch.subtract  r  rI   c                 ^    t          t          |                                           | _        | S )zB
        Replace the underlying faces with the selection.
        )rc   r&   r  rq   r   s    rG   replacezSketch.replace  s&    
 Hd&:&:&<&<==rI   otherc                     t          |                                           t          |                                          z   }|                     t          |                    S )z&
        Fuse self and other.
        rF   rH   r   r  rM   rd   r  r   s      rG   __add__zSketch.__add__  K    
 !,,/A%))++/N/NN~~,s"3"3~444rI   c                     t          |                                           t          |                                          z
  }|                     t          |                    S )z+
        Subtract other from self.
        rF   r  r  s      rG   __sub__zSketch.__sub__  r  rI   c                     t          |                                           t          |                                          z  }|                     t          |                    S )z+
        Intersect self and other.
        rF   r  r  s      rG   __mul__zSketch.__mul__  r  rI   c                     t          |                                           t          |                                          z  }|                     t          |                    S )z(
        Split self with other.
        rF   r  r  s      rG   __truediv__zSketch.__truediv__  r  rI   itemc                     |                                  t          |t                    rfd|D             | _        n1t          |t                    r|         | _        n|         g| _        | S )Nc                      g | ]
}|         S r^   r^   )rY   r:   r/  s     rG   r`   z&Sketch.__getitem__.<locals>.<listcomp>  s    5551tAw555rI   )r/  rD   r	   rs   slice)rd   r  r/  s     @rG   __getitem__zSketch.__getitem__  sp    yy{{dH%% 	+5555555DOOe$$ 	+"4jDOO#DzlDOrI   r~   c                 n    t          t          ||                                                     | _        | S )z
        Filter items using a boolean predicate.
        
        :param f: Callable to be used for filtering.
        :return: Sketch object with filtered items.
        )rx   r9  r/  rs   rd   r~   s     rG   r9  zSketch.filter  s*     va5566rI   c                 n    t          t          ||                                                     | _        | S )z
        Apply a callable to every item separately.
        
        :param f: Callable to be applied to every item separately.
        :return: Sketch object with f applied to all items.
        )rx   mapr/  rs   r  s     rG   r  z
Sketch.map  s*     s1diikk2233rI   c                 d    t           ||                                                     | _        | S )z
        Apply a callable to all items at once.
        
        :param f: Callable to be applied.
        :return: Sketch object with f applied to all items.
        )rx   r/  rs   r  s     rG   applyzSketch.apply  s(     qq~~..rI   keyc                 p    t          t          |                                 |                    | _        | S )z
        Sort items using a callable.
        
        :param key: Callable to be used for sorting.
        :return: Sketch object with items sorted.
        )r  )rx   sortedr/  rs   )rd   r  s     rG   sortzSketch.sort  s-     vdiikks;;;<<rI   c                     t          |          }| }|dk    r |             n%|dk    r ||           }||}nt          d          |S )a  
        Invoke a callable mapping Sketch to Sketch or None. Supports also
        callables that take no arguments such as breakpoint. Returns self if callable
        returns None.
        
        :param f: Callable to be invoked.
        :return: Sketch object.
        r   r   Nz0Provided function {f} accepts too many arguments)r    rE   )rd   r~   re   r  r   s        rG   invokezSketch.invoke)  s_     !A::ACCCCaZZ!D''COPPP	rI   皙?fname	toleranceangularToleranceoptc                 .    t          | ||||           | S )a_  
        Export Sketch to file.
        
        :param path: Filename.
        :param tolerance: the deflection tolerance, in model units. Default 0.1.
        :param angularTolerance: the angular tolerance, in radians. Default 0.1.
        :param opt: additional options passed to the specific exporter. Default None.
        :return: Self.
        )r  r  r  r.   )rd   r  r  r  r  s        rG   r/   zSketch.exportC  s/    " 	%9?OUX	
 	
 	
 	
 rI   )r   r8   NF)r   r8   N)r8   N)Nr   r8   N)T)r   r   TrK   )r8   NF)NNrp  )r   r   r   r   r   r   )r  r  N)iri   rj   rk   __doc__r   rm   r   r,   r&   r$   r   	SketchValrO   r   rl   r   r>   r	   rh   r
   r#   r   r   r   r%   r"   r   Modesr  r   floatr   r   r   r   r   r   intr   Pointr   r   r   r  r   r   r   r  r   r'   r  r(  r,  r.  r5  r   r   r;  r   r?  rC  r   rG  rI  rK  rN  r-   rT  rW  rY  r   r[  registerr_  rn  rt  rv  ry  r2   r~  r  r  r   r{   r*   r   r  r   r/  r  r  r  r  r  r  r  r  r  r  r9  r  r  r  r  r/   r^   rI   rG   r?   r?      s          KKK
x.Ji))))z""""Xi(())))DcN++++ $,HJJ="&	" """ x " h	" " " ".	L(4.8D>9 	L 	L 	L 	L1 8I. S     !!&N NNx~ua/0N N 	N
 c]N N 
N N N ND !0 000 0 c	0
 c0 0 0 c]0 
0 0 0 0, !> >>> > 	>
 > c]> 
> > > > > >Q >4 >u ># >RS > > > > !> >>> > 	>
 > c]> 
> > > >2 #!D DDD D 	D
 UOD D D c]D 
D D D D2 !1 111 1 	1
 1 c]1 
1 1 1 1@ !3 333 3 	3
 3 c]3 
3 3 3 3, !. ..e_. . 	.
 c]. 
. . . .&
Q 
D 
d 
 
 
 
 
 
 
2)
 )
Q )
4 )
T )
t )
 )
T )
UV )
 )
 )
 )
X JN* *** $*04*BF*	
* * * *Z OS ho 67>Fsm	
   & !!&5 55H:uT8X-E'FFG5 5 c]	5
 5 
5 5 5 5p 1 E hsm q    $ Q 4 u # RS    "tD$v,,>'?    $Q 4 A    a D Q    A !    "a "tI "4	? " " " " "	 E#x-() ;< c]	
 
   @
! 
# 
! 
 
 
 

Q 
s 
q 
 
 
 
 QU- --U3=12-@H-	
- - - - QU- --U3=12-@H-	
- - - - QU- --U3=12-@H-	
- - - - QU0 00U3=120@H0	
0 0 0 0A !    Q 1    ,V     6     PU !)#HL	
    
 " %4 444 4 c]	4
 4 
4 4 4 [4 OT4 444!)#4HL4	
4 4 4 4 
 " %4 444 4 c]	4
 4 
4 4 4 4  " %4 444 4 	4
 c]4 4 
4 4 4 [4  	\
 " %4 444 4 c]	4
 4 
4 4 4 \4 	\ " %4 444 4 	4
 4 c]4 4 
4 4 4 \4*  " %4 44e_4 8E?+4 	4
 c]4 4 
4 4 4 [4( _ " %	C CCe_C c]C 	C
 
C C C _C " %	4 44e_4 c]4 	4
 
4 4 4 4" A HSM Q    
 
q 
 
(3- 
1 
 
 
 
 	 	 	 	c 	a 	 	 	 [	 "%3AHK	
   JA J! J J J J\1      A H     X A X X h 1    X A Xh/ A    X  	 			 	 		
 	 	 	 
	 	 	 X	 A J 1    X A Z z * QR    X A HZ0 Q    XA 1    a h 1    #    ! 	    1 i     
4a 
4E 
4 
4 
4 
4!     q Q    a A    5a 5 5Q 5 5 5 55a 5 5Q 5 5 5 55a 5 5Q 5 5 5 55! 5H 5 5 5 5 5! 5hsmU)B#C     
Q 
8YK$56 
1 
 
 
 

! 
)i!78 
 
 
 

A 
(HY$7#8(9:M#MN 
 
 
 

1 
8YK$45 
! 
 
 
 
(A36*HaS$Y,?"d(ASST   : "%(,    	
 d38n% 
     rI   N)Itypingr   r   r   r   r   r   r	   r
   r   r   r   r   rc   r   r   r   mathr   r   r   r   r   r   	itertoolsr   r   r   r  r   	selectorsr   r   r[   r   utilsr    r!   occ_impl.shapesr"   r#   r$   r%   r&   r'   r(   r)   r*   occ_impl.geomr,   r-   occ_impl.exportersr/   occ_impl.importers.dxfr0   occ_impl.sketch_solverr1   r2   r3   r4   r5   r6   r7   r  r  r   r>   r  rH   rM   objectrO   r?   r^   rI   rG   <module>r     sf                                   $ 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 $ $ $ $ $ $ $ $ # # # # # #       5 5 5 5 5 5 5 5       ) ) ) ) ) ) ) )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 , + + + + + + + & & & & & & . . . . . .                  	'(feD$J''(
GCx   %/"	I %    -e - - - - -(J (J (J (J (J (J (J (J\S S S S SV S S S S SrI   