
    v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      ZHy)    )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                 <    t        | t              rt        d      | S )z,
    Make sure that a Shape is selected
    z)Location was provided, Shape is required.)
isinstancer+   
ValueErrorr@   s    </DATA/.local/lib/python3.12/site-packages/cadquery/sketch.py_sanitize_for_boolrG   A   s    
 #x DEEJ    c                 R    t        | t              r| S t        j                  | f      S N)rC   r&   makeCompoundrE   s    rF   _to_compoundrL   L   s$    #x 
$$cV,,rH   c            	       z    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	y)	
Constraint.tagsargskindparamNc           	        	 |t         vrt        d| d      t         |   \  }	}}|t        |      k7  rt        d| dt        |       d| d      t        	fd|D              r.t        d|D cg c]  }|j	                          c} d| d      t        ||      st        d	t        |       d| d      || _        || _        || _	        |r t        t        |      |      | _        y || _        y c c}w )
NzUnknown constraint .z*Invalid number of entities for constraint z. Provided z, required c              3   B   K   | ]  }|j                         v  y wrJ   )geomType).0etypess     rF   	<genexpr>z&Constraint.__init__.<locals>.<genexpr>q   s     7$Qqzz|5($s   zUnsupported geometry types z for constraint zUnsupported argument types )r2   rD   lenanyrV   r!   r   rO   rP   rQ   tcastr   rR   )
selfrO   rP   rQ   rR   arity
param_type	converterrX   rY   s
            @rF   __init__zConstraint.__init__^   s&    ++24&:;;.B4.H+uj)CI<TF+cRVi[Xcdicjjkl  7$77-T.JTqzz|T.J-KK[\`[aabc  5*--j.?-@J<WXY 
 			5>*U3	*51
E
 /Ks   1C7
rJ   )
__name__
__module____qualname__r   str__annotations__r$   r1   r   rb    rH   rF   rN   rN   W   sp    
S/
c	

J !JCHo!J D#I!J 	!J
 !JrH   rN   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d/ed0e%d1e%defd2Z)dded#ed%ed3ed*e%d4edefd5Z*	 dded*e%d6ed7ed4edefd8Z+	 ddedeeee'f      de
e   defd9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
d>Z0deeee1   f   fd?Z2ded=edefd@Z3ded=edefdAZ4dedefdBZ5dedCee   dee   fdDZ6	 ddedEe
eee7f      dFe8dG   de
e   def
dHZ9dededefdIZ:dedJedefdKZ;	 ddedEe
eee7f      de
e   defdLZ<	 ddedEe
eee7f      de
e   defdMZ=	 ddedEe
eee7f      de
e   defdNZ>	 ddedEe
eee7f      de
e   defdOZ?dedefdPZ@dedefdQZAdeBfdRZCdeBfdSZD	 ddede	de
e   dTedef
dUZEeF	 	 ddedVe'dWe'de
e   dTedefdX       ZGeGj                  	 ddedWe'de
e   dTedef
dY       ZGeGj                  	 	 ddedZedede
e   dTedefd[       ZGeF	 	 ddedVe'dWe'd\e'de
e   dTedefd]       ZIeIj                  	 	 ddedWe'd\e'de
e   dTedefd^       ZIeIj                  	 	 dded_e'd#eded3ede
e   dTedefd`       ZIeF	 	 dded,ee'   dae
ee'      dbede
e   dTedefdc       ZJeJj                  	 	 dded,ee'   de
e   dTedef
dd       ZJ	 	 dded,ee'   de
e   dTedef
deZKddede
e   defdfZLddedede
e   defdgZMeFdededheNdiedef
dj       ZOeOj                  dedkedledheNdiedefdm       ZOdedefdnZPdedefdoZQeRdedpedefdq       ZSeRdedredsededef
dt       ZSeRdedee   defdu       ZSeR	 	 	 	 	 	 ddedvedwedxedyedzed{edefd|       ZSeRdedpeTdefd}       ZSeRdedreTdseTdeTdef
d~       ZSeRdedpeeT   defd       ZSdedefdZSdedpe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Zhy
)r>   zY
    2D sketch. Supports faces, edges and edges with constraints based construction.
    parentlocs_faces_edges
_selection_constraints_tags_solve_statusNr^   r@   c                     || _         t        |      | _        |r|nt        j                  d      | _        g | _        d| _        g | _        i | _	        d| _
        y)z,
        Construct an empty sketch.
        rh   N)rj   listrk   r&   rK   rl   rm   rn   ro   rp   rq   )r^   rj   rk   r@   s       rF   rb   zSketch.__init__   sQ     J	 ch&;&;B&?
