
    'jr*                       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j6        e           edej6        ee
j7                   edej6        ed e
j7        e!           ed"e2e4e5#           ed$d %           ed&ej8        %          d'          Z9 ee9          Z: ee'e:          Z;ej<        d(z  Z=e) G d) de#                      Z>dS ),    )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&.>ratiofloatreturnboolc                `    t           t          |           cxk    ot          t          z   k     n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)r)   s    P/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/entities/ellipse.pyis_valid_ratior3   3   s0     E

6666i#o66666    c                    | dk     rdnd}t          |           } | t          k     r
t          |z  S | t          k    r
t          |z  S | |z  S )zVClamp axis-ratio into valid range and remove possible floating point imprecision.
    r   r   )r/   r.   r0   )r)   signs     r2   clamp_axis_ratior8   :   sV     22DJJEy4y44<r4   AcDbEllipse
   )xtypedefault   )r;   r<   r      T)r;   r<   optionalr   fixer(   )r<   r   r@   )   )r<   *   center
major_axis	extrusionr)   start_param	end_paramg       @c                      e Zd ZdZdZ eeee          Z	e
Z	 d4d5 fdZd6 fdZed7d            Zed7d            Zed7d            Zd8dZd9dZd:dZd;dZd<d=d Zd! Zed>d$            Zd?d'Zd@d+ZdAdBd.ZdCd0ZdD fd3Z xZS )Er'   zDXF ELLIPSE entityELLIPSEN	processorOptional[SubclassProcessor]r+   r$   c                    t          t          |                               |          }|r|                    |t                     |S )z!Loading interface. (internal API))superr   load_dxf_attribssimple_dxfattribs_loadermerged_ellipse_group_codes)selfrL   dxf	__class__s      r2   rP   zEllipse.load_dxf_attribsu   sG    
 J%%66yAA 	P..s4NOOO
r4   	tagwriterr#   Nonec                |   t                                          |           |                    t          t          j                   t          | j        j                  sJ dt           dt           d            t          | j        j                  | j        _        | j                            |g d           dS )z(Export entity specific data as DXF tags.zaxis-ratio out of range [z, ]rD   N)rO   export_entity
write_tag2r   acdb_ellipsenamer3   rT   r)   r.   r0   r8   export_dxf_attribs)rS   rV   rU   s     r2   rZ   zEllipse.export_entity   s    i(((_l.?@@@ HN
 
 	A 	A@y@@I@@@	A 	A 
 *$(.99##  
	
 
	
 
	
 
	
 
	
r4   r	   c                    | j         }t          j        t          |j                  t          |j                  |j                  S N)rT   r   
minor_axisr	   rF   rG   r)   rS   rT   s     r2   ra   zEllipse.minor_axis   s4    h!$s~"6"6S]8K8KSYWWWr4   c                h    t          |                     | j        j        g                    d         S Nr   )listverticesrT   rH   rS   s    r2   start_pointzEllipse.start_point   s)    DMM48#7"899::1==r4   c                h    t          |                     | j        j        g                    d         S rd   )re   rf   rT   rI   rg   s    r2   	end_pointzEllipse.end_point   s)    DMM48#5"67788;;r4   r   c                t    | j         }t          |j        |j        |j        |j        |j        |j                  S )zBReturns construction tool :class:`ezdxf.math.ConstructionEllipse`.)rT   r   rE   rF   rG   r)   rH   rI   rb   s     r2   construction_toolzEllipse.construction_tool   s9    h"JNMIOM
 
 	
r4   ec                T    |                      |                                           | S )zbSet ELLIPSE data from construction tool
        :class:`ezdxf.math.ConstructionEllipse`.

        )update_dxf_attribs
dxfattribsrS   rm   s     r2   apply_construction_toolzEllipse.apply_construction_tool   s%    
 	///r4   numintIterable[float]c              #     K   | j         j        t          j        z  }| j         j        t          j        z  }t          j        |||          E d{V  dS )u   Returns `num` params from start- to end param in counter-clockwise
        order.

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

        N)rT   rH   mathtaurI   r   
get_params)rS   rs   startends       r2   paramszEllipse.params   sW       $tx/h 48+%eS#66666666666r4   r|   Iterable[Vec3]c              #  d   K   |                                                      |          E d{V  dS )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)rl   rf   )rS   r|   s     r2   rf   zEllipse.vertices   s@       ))++44V<<<<<<<<<<<r4      distancer*   segmentsc                R    |                                                      ||          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

        )rl   
