
    'j .                    \   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dS )!    )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dS )r   N__name__
__module____qualname__     S/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/math/transformtools.pyr   r   &           Dr   r   c                      e Zd ZdS )r   Nr   r   r   r   r   r   *   r    r   r   c                      e Zd ZdS )r   Nr   r   r   r   r   r   .   r    r   r   entityr   mr   returnNonec                   | j                             d          rq| j         j        }t          |          }|                    | j         j        |z            }|j        |z  | j         _        |                                | j         _        d S | j                             d          r?|                    | j         j                  }|                                | j         _        d S d S )N	thickness	extrusion)dxfhasattrr(   r   transform_directionr)   	magnitude	normalize)r#   r$   r(   
reflectionr)   s        r   r   r   2   s     z+&& 5J(	)__
))&**>*JKK	(2Z?
(2244
			K	(	( 5))&**>??	(2244
5 5r   r)   r   tuple[Vec3, bool]c                T   t          |           }|                    t                    }|                    t                    }|                    ||f          \  }}t          j        |j        |j        d          }|                    |          	                                }||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   @   s      i..C

6**

6**++->@Q,RSSNFF !8$  J LL((2244M*$$r   c                      e Zd Zd2d3dZd4dZed5d            Zed5d            Ze	 d6d7d            Z	d8d9d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dAd.ZdAd/ZdBd1ZdS )Cr   Nr)   Vec3 | Noner$   Matrix44 | Nonec                    |t                      | _        n|| _        d| _        |#|                     t          t          d           d S t          ||          \  }}|                     t          |          t          |          |           d S )NT)r   r$   scale_uniform
_reset_ocs_PLACEHOLDER_OCSr   r   )selfr)   r$   rA   rF   s        r   __init__zOCSTransform.__init__^   s    9ZZDFFDF#'OO,.>EEEEE+>y!+L+L(M=OOC	NNC,>,>NNNNNr   old_ocsr   new_ocsrF   boolr%   r&   c                0    || _         || _        || _        d S N)rK   rL   rF   )rI   rK   rL   rF   s       r   rG   zOCSTransform._reset_ocsj   s    *r   r   c                    | j         j        S rO   )rK   uzrI   s    r   old_extrusionzOCSTransform.old_extrusiono       |r   c                    | j         j        S rO   )rL   rQ   rR   s    r   rA   zOCSTransform.new_extrusions   rT   r   Toldnewr   c                L     | |          }|                     |||           |S )N)r$   )rG   )clsrV   rW   r$   rF   r;   s         r   from_ocszOCSTransform.from_ocsw   s.     cAhhhsC///
r         ?lengthr   floatc                    | 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,   rK   r5   r-   r   )rI   r\   r/   s      r   transform_lengthzOCSTransform.transform_length   sF     v))$,*=*=f*E*EFFPSWT
 T
 
 	