!rH   rA   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   ~   K   | ]4  }j                   j                  |      j                         D ]  }|  6 y wrJ   )rl   movedFaces)rW   lfr^   s      rF   rZ   z"Sketch.__iter__.<locals>.<genexpr>   s3     S9adkk6G6G6J6P6P6R6R9s   :=c              3   b   K   | ]&  }j                   D ]  }|j                  |        ( y wrJ   )rm   rv   )rW   rx   rX   r^   s      rF   rZ   z"Sketch.__iter__.<locals>.<genexpr>   s&     KIqt{{!
{
Is   ,/)rl   iterrk   r^   s   `rF   __iter__zSketch.__iter__   s6     ;;S499SSSKDIIKKKrH   valtagc                 "    || j                   |<   y rJ   )rp   )r^   r~   r   s      rF   _tagzSketch._tag   s    

3rH   r   r7   banglemodeignore_selectionc           
      &   t        |t              rt        j                  |      nt        |t              r|nt        |t
              r$t        j                  |j                               nYt        |t              r;t        t        t        t           |            }t        j                  |d   |dd f nt        d|       |dk7  r/j                  t        t!               t!        ddd      |            | j#                  fd|||      S )z8
        Construct a face from a wire or edges.
        r   r   NzUnsupported argument c                 &    j                  |       S rJ   )rv   rx   ress    rF   <lambda>zSketch.face.<locals>.<lambda>   s    399Q<rH   )rC   r%   r#   makeFromWiresr>   r"   r&   rK   rw   r	   r(   r]   r$   rD   rv   r+   r,   each)r^   r   r   r   r   r   wiresr   s          @rF   facezSketch.face   s     a$$Q'C6"C5!''	2C8$ x~q!9:E$$uQxqr&;<C4QC899A:))HVXvaAFGCyy/s<LMMrH   r<   filenametolexcludeincludec                 l    t        j                  t        ||||            }| j                  ||||      S )z9
        Import a DXF file and construct face(s)
        )r&   rK   r/   r   )	r^   r   r   r   r   r   r   r   r   s	            rF   	importDXFzSketch.importDXF   s4     ##Jxgw$OPyyeT3//rH   whc                     t        j                  ||      j                  t               t        ddd      |      | j	                  fd||      S )z/
        Construct a rectangular face.
        r   r   c                 &    j                  |       S rJ   locatedr   s    rF   r   zSketch.rect.<locals>.<lambda>       3;;q>rH   )r#   	makePlanerotater,   r   )r^   r   r   r   r   r   r   s         @rF   rectzSketch.rect   sB     nnQ"))&(F1aOUKyy14==rH   r;   c                     t        j                  t        j                  |t	               t	        ddd                  | j                  fd||      S )z,
        Construct a circular face.
        r   r   c                 &    j                  |       S rJ   r   r   s    rF   r   zSketch.circle.<locals>.<lambda>  r   rH   )r#   r   r%   
makeCircler,   r   )r^   r;   r   r   r   s       @rF   circlezSketch.circle   s@    
   FHfQ1o!NOyy14==rH   a1a2c                     t        j                  t        j                  ||t	               t	        ddd      t	        ddd      |            | j                  fd||      S )z/
        Construct an elliptical face.
        r   r   )rotation_anglec                 &    j                  |       S rJ   r   r   s    rF   r   z Sketch.ellipse.<locals>.<lambda>  r   rH   )r#   r   r%   makeEllipser,   r   )r^   r   r   r   r   r   r   s         @rF   ellipsezSketch.ellipse  sY       B&Aq/6!Q?SX
 yy14==rH   c           	      F   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        }| j                  ||	||
|f|||      S )z/
        Construct a trapezoidal face.
           )r,   r   r   polygon)r^   r   r   r   r   r   r   r   v1v2v3v4s               rF   	trapezoidzSketch.trapezoid  s     QBFQBF#AEA26"QBFQWR[!1111q59AEA2GBK72; GGGQO||RRR0%sCCrH   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      }| j                  ||||      S )z/
        Construct a slot-shaped face.
        r   r   )r,   r$   makeLinemakeThreePointArcr%   assembleEdgesr   )r^   r   r   r   r   r   p1p2p3p4p5p6e1e2e3e4wires                    rF   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yyudC00rH   nc                     t        |dz         D cg c]@  }t        |t        |dz  t        z  |z        z  |t	        |dz  t        z  |z        z        B }}| j                  ||||      S c c}w )z5
        Construct a regular polygonal face.
        r   r   )ranger,   r   r   r   r   )r^   r;   r   r   r   r   r9   ptss           rF   regularPolygonzSketch.regularPolygonM  s{     1q5\
! 1s1q52:>**AAEBJN0C,CD! 	 

 ||Cc22
s   AA,r   c                 f    t        j                  d |D        dd      }| j                  ||||      S )z-
        Construct a polygonal face.
        c              3   P   K   | ]  }t        |t              r|nt        |    y wrJ   )rC   r,   )rW   ps     rF   rZ   z!Sketch.polygon.<locals>.<genexpr>l  s#     EA*Q'QVQZ7s   $&FT)r%   makePolygonr   )r^   r   r   r   r   r   s         rF   r   zSketch.polygon`  s7     EEud
 yyE4--rH   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 ]2  \  }}|j	                  t        t        ||z  ||z        |z
               4 | j                  r| j                  	nt               g	| j                  	fd|D              S )z<
        Generate a rectangular array of locations.
        r   z(At least 1 elements required, requested z,       ?c              3      K   | ]<  }D ]5  }t        |t              r||z  n|t        |j                               z   7 > y wrJ   )rC   r+   Center)rW   rx   el	selections      rF   rZ   z Sketch.rarray.<locals>.<genexpr>  sI      
 ""h/QVQ"))+9N5NN Os   AA)rD   r,   r   r   appendr+   rn   push)
