
    ^j.                    P   d dl mZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZ erd dlmZ g dZ e       Zdej(                  z  Zej(                  dz  Z G d d	e      Z G d
 de      Z G d de      Z	 	 	 	 	 	 ddZddZ G d d      Z G d d      Z G d d      Zy)    )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                      e Zd Zy)r   N__name__
__module____qualname__     R/opt/ringagent/.cad-venv/lib/python3.12/site-packages/ezdxf/math/transformtools.pyr   r   &       r   r   c                      e Zd Zy)r   Nr   r   r   r   r   r   *   r    r   r   c                      e Zd Zy)r   Nr   r   r   r   r   r   .   r    r   r   c                2   t         }| j                  j                  d      rt        | j                  j                        }|j
                  rt         }| j                  j                  d      rU| j                  j                  }|r=t        |      }|j                  ||z        }|j                  |z  | j                  _        |j                  |      }	 |j                         | j                  _        y # t        $ r t         | j                  _        Y y w xY w)N	extrusion	thickness)r
   dxfhasattrr   r$   is_nullr%   r   transform_direction	magnitude	normalizeZeroDivisionError)entitymr$   r%   
reflections        r   r   r   2   s     Izz+&--.		zz+&JJ((	iJ--i).CDI#,#6#6#CFJJ %%i0I&(224

 &%

&s   C5 5DDc                6   t        |       }|j                  t              }|j                  t              }|j	                  ||f      \  }}t        j                  |j                  |j                  d      }|j                  |      j                         }||fS )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$   r.   ocsocs_x_axis_in_wcsocs_y_axis_in_wcsx_axisy_axis
is_uniformnew_extrusions	            r   r   r   I   s      i.C

6*

6*++->@Q,RSNFF !8!8$J LL(224M*$$r   c                      e Zd ZdddZddZedd       Zedd       Ze	 d	 	 	 	 	 	 	 dd       Z	dddZ
ddZe
Zdd	Zdd
ZddZddZd dZd!dZd!dZd"dZ	 	 	 	 	 	 d"dZd#dZy)$r   Nc                    |t               | _        n|| _        d| _        || j                  t        t        d       y t        ||      \  }}| j                  t        |      t        |      |       y )NT)r   r.   scale_uniform
_reset_ocs_PLACEHOLDER_OCSr   r   )selfr$   r.   r@   rC   s        r   __init__zOCSTransform.__init__g   sa    9ZDFDF#'OO,.>E+>y!+L(M=OOC	NC,>Nr   c                .    || _         || _        || _        y N)old_ocsnew_ocsrC   )rF   rJ   rK   rC   s       r   rD   zOCSTransform._reset_ocss   s    *r   c                .    | j                   j                  S rI   )rJ   uzrF   s    r   old_extrusionzOCSTransform.old_extrusionx       ||r   c                .    | j                   j                  S rI   )rK   rM   rN   s    r   r@   zOCSTransform.new_extrusion|   rP   r   c                >     | |      }|j                  |||       |S )N)r.   )rD   )clsoldnewr.   rC   r:   s         r   from_ocszOCSTransform.from_ocs   s"     AhsC/
r   c                    | j                   j                  | j                  j                  |            j                  t        |      z  S )zReturns magnitude of `length` direction vector transformed from
        old OCS into new OCS including `reflection` correction applied.
        )r.   r)   rJ   r4   r*   r   )rF   lengthr/   s      r   transform_lengthzOCSTransform.transform_length   sA     vv))$,,*=*=f*EFPPSWT
 
 	
