Ë
    JÿiÂF  ã                  ó`  — d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZmZmZmZ ddl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«      Z G d„ de«      Z  G d„ de«      Z! G d„ de«      Z"y)aì  
Part Objects

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

desc:
    This python module contains objects (classes) that create 3D Parts.

license:

    Copyright 2023 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.

é    )Úannotations)ÚradiansÚtan)ÚLocationListÚvalidate_inputs)ÚAlignÚMode)Ú	BuildPart)ÚLocationÚPlaneÚRotationÚRotationLike)ÚCompoundÚPartÚ	ShapeListÚSolidÚtuplifyc                  óh   ‡ — e Zd ZdZej
                  gZddej                  f	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚBasePartObjecta«  BasePartObject

    Base class for all BuildPart objects & operations

    Args:
        solid (Solid): object to create
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to None.
        mode (Mode, optional): combination mode. Defaults to Mode.ADD.
    ©r   r   r   Nc                óŒ  •— |�Gt        |d«      }|j                  «       }|j                  |«      }|j                  t	        |«      «       t        j                  | d¬«      }t        |t        «      rt        |Ž n|}|| _
        |€|j                  |«      g}	n…|| _        t        j                  «       st        d«      ‚t        j                  «       j                  D �
cg c]  }
|j                  |
|z  «      ‘Œ }	}
t        |t
        «      r |j                   |	d|iŽ t#        |	«      dkD  rt%        |	«      j&                  }n8t        |	d   t$        «      r|	d   j&                  }nt%        |	«      j&                  }t(        ‰| �U  ||j,                  |j.                  |j0                  |j2                  |j4                  ¬«       y c c}
w )	Né   F)ÚlogzNo valid context foundÚmodeé   r   )ÚobjÚlabelÚmaterialÚjointsÚparentÚchildren)r   Úbounding_boxÚto_align_offsetÚmover   r
   Ú_get_contextÚ
isinstanceÚtupler   ÚrotationÚmovedr   r   ÚRuntimeErrorÚ	locationsÚ_add_to_contextÚlenr   ÚwrappedÚsuperÚ__init__r   r   r   r    r!   )ÚselfÚpartr(   Úalignr   ÚbboxÚoffsetÚcontextÚrotateÚ
new_solidsÚlocationÚnew_partÚ	__class__s               €úg/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/build123d/objects_part.pyr0   zBasePartObject.__init__7   s�  ø€ ð ÐÜ˜E 1Ó%ˆEØ×$Ñ$Ó&ˆDØ×)Ñ)¨%Ó0ˆFØ�I‰I”h˜vÓ&Ô'ä$-×$:Ñ$:¸4ÀUÔ$KˆÜ(2°8¼UÔ(C”˜8Ñ$ÈˆØˆŒØˆ?ØŸ*™* VÓ,Ð-‰JàˆDŒIä×,Ñ,Ô.Ü"Ð#;Ó<Ð<ô !-× 9Ñ 9Ó ;× EÒ Eóá E�Hð —
‘
˜8 fÑ,Õ-Ø Eð ð ô ˜'¤9Ô-Ø'�×'Ñ'¨Ð?¸$Ò?äˆz‹?˜QÒÜ 
Ó+×3Ñ3‰HÜ˜
 1™¤xÔ0Ø! !‘}×,Ñ,‰Hä 
Ó+×3Ñ3ˆHä‰ÑØà—*‘*Ø—]‘]Ø—;‘;Ø—;‘;Ø—]‘]ð 	õ 	
ùòs   ÃG)r2   zPart | Solidr(   r   r3   z)Align | tuple[Align, Align, Align] | Noner   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Ú_tagÚ_applies_tor	   ÚADDr0   Ú__classcell__©r;   s   @r<   r   r   (   sU   ø„ ñ
ð —>‘>Ð"€Kð
 "+Ø;?Ø—X‘Xð-
àð-
ð ð-
ð 9ð	-
ð
 ÷-
ñ -
ó    r   c                  ó²   ‡ — e Zd ZdZej
                  gZdej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚBoxaÿ  Part Object: Box

    Create a box(es) and combine with part.

    Args:
        length (float): box size
        width (float): box size
        height (float): box size
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    r   c                óÚ   •— t        j                  | «      }t        || «       || _        || _        || _        t        j                  |||«      }t        ‰	| �%  ||t        |d«      |¬«       y )Nr   ©r2   r(   r3   r   )r
   r%   r   ÚlengthÚwidthÚ
box_heightr   Úmake_boxr/   r0   r   )
r1   rK   rL   Úheightr(   r3   r   r6   Úsolidr;   s
            €r<   r0   zBox.__init__x   sh   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØˆŒ
Ø ˆŒä—‘˜v u¨fÓ5ˆä‰ÑØ ´¸ÀÓ1BÈð 	õ 	
rF   )rK   ÚfloatrL   rQ   rO   rQ   r(   r   r3   ú"Align | tuple[Align, Align, Align]r   r	   ©r=   r>   r?   r@   r
   rA   rB   r   ÚCENTERr	   rC   r0   rD   rE   s   @r<   rH   rH   g   s‚   ø„ ñð —>‘>Ð"€Kð "+à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð
àð
ð ð
ð ð	
ð
 ð
ð 2ð
ð ÷
ñ 
rF   rH   c                  ó¸   ‡ — e Zd ZdZej
                  gZddej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚConeah  Part Object: Cone

    Create a cone(s) and combine with part.

    Args:
        bottom_radius (float): cone size
        top_radius (float): top size, could be zero
        height (float): cone size
        arc_size (float, optional): angular size of cone. Defaults to 360.
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    éh  r   c                óú   •— t        j                  | «      }t        || «       || _        || _        || _        || _        || _        t        j                  ||||¬«      }	t        ‰
| �-  |	|t        |d«      |¬«       y ©N)Úangler   rJ   )r
   r%   r   Úbottom_radiusÚ
top_radiusÚcone_heightÚarc_sizer3   r   Ú	make_coner/   r0   r   )r1   r[   r\   rO   r^   r(   r3   r   r6   rP   r;   s             €r<   r0   zCone.__init__¥   s‚   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&à*ˆÔØ$ˆŒØ!ˆÔØ ˆŒØˆŒ
ä—‘ØØØØô	
ˆô 	‰ÑØ ´¸ÀÓ1BÈð 	õ 	
rF   )r[   rQ   r\   rQ   rO   rQ   r^   rQ   r(   r   r3   rR   r   r	   rS   rE   s   @r<   rV   rV   “   s�   ø„ ñð —>‘>Ð"€Kð Ø!*à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð 
àð 
ð ð 
ð ð	 
ð
 ð 
ð ð 
ð 2ð 
ð ÷ 
ñ  
rF   rV   c                  ój   ‡ — e Zd ZdZej
                  gZdej                  f	 	 	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚCounterBoreHolea‘  Part Operation: Counter Bore Hole

    Create a counter bore hole in part.

    Args:
        radius (float): hole size
        counter_bore_radius (float): counter bore size
        counter_bore_depth (float): counter bore depth
        depth (float, optional): hole depth - None implies through part. Defaults to None.
        mode (Mode, optional): combination mode. Defaults to Mode.SUBTRACT.
    Nc                ó
  •— t        j                  | «      }t        || «       || _        || _        || _        |�|| _        n!|€|�|j                  | _        nt        d«      ‚|| _	        t        j                  || j                  t        dd¬«      «      j                  t        j                  ||| j                  z   t        dd| f«      «      «      }t        |t        «      rt!        |«      }n|}t"        ‰	| �I  |d|¬«       y )NúNo depth providedr   ©r   r   éÿÿÿÿ©ÚoriginÚz_dirr   ©r2   r(   r   )r
   r%   r   ÚradiusÚcounter_bore_radiusÚcounter_bore_depthÚ
hole_depthÚmax_dimensionÚ
ValueErrorr   r   Úmake_cylinderr   Úfuser&   r   r   r/   r0   )
r1   rj   rk   rl   Údepthr   r6   ÚfusedrP   r;   s
            €r<   r0   zCounterBoreHole.__init__×   sú   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØ#6ˆÔ Ø"4ˆÔØÐØ#ˆD�OØˆ]˜wÐ2Ø%×3Ñ3ˆD�OäÐ0Ó1Ð1ØˆŒ	ä×#Ñ#Ø�D—O‘O¤U°)À:Ô%Nó
ç
‰$Ü×ÑØ#Ø" T§_¡_Ñ4Ü�q˜!Ð0Ð0Ð1Ó2óó
ð 	ô �eœYÔ'Ü˜“K‰EàˆEÜ‰Ñ˜e¨i¸dÐÕCrF   )
rj   rQ   rk   rQ   rl   rQ   rr   úfloat | Noner   r	   ©r=   r>   r?   r@   r
   rA   rB   r	   ÚSUBTRACTr0   rD   rE   s   @r<   ra   ra   È   sc   ø„ ñ
ð —>‘>Ð"€Kð #Ø—]‘]ð#Dàð#Dð #ð#Dð "ð	#Dð
 ð#Dð ÷#Dñ #DrF   ra   c                  ól   ‡ — e Zd ZdZej
                  gZddej                  f	 	 	 	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚCounterSinkHolea¤  Part Operation: Counter Sink Hole

    Create a counter sink hole in part.

    Args:
        radius (float): hole size
        counter_sink_radius (float): counter sink size
        depth (float, optional): hole depth - None implies through part. Defaults to None.
        counter_sink_angle (float, optional): cone angle. Defaults to 82.
        mode (Mode, optional): combination mode. Defaults to Mode.SUBTRACT.
    NéR   c                ó`  •— t        j                  | «      }t        || «       || _        || _        |�|| _        n!|€|�|j                  | _        nt        d«      ‚|| _        || _	        |t        t        |dz  «      «      z  }t        j                  || j
                  t        dd¬«      «      j                  t        j                   |d|t        dd¬«      «      t        j                  || j
                  «      «      }t#        |t$        «      rt'        |«      }	n|}	t(        ‰
