Ë
    £èhg/  ã                  ó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__© ó    ú9lib/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¿   € ð ‡z�z×Ñ˜+Ô&Ø—J‘J×(Ñ(ˆ	Ü˜)“_ˆ
Ø×)Ñ)¨&¯*©*×*>Ñ*>ÀÑ*JÓKˆ	Ø(×2Ñ2°ZÑ?ˆ�
‰
ÔØ(×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ÓS�N€FˆFô —‘Ø×Ñ ×!8Ñ!8À$ô€Jð —L‘L Ó(×2Ñ2Ó4€MØ˜*Ð$Ð$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Ü“ZˆD�FàˆDŒFØ#'ˆÔØÐØ�O‰OÔ,Ô.>ÀÕEä+>¸yÈ!Ó+LÑ(ˆM˜=Ø�O‰OœC 	›N¬C°Ó,>ÀÕ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"   € ñ �AŒhˆØ�‰�s˜C Ô/Øˆ
r   c                ó–   — | j                   j                  | j                  j                  |«      «      j                  t        |«      z  S )z�Returns 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   € ð �v‰v×)Ñ)¨$¯,©,×*=Ñ*=¸fÓ*EÓF×PÑPÔSWØó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   € ð !ŸL™L×/Ñ/°	Ó:ÐØ ŸF™F×6Ñ6Ð7HÓIÐØ�|‰|×$Ñ$Ð%6Ó7Ð7r   c                óR   — | j                  t        dd|«      «      }|j                  S )zÐTransform 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ÀÀIÓ9NÓ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   € à�|‰|×$Ñ$ T§V¡V×%5Ñ%5°d·l±l×6IÑ6IÈ&Ó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Ð Ó-ˆÜ�D—L‘L×)Ñ)¨$¯&©&×*:Ñ*:¸4¿<¹<×;NÑ;NÈqÓ;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:   € à�|‰|×$Ñ$Ø�F‰F×&Ñ& 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   € à×#Ñ# E¬G¡OÓ4´sÑ:Ð: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 )z†Returns arc start- and end angle (in radians) from old OCS
        transformed into new OCS in counter-clockwise orientation.
        ç      ð?g:Œ0âŽyE>)Ú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Â   € ô ,¨E°3Ó7ˆØ×(Ñ(¨Ó/ˆ	Ø×&Ñ& sÓ+ˆÜ�<‰<˜¬¯©Ô0Ø ˆNØ×(Ñ(¨°Ñ)?Ó@ˆEÜ/°	¸5ÓA‰NÜ�\‰\˜.¬$¯(©(Ô3à˜i¬$¯(©(Ñ2Ð2Ð2ä/°	¸7ÓCˆNô �<‰<˜¨ÀÕEØ˜gÐ%Ð%à˜IÐ%Ð%r   c                ól   — | j                  |t        z  |t        z  «      \  }}|t        z  |t        z  fS )z‚Returns 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Ñ2°5¼7±?À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³   € Ø�l‰lˆØ—V‘V×0Ñ0°#·&±&¸#¿&¹&À#Ç&Á&Ð1IÓJ‰
ˆˆB�Ø—,‘, §¡Ñ&ˆØ—,‘, §¡Ñ&ˆØ—,‘, §¡Ñ&ˆØ—h‘h˜r“l×,Ñ,Ó.ˆØ×"Ñ" 2§<¡<£>¸5Ð"ÔAà�hˆGÜ�G˜W gÓ.Ð.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Ó-ˆØ×.Ñ.ˆÜ&*§l¡lØ˜5×1Ñ1ó'
ˆÔ#ð (,×'BÑ'Bò (
ÄtÇ|Á|Ø˜5×1Ñ1óH
ˆÔ$ð "×2Ñ2°3Ó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Š;Ü�U˜A˜qÓ!‰AØ�SŠ[Ü�Q˜˜qÓ!‰AØ�SŠ[Ü�Q˜˜5Ó!‰Aä˜~¨d¨V°1Ð5Ó6Ð6Ø�v‰v×)Ñ)¨!Ó,×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   € ô  ˜6“lˆŒÜ# E¨!¡H›oˆÔÜ# E¨!¡H›oˆÔÜ# E¨!¡H›oˆÔÜ˜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 )z�Returns 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  € ô �$—.‘.Ó!ˆð ×+Ñ+¨S¯V©V°S·V±V¸S¿V¹VÐ,DÓE‰
ˆˆB�ð —,‘, ×!4Ñ!4Ñ4ˆØ—,‘, ×!4Ñ!4Ñ4ˆØ—,‘, ×!4Ñ!4Ñ4ˆà�\‰\‹^ˆØ�\‰\‹^ˆØ�\‰\‹^ˆäˆr�v‰v�b‹z‹?˜SÒ ¤C¨¯©¨r«
£O°cÒ$9¼SÀÇÁÈÃ»_ÈsÒ=RÜ+Ð,KÓLÐLð —h‘h˜r“lˆØ×"Ñ" 2¨sÐ"Ô3à�hˆGä$×-Ñ-¬c°$·.±.Ó.AÄ3ÀrÃ7ÈAÓNˆÜ%Ø ×1Ñ1°$·+±+Ó>Ø˜G WÐ-Ø"×6Ñ6°t·}±}Ó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Ð Øˆd�g‰g�o€Ø
�'‰'�E‰/€ô	�Yô 	ô	˜^ô 	ô	 ô 	ð5Øð5Ø#ð5à	ó5ó%÷:O/ñ O/÷d7ñ 7÷6=
ò =
r   