Ë
    £èh²+  ã                  ó�  — d dl mZ d dlmZmZmZ d dlZd dlmZ d dl	m
Z
 d dl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mZ d dlmZmZ d	d
lm Z m!Z! d	dl"m#Z#m$Z$m%Z%m&Z&m'Z' d	dl(m)Z) erd dl*m+Z+ d dl,m-Z-m.Z. d dlm/Z/ dgZ0dZ1dZ2dZ3d&d„Z4d'd„Z5 ed edejl                  e¬«       edejl                  ee
jn                  ¬«       edejl                  ede
jn                  e¬«       ede2e4e5¬«       ed d ¬!«       ed"ejp                  ¬!«      d#œ«      Z9 ee9«      Z: ee'e:«      Z;ejx                  d$z  Z=e) G d%„ de#«      «       Z>y)(é    )Úannotations)ÚTYPE_CHECKINGÚIterableÚOptionalN)Ú
AuditError)Ú	validator)ÚVec3ÚMatrix44ÚNULLVECÚX_AXISÚZ_AXISÚellipseÚConstructionEllipseÚOCS)ÚDXFAttrÚDXFAttributesÚDefSubclassÚXTypeÚRETURN_DEFAULTÚgroup_code_mappingÚmerge_group_code_mappings)ÚSUBCLASS_MARKERÚDXF2000é   )Ú
base_classÚSubclassProcessor)Ú
DXFGraphicÚacdb_entityÚ
add_entityÚreplace_entityÚacdb_entity_group_codes)Úregister_entity)ÚAbstractTagWriter)ÚDXFNamespaceÚSpline)ÚAuditorÚEllipseg»½×Ùß|Û=ç      ð?g•Ö&è.>c                óR   — t         t        | «      cxk  xr t        t        z   k  S c S )z{Check if axis-ratio is in valid range, takes an upper bound tolerance into
    account for floating point imprecision.
    )Ú	MIN_RATIOÚabsÚ	MAX_RATIOÚTOL)Úratios    ú6lib/python3.12/site-packages/ezdxf/entities/ellipse.pyÚis_valid_ratior0   3   s"   € ô œ˜E›
Ö6¤i´#¡oÑ6Ð6Ñ6Ð6ó    c                ó|   — | dk  rdnd}t        | «      } | t        k  r	t        |z  S | t        kD  r	t        |z  S | |z  S )zVClamp axis-ratio into valid range and remove possible floating point imprecision.
    r   éÿÿÿÿr   )r+   r*   r,   )r.   Úsigns     r/   Úclamp_axis_ratior5   :   sJ   € ð ˜’‰2 €DÜ�‹J€EØŒyÒÜ˜4ÑÐØŒyÒÜ˜4ÑÐØ�4‰<Ðr1   ÚAcDbEllipseé
   )ÚxtypeÚdefaulté   )r8   r9   r   éÒ   T)r8   r9   Úoptionalr   Úfixeré(   )r9   r   r=   é)   )r9   é*   ©ÚcenterÚ
major_axisÚ	extrusionr.   Ústart_paramÚ	end_paramg       @c                  óü   ‡ — e Zd ZdZdZ eeee«      Z	e
Z	 d	 	 	 dˆ fd„Zdˆ fd„Zedd„«       Zedd„«       Zedd„«       Zdd„Zdd	„Zdd
„Zdd„Zddd„Zd„ Zedd„«       Zdd„Zd d„Zd!d"d„Zd#d„Zd$ˆ fd„Zˆ xZS )%r'   zDXF ELLIPSE entityÚELLIPSEc                ó^   •— t         t        | �  |«      }|r|j                  |t        «       |S )z!Loading interface. (internal API))Úsuperr   Úload_dxf_attribsÚsimple_dxfattribs_loaderÚmerged_ellipse_group_codes)ÚselfÚ	processorÚdxfÚ	__class__s      €r/   rK   zEllipse.load_dxf_attribsu   s/   ø€ ô
 ”J Ñ6°yÓAˆÙØ×.Ñ.¨sÔ4NÔOØˆ
r1   c                ón  •— t         ‰| �  |«       |j                  t        t        j
                  «       t        | j                  j                  «      sJ dt        › dt        › d�«       ‚t        | j                  j                  «      | j                  _        | j                  j                  |g d¢«       y)z(Export entity specific data as DXF tags.zaxis-ratio out of range [z, Ú]rA   N)rJ   Úexport_entityÚ