| �U  |	d|¬«       y )Nrc   g       @r   rd   rf   g        ri   )r
   r%   r   rj   Úcounter_sink_radiusrm   rn   ro   Úcounter_sink_angler   r   r   r   rp   r   rq   r_   r&   r   r   r/   r0   )r1   rj   r{   rr   r|   r   r6   r]   rs   rP   r;   s             €r<   r0   zCounterSinkHole.__init__  s  ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØ#6ˆÔ ØÐØ#ˆD�OØˆ]˜wÐ2Ø%×3Ñ3ˆD�OäÐ0Ó1Ð1Ø"4ˆÔØˆŒ	Ø)¬C´Ð8JÈSÑ8PÓ0QÓ,RÑRˆä×#Ñ#Ø�D—O‘O¤U°)À:Ô%Nó
ç
‰$Ü�O‰OØ#ØØÜ˜Y¨jÔ9ó	ô ×ÑÐ 3°T·_±_ÓEó
ð 	ô �eœYÔ'Ü˜“K‰EàˆEä‰Ñ˜e¨i¸dÐÕCrF   )
rj   rQ   r{   rQ   rr   rt   r|   rQ   r   r	   ru   rE   s   @r<   rx   rx   ý   sf   ø„ ñ
ð —>‘>Ð"€Kð #Ø$&Ø—]‘]ð'Dàð'Dð #ð'Dð ð	'Dð
 "ð'Dð ÷'Dñ 'DrF   rx   c                  ó´   ‡ — e Zd ZdZej
                  gZddej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚCylindera=  Part Object: Cylinder

    Create a cylinder(s) and combine with part.

    Args:
        radius (float): cylinder size
        height (float): cylinder size
        arc_size (float, optional): angular size of cone. Defaults to 360.
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    rW   r   c                óê   •— t        j                  | «      }t        || «       || _        || _        || _        || _        t        j                  |||¬«      }t        ‰	| �)  ||t        |d«      |¬«       y rY   )r
   r%   r   rj   Úcylinder_heightr^   r3   r   rp   r/   r0   r   )
