Ë
    JÿiÐd  ã                  ó  — d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZ dd
l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'm(Z(m)Z)  G d„ de&«      Z* G d„ de*«      Z+ G d„ de*«      Z, G d„ de*«      Z- G d„ de*«      Z. G d„ de*«      Z/ G d„ de*«      Z0 G d„ de*«      Z1 G d„ de*«      Z2 G d„ de*«      Z3 G d „ d!e*«      Z4 G d"„ d#e*«      Z5 G d$„ d%e*«      Z6 G d&„ d'e*«      Z7y)(aó  
Sketch Objects

name: objects_sketch.py
by:   Gumyr
date: March 22nd 2023

desc:
    This python module contains objects (classes) that create 2D Sketches.

license:

    Copyright 2022 Gumyr

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

é    )ÚannotationsN)ÚcosÚdegreesÚpiÚradiansÚsinÚtan)Úcast)ÚIterable)ÚLocationListÚflatten_sequenceÚvalidate_inputs)ÚAlignÚ	FontStyleÚMode)ÚBuildSketch)ÚAxisÚLocationÚRotationÚVectorÚ
VectorLikeÚto_align_offsetÚ	TOLERANCE)ÚCompoundÚEdgeÚFaceÚ	ShapeListÚSketchÚWireÚtuplifyÚtopo_explore_common_vertexc                  óh   ‡ — e Zd ZdZej
                  gZddej                  f	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚBaseSketchObjecta„  BaseSketchObject

    Base class for all BuildSketch objects

    Args:
        face (Face): face to create
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to None.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   Nc                ó4  •— |�Ct        |d«      }|j                  t        |j                  «       j	                  |«      «      «       t        j                  | d¬«      }|€+|j                  t        dd|«      «      j                  «       }nl|| _
        || _        |j                  t        dd|«      «      }t        d„ |j                  «       D «       «      }t        |t
        «      r |j                  |d|iŽ t        ‰| �A  t#        |«      j$                  «       y )Né   F)Úlogr   c              3  ó„   K  — | ]8  }t        j                  «       j                  D ]  }|j                  |«      –— Œ Œ: y ­w©N)r   Ú_get_contextÚlocal_locationsÚmoved)Ú.0ÚfaceÚlocations      úi/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/build123d/objects_sketch.pyÚ	<genexpr>z,BaseSketchObject.__init__.<locals>.<genexpr>b   s=   è ø€ ð "á'�DÜ ,× 9Ñ 9Ó ;× KÔ K�Hð —
‘
˜8×$à Kð %Ù'ùs   ‚>A Úmode)r    Úmover   Úbounding_boxr   r   r)   r+   r   ÚfacesÚrotationr1   r   Ú
isinstanceÚ_add_to_contextÚsuperÚ__init__r   Úwrapped)ÚselfÚobjr5   Úalignr1   ÚcontextÚ	new_facesÚ	__class__s          €r/   r9   zBaseSketchObject.__init__M   sð   ø€ ð ÐÜ˜E 1Ó%ˆEØ�H‰H”X˜c×.Ñ.Ó0×@Ñ@ÀÓGÓHÔIä&1×&>Ñ&>¸tÈÔ&OˆØˆ?ØŸ	™	¤(¨1¨a°Ó":Ó;×AÑAÓC‰Ið %ˆDŒMØˆDŒIà—)‘)œH Q¨¨8Ó4Ó5ˆCä!ñ "àŸI™IœKó"ó ˆIô
 ˜'¤;Ô/Ø'�×'Ñ'¨Ð>¸Ò>ä‰Ñœ )Ó,×4Ñ4Õ5ó    )r<   zCompound | Facer5   Úfloatr=   ú"Align | tuple[Align, Align] | Noner1   r   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú_tagÚ_applies_tor   ÚADDr9   Ú__classcell__©r@   s   @r/   r#   r#   >   sW   ø„ ñ