flattening)rS   r   r   s      r2   r   zEllipse.flattening   s&     %%''228XFFFr4   c                    |                                  }|                                 |                     |                                           dS )z.Swap axis and adjust start- and end parameter.N)rl   	swap_axisro   rp   rq   s     r2   r   zEllipse.swap_axis   sB    ""$$	/////r4   entityr   c           
        |                                 dv s
J d            |                    h d          }t          j                            |                    dt                    |                    dt                    |                    dd          |                    d	d
          |                    dd                    }|	                    |                                           | 
                    ||j                  S )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)droprE   rG   radiusr(   start_angler   	end_angleih  )rE   rG   r   r   r   )rp   doc)dxftyperp   r   r   from_arcgetr   r   popupdatenewr   )clsr   attribsrm   s       r2   r   zEllipse.from_arc   s     ~~#44446U444##)I)I)I#JJ'00;;x11kk+v66;;x--M155kk+s33 1 
 
 	q||~~&&&ww'vzw:::r4   mr
   c                    |                                  }|                    |           |                     |                                           |                     |           | S )zBTransform the ELLIPSE entity by transformation matrix `m` inplace.)rl   	transformro   rp   post_transform)rS   r   rm   s      r2   r   zEllipse.transform   sW    ""$$	A///Ar4   dxdydzc                    t          |||          | j        j        z   | j        _        | j        r)|                     t          j        |||                     | S )zOptimized ELLIPSE translation about `dx` in x-axis, `dy` in y-axis
        and `dz` in z-axis, returns `self` (floating interface).

        )r	   rT   rE   is_post_transform_requiredr   r
   	translate)rS   r   r   r   s       r2   r   zEllipse.translate   sV    
 r2r**TX_<* 	@ 22r2 > >???r4   Tr%   c                    ddl m}  |j        |           }|                                 }|
J d            |rt	          | ||           n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%   Nzvalid layout required)ezdxf.entitiesr%   r   
get_layoutr    r   )rS   replacer%   splinelayouts        r2   	to_splinezEllipse.to_spline	  s}     	*))))) &&""!!#:!!! 	'40000vv&&&r4   r   c                    t                      S r`   )r   rg   s    r2   ocszEllipse.ocs  s     uur4   auditorr&   c                   | j         sd S t                                          |           t          |           }t	          | j        j                  }|j        r<|                    |            |	                    t          j        d| d           d S | j        j        }t          |          rt          |          | j        _        d S t          |          t           k    r;|                                  |	                    t          j        d| d           d S t          |          t&          k     rHt          |          | j        _        |	                    t          j        d| dt&           d           d S d S )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_aliverO   auditstrr	   rT   rF   is_nulltrashfixed_errorr   INVALID_MAJOR_AXISr)   r3   r8   r/   r0   r   INVALID_ELLIPSE_RATIOr.   )rS   r   r   rF   
axis_ratiorU   s        r2   r   zEllipse.audit#  s   } 	FgT$(-..
 	MM$2O6OOO      FX^
*%% 	-j99DHNFz??Y&&NN5QvQQQ        __y((-j99DHN5TvTT	TTT        )(r4   r`   )rL   rM   r+   r$   )rV   r#   r+   rW   )r+   r	   )r+   r   )rm   r   r+   r'   )rs   rt   r+   ru   )r|   ru   r+   r}   )r   )r   r*   r   rt   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+   rW   ) __name__
__module____qualname____doc__DXFTYPEr   r   r   r\   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTrP   rZ   propertyra   rh   rj   rl   rr   r|   rf   r   r   classmethodr   r   r   r   r   r   __classcell__)rU   s   @r2   r'   r'   m   s       Gz;EEJ!( 8<      
 
 
 
 
 
, X X X XX > > > X> < < < X<

 

 

 

   	7 	7 	7 	7	= 	= 	= 	=G G G G G0 0 0 ; ; ; [;(   	 	 	 	    *   
         r4   )r)   r*   r+   r,   )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.   r0   r1   r3   r8   point3dis_not_null_vectorrx   r\   acdb_ellipse_group_coderR   piHALF_PIr'    r4   r2   <module>r      s   # " " " " " 4 4 4 4 4 4 4 4 4 4  " " " " " " ! ! ! ! ! !	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                  7 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4              % $ $ $ $ $ $77777733333333###### +		
7 7 7 7	 	 	 	 {'"EM7CCCg-2	
 
 
 W-2 
 
 
 	^CS
 
 
 wr1---WR2225  > -,\:: 664   'C- R R R R Rj R R R R Rr4   