r   c                    t        |      }|dkD  r0t        | j                  |ddf      | j                  d|df            S y)zlTransform the width of a linear OCS entity from the old OCS
        into the new OCS. (LWPOLYLINE!)
        -q=r   g        )absmaxrY   )rF   width	abs_widths      r   transform_widthzOCSTransform.transform_width   sQ     J	u%%y!Q&78%%q)Q&78  r   c                    | j                   j                  |      }| j                  j                  |      }| j                  j                  |      S )z=Transform an OCS direction from the old OCS into the new OCS.)rJ   r4   r.   r)   rK   from_wcs)rF   	directionold_wcs_directionnew_wcs_directions       r   transform_ocs_directionz$OCSTransform.transform_ocs_direction   sE     !LL//	: FF667HI||$$%677r   c                R    | j                  t        dd|            }|j                  S )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   )rf   r   z)rF   r%   new_ocs_thicknesss      r   transform_thicknessz OCSTransform.transform_thickness   s*     !88aI9NO """r   c                    | j                   j                  | j                  j                  | j                  j                  |                  S )z5Returns vertex transformed from old OCS into new OCS.)rK   rb   r.   	transformrJ   r4   )rF   vertexs     r   transform_vertexzOCSTransform.transform_vertex   s5    ||$$TVV%5%5dll6I6I&6Q%RSSr   c           	         t        |      j                  |      }t        | j                  j	                  | j
                  j                  | j                  j                  |                        S )z8Returns 2D vertex transformed from old OCS into new OCS.)rh   )	r   replacer   rK   rb   r.   rl   rJ   r4   )rF   rm   	elevationvs       r   transform_2d_vertexz OCSTransform.transform_2d_vertex   sQ    L  9 -DLL))$&&*:*:4<<;N;Nq;Q*RSTTr   c                    | j                   j                  | j                  j                  | j                  j                  |                  S )z8Returns direction transformed from old OCS into new OCS.)rK   rb   r.   r)   rJ   r4   )rF   rc   s     r   r)   z OCSTransform.transform_direction   s:    ||$$FF&&t||':':9'EF
 	
r   c                ^    | j                  t        j                  |            j                  S )zAReturns angle (in radians) from old OCS transformed into new OCS.)r)   r   
from_angleanglerF   rw   s     r   transform_anglezOCSTransform.transform_angle   s"    ''(>?EEEr   c                @    | j                  |t        z        t        z  S )zAReturns angle (in degrees) from old OCS transformed into new OCS.)ry   RADIANSDEGrx   s     r   transform_deg_anglez OCSTransform.transform_deg_angle   s    ##EGO4s::r   c                   t        ||      }| j                  |      }| j                  |      }t        j                  |t        j                        r#d}| j                  ||z         }t        ||      }nEt        j                  |t        j
                        r||t        j
                  z   fS t        ||      }t        j                  ||d      r||fS ||fS )zReturns arc start- and end angle (in radians) from old OCS
        transformed into new OCS in counter-clockwise orientation.
              ?g:0yE>)rel_tol)r   ry   r6   r7   pitau)rF   startendold_angle_span	new_startnew_endchecknew_angle_spans           r   transform_ccw_arc_anglesz%OCSTransform.transform_ccw_arc_angles   s     ,E37((/	&&s+<<0 N(()?@E/	5AN\\.$((3i$((222/	7CN <<Eg%%I%%r   c                l    | j                  |t        z  |t        z        \  }}|t        z  |t        z  fS )zReturns start- and end angle (in degrees) from old OCS transformed
        into new OCS in counter-clockwise orientation.
        )r   r{   r|   )rF   r   r   s      r   transform_ccw_arc_angles_degz)OCSTransform.transform_ccw_arc_angles_deg   s5     2257?C'MR
ss{C#I%%r   c                   | j                   }| j                  j                  |j                  |j                  |j
                  f      \  }}}|j                  |j                  z  }|j                  |j                  z  }|j                  |j                  z  }|j                  |      j                         }	|	j                  |j                         d      s| }t        |||      S )Nr[   r2   )rJ   r.   r5   uxuyrM   r*   xyrh   r9   r+   r7   r   )
rF   vecr:   r   r   rM   x_scaley_scalez_scaleexpected_uys
             r   transform_scale_vectorz#OCSTransform.transform_scale_vector   s    llVV00#&&#&&#&&1IJ