r1   rj   rO   r^   r(   r3   r   r6   rP   r;   s
            €r<   r0   zCylinder.__init__G  sy   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØ%ˆÔØ ˆŒØˆŒ
ä×#Ñ#ØØØô
ˆô
 	‰ÑØ ´¸ÀÓ1BÈð 	õ 	
rF   )rj   rQ   rO   rQ   r^   rQ   r(   r   r3   rR   r   r	   rS   rE   s   @r<   r~   r~   6  s…   ø„ ñð —>‘>Ð"€Kð Ø!*à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð
àð
ð ð
ð ð	
ð
 ð
ð 2ð
ð ÷
ñ 
rF   r~   c                  ób   ‡ — e Zd ZdZej
                  gZdej                  f	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )ÚHolea	  Part Operation: Hole

    Create a hole in part.

    Args:
        radius (float): hole size
        depth (float, optional): hole depth - None implies through part. Defaults to None.
        mode (Mode, optional): combination mode. Defaults to Mode.SUBTRACT.
    Nc                óÊ  •— t        j                  | «      }t        || «       || _        |�d|z  | _        n$|€|�d|j
                  z  | _        nt        d«      ‚|| _        |€dd| j                  dz  fnd}t        j                  || j                  t        |d¬«      «      }t        ‰| �1  |t        j                  t        j                  t        j                  fd|¬«       y )Né   rc   r   r   rd   rf   )r2   r3   r(   r   )r
   r%   r   rj   rm   rn   ro   r   r   rp   r   r/   r0   r   rT   )r1   rj   rr   r   r6   Ú