r^   r   r   r   r   rk   offsetr9   jr   s
            @rF   rarrayzSketch.rarrays  s    
 6R!VGt2bTRSSa2Q"}5;E"IuRy1DAqKKBB!7&!@AB 2 ??BF//I
Iyy 

 
 	
rH   dar   c                    |dk  rt        d|       g }t        t        |d            t        k  r||z  n|dkD  r||dz
  z  nt	        d|      D ]^  }|z  z   }|t        t        |            z  }	|t        t        |            z  }
t        t        |	|
            }|j                  |       ` | j                  r| j                  nt               g| j                  fdt        |      D              S )z6
        Generate a polar array of locations.
        r   'At least 1 element required, requested h  r   c              3     K   | ]w  \  }}D cg c]-  }t        |t              r|nt        |j                               / c}D ]6  }||z  t        t        d d       t        d d d      r|z  z   nd       z   8 y yc c}w w)r   r   N)rC   r+   r   r,   )rW   r9   rx   r   r   r   r   r   s       rF   rZ   z Sketch.parray.<locals>.<genexpr>  s      
 (1 $#B !X.HRYY[4II# 1aL&Aq/B%!)4DUV (s   B2B AB)rD   absr   TOLr   r   r   r   r+   r,   r   rn   r   	enumerate)r^   r;   r   r   r   r   rk   r9   phixylocr   r   s     `  `      @@rF   parrayzSketch.parray  s    
 q5FqcJKKyS!"S(FE$%EB!a%LrEq!A	"CC%%AC%%A6!Q<(CKK  ??BF//I
Iyy 
 "$
 
 	
rH   startstopc                    |dk  rt        d|       | j                  st        d      dt        ||z
        z
  t        k  rd}nd}t	        |      D cg c]  }||||z
  z  |z  z    }}t	        |      D cg c]  }|dz
  dkD  r||||z
  z  |dz
  z  z   n| }}g }	| j                  D ]  }
t        |
t        t        f      rd|
j                         r|s|}n|}|r#|	j                  |
j                  |d             U|	j                  d |
j                  |      D               }t        d	|
        | j                  |	      S c c}w c c}w )
zE
        Distribute locations along selected edges or wires.
        r   r   z#Nothing selected to distribute overFTr   )planarc              3   2   K   | ]  }t        |        y wrJ   )r+   )rW   vs     rF   rZ   z$Sketch.distribute.<locals>.<genexpr>  s     J5I5Is   zUnsupported selection: )rD   rn   r   r   r   rC   r%   r$   IsClosedextend	locations	positionsr   )r^   r   r   r   r   trimmedr9   params_closedparams_openrk   r   paramss               rF   
distributezSketch.distribute  si    q5FqcJKKBCCs4%<  3&GG BGqJAdUl!3a!77J
 1X
 56EAIEA&!a%005H 	 

 //B"tTl+;;=*F(FKKVD BCKKJR\\&5IJJ #:2$!?@@ " yy/ K
s   E9"Ec                     |D cg c](  }t        |t              r|nt        t        |            * c}| _        |r| j	                  | j                  dd |       | S c c}w )zE
        Set current selection to given locations or points.
        N)rC   r+   r,   rn   r   )r^   rk   r   rx   s       rF   r   zSketch.push  s^     LP
KOaAx(Ahvay.AA4
 IIdooa(#.
s   -Acallbackc                    g }g }| j                   rQ|sO| j                   D ]?  }t        |t              r|}nt        |j                               }|j	                  |       A n|j	                  t                      |D ]  } ||      }	t        |	t
              r*|j                  |	j                  j                                Et        |	t              r |j                  |	j                                u|j	                  |	        |r| j                  ||       |dk(  r  | j                  j                  | | _        | S |dk(  r  | j                  j                  | | _        | S |dk(  r  | j                  j                  | | _        | S |dk(  rt        j                  |      | _        | S |dk(  r|st        d      | S t        d|       )z>
        Apply a callback on all applicable entities.
        r7   r8   r9   r;   r:   z3No tag specified - the geometry will be unreachablezInvalid mode: )rn   rC   r+   r   r   r>   r   rl   rw   r&   r   fusecut	intersectrK   rD   )
r^   r   r   r   r   r   rk   r   r   tmps
             rF   r   zSketch.each  s    !??#3oob(+C"299;/CC  & KK
#C3-C#v&

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

399;'

3  IIc33;*$++**C0DK  S[)$++//3/DK  S[/$++//5DK  S["//4DK  S[ !VWW  ~dV455rH   c                 p   | j                   rt        d | j                   D              }nd| j                  r+t        d | j                  j                         D              }n-| j                  rt        | j                        }nt        d      | j                  |||t        | j                                | S )zO
        Generate a convex hull from current selection or all objects.
        c              3   B   K   | ]  }t        |t              s|  y wrJ   rC   r$   rW   r   s     rF   rZ   zSketch.hull.<locals>.<genexpr>1  s     P":b$;O2s   c              3       K   | ]  }|  y wrJ   rh   r   s     rF   rZ   zSketch.hull.<locals>.<genexpr>3  s     <(;"2(;s   z*No objects available for hull constructionr   r   r   )rn   r   rl   Edgesrm   rD   r   bool)r^   r   r   rvs       rF   hullzSketch.hull+  s    
 ??PPPB[[<(9(9(;<<B[[4;;'BIJJ		"4S4;P	QrH   dc           	          | j                   rYfd| j                   D        }t        j                  |      D ]*  }| j                  |||t	        | j                                , | S t        d      )z1
        Offset selected wires or edges.
        c              3   b   K   | ]&  }t        |t              s|j                         ( y wrJ   )rC   r%   offset2D)rW   r   r  s     rF   rZ   z Sketch.offset.<locals>.<genexpr>C  s#     S?RjT>R"++a.?s   //r  zSelection is needed to offset)rn   r   from_iterabler   r  rD   )r^   r  r   r   r  r   s    `    rF   r   zSketch.offset=  sg    
 ??S4??SB))"-		TsT$//=R   .  <==rH   c                    i }| j                   rb| j                  j                         D ]C  }|j                         }| j                   D cg c]  }t	        |t
              r||v r| c}||<   E |S t        d      c c}w )Nz.Selection is needed to match vertices to faces)rn   rl   rw   VerticesrC   r'   rD   )r^   r  ry   