ð ×#Ñ#Ð$€Kð
 Ø48Ø—X‘Xð6àð6ð ð6ð 2ð	6ð
 ÷6ñ 6rA   r#   c                  óŽ   ‡ — e Zd ZdZej
                  gZej                  ej                  fe	j                  f	 	 	 	 	 dˆ fd„Zˆ xZS )ÚCircleaJ  Sketch Object: Circle

    Add circle(s) to the sketch.

    Args:
        radius (float): circle size
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    c                óì   •— t        j                  | «      }t        || «       || _        t	        |d«      | _        t        t        j                  |«      «      }t        ‰| �)  |d| j
                  |«       y )Nr%   r   )r   r)   r   Úradiusr    r=   r   r   Úmake_circler8   r9   )r;   rQ   r=   r1   r>   r-   r@   s         €r/   r9   zCircle.__init__{   s`   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&àˆŒÜ˜U AÓ&ˆŒ
ä”D×$Ñ$ VÓ,Ó-ˆÜ‰Ñ˜˜q $§*¡*¨dÕ3rA   )rQ   rB   r=   rC   r1   r   ©rE   rF   rG   rH   r   rI   rJ   r   ÚCENTERr   rK   r9   rL   rM   s   @r/   rO   rO   m   sW   ø„ ñ	ð ×#Ñ#Ð$€Kð
 6;·\±\À5Ç<Á<Ð4PØ—X‘Xð	4àð4ð 2ð4ð ÷	4ñ 4rA   rO   c                  ó˜   ‡ — e Zd ZdZej
                  gZdej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚEllipseaÇ  Sketch Object: Ellipse

    Add ellipse(s) to sketch.

    Args:
        x_radius (float): horizontal radius
        y_radius (float): vertical radius
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                óü   •— t        j                  | «      }t        || «       || _        || _        t        |d«      | _        t        t        j                  ||«      «      }t        ‰| �-  ||| j                  |«       y ©Nr%   )r   r)   r   Úx_radiusÚy_radiusr    r=   r   r   Úmake_ellipser8   r9   )	r;   rY   rZ   r5   r=   r1   r>   r-   r@   s	           €r/   r9   zEllipse.__init__›   si   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&à ˆŒØ ˆŒÜ˜U AÓ&ˆŒ
ä”D×%Ñ% h°Ó9Ó:ˆÜ‰Ñ˜˜x¨¯©°TÕ:rA   )
rY   rB   rZ   rB   r5   rB   r=   rC   r1   r   rS   rM   s   @r/   rV   rV   ‹   sn   ø„ ñð ×#Ñ#Ð$€Kð Ø5:·\±\À5Ç<Á<Ð4PØ—X‘Xð;àð;ð ð;ð ð	;ð
 2ð;ð ÷;ñ ;rA   rV   c                  ó–   ‡ — e Zd ZdZej
                  gZdej                  ej                  fe	j                  dœ	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚPolygona:  Sketch Object: Polygon

    Add polygon(s) defined by given sequence of points to sketch.

    Note that the order of the points define the normal of the Face that is created in
    Algebra mode, where counter clockwise order creates Faces with their normal being up
    while a clockwise order will have a normal that is down.  In Builder mode, all Faces
    added to the sketch are up.

    Args:
        pts (Union[VectorLike, Iterable[VectorLike]]): sequence of points defining the
            vertices of the polygon
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   ©r5   r=   r1   c               ó6  •— t        j                  | «      }t        || «       t        |Ž }|| _        t        |d«      | _        |D �cg c]  }t        |«      ‘Œ }}t        t        j                  |«      «      }	t        ‰
| �1  |	|| j                  |«       y c c}w rX   )r   r)   r   r   Úptsr    r=   r   r   r   Úmake_polygonr8   r9   )r;   r5   r=   r1   r`   r>   Úflattened_ptsÚpÚpoly_ptsr-   r@   s             €r/   r9   zPolygon.__init__Ã   s‡   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&ä(¨#Ð.ˆØ ˆŒÜ˜U AÓ&ˆŒ
á'*Ó+¡s !”F˜1•I sˆÐ+Ü”D×%Ñ% hÓ/Ó0ˆÜ‰Ñ˜˜x¨¯©°TÕ:ùò ,s   ÁB)r`   z!VectorLike | Iterable[VectorLike]r5   rB   r=   rC   r1   r   rS   rM   s   @r/   r]   r]   ®   sd   ø„ ñð$ ×#Ñ#Ð$€Kð
 Ø5:·\±\À5Ç<Á<Ð4PØ—X‘Xñ;à/ð;ð ð;ð 2ð	;ð
 ÷;ñ ;rA   r]   c                  ó˜   ‡ — e Zd ZdZej
                  gZdej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )Ú	RectangleaÂ  Sketch Object: Rectangle

    Add rectangle(s) to sketch.

    Args:
        width (float): horizontal size
        height (float): vertical size
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                óê   •— t        j                  | «      }t        || «       || _        || _        t        |d«      | _        t        j                  ||«      }t        ‰| �)  ||| j                  |«       y rX   )r   r)   r   ÚwidthÚrectangle_heightr    r=   r   Ú	make_rectr8   r9   ©	r;   rh   Úheightr5   r=   r1   r>   r-   r@   s	           €r/   r9   zRectangle.__init__æ   sc   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&àˆŒ
Ø &ˆÔÜ˜U AÓ&ˆŒ
ä�~‰~˜e VÓ,ˆÜ‰Ñ˜˜x¨¯©°TÕ:rA   ©
rh   rB   rl   rB   r5   rB   r=   rC   r1   r   rS   rM   s   @r/   rf   rf   Ö   sn   ø„ ñð ×#Ñ#Ð$€Kð Ø5:·\±\À5Ç<Á<Ð4PØ—X‘Xð;àð;ð ð;ð ð	;ð
 2ð;ð ÷;ñ ;rA   rf   c                  óœ   ‡ — e Zd ZdZej
                  gZdej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚRectangleRoundeda  Sketch Object: RectangleRounded

    Add rectangle(s) with filleted corners to sketch.

    Args:
        width (float): horizontal size
        height (float): vertical size
        radius (float): fillet radius
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                óZ  •— t        j                  | «      }t        || «       |d|z  k  s|d|z  k  rt        d«      ‚|| _        || _        || _        t        |d«      | _        t        j                  ||«      }|j                  ||j                  «       «      }t        ‰	| �9  ||||«       y )Nr%   z#width and height must be > 2*radius)r   r)   r   Ú
ValueErrorrh   ri   rQ   r    r=   r   rj   Ú	fillet_2dÚverticesr8   r9   )
r;   rh   rl   rQ   r5   r=   r1   r>   r-   r@   s
            €r/   r9   zRectangleRounded.__init__
  sŸ   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&à�A˜‘JÒ &¨A°©JÒ"6ÜÐBÓCÐCØˆŒ