hole_startrP   r;   s          €r<   r0   zHole.__init__s  sØ   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØÐØ %™iˆD�OØˆ]˜wÐ2Ø '×"7Ñ"7Ñ7ˆD�OäÐ0Ó1Ð1ØˆŒ	ð 5:°M�a˜˜DŸO™O¨aÑ/Ñ0Àyˆ
Ü×#Ñ#Ø�D—O‘O¤U°*ÀJÔ%Oó
ˆô 	‰ÑØÜ—<‘<¤§¡¬u¯|©|Ð<ØØð	 	õ 	
rF   )rj   rQ   rr   rt   r   r	   ru   rE   s   @r<   r‚   r‚   f  sH   ø„ ñð —>‘>Ð"€Kð
 #Ø—]‘]ð	
àð
ð ð
ð ÷	
ñ 
rF   r‚   c                  ó¼   ‡ — e Zd ZdZej
                  gZddddej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚSpherea¯  Part Object: Sphere

    Create a sphere(s) and combine with part.

    Args:
        radius (float): sphere size
        arc_size1 (float, optional): angular size of sphere. Defaults to -90.
        arc_size2 (float, optional): angular size of sphere. Defaults to 90.
        arc_size3 (float, optional): angular size of sphere. Defaults to 360.
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    i¦ÿÿÿéZ   rW   r   c                óú   •— t        j                  | «      }t        || «       || _        || _        || _        || _        || _        t        j                  ||||¬«      }	t        ‰
| �-  |	|t        |d«      |¬«       y )N)Úangle1Úangle2Úangle3r   rJ   )r
   r%   r   rj   Ú	arc_size1Ú	arc_size2Ú	arc_size3r3   r   Úmake_spherer/   r0   r   )r1   rj   r�   rŽ   r�   r(   r3   r   r6   rP   r;   s             €r<   r0   zSphere.__init__§  s‚   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&àˆŒØ"ˆŒØ"ˆŒØ"ˆŒØˆŒ
ä×!Ñ!ØØØØô	
ˆô 	‰ÑØ ´¸ÀÓ1BÈð 	õ 	
rF   )rj   rQ   r�   rQ   rŽ   rQ   r�   rQ   r(   r   r3   rR   r   r	   rS   rE   s   @r<   r‡   r‡   •  s•   ø„ ñð —>‘>Ð"€Kð
 ØØØ!*à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð
àð
ð ð
ð ð	
ð
 ð
ð ð
ð 2ð
ð ÷
ñ 
rF   r‡   c                  óÀ   ‡ — e Zd ZdZej
                  gZddddej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚTorusa–  Part Object: Torus

    Create a torus(es) and combine with part.


    Args:
        major_radius (float): torus size
        minor_radius (float): torus size
        major_arc_size (float, optional): angular size of torus. Defaults to 0.
        minor_arc_size (float, optional): angular size or torus. Defaults to 360.
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    r   rW   r   c	                ó
  •— t        j                  | «      }	t        |	| «       || _        || _        || _        || _        || _        || _        t        j                  |||||¬«      }
t        ‰| �1  |
|t        |d«      |¬«       y )N)Ústart_angleÚ	end_angleÚmajor_angler   rJ   )r
   r%   r   Úmajor_radiusÚminor_radiusÚminor_start_angleÚminor_end_angler–   r3   r   Ú