f_verticesr   s        rF   _matchFacesToVerticeszSketch._matchFacesToVerticesN  s    ??[[&&(ZZ\
 "__,!!V,j ,1 ) 	 MNNs   
A<c                     | j                         }t        j                  fd|j                         D              | _        | S )z:
        Add a fillet based on current selection.
        c              3   P   K   | ]  \  }}|r|j                  |      n|  y wrJ   )fillet2DrW   kr   r  s      rF   rZ   z Sketch.fillet.<locals>.<genexpr>g  s+      ,
5@TQAJJq!q([   #&r  r&   rK   itemsrl   r^   r  f2vs    ` rF   filletzSketch.fillet`  s?    
 ((*++ ,
58YY[,
 
 rH   c                     | j                         }t        j                  fd|j                         D              | _        | S )z;
        Add a chamfer based on current selection.
        c              3   P   K   | ]  \  }}|r|j                  |      n|  y wrJ   )	chamfer2Dr  s      rF   rZ   z!Sketch.chamfer.<locals>.<genexpr>t  s+      ,
6AdaAKK1)kr  r  r  s    ` rF   chamferzSketch.chamferm  s?    
 ((*++ ,
69iik,
 
 rH   c                 D    | j                   j                         | _         | S )z(
        Remove internal wires.
        )rl   cleanr|   s    rF   r   zSketch.cleanz  s    
 kk'')rH   valsc                 p    |D ci c]  }t        |      | }}t        |j                               S c c}w rJ   )hashrs   values)r^   r!  r   r   s       rF   _uniquezSketch._unique  s4    #'(4atAwz4(CJJL!! )s   3r8   rQ   )rw   Wiresr  r  c                    g }|r5| j                   |   D ]"  }|j                   t        ||                    $ n| j                  rC| j                  D ]3  }t	        |t
              r|j                   t        ||                    5 n[|j                   t        | j                  |                    | j                  D ]"  }|j                   t        ||                    $ |r"t	        |t              r|j                  |      }n/|r+t	        |t              rt        |      j                  |      }n|}| j                  |      | _        | S rJ   )rp   r   getattrrn   rC   r+   rl   rm   r   filterrf   r   r%  )r^   r8   rQ   r   r  r   filtereds          rF   _selectzSketch._select  s    jjo		+'"d+-. &__oo!"h/II/gb$/12 & II0gdkk4023kk		+'"d+-. " Ax(xx|H:a%+A.55b9HH,,x0rH   c                 x    | j                   r$t        | j                         | j                  |<   | S t        d      )z(
        Tag current selection.
        zSelection is needed to tag)rn   rs   rp   rD   r^   r   s     rF   r   z
Sketch.tag  s6    
 ??"4??3DJJsO  9::rH   rO   c                 r    g | _         |D ]*  }| j                   j                  | j                  |          , | S )z'
        Select based on tags.
        )rn   r   rp   )r^   rO   r   s      rF   selectzSketch.select  s6    
 COO""4::c?3  rH   c                 (    | j                  |d|      S )z
        Select faces.
        rw   r+  r^   r8   r   s      rF   faceszSketch.faces       ||Aw,,rH   c                 (    | j                  |d|      S )z
        Select wires.
        r&  r1  r2  s      rF   r   zSketch.wires  r4  rH   c                 (    | j                  |d|      S )z
        Select edges.
        r  r1  r2  s      rF   edgeszSketch.edges  r4  rH   c                 (    | j                  |d|      S )z"
        Select vertices.
        r  r1  r2  s      rF   verticeszSketch.vertices  s     ||Az3//rH   c                     d| _         | S )z*
        Reset current selection.
        N)rn   r|   s    rF   resetzSketch.reset  s    
 rH   c                 D   | j                   rx| j                   D ]h  }t        |t              r| j                  j	                  |       /t        |t
              r| j                  j	                  |       [t        d| d       nt        d      | j                          | S )z)
        Delete selected object.
        zDeletion of z not supportedzSelection is needed to delete)	rn   rC   r#   rl   remover$   rm   rD   r;  )r^   r@   s     rF   deletezSketch.delete  s    
 ??c4(KK&&s+T*KK&&s+$|C5%GHH ' <==

rH   c                     | j                   st        d      | j                   d   }|j                  }| j                   D ]$  }|j                  |k(  s|} |j                         S  |j                         S NzNo free edges available)rm   rD   forConstruction
startPoint)r^   rX   r   r   s       rF   _startPointzSketch._startPoint  sm    {{677 KKO  ++B!!T)||~ 
 ||~rH   c                 n    | j                   st        d      | j                   d   }|j                         S r@  )rm   rD   endPoint)r^   rX   s     rF   	_endPointzSketch._endPoint  s.    {{677KKOzz|rH   rB  c                 t    ||_         | j                  j                  |       |r| j                  |g|       | S )z,
        Add an edge to the sketch.
        )rB  rm   r   r   )r^   r~   r   rB  s       rF   edgezSketch.edge  s6     .3IIseS!rH   r   r   c                 x    t        j                  t        |      t        |            }| j                  |||      S )z&
        Construct a segment.
        )r$   r   r,   rI  )r^   r   r   r   rB  r~   s         rF   segmentzSketch.segment-  s/     mmF2Jr
3yyc?33rH   c                     | j                         }t        j                  |t        |            }| j	                  |||      S rJ   )rG  r$   r   r,   rI  )r^   r   r   rB  r   r~   s         rF   rK  zSketch.segment=  s7    
 ^^mmBr
+yyc?33rH   rx   c           	          | j                         }t        |t        t        |            z  |t	        t        |            z        }t        j                  |||z         }| j                  |||      S rJ   )rG  r,   r   r   r   r$   r   rI  )r^   rx   r7   r   rB  r   r  r~   s           rF   rK  zSketch.segmentG  s]     ^^1s71:&C
O(;<mmBQ'yyc?33rH   r   c                     t        j                  t        |      t        |      t        |            }| j                  |||      S )z#
        Construct an arc.
        )r$   r   r,   rI  )r^   r   r   r   r   rB  r~   s          rF   arcz
Sketch.arcV  s7     $$VBZVBZHyyc?33rH   c                     | j                         }t        j                  t        |      t        |      t        |            }| j	                  |||      S rJ   )rG  r$   r   r,   rI  )r^   r   r   r   rB  r   r~   s          rF   rO  z
Sketch.arcg  sC     ^^$$VBZVBZHyyc?33rH   r:   c                 >   t        |      dk\  r't        j                  |t        |      |||dkD        }nt        |      }||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                  |	|
|      }| j                  |||      S )Nr   r   )angle1angle2orientationr   )	r   r$   r   r,   r   r   r   r   rI  )r^   r:   r;   r7   r   r   rB  r~   p0r   r   r   s               rF   rO  z
Sketch.arcu  s     r7c>//!VAYqPRUVPVWCBa&WQZ#gaj/BBBBa&WQaZ%8!93wq2PQ6z?R;STTTBa&WQV_!5s71r6?7KLLLB((R4Cyyc?33rH   tangentsperiodicc           	          t        j                  |D cg c]
  }t        |  c}|r|D cg c]
  }t        |  c}nd|      }| j                  |||      S c c}w c c}w )z*
        Construct a spline edge.
        N)r$   
makeSpliner,   rI  )	r^   r   rV  rW  r   rB  r   tr~   s	            rF   splinezSketch.spline  sb     oo!$%AVQZ%.6*AVQZ*D
 yyc?33 &*s
   AA
c                 ,    | j                  |d d||      S NF)r[  )r^   r   r   rB  s       rF   r[  zSketch.spline  s     {{3eS/BBrH   c                     t        j                  |D cg c]
  }t        |  c}      }| j                  |||      S c c}w )z
        Construct an bezier curve.

        The edge will pass through the last points, and the inner points
        are bezier control points.
        )r$   
makeBezierr,   rI  )r^   r   r   rB  r   r~   s         rF   bezierzSketch.bezier  s=     oo373avqz378yyc?33 8s   =c                 d    | j                  | j                         | j                         |       | S )z5
        Connect last edge to the first one.
        )rK  rG  rD  r-  s     rF   closezSketch.close  s)    
 	T^^%t'7'7'93?rH   c                 L    | j                  d | j                  D        d||      S )z,
        Assemble edges into faces.
        c              3   :   K   | ]  }|j                   r|  y wrJ   )rB  )rW   rX   s     rF   rZ   z"Sketch.assemble.<locals>.<genexpr>  s     =11+<+<Qs   r   )r   rm   )r^   r   r   s      rF   assemblezSketch.assemble  s'    
 yy==q$
 	
rH   
constraintargc                 x    | j                   j                  t        |f| j                  |   d   f||             | S )z#
        Add a constraint.
        r   ro   r   rN   rp   )r^   r   rf  rg  s       rF   	constrainzSketch.constrain  s?     	  v

3 24j#F	
 rH   tag1tag2c                     | j                   j                  t        ||f| j                  |   d   | j                  |   d   f||             | S )Nr   ri  )r^   rk  rl  rf  rg  s        rF   rj  zSketch.constrain  sX    
 	  tD!!$djj&6q&9:		
 rH   c                    g }i }g }t        t        d | j                  j                                     D ]  \  }\  }}t	        t
        |d         }|j                         dk(  rO|j                         }|j                         }	|j                  |j                  |	j                  |	j                  f}
n|j                         dk(  r|j                         }|j                         |z
  }|j                         |z
  }	|j                  d      |z
  }t        dd      j                  |      }|j                  |	      }|j                  |      }|dkD  r|dk  r|dt        z  z  }n|dk  r|dkD  r|dt        z  z  }|j!                         }|j                  |j                  |||f}
nt|j#                  |
       |||<   |j#                  |j                                 g }| j$                  D ]h  }||j&                  d      t)        |j&                        dk(  r||j&                  d      ndf}|j#                  ||j*                  |j,                  f       j t/        |||      }|j1                         \  }| _        || j2                  d	<   t5        ||j                               D ]  \  }\  }}||   }|dk(  r;t        |d   |d         }t        |d   |d
         }	t        j6                  ||	      }nP|dk(  rKt        t9        |       }t        t;        |d       }	t        t=        |       }t        j>                  ||	|      }j@                  | j                  |   d   _          | S )zF
        Solve current constraints and update edge positions.
        c                 .    t        | d   d   t              S )Nr   r   r   )kvs    rF   r   zSketch.solve.<locals>.<lambda>  s    jAq48rH   r   LINECIRCLEr   r   r   Nr      )!r   r)  rp   r  r]   r$   rV   rC  rF  r   r   	arcCenter
positionAtr,   getSignedAngler   radiusr   ro   rO   r[   rQ   rR   r0   solverq   zipr   r4   r6   r5   r   wrapped)r^   entitiese2igeomsr9   r  r   v0r   r   entr   pmr   r   a3rw  constraintsr:   ixsolverr   gr   rX   r   s                             rF   rx  zSketch.solve  s   
  #8$**:J:J:LM
IAv1 tQqT"B {{}&]]_[[]DD"$$bdd3(*LLN]]_q([[]Q&]]3'!+Aq\004&&r*&&r*6b1f!b&LB!VQ!b&LBssACCR0 OOC CFLL'C
H ""AaffQi.CK14D#affQi.$OBAFFAGG45 #
 (+uE"(,,.T"%3 UCIIK0IAv1QB F{BqE2a5)BqE2a5)MM"b)hYr]+Yr3/0Xb\***2r26 ()yyDJJqM!$ 1" rH   c                 d    | j                         }| j                  j                         |_        |S )z6
        Create a partial copy of the sketch.
        	__class__rl   copyr^   r  s     rF   r  zSketch.copy8  s)    
 ^^KK$$&		rH   r   c                      y rJ   rh   r^   r   s     rF   rv   zSketch.movedB      rH   loc1loc2c                      y rJ   rh   r^   r  r  rk   s       rF   rv   zSketch.movedF  r  rH   c                      y rJ   rh   )r^   rk   s     rF   rv   zSketch.movedJ  r  rH   r   r   zrxryrzc                      y rJ   rh   )r^   r   r   r  r  r  r  s          rF   rv   zSketch.movedN  s     	rH   c                      y rJ   rh   r  s     rF   rv   zSketch.movedZ  r  rH   c                      y rJ   rh   r  s       rF   rv   zSketch.moved^  r  rH   c                      y rJ   rh   r  s     rF   rv   zSketch.movedb  r  rH   c                 h    | j                         } | j                  j                  |i ||_        |S )zH
        Create a partial copy of the sketch with moved _faces.
        )r  rl   rv   )r^   rP   kwargsr  s       rF   rv   zSketch.movedf  s2    
 ^^%DKK%%t6v6		rH   c                 j    | j                  |f      }| j                  j                         |_        |S )zJ
        Create a partial copy of the sketch with a new location.
        )rk   r  )r^   r   r  s      rF   r   zSketch.locatedp  s/    
 ^^#^(KK$$&		rH   c                     | j                   S )zC
        Finish sketch construction and return the parent.
        )rj   r|   s    rF   finalizezSketch.finalizez  s    
 {{rH   c                     | j                   | j                   d   }|S | j                  s| j                  r| j                  d   }|S | j                  }|S )zT
        Return the first selected item, underlying compound or first edge.
        r   )rn   rl   rm   r  s     rF   r~   z
Sketch.val  sV    
 ??&#B 	 QB 	 B	rH   c                     | j                   t        | j                         }|S | j                  s#| j                  rt        | j                        }|S t        | j                        }|S )zN
        Return all selected items, underlying compound or all edges.
        )rn   rs   rl   rm   r  s     rF   r!  zSketch.vals  s\     ??&doo&B 	 dkk"B 	 dkk"B	rH   c           	          | j                   rBt        | j                   D cg c]  }t        |t              s| c}      j	                         S t        d      c c}w )z6
        Helper for returning selected faces.
        zNothing is selected)rn   r)   rC   r"   r3  rD   )r^   r   s     rF   _selected_faceszSketch._selected_faces  sR    
 ??"ooGoB1FoGeg 233 Hs
   AAc                 ~    | j                   r0t        t        | j                  | j	                         z         | _        | S )z8
        Add selection to the underlying faces.
        rn   r]   r&   rl   r  r|   s    rF   addz
Sketch.add  0    
 ??$++8L8L8N*NODKrH   c                 ~    | j                   r0t        t        | j                  | j	                         z
        | _        | S )z?
        Subtract selection from the underlying faces.
        r  r|   s    rF   subtractzSketch.subtract  r  rH   c                 L    t        t        | j                               | _        | S )zB
        Replace the underlying faces with the selection.
        )r]   r&   r  rl   r|   s    rF   replacezSketch.replace  s     
 Hd&:&:&<=rH   otherc                     t        | j                               t        |j                               z   }| j                  t        |            S )z&
        Fuse self and other.
        rE   rG   r~   r  rL   r^   r  r   s      rF   __add__zSketch.__add__  ;    
 !,/A%))+/NN~~,s"3~44rH   c                     t        | j                               t        |j                               z
  }| j                  t        |            S )z+
        Subtract other from self.
        rE   r  r  s      rF   __sub__zSketch.__sub__  r  rH   c                     t        | j                               t        |j                               z  }| j                  t        |            S )z+
        Intersect self and other.
        rE   r  r  s      rF   __mul__zSketch.__mul__  r  rH   c                     t        | j                               t        |j                               z  }| j                  t        |            S )z(
        Split self with other.
        rE   r  r  s      rF   __truediv__zSketch.__truediv__  r  rH   itemc                     | j                         }t        |t              r|D cg c]  }||   	 c}| _        | S t        |t              r||   | _        | S ||   g| _        | S c c}w rJ   )r!  rC   r	   rn   slice)r^   r  r!  r9   s       rF   __getitem__zSketch.__getitem__  so    yy{dH%0451tAw5DO  e$"4jDO   $DzlDO 6s   A$ry   c                 V    t        t        || j                                     | _        | S )z
        Filter items using a boolean predicate.
        
        :param f: Callable to be used for filtering.
        :return: Sketch object with filtered items.
        )rs   r)  r!  rn   r^   ry   s     rF   r)  zSketch.filter  s"     va56rH   c                 V    t        t        || j                                     | _        | 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.
        )rs   mapr!  rn   r  s     rF   r  z
Sketch.map  s"     s1diik23rH   c                 N    t         || j                                     | _        | 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.
        )rs   r!  rn   r  s     rF   applyzSketch.apply  s     q~.rH   keyc                 X    t        t        | j                         |            | _        | S )z
        Sort items using a callable.
        
        :param key: Callable to be used for sorting.
        :return: Sketch object with items sorted.
        )r  )rs   sortedr!  rn   )r^   r  s     rF   sortzSketch.sort  s"     vdiiks;<rH   c                 t    t        |      }| }|dk(  r	 |        |S |dk(  r ||       }||}|S t        d      )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   z0Provided function {f} accepts too many arguments)r    rD   )r^   ry   r_   r  r   s        rF   invokezSketch.invoke)  sV     !A:C 	 aZD'C 	 OPPrH   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-   )r^   r  r  r  r  s        rF   r.   zSketch.exportC  s     " 	%9?OUX	
 rH   )r   r7   NF)r   r7   N)r7   N)Nr   r7   N)T)r   r   TrJ   )r7   NF)NNr]  )r   r   r   r   r   r   )皙?r  N)irc   rd   re   __doc__r   rg   r   r+   r&   r$   r   	SketchValrN   r   rf   r   r=   r	   rb   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   r%  r   r   r+  r   r/  r3  r   r7  r9  r;  r>  r,   rD  rG  rI  r   rK  registerrO  r[  r`  rb  re  r1   rj  rx  r  r   rv   r*   r   r  r~   r!  r  r  r  r  r  r  r  r  r  r  r)  r  r  r  r  r.   rh   rH   rF   r>   r>      s[    K
x.Ji))z""Xi(())DcN++ $,J="&	""" x " h	".	L(4.8D>9 	L1 8I. S  !!&NNx~ua/0N N 	N
 c]N N 