Ø &ˆÔØˆŒÜ˜U AÓ&ˆŒ
ä�~‰~˜e VÓ,ˆØ�~‰~˜f d§m¡m£oÓ6ˆÜ‰Ñ˜˜x¨°Õ5rA   )rh   rB   rl   rB   rQ   rB   r5   rB   r=   rC   r1   r   rS   rM   s   @r/   ro   ro   ù   sx   ø„ ñð ×#Ñ#Ð$€Kð Ø5:·\±\À5Ç<Á<Ð4PØ—X‘Xð6àð6ð ð6ð ð	6ð
 ð6ð 2ð6ð ÷6ñ 6rA   ro   c                  óž   ‡ — e Zd ZdZej
                  gZddej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚRegularPolygonaþ  Sketch Object: Regular Polygon

    Add regular polygon(s) to sketch.

    Args:
        radius (float): distance from origin to vertices (major), or
            optionally from the origin to side (minor) with major_radius = False
        side_count (int): number of polygon sides
        major_radius (bool): If True the radius is the major radius, else the
            radius is the minor radius (also known as inscribed radius).
            Defaults to True.
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    Tr   c                ó¶  •— t        j                  | «      }t        || «       |dk  rt        d|› �«      ‚|r|}n|t	        t
        |z  «      z  }|| _        |t	        t
        |z  «      z  | _        || _        || _	        t        t        |dz   «      D �	cg c]X  }	t        |t	        |	dz  t
        z  |z  t        |«      z   «      z  |t        |	dz  t
        z  |z  t        |«      z   «      z  «      ‘ŒZ c}	«      }
