
    hr*                    z   S SK Jr  S SKJrJrJr  S SKrS SKJr  S SK	J
r
  S SKJrJrJrJrJrJrJrJr  S SKJrJrJrJrJrJrJr  S SKJrJr  S	S
KJ r J!r!  S	SK"J#r#J$r$J%r%J&r&J'r'  S	SK(J)r)  \(       a  S SK*J+r+  S SK,J-r-J.r.  S SKJ/r/  S/r0Sr1Sr2Sr3S&S jr4S'S jr5\" S\" S\Rl                  \S9\" S\Rl                  \\
Rn                  S9\" S\Rl                  \S\
Rn                  \S9\" S\2\4\5S9\" S S S!9\" S"\Rp                  S!9S#.5      r9\" \95      r:\" \'\:5      r;\Rx                  S$-  r=\) " S% S\#5      5       r>g)(    )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                \    [         [        U 5      s=:*  =(       a    [        [        -   :  $ s  $ )zsCheck 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    H/var/www/html/env/lib/python3.13/site-packages/ezdxf/entities/ellipse.pyis_valid_ratior0   3   s%     E
66i#o6666    c                    U S:  a  SOSn[        U 5      n U [        :  a	  [        U-  $ U [        :  a	  [        U-  $ X-  $ )zVClamp axis-ratio into valid range and remove possible floating point imprecision.
    r   r   )r+   r*   r,   )r.   signs     r/   clamp_axis_ratior5   :   sH     2DJEy4y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                  0  ^  \ rS rSrSrSr\" \\\	5      r
\r S   SU 4S jjjrSU 4S jjr\SS j5       r\SS j5       r\SS j5       rSS	 jrSS
 jrSS jrSS jrSSS jjrS r\S S j5       rS!S jrS"S jrS#S$S jjrS%S jrS&U 4S jjrSr U =r!$ )'r'   m   zDXF ELLIPSE entityELLIPSEc                h   > [         [        U ]  U5      nU(       a  UR                  U[        5        U$ )z!Loading interface. (internal API))superr   load_dxf_attribssimple_dxfattribs_loadermerged_ellipse_group_codes)self	processordxf	__class__s      r/   rL   Ellipse.load_dxf_attribsu   s/    
 J6yA..s4NO
