
    h .                    ^   S SK Jr  S SKJr  S SKrS SKJrJrJrJ	r	J
r
JrJrJrJrJr  \(       a  S SKJr  / SQr\" 5       rS\R(                  -  r\R(                  S-  r " S S	\5      r " S
 S\5      r " S S\5      r      SS jrSS jr " S S5      r " S S5      r " S S5      rg)    )annotations)TYPE_CHECKINGN)
Vec3Vec2UVecX_AXISY_AXISZ_AXISMatrix44signOCSarc_angle_span_rad)
DXFGraphic)TransformErrorNonUniformScalingErrorInsertTransformationErrortransform_extrusion-transform_thickness_and_extrusion_without_ocsOCSTransformWCSTransformInsertCoordinateSystemg     f@c                      \ rS rSrSrg)r   &    N__name__
__module____qualname____firstlineno____static_attributes__r       K/var/www/html/env/lib/python3.13/site-packages/ezdxf/math/transformtools.pyr   r   &       r!   r   c                      \ rS rSrSrg)r   *   r   Nr   r   r!   r"   r   r   *   r#   r!   r   c                      \ rS rSrSrg)r   .   r   Nr   r   r!   r"   r   r   .   r#   r!   r   c                   U R                   R                  S5      (       a  U R                   R                  n[        U5      nUR	                  U R                   R
                  U-  5      nUR                  U-  U R                   l        UR                  5       U R                   l        g U R                   R                  S5      (       aE  UR	                  U R                   R
                  5      nUR                  5       U R                   l        g g )N	thickness	extrusion)dxfhasattrr)   r   transform_directionr*   	magnitude	normalize)entitymr)   
reflectionr*   s        r"   r   r   2   s     zz+&&JJ((	)_
))&***>*>*JK	(22Z?

(224

			K	(	())&***>*>?	(224

 
)r!   c                ,   [        U 5      nUR                  [        5      nUR                  [        5      nUR	                  X445      u  pV[
        R                  " UR                  UR                  SS9nUR                  U5      R                  5       nX4$ )a  Transforms the old `extrusion` vector into a new extrusion vector.
Returns the new extrusion vector and a boolean value: ``True`` if the new
OCS established by the new extrusion vector has a uniform scaled xy-plane,
else ``False``.

The new extrusion vector is perpendicular to plane defined by the
transformed x- and y-axis.

Args:
    extrusion: extrusion vector of the old OCS
    m: transformation matrix

Returns:

&.>abs_tol)
r   to_wcsr   r	   transform_directionsmathisclosemagnitude_squarecrossr/   )	r*   r1   ocsocs_x_axis_in_wcsocs_y_axis_in_wcsx_axisy_axis
is_uniformnew_extrusions	            r"   r   r   @   s      i.C

6*

6*++->,RSNF !8!8$J LL(224M$$r!   c                     \ rS rSrSSS jjrSS jr\SS j5       r\SS j5       r\	 S       SS jj5       r
SSS jjrSS	 jr\rSS
 jrSS jrS S jrS!S jrS"S jrS#S jrS#S jrS$S jr      S$S jrS%S jrSrg)&r   ]   Nc                    Uc  [        5       U l        OX l        SU l        Uc  U R                  [        [        S5        g [        X5      u  p4U R                  [        U5      [        U5      U5        g )NT)r   r1   scale_uniform
_reset_ocs_PLACEHOLDER_OCSr   r   )selfr*   r1   rC   rG   s        r"   __init__OCSTransform.__init__^   s[    9ZDFF#'OO,.>E+>y+L(MOOC	NC,>Nr!   c                (    Xl         X l        X0l        g N)old_ocsnew_ocsrG   )rJ   rO   rP   rG   s       r"   rH   OCSTransform._reset_ocsj   s    *r!   c                .    U R                   R                  $ rN   )rO   uzrJ   s    r"   old_extrusionOCSTransform.old_extrusiono       ||r!   c                .    U R                   R                  $ rN   )rP   rS   rT   s    r"   rC   OCSTransform.new_extrusions   rW   r!   c                6    U " US9nUR                  XU5        U$ )N)r1   )rH   )clsoldnewr1   rG   r=   s         r"   from_ocsOCSTransform.from_ocsw   s      Ahs/
r!   c                    U R                   R                  U R                  R                  U5      5      R                  [        U5      -  $ )zReturns magnitude of `length` direction vector transformed from
old OCS into new OCS including `reflection` correction applied.
)r1   r-   rO   r7   r.   r   )rJ   lengthr2   s      r"   transform_lengthOCSTransform.transform_length   sA     vv))$,,*=*=f*EFPPSWT
 
 	
r!   c                    [        U5      nUS:  a0  [        U R                  USS45      U R                  SUS45      5      $ g)z\Transform the width of a linear OCS entity from the old OCS
into the new OCS. (LWPOLYLINE!)
-q=r   g        )absmaxrb   )rJ   width	abs_widths      r"   transform_widthOCSTransform.transform_width   sQ     J	u%%y!Q&78%%q)Q&78  r!   c                    U R                   R                  U5      nU R                  R                  U5      nU R                  R                  U5      $ )z=Transform an OCS direction from the old OCS into the new OCS.)rO   r7   r1   r-   rP   from_wcs)rJ   	directionold_wcs_directionnew_wcs_directions       r"   transform_ocs_direction$OCSTransform.transform_ocs_direction   sE     !LL//	: FF667HI||$$%677r!   c                R    U R                  [        SSU5      5      nUR                  $ )zTransform the thickness attribute of an OCS entity from the old OCS
into the new OCS.