|
j                  t         j"                  «      |
j                  t         j$                  «      g}|d   d   j"                  |d   d   j$                  g}|d   d   j"                  |d   d   j$                  g}t'        |||d¬«      }|
D �cg c]  }||z   ‘Œ	 }}t)        t+        j,                  |«      «      }t.        ‰| �a  |dd |¬	«       y c c}	w c c}w )
Né   z3RegularPolygon must have at least three sides, not é   r%   r   éÿÿÿÿ)r   r   )Úcenterr^   )r   r)   r   rq   r   r   rQ   ÚapothemÚ
side_countr=   r   Úranger   r   r   Úsort_byr   ÚXÚYr   r   r   ra   r8   r9   )r;   rQ   r|   Úmajor_radiusr5   r=   r1   r>   ÚradÚir`   Ú
pts_sortedÚminsÚmaxsÚalign_offsetÚpointÚpts_aor-   r@   s                     €r/   r9   zRegularPolygon.__init__6  sâ  ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&à˜Š>ÜØEÀjÀ\ÐRóð ñ Ø‰Càœ3œr J™Ó/Ñ/ˆCà ˆŒØ!¤CÜ�‰Oó%
ñ 
ˆŒð %ˆŒØˆŒ
äô ˜z¨A™~Ô.óñ
 /�Aô	 Øœ#˜a !™e¤b™j¨:Ñ5¼ÀÓ8IÑIÓJÑJØœ#˜a !™e¤b™j¨:Ñ5¼ÀÓ8IÑIÓJÑJõð /ñó
ˆð —k‘k¤$§&¡&Ó)¨3¯;©;´t·v±vÓ+>Ð?ˆ
ð ˜1‘˜aÑ ×"Ñ" J¨q¡M°!Ñ$4×$6Ñ$6Ð7ˆØ˜1‘˜bÑ!×#Ñ# Z°¡]°2Ñ%6×%8Ñ%8Ð9ˆä& t¨T°5ÀÔHˆÙ47Ó8±C¨5�%˜,Ó&°CˆÐ8ä”D×%Ñ% fÓ-Ó.ˆÜ‰Ñ˜¨°¸DÐÕAùò%ùò 9s   ÂAGÆG)rQ   rB   r|   Úintr�   Úboolr5   rB   r=   ztuple[Align, Align]r1   r   rS   rM   s   @r/   ru   ru   "  sƒ   ø„ ñð" ×#Ñ#Ð$€Kð "ØØ&+§l¡l°E·L±LÐ%AØ—X‘Xð2Bàð2Bð ð2Bð ð	2Bð
 ð2Bð #ð2Bð ÷2Bñ 2BrA   ru   c                  óf   ‡ — e Zd ZdZej
                  gZdej                  f	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚSlotArcaM  Sketch Object: Arc Slot

    Add slot(s) following an arc to sketch.

    Args:
        arc (Union[Edge, Wire]): center line of slot
        height (float): diameter of end circles
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                ó:  •— t        j                  | «      }t        || «       || _        || _        t        |t        «      r|nt        |g«      }t        |j                  |dz  «      «      j                  t        j                  |«      }t        ‰| �5  ||d |«       y rX   )r   r)   r   ÚarcÚslot_heightr6   r   r   Ú	offset_2dÚrotater   ÚZr8   r9   )r;   r�   rl   r5   r1   r>   r-   r@   s          €r/   r9   zSlotArc.__init__y  s   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&àˆŒØ!ˆÔä ¤TÔ*‰c´°c°U³ˆÜ�C—M‘M &¨1¡*Ó-Ó.×5Ñ5´d·f±f¸hÓGˆÜ‰Ñ˜˜x¨¨tÕ4rA   )r�   zEdge | Wirerl   rB   r5   rB   r1   r   rD   rM   s   @r/   r�   r�   k  sT   ø„ ñ	ð ×#Ñ#Ð$€Kð Ø—X‘Xð5àð5ð ð5ð ð	5ð
 ÷5ñ 5rA   r�   c                  ój   ‡ — e Zd ZdZej
                  gZdej                  f	 	 	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚSlotCenterPointa  Sketch Object: Center Point Slot

    Add a slot(s) defined by the center of the slot and the center of one of the
    circular arcs at the end. The other end will be generated to create a symmetric
    slot.

    Args:
        center (VectorLike): slot center point
        point (VectorLike): slot center of arc point
        height (float): diameter of end circles
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c           
     óÆ  •— t        j                  | «      }t        || «       t        |«      }t        |«      }|| _        || _        || _        ||z
  }	|	j                  dz  |k  rt        d«      ‚t        t        j                  t        j                  ||«      t        j                  |||	z
  «      g«      d   j                  |dz  «      «      }
t        ‰| �A  |
|d |«       y )Nr%   zVSlots must have width > height. Got: {height=} width={half_line.length * 2} (computed)r   )r   r)   r   r   Úslot_centerrˆ   r�   Úlengthrq   r   r   Úcombiner   Ú	make_liner‘   r8   r9   )r;   rz   rˆ   rl   r5   r1   r>   Úcenter_vÚpoint_vÚ	half_liner-   r@   s              €r/   r9   zSlotCenterPoint.__init__œ  så   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&ä˜&“>ˆÜ˜“-ˆØ#ˆÔØˆŒ
Ø!ˆÔà˜hÑ&ˆ	à×Ñ˜aÑ 6Ò)ÜðIóð ô
 Ü�L‰Lä—N‘N 7¨HÓ5Ü—N‘N 8¨X¸	Ñ-AÓBðóð
 ñ÷
 ‘˜6 A™:Ó&ó
ˆô 	‰Ñ˜˜x¨¨tÕ4rA   )
rz   r   rˆ   r   rl   rB   r5   rB   r1   r   rD   rM   s   @r/   r•   r•   ‹  s^   ø„ ñð ×#Ñ#Ð$€Kð Ø—X‘Xð!5àð!5ð ð!5ð ð	!5ð
 ð!5ð ÷!5ñ !5rA   r•   c                  óf   ‡ — e Zd ZdZej
                  gZdej                  f	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚSlotCenterToCentera˜  Sketch Object: Center to Center points Slot

    Add slot(s) defined by the distance between the center of the two
    end arcs.

    Args:
        center_separation (float): distance between two arc centers
        height (float): diameter of end circles
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                óª  •— |dk  rt        d|›�«      ‚t        j                  | «      }t        || «       || _        || _        t        t        t        j                  t        | dz  dd«      t        «       «      t        j                  t        «       t        |­dz  dd«      «      g«      j                  |dz  «      «      }t        ‰| �5  ||d |«       y )Nr   z7Requires center_separation > 0. Got: center_separation=r%   )rq   r   r)   r   Úcenter_separationr�   r   r   r   rš   r   r‘   r8   r9   )r;   r¡   rl   r5   r1   r>   r-   r@   s          €r/   r9   zSlotCenterToCenter.__init__Ï  sÒ   ø€ ð  Ò!ÜØJÐ8IÐ7KÐLóð ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&à!2ˆÔØ!ˆÔäÜä—N‘N¤6Ð+<Ð*<¸qÑ*@À!ÀQÓ#GÌËÓRÜ—N‘N¤6£8¬VÐ5FÐ4FÈÑ4JÈAÈqÓ-QÓRðó÷
 ‰i˜ ™
Ó#ó
ˆô 	‰Ñ˜˜x¨¨tÕ4rA   )r¡   rB   rl   rB   r5   rB   r1   r   rD   rM   s   @r/   rŸ   rŸ   À  sT   ø„ ñ
ð ×#Ñ#Ð$€Kð Ø—X‘Xð5à ð5ð ð5ð ð	5ð
 ÷5ñ 5rA   rŸ   c                  ó˜   ‡ — e Zd ZdZej
                  gZdej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚSlotOveralla  Sketch Object: Center to Center points Slot

    Add slot(s) defined by the overall with of the slot.

    Args:
        width (float): overall width of the slot
        height (float): diameter of end circles
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    r   c                ó,  •— ||k  rt        d|›d|›�«      ‚t        j                  | «      }t        || «       || _        || _        ||k7  r‹t        t        t        j                  t        | dz  |dz  z   dd«      t        «       «      t        j                  t        «       t        |­dz  |dz  z
  dd«      «      g«      j                  |dz  «      «      }n,t        t        t        |dz  |¬«      j                  «       «      }t        ‰| �A  ||||«       y )Nz.Slot requires that width > height. Got: width=z	, height=r%   r   )r1   )rq   r   r)   r   rh   r�   r   r   r   rš   r   r‘   r
   rO   r-   r8   r9   rk   s	           €r/   r9   zSlotOverall.__init__ü  s	  ø€ ð �FŠ?ÜØA¸5¸(À*ÀVÀIÐNóð ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&àˆŒ
Ø!ˆÔà�FŠ?ÜÜäŸ™¤v¨u¨f°q©j¸6ÀA¹:Ñ.EÀqÈ!Ó'LÌfËhÓWÜŸ™¤v£x´¸¸À¹
ÀVÈaÁZÑ8OÐQRÐTUÓ1VÓWðó÷
 ‘)˜F Q™JÓ'ó‰Dô œœf U¨Q¡Y°TÔ:×?Ñ?ÓAÓBˆDÜ‰Ñ˜˜x¨°Õ5rA   rm   rS   rM   s   @r/   r£   r£   ì  sn   ø„ ñð ×#Ñ#Ð$€Kð Ø5:·\±\À5Ç<Á<Ð4PØ—X‘Xð6àð6ð ð6ð ð	6ð
 2ð6ð ÷6ñ 6rA   r£   c                  óÊ   ‡ — e Zd ZdZej
                  gZddej                  e	j                  e	j                  fdddej                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚTexta«  Sketch Object: Text

    Add text(s) to the sketch.

    Args:
        txt (str): text to be rendered
        font_size (float): size of the font in model units
        font (str, optional): font name. Defaults to "Arial".
        font_path (str, optional): system path to font library. Defaults to None.
        font_style (Font_Style, optional): style. Defaults to Font_Style.REGULAR.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        path (Union[Edge, Wire], optional): path for text to follow. Defaults to None.
        position_on_path (float, optional): the relative location on path to position the
            text, values must be between 0.0 and 1.0. Defaults to 0.0.
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    ÚArialNg        c           
     ó2  •— t        j                  | «      }t        || «       || _        || _        || _        || _        || _        || _        || _	        || _
        |	| _        |
| _        t        j                  ||||||||¬«      }t        ‰| �A  ||	d |
«       y )N)ÚtxtÚ	font_sizeÚfontÚ	font_pathÚ
font_styler=   Úposition_on_pathÚ	text_path)r   r)   r   r©   rª   r«   r¬   r­   r=   r¯   r®   r5   r1   r   Ú	make_textr8   r9   )r;   r©   rª   r«   r¬   r­   r=   Úpathr®   r5   r1   r>   Útext_stringr@   s                €r/   r9   zText.__init__4  s£   ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&àˆŒØ"ˆŒØˆŒ	Ø"ˆŒØ$ˆŒØˆŒ
ØˆŒØ 0ˆÔØ ˆŒØˆŒ	ä×(Ñ(ØØØØØ!ØØ-Øô	
ˆô 	‰Ñ˜ h°°dÕ;rA   )r©   Ústrrª   rB   r«   r³   r¬   z
str | Noner­   r   r=   rC   r±   zEdge | Wire | Noner®   rB   r5   rB   r1   r   )rE   rF   rG   rH   r   rI   rJ   r   ÚREGULARr   rT   r   rK   r9   rL   rM   s   @r/   r¦   r¦     sµ   ø„ ñð( ×#Ñ#Ð$€Kð Ø $Ø )× 1Ñ 1Ø5:·\±\À5Ç<Á<Ð4PØ#'Ø"%ØØ—X‘Xð%<àð%<ð ð%<ð ð	%<ð
 ð%<ð ð%<ð 2ð%<ð !ð%<ð  ð%<ð ð%<ð ÷%<ñ %<rA   r¦   c                  ó¢   ‡ — e Zd ZdZej
                  gZddej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )Ú	Trapezoidaê  Sketch Object: Trapezoid

    Add trapezoid(s) to the sketch.

    Args:
        width (float): horizontal width
        height (float): vertical height
        left_side_angle (float): bottom left interior angle
        right_side_angle (float, optional): bottom right interior angle. If not provided,
            the trapezoid will be symmetric. Defaults to None.
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to (Align.CENTER, Align.CENTER).
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.

    Raises:
        ValueError: Give angles result in an invalid trapezoid
    Nr   c                ór  •— t        j                  | «      }t        || «       |s|n|}|| _        || _        || _        || _        t        |d«      | _        |dk(  rdn|t        t        |«      «      z  }	|dk(  rdn|t        t        |«      «      z  }
|dz  }|dz  }|dz  }|dz  }|	dkD  r||	z  }n||	z  }|
dkD  r||
z  }n||
z  }||z   dk  rt        d«      ‚||z   dk  rt        d«      ‚g }|j                  t        | | dz  «      «       |j                  t        || dz  «      «       |j                  t        ||dz  «      «       |j                  t        | |dz  «      «       |j                  |d   «       t        t        j                   |«      «      }t"        ‰| �I  ||| j                  |«       y )Nr%   éZ   r   z(Trapezoid bottom invalid - change anglesz%Trapezoid top invalid - change angles)r   r)   r   rh   Útrapezoid_heightÚleft_side_angleÚright_side_angler    r=   r	   r   rq   Úappendr   r   r   ra   r8   r9   )r;   rh   rl   rº   r»   r5   r=   r1   r>   Úreduction_leftÚreduction_rightÚtop_width_leftÚtop_width_rightÚbot_width_leftÚbot_width_rightr`   r-   r@   s                    €r/   r9   zTrapezoid.__init__r  sÑ  ø€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&á2B™?ÐHXÐàˆŒ
Ø &ˆÔØ.ˆÔØ 0ˆÔÜ˜U AÓ&ˆŒ
ð ! BÒ&‰A¨F´S¼ÀÓ9QÓ5RÑ,Rð 	ð " RÒ'‰A¨V´c¼'ÐBRÓ:SÓ6TÑ-Tð 	ð  ™ˆØ !™)ˆØ ™ˆØ !™)ˆà˜AÒØ˜nÑ,‰Nà˜nÑ,ˆNà˜QÒØ˜Ñ.‰Oà˜Ñ.ˆOà˜_Ñ,°Ò1ÜÐGÓHÐHØ˜_Ñ,°Ò1ÜÐDÓEÐEàˆØ�
‰
”6˜>˜/¨F¨7°Q©;Ó7Ô8Ø�
‰
”6˜/¨F¨7°Q©;Ó7Ô8Ø�
‰
”6˜/¨6°A©:Ó6Ô7Ø�
‰
”6˜>˜/¨6°A©:Ó6Ô7Ø�
‰
�3�q‘6ÔÜ”D×%Ñ% cÓ*Ó+ˆÜ‰Ñ˜˜x¨¯©°TÕ:rA   )rh   rB   rl   rB   rº   rB   r»   úfloat | Noner5   rB   r=   rC   r1   r   rS   rM   s   @r/   r¶   r¶   \  s…   ø„ ñð& ×#Ñ#Ð$€Kð *.ØØ5:·\±\À5Ç<Á<Ð4PØ—X‘Xð8;àð8;ð ð8;ð ð	8;ð
 'ð8;ð ð8;ð 2ð8;ð ÷8;ñ 8;rA   r¶   c            
      óŠ   ‡ — e Zd ZdZej
                  gZddddddddej                  dœ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚTrianglea1  Sketch Object: Triangle

    Add any triangle to the sketch by specifying the length of any side and any
    two other side lengths or interior angles. Note that the interior angles are
    opposite the side with the same designation (i.e. side 'a' is opposite angle 'A').

    Args:
        a (float, optional): side 'a' length. Defaults to None.
        b (float, optional): side 'b' length. Defaults to None.
        c (float, optional): side 'c' length. Defaults to None.
        A (float, optional): interior angle 'A' in degrees. Defaults to None.
        B (float, optional): interior angle 'B' in degrees. Defaults to None.
        C (float, optional): interior angle 'C' in degrees. Defaults to None.
        rotation (float, optional): angles to rotate objects. Defaults to 0.
        align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
            Defaults to None.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.

    Raises:
        ValueError: One length and two other values were not provided
    Nr   )	ÚaÚbÚcÚAÚBÚCr=   r5   r1   c       	   
     óŠ  •‡ ‡‡— t        j                  ‰ «      }