write_tag2r   Úacdb_ellipseÚnamer0   rP   r.   r*   r,   r5   Úexport_dxf_attribs)rN   Ú	tagwriterrQ   s     €r/   rT   zEllipse.export_entity   s’   ø€ ä‰Ñ˜iÔ(Ø×Ñœ_¬l×.?Ñ.?Ô@ô Ø�H‰H�N‰Nô
ð 	Aà&¤y k°´I°;¸aÐ@ó	Að 
ô *¨$¯(©(¯.©.Ó9ˆ�‰ŒØ�‰×#Ñ#Øòõ
	
r1   c                ó¨   — | j                   }t        j                  t        |j                  «      t        |j
                  «      |j                  «      S ©N)rP   r   Ú
minor_axisr	   rC   rD   r.   ©rN   rP   s     r/   r\   zEllipse.minor_axis•   s6   € à�h‰hˆÜ×!Ñ!¤$ s§~¡~Ó"6¼¸S¿]¹]Ó8KÈSÏYÉYÓWÐWr1   c                óf   — t        | j                  | j                  j                  g«      «      d   S ©Nr   )ÚlistÚverticesrP   rE   ©rN   s    r/   Ústart_pointzEllipse.start_pointš   s(   € ä�D—M‘M 4§8¡8×#7Ñ#7Ð"8Ó9Ó:¸1Ñ=Ð=r1   c                óf   — t        | j                  | j                  j                  g«      «      d   S r_   )r`   ra   rP   rF   rb   s    r/   Ú	end_pointzEllipse.end_pointž   s(   € ä�D—M‘M 4§8¡8×#5Ñ#5Ð"6Ó7Ó8¸Ñ;Ð;r1   c                ó²   — | j                   }t        |j                  |j                  |j                  |j
                  |j                  |j                  «      S )zBReturns construction tool :class:`ezdxf.math.ConstructionEllipse`.)rP   r   rB   rC   rD   r.   rE   rF   r]   s     r/   Úconstruction_toolzEllipse.construction_tool¢   sB   € à�h‰hˆÜ"Ø�J‰JØ�N‰NØ�M‰MØ�I‰IØ�O‰OØ�M‰Mó
ð 	
r1   c                óD   — | j                  |j                  «       «       | S )zbSet ELLIPSE data from construction tool
        :class:`ezdxf.math.ConstructionEllipse`.

        )Úupdate_dxf_attribsÚ
dxfattribs©rN   Úes     r/   Úapply_construction_toolzEllipse.apply_construction_tool®   s   € ð
 	×Ñ §¡£Ô/Øˆr1   c              #  óê   K  — | j                   j                  t        j                  z  }| j                   j                  t        j                  z  }t        j                  |||«      E d{  –—†  y7 Œ­w)u•   Returns `num` params from start- to end param in counter-clockwise
        order.

        All params are normalized in the range [0, 2Ï€).

        N)rP   rE   ÚmathÚtaurF   r   Ú
get_params)rN   ÚnumÚstartÚends       r/   ÚparamszEllipse.params¶   sP   è ø€ ð —‘×$Ñ$¤t§x¡xÑ/ˆØ�h‰h× Ñ ¤4§8¡8Ñ+ˆÜ×%Ñ% e¨S°#Ó6×6Ò6ús   ‚A)A3Á+A1Á,A3c              #  ó^   K  — | j                  «       j                  |«      E d{  –—†  y7 Œ­w)u  Yields vertices on ellipse for iterable `params` in WCS.

        Args:
            params: param values in the range from 0 to 2Ï€ in radians,
                param goes counter-clockwise around the extrusion vector,
                major_axis = local x-axis = 0 rad.

        N)rg   ra   )rN   ru   s     r/   ra   zEllipse.verticesÁ   s%   è ø€ ð ×)Ñ)Ó+×4Ñ4°VÓ<×<Ò<ús   ‚#-¥+¦-c                óB   — | j                  «       j                  ||«      S )a&  Adaptive recursive flattening. The argument `segments` is the
        minimum count of approximation segments, if the distance from the center
        of the approximation segment to the curve is bigger than `distance` the
        segment will be subdivided. Returns a closed polygon for a full ellipse
        where the start vertex has the same value as the end vertex.

        Args:
            distance: maximum distance from the projected curve point onto the
                segment chord.
            segments: minimum segment count

        )rg   Ú
flattening)rN   ÚdistanceÚsegmentss      r/   rx   zEllipse.flatteningÌ   s    € ð ×%Ñ%Ó'×2Ñ2°8¸XÓFÐFr1   c                ó‚   — | j                  «       }|j                  «        | j                  |j                  «       «       y)z.Swap axis and adjust start- and end parameter.N)rg   Ú	swap_axisri   rj   rk   s     r/   r|   zEllipse.swap_axisÛ   s-   € à×"Ñ"Ó$ˆØ	�‰ŒØ×Ñ §¡£Õ/r1   c           
     óÌ  — |j                  «       dv sJ d«       ‚|j                  h d£¬«      }t        j                  j	                  |j                  dt        «      |j                  dt        «      |j                  dd«      |j                  d	d
«      |j                  dd«      ¬«      }|j                  |j                  «       «       | j                  ||j                  ¬«      S )zÇCreate a new virtual ELLIPSE entity from an ARC or a CIRCLE entity.

        The new entity has no owner, no handle, is not stored in the entity database nor
        assigned to any layout!

        >   ÚARCÚCIRCLEzARC or CIRCLE entity required>   ÚownerÚhandleÚ	thickness)ÚdroprB   rD   Úradiusr(   Ústart_angler   Ú	end_angleih  )rB   rD   r„   r…   r†   )rj   Údoc)Údxftyperj   r   r   Úfrom_arcÚgetr   r   ÚpopÚupdateÚnewr‡   )ÚclsÚentityÚattribsrl   s       r/   r‰   zEllipse.from_arcá   sÀ   € ð �~‰~ÓÐ#4Ñ4ÐUÐ6UÓUÐ4Ø×#Ñ#Ò)IÐ#ÓJˆÜ×'Ñ'×0Ñ0Ø—;‘;˜x¬Ó1Ø—k‘k +¬vÓ6à—;‘;˜x¨Ó-ØŸ™ M°1Ó5Ø—k‘k +¨sÓ3ð 1ó 
ˆð 	�‰�q—|‘|“~Ô&Ø�w‰w '¨v¯z©zˆwÓ:Ð:r1   c                ó¨   — | j                  «       }|j                  |«       | j                  |j                  «       «       | j	                  |«       | S )zBTransform the ELLIPSE entity by transformation matrix `m` inplace.)rg   Ú	transformri   rj   Úpost_transform)rN   Úmrl   s      r/   r’   zEllipse.transformö   sB   € à×"Ñ"Ó$ˆØ	�‰�AŒØ×Ñ §¡£Ô/Ø×Ñ˜AÔØˆr1   c                óÐ   — t        |||«      | j                  j                  z   | j                  _        | j                  r&| j	                  t        j                  |||«      «       | S )z�Optimized ELLIPSE translation about `dx` in x-axis, `dy` in y-axis
        and `dz` in z-axis, returns `self` (floating interface).

        )r	   rP   rB   Úis_post_transform_requiredr“   r
   Ú	translate)rN   ÚdxÚdyÚdzs       r/   r—   zEllipse.translateþ   sP   € ô
 ˜r 2 rÓ*¨T¯X©X¯_©_Ñ<ˆ�‰Œà×*Ò*Ø×Ñ¤× 2Ñ 2°2°r¸2Ó >Ô?Øˆr1   c                ó¢   — ddl m}  |j                  | «      }| j                  «       }|€J d«       ‚|rt	        | ||«       |S t        ||«       |S )a  Convert ELLIPSE to a :class:`~ezdxf.entities.Spline` entity.

        Adds the new SPLINE entity to the entity database and to the
        same layout as the source entity.

        Args:
            replace: replace (delete) source entity by SPLINE entity if ``True``

        r   )r%   zvalid layout required)Úezdxf.entitiesr%   r‰   Ú
get_layoutr    r   )rN   Úreplacer%   ÚsplineÚlayouts        r/   Ú	to_splinezEllipse.to_spline	  s\   € õ 	*à �—‘ Ó&ˆØ—‘Ó"ˆØÐ!Ð:Ð#:Ó:Ð!ÙÜ˜4 ¨Ô0ð ˆô �v˜vÔ&Øˆr1   c                ó   — t        «       S r[   )r   rb   s    r/   ÚocszEllipse.ocs  s   € ô ‹uˆr1   c                óÒ  •— | j                   sy t        ‰| �	  |«       t        | «      }t	        | j
                  j                  «      }|j                  r7|j                  | «       |j                  t        j                  d|› d�¬«       y | j
                  j                  }t        |«      rt        |«      | j
                  _        y t        |«      t         kD  r6| j#                  «        |j                  t        j$                  d|› d�¬«       y t        |«      t&        k  rGt        |«      | j
                  _        |j                  t        j$                  d|› dt&        › d�¬«       y y )NzRemoved z$ with invalid major axis: (0, 0, 0).)ÚcodeÚmessagezFixed invalid axis-ratio in z by swapping axis.z	, set to Ú.)Úis_aliverJ   ÚauditÚstrr	   rP   rC   Úis_nullÚtrashÚfixed_errorr   ÚINVALID_MAJOR_AXISr.   r0   r5   r+   r,   r|   ÚINVALID_ELLIPSE_RATIOr*   )rN   Úauditorr�   rC   Ú
axis_ratiorQ   s        €r/   r©   zEllipse.audit#  s2  ø€ Ø�}Š}ØÜ‰‰�gÔÜ�T“ˆÜ˜$Ÿ(™(×-Ñ-Ó.ˆ
Ø×ÒØ�M‰M˜$ÔØ×ÑÜ×2Ñ2Ø" 6 (Ð*NÐOð  ô ð Ø—X‘X—^‘^ˆ
Ü˜*Ô%ä-¨jÓ9ˆD�H‰HŒNØÜˆz‹?œYÒ&Ø�N‰NÔØ×ÑÜ×5Ñ5Ø6°v°hÐ>PÐQð  õ ô �‹_œyÒ(Ü-¨jÓ9ˆD�H‰HŒNØ×ÑÜ×5Ñ5Ø6°v°h¸iÌ	À{ÐRSÐTð  õ ð )r1   r[   )rO   zOptional[SubclassProcessor]Úreturnr$   )rY   r#   r²   ÚNone)r²   r	   )r²   r   )rl   r   r²   r'   )rr   Úintr²   úIterable[float])ru   rµ   r²   úIterable[Vec3])é   )ry   Úfloatrz   r´   r²   r¶   )r�   r   r²   r'   )r”   r
   r²   r'   )r˜   r¸   r™   r¸   rš   r¸   r²   r'   )T)r²   r%   )r²   r   )r°   r&   r²   r³   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚDXFTYPEr   r   r   rV   Ú
DXFATTRIBSr   ÚMIN_DXF_VERSION_FOR_EXPORTrK   rT   Úpropertyr\   rc   re   rg   rm   ru   ra   rx   r|   Úclassmethodr‰   r’   r—   r¡   r£   r©   Ú__classcell__)rQ   s   @r/   r'   r'   m   sÍ   ø„ áà€GÙ˜z¨;¸ÓE€JØ!(Ðð 8<ðØ4ðà	õõ
ð, òXó ðXð ò>ó ð>ð ò<ó ð<ó

óó	7ó	=ôGò0ð ò;ó ð;ó(ó	ôó*÷
ñ r1   )r.   r¸   r²   Úbool)r.   r¸   r²   r¸   )?Ú
__future__r   Útypingr   r   r   ro   Úezdxf.auditr   Úezdxf.lldxfr   Ú
ezdxf.mathr	   r
   r   r   r   r   r   r   Úezdxf.lldxf.attributesr   r   r   r   r   r   r   Úezdxf.lldxf.constr   r   Ú	dxfentityr   r   Údxfgfxr   r   r   r    r!   Úfactoryr"   Úezdxf.lldxf.tagwriterr#   rœ   r$   r%   r&   Ú__all__r*   r,   r-   r0   r5   Úpoint3dÚis_not_null_vectorrp   rV   Úacdb_ellipse_group_coderM   ÚpiÚHALF_PIr'   © r1   r/   Ú<module>rÖ      s]  ðõ #ß 4Ñ 4Û Ý "Ý !÷	÷ 	ó 	÷÷ ñ ÷ 7ß 4÷õ õ %áÝ7ß3Ý#ð ˆ+€à€	Ø€	Ø
€ó7ó	ñ Øá˜" E§M¡M¸7ÔCáØØ—-‘-ØØ×2Ñ2ô	
ñ ØØ—-‘-ØØØ×2Ñ2Ø ô
ñ Ø˜	¨^ÐCSô
ñ ˜r¨1Ô-á˜R¨¯©Ô2ñ5ó€ñ> -¨\Ó:Ð Ù6ØÐ4óÐ ð �'‰'�C‰-€ð ôRˆjó Ró ñRr1   