B,,&,,&,,&hhrl,,.""2<<>5"AhGGWg..r   )NN)r$   zVec3 | Noner.   zMatrix44 | None)rJ   r   rK   r   rC   boolreturnNone)r   r   )T)rT   r   rU   r   r.   r   r   r   )r   )rX   r   r   float)r^   r   r   r   )rc   r   r   r   )r%   r   r   r   )rm   r   r   r   )rm   r   rq   r   r   r   )rc   r   r   r   )rw   r   r   r   )r   r   r   r   r   ztuple[float, float])r   r   r   r   )r   r   r   rG   rD   propertyrO   r@   classmethodrV   rY   r`   transform_scale_factorrf   rj   rn   rs   r)   ry   r}   r   r   r   r   r   r   r   r   f   s    
O+
     <@$,	 

 .8#TU

F;&.&&!&&	&
/r   r   c                      e Zd ZddZdddZy)r   c                   || _         |j                  t              }|j                  t              }|j                  t              }|j
                  }t        j                  ||j
                        | _        | j                  xr  t        j                  ||j
                        | _	        | j                  d      | _        y )Nr   )r.   r)   r   r	   r
   r8   r6   r7   has_uniform_xy_scalinghas_uniform_xyz_scalingrY   uniform_scale)rF   r.   new_xnew_ynew_znew_x_mag_squs         r   rG   zWCSTransform.__init__   s    %%f-%%f-%%f-..&*ll511'
# (,'B'B (
t||511H
$ "2237r   c                    |dk(  rt        |dd      }n5|dk(  rt        d|d      }n"|dk(  rt        dd|      }nt        d| d      | j                  j                  |      j                  S )Nr   r   r   rh   zinvalid axis '')r   
ValueErrorr.   r)   r*   )rF   valueaxisrr   s       r   rY   zWCSTransform.transform_length  sp    3;UAq!AS[Qq!AS[Q5!A~dV1566vv))!,666r   N)r.   r   )r   )r   r   r   strr   r   )r   r   r   rG   rY   r   r   r   r   r      s    8	7r   r   c                  .    e Zd Z	 	 	 	 	 	 	 	 ddZdddZy)r   c                    t        |      | _        t        |d         | _        t        |d         | _        t        |d         | _        t        |      | _        t        |      | _        y)a.  Defines 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$   )rF   r   scaler   r$   s        r   rG   zInsertCoordinateSystem.__init__  sU      6l#E!Ho#E!Ho#E!Hohir   c                   t        | j                        }|j                  |j                  |j                  |j
                  f      \  }}}|j                  | j                  z  }|j                  | j                  z  }|j                  | j                  z  }	|j                         }|j                         }|j                         }t        |j                  |            |kD  s:t        |j                  |            |kD  st        |j                  |            |kD  rt        d      |j                  |      }
|
j                  ||      s| }t         j#                  t        | j                        t        |      |      }t%        |j'                  | j(                        |||	f|j+                  | j,                        |      S )zReturns the transformed INSERT coordinate system.

        Args:
            m: transformation matrix
            tol: tolerance value

        zNon-orthogonal target system.r2   )r   r   r   r$   )r   r$   r5   r   r   rM   r*   r   r   r   r+   r\   dotr   r9   r7   r   rV   r   rn   r   r}   r   )rF   r.   tolr:   r   r   rM   r   r   r   r   ocs_transforms               r   rl   z InsertCoordinateSystem.transform+  sj    $..! ++SVVSVVSVV,DE
B ,,!4!44,,!4!44,,!4!44\\^\\^\\^rvvbz?S Cr
Oc$9S_s=R+,KLL hhrl""2s"3hG$--c$...A3r7AN% 11$++>GW-"66t}}E	
 	
r   N)r   r   r   ztuple[float, float, float]r   r   r$   r   )r1   )r.   r   r   r   )r   r   r   rG   rl   r   r   r   r   r     s2    )) *) 	)
 ).%
r   r   )r-   r   r.   r   r   r   )r$   r   r.   r   r   ztuple[Vec3, bool]) 
__future__r   typingr   r6   
ezdxf.mathr   r   r   r   r	   r
   r   r   r   r   ezdxf.entitiesr   __all__rE   r   r|   r{   	Exceptionr   r   r   r   r   r   r   r   r   r   r   <module>r      s    #      )	 5 dggo
''E/	Y 		^ 		 	&&#&	&.%:O/ O/d7 76=
 =
r   