t        |
‰ «       |||fD �cg c]  }|d u ‘Œ c}j                  d«      dk(  s*||||||fD �cg c]  }|d u ‘Œ c}j                  d«      dk7  rt	        d«      ‚d„ |||fD «       \  }}}t        j                  ||||||«      \  ŠŠ}}}}‰‰ _        ‰‰ _        |‰ _	        t        |«      ‰ _        t        |«      ‰ _        t        |«      ‰ _        t        t        j                   t#        dd«      t#        ‰d«      t#        |d«      j%                  t&        j(                  ‰ j                  «      g«      «      }t+        d„ |j-                  «       D «       t#        ddd«      «      dz  }|j/                  t1        | «      «       |€d nt3        |d«      }t4        ‰‰ �m  ||||	¬«       ‰ j9                  «       j;                  ˆfd	„«      d   ‰ _        ‰ j9                  «       j;                  ˆˆ fd
„«      d   ‰ _        ‰ j9                  «       j;                  ˆ fd„«      d   ‰ _         tC        ‰ j>                  ‰ j@                  «      ‰ _"        tC        ‰ j<                  ‰ j@                  «      ‰ _#        tC        ‰ j<                  ‰ j>                  «      ‰ _$        y c c}w c c}w )NTrw   z0One length and two other values must be providedc              3  ó:   K  — | ]  }|�t        |«      nd –— Œ y ­wr(   )r   )r,   Úangles     r/   r0   z$Triangle.__init__.<locals>.<genexpr>Û  s   è ø€ ÐXÉiÀU UÐ%6”7˜5”>¸DÓ@Éiùs   ‚r   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr(   )r   )r,   Úvs     r/   r0   z$Triangle.__init__.<locals>.<genexpr>é  s   è ø€ Ð8Ñ$7˜q”˜—Ñ$7ùs   ‚r%   )r<   r5   r=   r1   c                óB   •— t        | j                  ‰z
  «      t        k  S r(   )Úabsr˜   r   )ÚeÚars    €r/   Ú<lambda>z#Triangle.__init__.<locals>.<lambda>î  s   ø€ ´s¸1¿8¹8Àb¹=Ó7IÌIÒ7UrA   c                ód   •— t        | j                  ‰z
  «      t        k  xr | ‰j                  fvS r(   )rÒ   r˜   r   Úedge_a)rÓ   Úbrr;   s    €€r/   rÕ   z#Triangle.__init__.<locals>.<lambda>ò  s*   ø€ ”c˜!Ÿ(™( R™-Ó(¬9Ñ4ÒO¸À4Ç;Á;À-Ð9OÐOrA   c                ó8   •— | ‰j                   ‰j                  fvS r(   )r×   Úedge_b)rÓ   r;   s    €r/   rÕ   z#Triangle.__init__.<locals>.<lambda>÷  s   ø€ �a §¡¨T¯[©[Ð9Ñ9rA   )%r   r)   r   Úcountrq   ÚtrianglesolverÚsolverÆ   rÇ   rÈ   r   rÉ   rÊ   rË   r   r   ra   r   r’   r   r“   Úsumrs   r2   r   r    r8   r9   ÚedgesÚ	filter_byr×   rÚ   Úedge_cr!   Úvertex_AÚvertex_BÚvertex_C)r;   rÆ   rÇ   rÈ   rÉ   rÊ   rË   r=   r5   r1   r>   rÐ   ÚcrÚArÚBrÚCrÚtriangleÚcenter_of_geometryÚ	alignmentrÔ   rØ   r@   s   `                  @@€r/   r9   zTriangle.__init__Æ  sˆ  û€ ô '2×&>Ñ&>¸tÓ&DˆÜ˜ Ô&à ! 1 a™yÓ)™y˜!ˆA�ŠI˜yÑ)×/Ñ/°Ó5¸Ò:Ø ! 1 a¨¨A¨qÑ1ó?