make_torusr/   r0   r   )r1   r—   r˜   r™   rš   r–   r(   r3   r   r6   rP   r;   s              €r<   r0   zTorus.__init__Ü  s‘   ø€ ô %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&à(ˆÔØ(ˆÔØ!2ˆÔØ.ˆÔØ&ˆÔØˆŒ
ä× Ñ ØØØ)Ø%Ø#ô
ˆô 	‰ÑØ ´¸ÀÓ1BÈð 	õ 	
rF   )r—   rQ   r˜   rQ   r™   rQ   rš   rQ   r–   rQ   r(   r   r3   rR   r   r	   rS   rE   s   @r<   r’   r’   É  sŸ   ø„ ñð  —>‘>Ð"€Kð $%Ø!$Ø Ø!*à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð"
àð"
ð ð"
ð !ð	"
ð
 ð"
ð ð"
ð ð"
ð 2ð"
ð ÷"
ñ "
rF   r’   c                  óÂ   ‡ — e Zd ZdZej
                  gZdej                  ej                  ej                  fe	j                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚWedgea×  Part Object: Wedge

    Create a wedge(s) and combine with part.

    Args:
        xsize (float): distance along the X axis
        ysize (float): distance along the Y axis
        zsize (float): distance along the Z axis
        xmin (float): minimum X location
        zmin (float): minimum Z location
        xmax (float): maximum X location
        zmax (float): maximum Z location
        rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
        align (Align | tuple[Align, Align, Align] | None, optional): align min, center,
            or max of object. Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
        mode (Mode, optional): combine mode. Defaults to Mode.ADD.
    r   c           	     ó†  •— t        j                  | «      }t        || «       t        |||fD �cg c]  }|dk  ‘Œ	 c}«      rt	        d«      ‚|| _        || _        || _        || _        || _	        || _
        || _        |	| _        t        j                  |||||||«      }t        ‰| �A  ||t#        |	d«      |
¬«       y c c}w )Nr   z2xsize, ysize & zsize must all be greater than zeror   rJ   )r
   r%   r   Úanyro   ÚxsizeÚysizeÚzsizeÚxminÚzminÚxmaxÚzmaxr3   r   Ú
make_wedger/   r0   r   )r1   r    r¡   r¢   r£   r¤   r¥   r¦   r(   r3   r   r6   ÚvaluerP   r;   s                 €r<   r0   zWedge.__init__  sÊ   ø€ ô" %.×$:Ñ$:¸4Ó$@ˆÜ˜ Ô&ä¨°°uÑ(=Ó>Ñ(=˜u�˜“
Ð(=Ñ>Ô?ÜÐQÓRÐRàˆŒ
ØˆŒ
ØˆŒ
ØˆŒ	ØˆŒ	ØˆŒ	ØˆŒ	ØˆŒ
ä× Ñ  ¨¨u°d¸DÀ$ÈÓMˆÜ‰ÑØ ´¸ÀÓ1BÈð 	õ 	
ùò ?s   ¯B>)r    rQ   r¡   rQ   r¢   rQ   r£   rQ   r¤   rQ   r¥   rQ   r¦   rQ   r(   r   r3   rR   r   r	   rS   rE   s   @r<   r�   r�     sª   ø„ ñð$ —>‘>Ð"€Kð "+à�L‰LØ�L‰LØ�L‰Lð5
ð
 —X‘Xð#
àð#
ð ð#
ð ð	#
ð
 ð#
ð ð#
ð ð#
ð ð#
ð ð#
ð 2ð#
ð ÷#
ñ #
rF   r�   N)#r@   Ú
__future__r   Úmathr   r   Úbuild123d.build_commonr   r   Úbuild123d.build_enumsr   r	   Úbuild123d.build_partr
   Úbuild123d.geometryr   r   r   r   Úbuild123d.topologyr   r   r   r   r   r   rH   rV   ra   rx   r~   r‚   r‡   r’   r�   © rF   r<   Ú<module>r±      s¬   ðñõ8 #ç ç @ß -Ý *ß FÓ Fß HÕ Hô<
�Tô <
ô~)
ˆ.ô )
ôX2
ˆ>ô 2
ôj2D�nô 2Dôj6D�nô 6Dôr-
ˆ~ô -
ô`,
ˆ>ô ,
ô^1
ˆ^ô 1
ôh5
ˆNô 5
ôp8
ˆNõ 8
rF   