r   widthc                    t          |          }|dk    r<t          |                     |ddf          |                     d|df                    S dS )zlTransform the width of a linear OCS entity from the old OCS
        into the new OCS. (LWPOLYLINE!)
        -q=r   g        )absmaxr_   )rI   r`   	abs_widths      r   transform_widthzOCSTransform.transform_width   sc     JJ	u%%y!Q&788%%q)Q&788   sr   	directionc                    | j                             |          }| j                            |          }| j                            |          S )z=Transform an OCS direction from the old OCS into the new OCS.)rK   r5   r$   r,   rL   from_wcs)rI   rg   old_wcs_directionnew_wcs_directions       r   transform_ocs_directionz$OCSTransform.transform_ocs_direction   sH     !L//	:: F667HII|$$%6777r   r(   c                X    |                      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   )rl   r   z)rI   r(   new_ocs_thicknesss      r   transform_thicknessz OCSTransform.transform_thickness   s-     !88aI9N9NOO ""r   vertexc                    | j                             | j                            | j                            |                              S )z5Returns vertex transformed from old OCS into new OCS.)rL   ri   r$   	transformrK   r5   )rI   rq   s     r   transform_vertexzOCSTransform.transform_vertex   s8    |$$TV%5%5dl6I6I&6Q6Q%R%RSSSr   	elevationr   c           	         t          |                              |          }t          | j                            | j                            | j                            |                                        S )z8Returns 2D vertex transformed from old OCS into new OCS.)rn   )	r   replacer   rL   ri   r$   rs   rK   r5   )rI   rq   ru   vs       r   transform_2d_vertexz OCSTransform.transform_2d_vertex   s\    LL  9 --DL))$&*:*:4<;N;Nq;Q;Q*R*RSSTTTr   c                    | j                             | j                            | j                            |                              S )z8Returns direction transformed from old OCS into new OCS.)rL   ri   r$   r,   rK   r5   )rI   rg   s     r   r,   z OCSTransform.transform_direction   s?    |$$F&&t|':':9'E'EFF
 
 	
r   anglec                Z    |                      t          j        |                    j        S )zAReturns angle (in radians) from old OCS transformed into new OCS.)r,   r   
from_angler{   rI   r{   s     r   transform_anglezOCSTransform.transform_angle   s#    ''(>(>??EEr   c                L    |                      |t          z            t          z  S )zAReturns angle (in degrees) from old OCS transformed into new OCS.)r   RADIANSDEGr~   s     r   transform_deg_anglez OCSTransform.transform_deg_angle   s    ##EGO44s::r   startendtuple[float, float]c                   t          ||          }|                     |          }|                     |          }t          j        |t          j                  r+d}|                     ||z             }t          ||          }n@t          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.
        r[   g:0yE>)rel_tol)r   r   r7   r8   pitau)rI   r   r   old_angle_span	new_startnew_endchecknew_angle_spans           r   transform_ccw_arc_anglesz%OCSTransform.transform_ccw_arc_angles   s     ,E377((//	&&s++<00 	D N(()?@@E/	5AANN\.$(33 	Di$(222/	7CCN <EEE 	&g%%I%%r   c                |    |                      |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   )rI   r   r   s      r   transform_ccw_arc_angles_degz)OCSTransform.transform_ccw_arc_angles_deg   s8     2257?C'MRR
ss{C#I%%r   vecc                   | j         }| j                            |j        |j        |j        f          \  }}}|j        |j        z  }|j        |j        z  }|j        |j	        z  }|
                    |                                          }	|	                    |                                d          s| }t          |||          S )Nrb   r3   )rK   r$   r6   uxuyrQ   r-   xyrn   r:   r.   r8   r   )
rI   r   r;   r   r   rQ   x_scaley_scalez_scaleexpected_uys
             r   transform_scale_vectorz#OCSTransform.transform_scale_vector   s    lV00#&#&#&1IJJ
B,&,&,&hhrll,,..""2<<>>5"AA 	hGGWg...r   )NN)r)   rC   r$   rD   )rK   r   rL   r   rF   rM   r%   r&   )r%   r   )T)rV   r   rW   r   r$   r   r%   r   )r[   )r\   r   r%   r]   )r`   r]   r%   r]   )rg   r   r%   r   )r(   r]   r%   r]   )rq   r   r%   r   )rq   r   ru   r]   r%   r   )rg   r   r%   r   )r{   r]   r%   r]   )r   r]   r   r]   r%   r   )r   r   r%   r   )r   r   r   rJ   rG   propertyrS   rA   classmethodrZ   r_   rf   transform_scale_factorrl   rp   rt   ry   r,   r   r   r   r   r   r   r   r   r   r   ]   s       
O 
O 
O 
O 
O+ + + +
    X    X <@    [
 
 
 
 

 
 
 
 .8 8 8 8# # # #T T T TU U U U

 
 
 
F F F F; ; ; ;& & & &.& & & &
/ 
/ 
/ 
/ 
/ 
/r   r   c                       e Zd ZddZddd
ZdS )r   r$   r   c                |   || _         |                    t                    }|                    t                    }|                    t                    }|j        }t          j        ||j                  | _        | j        ot          j        ||j                  | _	        | 
                    d          | _        d S )Nr[   )r$   r,   r   r	   r
   r9   r7   r8   has_uniform_xy_scalinghas_uniform_xyz_scalingr_   uniform_scale)rI   r$   new_xnew_ynew_znew_x_mag_squs         r   rJ   zWCSTransform.__init__   s    %%f--%%f--%%f--.&*l51'
 '
