
    Og .                    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__     ^/var/www/html/public_html/myphp/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                   | j                   j                  d      r| j                   j                  }t        |      }|j	                  | j                   j
                  |z        }|j                  |z  | j                   _        |j                         | j                   _        y | j                   j                  d      rE|j	                  | j                   j
                        }|j                         | j                   _        y y )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                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   @   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>   rA   s        r   __init__zOCSTransform.__init__^   sa    9ZDFDF#'OO,.>E+>y!+L(M=OOC	NC,>Nr   c                .    || _         || _        || _        y N)old_ocsnew_ocsrA   )rD   rH   rI   rA   s       r   rB   zOCSTransform._reset_ocsj   s    *r   c                .    | j                   j                  S rG   )rH   uzrD   s    r   old_extrusionzOCSTransform.old_extrusiono       ||r   c                .    | j                   j                  S rG   )rI   rK   rL   s    r   r>   zOCSTransform.new_extrusions   rN   r   c                >     | |      }|j                  |||       |S )N)r,   )rB   )clsoldnewr,   rA   r8   s         r   from_ocszOCSTransform.from_ocsw   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(   rH   r2   r)   r   )rD   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maxrW   )rD   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.)rH   r2   r,   r(   rI   from_wcs)rD   	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   )rd   r   z)rD   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.)rI   r`   r,   	transformrH   r2   )rD   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.)rf   )	r   replacer   rI   r`   r,   rj   rH   r2   )rD   rk   	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.)rI   r`   r,   r(   rH   r2   )rD   ra   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rD   ru   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.)rw   RADIANSDEGrv   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   rw   r4   r5   pitau)rD   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   ry   rz   )rD   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 )NrY   r0   )rH   r,   r3   uxuyrK   r)   xyrf   r7   r*   r5   r   )
rD   vecr8   r   r   rK   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)rH   r   rI   r   rA   boolreturnNone)r   r   )T)rR   r   rS   r   r,   r   r   r   )r}   )rV   r   r   float)r\   r   r   r   )ra   r   r   r   )r$   r   r   r   )rk   r   r   r   )rk   r   ro   r   r   r   )ra   r   r   r   )ru   r   r   r   )r   r   r   r   r   ztuple[float, float])r   r   r   r   )r   r   r   rE   rB   propertyrM   r>   classmethodrT   rW   r^   transform_scale_factorrd   rh   rl   rq   r(   rw   r{   r   r   r   r   r   r   r   r   ]   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
   r6   r4   r5   has_uniform_xy_scalinghas_uniform_xyz_scalingrW   uniform_scale)rD   r,   new_xnew_ynew_znew_x_mag_squs         r   rE   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   rf   zinvalid axis '')r   
ValueErrorr,   r(   r)   )rD   valueaxisrp   s       r   rW   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   rE   rW   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%   )rD   r   scaler   r%   s        r   rE   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.r0   )r   r   r   r%   )r   r%   r3   r   r   rK   r)   r   r   r   r*   rZ   dotr   r7   r5   r   rT   r   rl   r   r{   r   )rD   r,   tolr8   r   r   rK   r   r   r   r   ocs_transforms               r   rj   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   )r/   )r,   r   r   r   )r   r   r   rE   rj   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   r4   
ezdxf.mathr   r   r   r   r	   r
   r   r   r   r   ezdxf.entitiesr   __all__rC   r   rz   ry   	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   