
    Ogr*                       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    [/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/ellipse.pyis_valid_ratior0   3   s"     E
6i#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JE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6yA..s4N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.?.?@ HHNN
 	A&yk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    hh!!$s~~"6S]]8KSYYWWr1   c                f    t        | j                  | j                  j                  g            d   S Nr   )listverticesrP   rE   rN   s    r/   start_pointzEllipse.start_point   s(    DMM488#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(    DMM488#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    hh"JJNNMMIIOOMM
 	
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      $$txx/hh  488+%%eS#666s   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4V<<<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28X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 )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   )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U6UU4##)I#J''00;;x1kk+v6;;x-M15kk+s3 1 
 	q||~&ww'vzzw::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 )zOptimized 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    
 r2r*TXX__<** 2 22r2 >?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  vv&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$((--.
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[   )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;EJ!( 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	 "EMM7C--22	
 --22 
 	^CS
 r1-R25> -\: 64  ''C- Rj R Rr1   