ND !000 0 c	0
 c0 0 0 c]0 
0, !>>> > 	>
 > c]> 
> >Q >4 >u ># >RS > !>>> > 	>
 > c]> 
>2 #!DDD D 	D
 UOD D D c]D 
D2 !111 1 	1
 1 c]1 
1@ !333 3 	3
 3 c]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H:uT8X-E'FFG5 5 c]	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U3=120@H0	
0A ! Q 1 ,V  6  PU!)#HL	
 
 " %444 4 c]	4
 4 
4 4 OT444!)#4HL4	
4 4 
 " %444 4 c]	4
 4 
4 4  " %444 4 	4
 c]4 4 
4 4  	\\
 " %444 4 c]	4
 4 
4 4 	\\ " %444 4 	4
 4 c]4 4 
4 4*  " %44e_4 8E?+4 	4
 c]4 4 
4 4( __ " %	CCe_C c]C 	C
 
C C " %	44e_4 c]4 	4
 
4"A HSM Q 
q 
 
(3- 
1 
 	 	 	 	c 	a 	 	 "%3AHK	
 JA J! J\1   A H    A X X h 1   A Xh/ A    			 	 		
 	 	 	 
	 	 A J 1   A Z z * QR   A HZ0 Q  A 1 a h 1 # ! 	 1 i  
4a 
4E 
4!  q Q a A 5a 5 5Q 55a 5 5Q 55a 5 5Q 55! 5H 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% 
rH   N)Itypingr   r   r   r   r   r   r	   r
   r   r   r   r   r]   r   r   r   mathr   r   r   r   r   r   	itertoolsr   r   r   r  r   	selectorsr   r   rY   r   utilsr    r!   occ_impl.shapesr"   r#   r$   r%   r&   r'   r(   r)   r*   occ_impl.geomr+   r,   occ_impl.exportersr.   occ_impl.importers.dxfr/   occ_impl.sketch_solverr0   r1   r2   r3   r4   r5   r6   r  r  r   r=   r  rG   rL   objectrN   r>   rh   rH   rF   <module>r     s       $ 7 6 $ #  5  )
 
 
 , & .   	'(feD$J''(
Cx %/"	I % -e - -(J (J\SV SrH   