# (,'B (
t|51H
 H
$ "22377r   r   valuer]   axisstrr%   c                    |dk    rt          |dd          }nC|dk    rt          d|d          }n+|dk    rt          dd|          }nt          d| d          | j                            |          j        S )Nr   r   r   rn   zinvalid axis '')r   
ValueErrorr$   r,   r-   )rI   r   r   rx   s       r   r_   zWCSTransform.transform_length   s    3;;UAq!!AAS[[Qq!!AAS[[Q5!!AA5d555666v))!,,66r   N)r$   r   )r   )r   r]   r   r   r%   r]   )r   r   r   rJ   r_   r   r   r   r   r      sA        8 8 8 8	7 	7 	7 	7 	7 	7 	7r   r   c                       e Zd ZddZdddZdS )r   insertr   scaletuple[float, float, float]rotationr]   r)   c                   t          |          | _        t          |d                   | _        t          |d                   | _        t          |d                   | _        t          |          | _        t          |          | _        dS )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   r   r]   scale_factor_xscale_factor_yscale_factor_zr   r)   )rI   r   r   r   r)   s        r   rJ   zInsertCoordinateSystem.__init__  se      6ll#E!Hoo#E!Hoo#E!Hoohir   r2   r$   r   r%   c                   t          | j                  }|                    |j        |j        |j        f          \  }}}|j        | j        z  }|j        | j        z  }|j        | j	        z  }	|
                                }|
                                }|
                                }t          |                    |                    |k    sLt          |                    |                    |k    s&t          |                    |                    |k    rt          d          |                    |          }
|
                    ||          s| }t                               t          | j                  t          |          |          }t%          |                    | j                  |||	f|                    | j                  |          S )zReturns the transformed INSERT coordinate system.

        Args:
            m: transformation matrix
            tol: tolerance value

        zNon-orthogonal target system.r3   )r   r   r   r)   )r   r)   r6   r   r   rQ   r-   r   r   r   r.   rc   dotr   r:   r8   r   rZ   r   rt   r   r   r   )rI   r$   tolr;   r   r   rQ   r   r   r   r   ocs_transforms               r   rs   z InsertCoordinateSystem.transform"  s    $.!! ++SVSVSV,DEE
B ,!44,!44,!44\\^^\\^^\\^^rvvbzz??S  Cr

OOc$9$9S__s=R=R+,KLLL hhrll""2s"33 	hG$--c$..A.A3r77ANN% 11$+>>GW-"66t}EE	
 
 
 	
r   N)r   r   r   r   r   r]   r)   r   )r2   )r$   r   r%   r   )r   r   r   rJ   rs   r   r   r   r   r   
  sA        ) ) ) ).%
 %
 %
 %
 %
 %
 %
r   r   )r#   r   r$   r   r%   r&   )r)   r   r$   r   r%   r0   ) 
__future__r   typingr   r7   
ezdxf.mathr   r   r   r   r	   r
   r   r   r   r   ezdxf.entitiesr   __all__rH   r   r   r   	Exceptionr   r   r   r   r   r   r   r   r   r   r   <module>r      s.   # " " " " "                                      *))))))	 	 	 355 dgo
'E/	 	 	 	 	Y 	 	 		 	 	 	 	^ 	 	 		 	 	 	 	 	 	 	5 5 5 5% % % %:O/ O/ O/ O/ O/ O/ O/ O/d7 7 7 7 7 7 7 76=
 =
 =
 =
 =
 =
 =
 =
 =
 =
r   