Ù1˜!ˆA�ŠIÐ1ñ?
ç
‰%�‹+˜ò?ô ÐOÓPÐPáXÈqÐRSÐUVÉiÓX‰ˆˆ1ˆaÜ!/×!5Ñ!5°a¸¸A¸qÀ!ÀQÓ!GÑˆˆB��B˜˜BØˆŒØˆŒØˆŒÜ˜“ˆŒÜ˜“ˆŒÜ˜“ˆŒÜÜ×ÑÜ˜˜1“œv b¨!›}¬f°R¸«m×.BÑ.BÄ4Ç6Á6È4Ï6É6Ó.RÐSóó
ˆô Ñ8 H×$5Ñ$5Ô$7Ó8¼&ÀÀAÀq»/ÓJÈQÑNð 	ð 	�‰”hÐ 2Ð2Ó3Ô4Ø!˜M‘D¬w°u¸aÓ/@ˆ	Ü‰Ñ˜X°À	ÐPTÐÔUØ—j‘j“l×,Ñ,Ó-UÓVØñ
ˆŒð —j‘j“l×,Ñ,ÜOó
ð ñ
ˆŒð
 —j‘j“l×,Ñ,Û9ó
ð ñ
ˆŒô
 3Ø�K‰K˜Ÿ™ó