Thickness is always applied in the z-axis direction of the OCS
a.k.a. extrusion vector.

r   )rq   r   z)rJ   r)   new_ocs_thicknesss      r"   transform_thickness OCSTransform.transform_thickness   s*     !88aI9NO """r!   c                    U R                   R                  U R                  R                  U R                  R                  U5      5      5      $ )z5Returns vertex transformed from old OCS into new OCS.)rP   rm   r1   	transformrO   r7   )rJ   vertexs     r"   transform_vertexOCSTransform.transform_vertex   s5    ||$$TVV%5%5dll6I6I&6Q%RSSr!   c           	         [        U5      R                  US9n[        U R                  R	                  U R
                  R                  U R                  R                  U5      5      5      5      $ )z8Returns 2D vertex transformed from old OCS into new OCS.)rt   )	r   replacer   rP   rm   r1   ry   rO   r7   )rJ   rz   	elevationvs       r"   transform_2d_vertex OCSTransform.transform_2d_vertex   sQ    L  9 -DLL))$&&*:*:4<<;N;Nq;Q*RSTTr!   c                    U R                   R                  U R                  R                  U R                  R                  U5      5      5      $ )z8Returns direction transformed from old OCS into new OCS.)rP   rm   r1   r-   rO   r7   )rJ   rn   s     r"   r-    OCSTransform.transform_direction   s:    ||$$FF&&t||':':9'EF
 	