r1   c                x  > [         TU ]  U5        UR                  [        [        R
                  5        [        U R                  R                  5      (       d   S[         S[         S35       e[        U R                  R                  5      U R                  l        U R                  R                  U/ SQ5        g)z(Export entity specific data as DXF tags.zaxis-ratio out of range [z, ]rA   N)rK   export_entity
write_tag2r   acdb_ellipsenamer0   rQ   r.   r*   r,   r5   export_dxf_attribs)rO   	tagwriterrR   s     r/   rV   Ellipse.export_entity   s    i(_l.?.?@ HHNN
 
 	A&ykI;a@	A 
 *$((..9##
	
r1   c                    U R                   n[        R                  " [        UR                  5      [        UR
                  5      UR                  5      $ N)rQ   r   
minor_axisr	   rC   rD   r.   rO   rQ   s     r/   r_   Ellipse.minor_axis   s6    hh!!$s~~"6S]]8KSYYWWr1   c                f    [        U R                  U R                  R                  /5      5      S   $ Nr   )listverticesrQ   rE   rO   s    r/   start_pointEllipse.start_point   s(    DMM488#7#7"89:1==r1   c                f    [        U R                  U R                  R                  /5      5      S   $ rc   )rd   re   rQ   rF   rf   s    r/   	end_pointEllipse.end_point   s(    DMM488#5#5"678;;r1   c                    U R                   n[        UR                  UR                  UR                  UR
                  UR                  UR                  5      $ )zBReturns construction tool :class:`ezdxf.math.ConstructionEllipse`.)rQ   r   rB   rC   rD   r.   rE   rF   r`   s     r/   construction_toolEllipse.construction_tool   sB    hh"JJNNMMIIOOMM
 	
r1   c                D    U R                  UR                  5       5        U $ )zRSet ELLIPSE data from construction tool
:class:`ezdxf.math.ConstructionEllipse`.

)update_dxf_attribs
dxfattribsrO   es     r/   apply_construction_toolEllipse.apply_construction_tool   s    
 	/r1   c              #     #    U R                   R                  [        R                  -  nU R                   R                  [        R                  -  n[
        R                  " X#U5       Sh  vN   g N7f)u}   Returns `num` params from start- to end param in counter-clockwise
order.

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

N)rQ   rE   mathtaurF   r   
get_params)rO   numstartends       r/   paramsEllipse.params   sM      $$txx/hh  488+%%e#666s   A)A3+A1,A3c              #  ^   #    U R                  5       R                  U5       Sh  vN   g N7f)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)rm   re   )rO   r}   s     r/   re   Ellipse.vertices   s$      ))+44V<<<s   #-+-c                @    U R                  5       R                  X5      $ )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

)rm   
flattening)rO   distancesegmentss      r/   r   Ellipse.flattening   s     %%'228FFr1   c                    U R                  5       nUR                  5         U R                  UR                  5       5        g)z.Swap axis and adjust start- and end parameter.N)rm   	swap_axisrp   rq   rr   s     r/   r   Ellipse.swap_axis   s-    ""$	/r1   c           
        UR                  5       S;   d   S5       eUR                  1 SkS9n[        R                  R	                  UR                  S[        5      UR                  S[        5      UR                  SS5      UR                  S	S
5      UR                  SS5      S9nUR                  UR                  5       5        U R                  X!R                  S9$ )zCreate 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   )rq   doc)dxftyperq   r   r   from_arcgetr   r   popupdatenewr   )clsentityattribsrs   s       r/   r   Ellipse.from_arc   s     ~~#44U6UU4##)I#J''00;;x1kk+v6;;x-M15kk+s3 1 
 	q||~&ww'zzw::r1   c                    U R                  5       nUR                  U5        U R                  UR                  5       5        U R	                  U5        U $ )zBTransform the ELLIPSE entity by transformation matrix `m` inplace.)rm   	transformrp   rq   post_transform)rO   mrs   s      r/   r   Ellipse.transform   sB    ""$	A/Ar1   c                    [        XU5      U R                  R                  -   U R                  l        U R                  (       a&  U R	                  [
        R                  " XU5      5        U $ )z}Optimized ELLIPSE translation about `dx` in x-axis, `dy` in y-axis
and `dz` in z-axis, returns `self` (floating interface).

)r	   rQ   rB   is_post_transform_requiredr   r
   	translate)rO   dxdydzs       r/   r   Ellipse.translate   sL    
 rr*TXX__<** 2 222 >?r1   c                    SSK Jn  UR                  " U 5      nU R                  5       nUc   S5       eU(       a  [	        XU5        U$ [        X45        U$ )zConvert 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   )rO   replacer%   splinelayouts        r/   	to_splineEllipse.to_spline	  sV     	*&"!:#::!40  v&r1   c                    [        5       $ r^   )r   rf   s    r/   ocsEllipse.ocs  s     ur1   c                  > U R                   (       d  g [        TU ]	  U5        [        U 5      n[	        U R
                  R                  5      nUR                  (       a4  UR                  U 5        UR                  [        R                  SU S3S9  g U R
                  R                  n[        U5      (       a  [        U5      U R
                  l        g [        U5      [         :  a3  U R#                  5         UR                  [        R$                  SU S3S9  g [        U5      [&        :  aD  [        U5      U R
                  l        UR                  [        R$                  SU S[&         S3S9  g g )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_aliverK   auditstrr	   rQ   rC   is_nulltrashfixed_errorr   INVALID_MAJOR_AXISr.   r0   r5   r+   r,   r   INVALID_ELLIPSE_RATIOr*   )rO   auditorr   rC   
axis_ratiorR   s        r/   r   Ellipse.audit#  s5   }}gT$((--.
MM$22"6(*NO    XX^^
*%%-j9DHHNz?Y&NN556vh>PQ    _y(-j9DHHN556vhi	{RST    )r1    r^   )rP   zOptional[SubclassProcessor]returnr$   )r[   r#   r   None)r   r	   )r   r   )rs   r   r   r'   )rz   intr   Iterable[float])r}   r   r   Iterable[Vec3])   )r   floatr   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____firstlineno____doc__DXFTYPEr   r   r   rX   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTrL   rV   propertyr_   rg   rj   rm   rt   r}   re   r   r   classmethodr   r   r   r   r   r   __static_attributes____classcell__)rR   s   @r/   r'   r'   m   s    Gz;EJ!( 8<4	 
, X X > > < <

	7	=G0 ; ;(	*
 r1   )r.   r   r   bool)r.   r   r   r   )?
__future__r   typingr   r   r   rw   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_vectorrx   rX   acdb_ellipse_group_coderN   piHALF_PIr'   r   r1   r/   <module>r      s]   # 4 4  " !	 	 	   7 4  %73# +		
7	 "EMM7C--22	
 --22 
 	^CS
 r1-R25> -\: 64  ''C- Rj R Rr1   