ˆŒô 3Ø�K‰K˜Ÿ™ó
ˆŒô 3Ø�K‰K˜Ÿ™ó
ˆ�ùòW *ùò ?
s   ­J;ÁK )rÆ   rÃ   rÇ   rÃ   rÈ   rÃ   rÉ   rÃ   rÊ   rÃ   rË   rÃ   r=   rC   r5   rB   r1   r   rD   rM   s   @r/   rÅ   rÅ   ­  s�   ø„ ñð, ×#Ñ#Ð$€Kð
 ØØØØØØ48ØØ—X‘Xñ=
ð ð=
ð ð	=
ð
 ð=
ð ð=
ð ð=
ð ð=
ð 2ð=
ð ð=
ð ÷=
ñ =
rA   rÅ   )8rH   Ú
__future__r   rÜ   Úmathr   r   r   r   r   r	   Útypingr
   Úcollections.abcr   Úbuild123d.build_commonr   r   r   Úbuild123d.build_enumsr   r   r   Úbuild123d.build_sketchr   Úbuild123d.geometryr   r   r   r   r   r   r   Úbuild123d.topologyr   r   r   r   r   r   r    r!   r#   rO   rV   r]   rf   ro   ru   r�   r•   rŸ   r£   r¦   r¶   rÅ   © rA   r/   Ú<module>rö      s  ðñõ8 #ã ç 4× 4Ý å $ç RÑ Rß 8Ñ 8Ý .÷÷ ñ ÷	÷ 	ó 	ô,6�vô ,6ô^4Ðô 4ô< ;Ðô  ;ôF%;Ðô %;ôP ;Ð ô  ;ôF&6Ð'ô &6ôRFBÐ%ô FBôR5Ðô 5ô@25Ð&ô 25ôj)5Ð)ô )5ôX.6Ð"ô .6ôb<<Ðô <<ô~N;Ð ô N;ôbV
Ðõ V
rA   