r!   c                `    U R                  [        R                  " U5      5      R                  $ )zAReturns angle (in radians) from old OCS transformed into new OCS.)r-   r   
from_angleanglerJ   r   s     r"   transform_angleOCSTransform.transform_angle   s"    ''(>?EEEr!   c                @    U R                  U[        -  5      [        -  $ )zAReturns angle (in degrees) from old OCS transformed into new OCS.)r   RADIANSDEGr   s     r"   transform_deg_angle OCSTransform.transform_deg_angle   s    ##EGO4s::r!   c                   [        X5      nU R                  U5      nU R                  U5      n[        R                  " U[        R                  5      (       a!  SnU R                  X-   5      n[        XF5      nOI[        R                  " U[        R
                  5      (       a  XD[        R
                  -   4$ [        XE5      n[        R                  " X7SS9(       a  XE4$ XT4$ )zvReturns arc start- and end angle (in radians) from old OCS
transformed into new OCS in counter-clockwise orientation.
      ?g:0yE>)rel_tol)r   r   r9   r:   pitau)rJ   startendold_angle_span	new_startnew_endchecknew_angle_spans           r"   transform_ccw_arc_angles%OCSTransform.transform_ccw_arc_angles   s     ,E7((/	&&s+<<00 N(()?@E/	AN\\.$((33$((222/	CN <<E%%%%r!   c                j    U R                  U[        -  U[        -  5      u  pU[        -  U[        -  4$ )zrReturns start- and end angle (in degrees) from old OCS transformed
into new OCS in counter-clockwise orientation.
)r   r   r   )rJ   r   r   s      r"   transform_ccw_arc_angles_deg)OCSTransform.transform_ccw_arc_angles_deg   s3     2257?C'MR
s{C#I%%r!   c                   U R                   nU R                  R                  UR                  UR                  UR
                  45      u  p4nUR                  UR                  -  nUR                  UR                  -  nUR                  UR                  -  nUR                  U5      R                  5       n	U	R                  UR                  5       SS9(       d  U* n[        XgU5      $ )Nre   r5   )rO   r1   r8   uxuyrS   r.   xyrt   r<   r/   r:   r   )
rJ   vecr=   r   r   rS   x_scaley_scalez_scaleexpected_uys
             r"   transform_scale_vector#OCSTransform.transform_scale_vector   s    llVV00#&&#&&#&&1IJ
,,&,,&,,&hhrl,,.""2<<>5"AhGGg..r!   )r1   rP   rO   rG   )NN)r*   zVec3 | Noner1   zMatrix44 | None)rO   r   rP   r   rG   boolreturnNone)r   r   )T)r\   r   r]   r   r1   r   r   r   )r   )ra   r   r   float)rh   r   r   r   )rn   r   r   r   )r)   r   r   r   )rz   r   r   r   )rz   r   r   r   r   r   )rn   r   r   r   )r   r   r   r   )r   r   r   r   r   ztuple[float, float])r   r   r   r   )r   r   r   r   rK   rH   propertyrU   rC   classmethodr^   rb   rj   transform_scale_factorrq   rv   r{   r   r-   r   r   r   r   r   r    r   r!   r"   r   r   ]   s    
O+
     <@$,	 

 .8#TU

F;&.&&!&&	&
/r!   r   c                  ,    \ rS rSrSS jrSSS jjrSrg)	r      c                   Xl         UR                  [        5      nUR                  [        5      nUR                  [        5      nUR
                  n[        R                  " XSR
                  5      U l        U R                  =(       a     [        R                  " XTR
                  5      U l	        U R                  S5      U l        g )Nr   )r1   r-   r   r	   r
   r;   r9   r:   has_uniform_xy_scalinghas_uniform_xyz_scalingrb   uniform_scale)rJ   r1   new_xnew_ynew_znew_x_mag_squs         r"   rK   WCSTransform.__init__   s    %%f-%%f-%%f-..&*ll11'
# (,'B'B (
t||11H
$ "2237r!   c                    US:X  a  [        USS5      nO7US:X  a  [        SUS5      nO#US:X  a  [        SSU5      nO[        SU S35      eU R                  R                  U5      R                  $ )Nr   r   r   rt   zinvalid axis '')r   
ValueErrorr1   r-   r.   )rJ   valueaxisr   s       r"   rb   WCSTransform.transform_length   sp    3;UAq!AS[Qq!AS[Q5!A~dV1566vv))!,666r!   )r   r   r1   r   N)r1   r   )r   )r   r   r   strr   r   )r   r   r   r   rK   rb   r    r   r!   r"   r   r      s    8	7 	7r!   r   c                  <    \ rS rSr        SS jrSSS jjrSrg)	r   i
  c                    [        U5      U l        [        US   5      U l        [        US   5      U l        [        US   5      U l        [        U5      U l        [        U5      U l        g)zDefines an INSERT coordinate system.

Args:
    insert: insertion location
    scale: scaling factors for x-, y- and z-axis
    rotation: rotation angle around the extrusion vector in degrees
    extrusion: extrusion vector which defines the :ref:`OCS`

r         N)r   insertr   scale_factor_xscale_factor_yscale_factor_zrotationr*   )rJ   r   scaler   r*   s        r"   rK   InsertCoordinateSystem.__init__  sU      6l#E!Ho#E!Ho#E!Hohir!   c                   [        U R                  5      nUR                  UR                  UR                  UR
                  45      u  pEnUR                  U R                  -  nUR                  U R                  -  nUR                  U R                  -  n	UR                  5       nUR                  5       nUR                  5       n[        UR                  U5      5      U:  d<  [        UR                  U5      5      U:  d  [        UR                  U5      5      U:  a  [        S5      eUR                  U5      n
U
R                  XRS9(       d  U* n[         R#                  [        U R                  5      [        U5      U5      n[%        UR'                  U R(                  5      XxU	4UR+                  U R,                  5      US9$ )zpReturns the transformed INSERT coordinate system.

Args:
    m: transformation matrix
    tol: tolerance value

zNon-orthogonal target system.r5   )r   r   r   r*   )r   r*   r8   r   r   rS   r.   r   r   r   r/   rf   dotr   r<   r:   r   r^   r   r{   r   r   r   )rJ   r1   tolr=   r   r   rS   r   r   r   r   ocs_transforms               r"   ry    InsertCoordinateSystem.transform"  sd    $..! ++SVVSVVSVV,DE
 ,,!4!44,,!4!44,,!4!44\\^\\^\\^rvvbz?S Cr
Oc$9S_s=R+,KLL hhrl""2"3hG$--c$...A3r7AN% 11$++>W-"66t}}E	
 	
r!   )r*   r   r   r   r   r   N)r   r   r   ztuple[float, float, float]r   r   r*   r   )r4   )r1   r   r   r   )r   r   r   r   rK   ry   r    r   r!   r"   r   r   
  s7    )) *) 	)
 ).%
 %
r!   r   )r0   r   r1   r   r   r   )r*   r   r1   r   r   ztuple[Vec3, bool]) 
__future__r   typingr   r9   
ezdxf.mathr   r   r   r   r	   r
   r   r   r   r   ezdxf.entitiesr   __all__rI   r   r   r   	Exceptionr   r   r   r   r   r   r   r   r   r!   r"   <module>r      s    #      )	 5 dggo
''E/	Y 		^ 		 	55#5	5%:O/ O/d7 76=
 =
r!   