Ë
    £èhv‹  ã                  ót  — d dl mZ d dlmZmZ d dlmZ d dlZd dlZd dl	m
Z
mZmZmZmZmZmZ d dlmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZ d d	l m!Z!m"Z" d d
l#m$Z$ d dl	m%Z% erd dl&m'Z' g d¢Z( ejR                  d«      Z*dZ+d)d„Z,dejZ                  z  Z.dejZ                  z  Z/	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*d„Z0e/e/e.dgZ1d+d„Z2 G d„ de«      Z3 G d„ de«      Z4d,d„Z5 G d„ de«      Z6 G d„ de6«      Z7 G d„ d e7«      Z8 G d!„ d"e7«      Z9 G d#„ d$e«      Z: G d%„ d&e6«      Z;	 	 	 	 	 	 	 	 	 	 d-d'„Z<	 	 	 	 	 	 	 	 d.d(„Z=y)/é    )Úannotations)ÚTYPE_CHECKINGÚOptional)ÚabstractmethodN)ÚVec2ÚVec3ÚNULLVECÚUCSÚ
decdeg2dmsÚarc_angle_span_radÚxround)ÚDimStyleOverrideÚ	DimensionÚ	DXFEntityé   )
ÚBaseDimensionRendererÚget_required_defpointÚformat_textÚapply_dimpostÚ	ToleranceÚMeasurementÚLengthMeasurementÚcompile_mtextÚorder_leader_pointsÚget_center_leader_points)ÚARROWSÚarrow_length)Úis_upside_down_text_angle)Úintersection_line_line_2d)ÚGenericLayoutType)ÚAngularDimensionÚAngular3PDimensionÚArcLengthDimensionÚezdxfz( c                óX   ‡— | j                   j                  Št        ˆfd„|D «       «      S )Nc              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­w©N© )Ú.0Úattrib_nameÚhass     €ú7lib/python3.12/site-packages/ezdxf/render/dim_curved.pyÚ	<genexpr>z*has_required_attributes.<locals>.<genexpr>.   s   øè ø€ Ð@±< K‰s�;×±<ùs   ƒ)ÚdxfÚhasattrÚall)ÚentityÚattrib_namesr+   s     @r,   Úhas_required_attributesr3   ,   s#   ø€ Ø
�*‰*×
Ñ
€CÜÓ@±<Ó@Ó@Ð@ó    g      i@ç     €f@c                óæ   ‡‡‡‡‡— dˆˆˆˆfd„Šdˆˆˆfd„}d}|dk(  r ‰| t         z  «      dz   }|S |dk(  r || t         z  «      }|S |dk(  r ‰| t        z  «      dz   }|S |d	k(  r ‰| «      d
z   }|S )Nc                ó$   •— t        | ‰‰‰‰¬«      S )N)ÚdimrndÚdimdecÚdimzinÚdimdsep)r   )Ú_valuer9   r;   r8   r:   s    €€€€r,   Údecimal_formatz+format_angular_text.<locals>.decimal_format=   s   ø€ ÜØØØØØô
ð 	
r4   c                óà   •— ‰�t        | ‰«      } t        | «      \  }}}‰dkD  r$‰dz
  }t        ||«      }|d›d|d›d ‰|«      › d�S ‰dkD  r|d›d|d›d|d›d�S ‰dkD  r
|d›d|d›d�S |d›d�S )	Né   é   z.0fô   Â°Ú'Ú"é   r   )r   r   Úround)r<   ÚdÚmÚsÚplacesr=   r9   r8   s        €€€r,   Ú
dms_formatz'format_angular_text.<locals>.dms_formatF   s¶   ø€ ØÐÜ˜F FÓ+ˆFÜ˜VÓ$‰ˆˆ1ˆaØ�AŠ:Ø˜a‘ZˆFÜ�a˜Ó ˆAØ˜�W˜B˜q ˜g Q¡~°aÓ'8Ð&9¸Ð<Ð<Ø�AŠ:Ø˜�W˜B˜q ˜g Q q¨ g¨RÐ0Ð0Ø�AŠ:Ø˜�W˜B˜q ˜g QÐ'Ð'Ø�C�˜ˆ|Ðr4   Ú r   rA   r   rD   Úgé   Úr)r<   ÚfloatÚreturnÚstr)ÚDEGÚGRAD)	ÚvalueÚangle_unitsr8   r9   r:   r;   rJ   Útextr=   s	     ````  @r,   Úformat_angular_textrW   5   sœ   ü€ ÷
ð 
÷ð& €DØ�aÒÙ˜e¤c™kÓ*¨TÑ1ˆð €Kð 
˜Ò	Ù˜%¤#™+Ó&ˆð
 €Kð	 
˜Ò	Ù˜e¤d™lÓ+¨cÑ1ˆð €Kð 
˜Ò	Ù˜eÓ$ sÑ*ˆØ€Kr4   ç      ð?c                óL   — 	 | t         |   z  S # t        $ r | t        z  cY S w xY wr'   )Ú_ANGLE_UNITSÚ
IndexErrorrR   )rT   Údimaunits     r,   Ú
to_radiansr]   m   s0   € ðØ”| HÑ-Ñ-Ð-øÜò Ø”s‰{Òðús   ‚ Ž#¢#c                  óL   ‡ — e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zˆ xZS )ÚAngularTolerancec                ó¬   •— || _         t        ‰| �	  ||||«       | j                  t	        | j
                  |«      t	        | j                  |«      «       y r'   )Úangular_unitsÚsuperÚ__init__Úupdate_tolerance_textr]   ÚmaximumÚminimum)ÚselfÚ	dim_styleÚ
cap_heightÚwidth_factorÚ	dim_scalerU   Ú	__class__s         €r,   rc   zAngularTolerance.__init__u   sL   ø€ ð )ˆÔÜ‰Ñ˜ J°¸iÔHð
 	×"Ñ"Ü�t—|‘| [Ó1Ü�t—|‘| [Ó1õ	
r4   c                ót   — t        || j                  d| j                  | j                  | j                  ¬«      S )zuRounding and text formatting of tolerance `value`, removes leading
        and trailing zeros if necessary.

        N©rT   rU   r8   r9   r:   r;   )rW   ra   Údecimal_placesÚsuppress_zerosÚtext_decimal_separator)rg   rT   s     r,   r   zAngularTolerance.format_textˆ   s;   € ô
 #ØØ×*Ñ*ØØ×&Ñ&Ø×&Ñ&Ø×/Ñ/ô
ð 	
r4   c                ó>  — |t        | j                  | j                  «      z   }|t        | j                  | j                  «      z
  }| j	                  |«      | _        | j	                  |«      | _        | j                  | j
                  | j                  «      | _        y r'   )	r]   re   ra   rf   r   Ú
text_upperÚ
text_lowerÚget_text_widthÚ
text_width)rg   ÚmeasurementÚupper_limitÚlower_limits       r,   Úupdate_limitszAngularTolerance.update_limits–   sz   € ð
 "¤J¨t¯|©|¸T×=OÑ=OÓ$PÑPˆØ!¤J¨t¯|©|¸T×=OÑ=OÓ$PÑPˆØ×*Ñ*¨;Ó7ˆŒØ×*Ñ*¨;Ó7ˆŒØ×-Ñ-¨d¯o©o¸t¿¹ÓOˆ�r4   )rX   rX   rX   r   )
rh   r   ri   rO   rj   rO   rk   rO   rU   Úint©rT   rO   rP   rQ   )rw   rO   rP   ÚNone)Ú__name__Ú
__module__Ú__qualname__rc   r   rz   Ú__classcell__©rl   s   @r,   r_   r_   t   sQ   ø„ ð  Ø!ØØð
à#ð
ð ð
ð ð	
ð
 ð
ð õ
ó&
÷	Pr4   r_   c                  ó   — e Zd Zdd„Zdd„Zy)ÚAngleMeasurementc                óL   — || _         || _        | j                  |«      | _        y r'   )Ú	raw_valuerT   Útext_overriderV   )rg   Úraw_measurement_values     r,   ÚupdatezAngleMeasurement.update£   s#   € Ø.ˆŒØ*ˆŒ
Ø×&Ñ&Ð'<Ó=ˆ�	r4   c                óÂ   — t        || j                  d | j                  | j                  dz  | j                  ¬«      }| j
                  rt        || j
                  «      }|S )NrD   rn   )rW   rU   Úangular_decimal_placesÚangular_suppress_zerosÚdecimal_separatorÚtext_post_process_formatr   ©rg   rT   rV   s      r,   r   zAngleMeasurement.format_text¨   s]   € Ü"ØØ×(Ñ(ØØ×.Ñ.Ø×.Ñ.°!Ñ3Ø×*Ñ*ô
ˆð ×(Ò(Ü   t×'DÑ'DÓEˆDØˆr4   N)rˆ   rO   rP   r}   r|   )r~   r   r€   r‰   r   r(   r4   r,   r„   r„   ¢   s   „ ó>ô
r4   r„   c                ó   — | |z  }||kD  S r'   r(   )ÚlengthÚradiusÚarc_spanÚrequired_arc_spans       r,   Úfits_into_arc_spanr•   ¶   s   € Ø%¨™ÐØÐ'Ñ'Ð'r4   c                  óB  ‡ — e Zd Z	 	 d	 	 	 	 	 dˆ fd„Zedd„«       Zedd„«       Zedd„«       Zedd„«       Z	edd„«       Z
edd„«       Zedd„«       Zedd	„«       Zdd
„Zddd„Zdd„Zdd„Zdd„Zd ˆ fd„Zdd„Zd!d„Zd"d„Z	 	 	 	 	 	 d#d„Zd$d„Z	 	 	 	 	 	 	 	 d%d„Zˆ xZS )&Ú_CurvedDimensionLinec                óp  •— t         ‰| �  |||«       d| _        | j                  «       | _        | j                  «       | _        | j                  «       | _        | j                  j                  | _
        | j                  «       | _        | j                  j                  | _        t        | j                  | j                  «      | _        | j                  | j                  dz  z   | _        t!        «       | _        t!        «       | _        | j'                  «        | j(                  j*                  r/| j(                  j-                  | j.                  j0                  «       | j3                  «       | _        d| _        | j9                  «        | j;                  «        | j.                  j<                  | j4                  _        | j.                  j@                  | j4                  _	        | jB                  jE                  | j4                  «       | j.                  j<                  | jF                  jH                  _%        y )NTç       @F)&rb   rc   Úremove_hidden_lines_of_dimlineÚget_center_of_arcÚcenter_of_arcÚget_dim_line_radiusÚdim_line_radiusÚget_ext1_dirÚext1_dirÚangleÚstart_angle_radÚget_ext2_dirÚext2_dirÚend_angle_radr   Úcenter_angle_radr   Ú
ext1_startÚ
ext2_startÚupdate_measurementÚtolÚ
has_limitsrz   rw   rT   Úinit_text_boxÚtext_boxÚarrows_outsideÚsetup_text_and_arrow_fittingÚsetup_text_locationÚtext_locationÚcenterÚtext_rotationÚgeometryÚset_text_boxÚ	dimensionr.   Útext_midpoint©rg   r¶   ÚucsÚoverriderl   s       €r,   rc   z_CurvedDimensionLine.__init__¼   s²  ø€ ô 	‰Ñ˜ C¨Ô2ð /3ˆÔ+Ø#'×#9Ñ#9Ó#;ˆÔØ&*×&>Ñ&>Ó&@ˆÔØ"×/Ñ/Ó1ˆŒØ&*§m¡m×&9Ñ&9ˆÔØ"×/Ñ/Ó1ˆŒØ$(§M¡M×$7Ñ$7ˆÔô *<Ø× Ñ  $×"4Ñ"4ó*
ˆÔð × Ñ  4×#:Ñ#:¸SÑ#@Ñ@ð 	Ôô
 ›&ˆŒÜ›&ˆŒð 	×ÑÔ!Ø�8‰8×ÒØ�H‰H×"Ñ" 4×#3Ñ#3×#9Ñ#9Ô:ð ×*Ñ*Ó,ˆŒð $ˆÔà×)Ñ)Ô+Ø× Ñ Ô"ð  $×/Ñ/×=Ñ=ˆ�‰ÔØ"×.Ñ.×<Ñ<ˆ�‰ÔØ�‰×"Ñ" 4§=¡=Ô1ð ,0×+;Ñ+;×+IÑ+Iˆ�‰×ÑÕ(r4   c                ór   — | j                   j                  j                  t        | j                  «      «      S r'   )r´   r¹   Úto_ocsr   rœ   ©rg   s    r,   Úocs_center_of_arcz&_CurvedDimensionLine.ocs_center_of_arcò   s(   € à�}‰}× Ñ ×'Ñ'¬¨T×-?Ñ-?Ó(@ÓAÐAr4   c                óp   — | j                   t        j                  | j                  | j                  «      z   S )z*Return the midpoint of the dimension line.)rœ   r   Ú
from_angler¦   rž   r½   s    r,   Údim_midpointz!_CurvedDimensionLine.dim_midpointö   s3   € ð ×!Ñ!¤D§O¡OØ×!Ñ! 4×#7Ñ#7ó%
ñ 
ð 	
r4   c                 ó   — y)zSetup measurement text.Nr(   r½   s    r,   r©   z'_CurvedDimensionLine.update_measurementý   ó   € ð 	r4   c                 ó   — y)z>Return the direction of the 1st extension line == start angle.Nr(   r½   s    r,   rŸ   z!_CurvedDimensionLine.get_ext1_dir  rÃ   r4   c                 ó   — y)z<Return the direction of the 2nd extension line == end angle.Nr(   r½   s    r,   r£   z!_CurvedDimensionLine.get_ext2_dir  rÃ   r4   c                 ó   — y)zReturn the center of the arc.Nr(   r½   s    r,   r›   z&_CurvedDimensionLine.get_center_of_arc  rÃ   r4   c                 ó   — y)z^Return the distance from the center of the arc to the dimension line
        location
        Nr(   r½   s    r,   r�   z(_CurvedDimensionLine.get_dim_line_radius  s   € ð
 	r4   c                 ó   — y r'   r(   r½   s    r,   Úget_defpointsz"_CurvedDimensionLine.get_defpoints  s   € àr4   c                óL  ‡— ˆfd„}| j                   j                  Š| j                  j                  } |d|j                  «        |d|j                  «        |d|j                  «        |d|j                  «        |d|j                  «        |d|j
                  «       y)	zYTransforms dimension definition points into WCS or if required into
        OCS.
        c                ó†   •— ‰j                  | «      r/‰j                  | t        «      }‰j                  |  ||«      «       y y r'   )Úis_supportedÚgetr	   Úset)ÚattrÚfuncÚpointr.   s      €r,   Úfrom_ucsz;_CurvedDimensionLine.transform_ucs_to_wcs.<locals>.from_ucs!  s8   ø€ Ø×Ñ Ô%ØŸ™ ¤gÓ.�Ø—‘˜™d 5›kÕ*ð &r4   ÚdefpointÚ	defpoint2Ú	defpoint3Ú	defpoint4Ú	defpoint5r·   N)r¶   r.   r´   r¹   Úto_wcsr¼   )rg   rÒ   r¹   r.   s      @r,   Útransform_ucs_to_wcsz)_CurvedDimensionLine.transform_ucs_to_wcs  s|   ø€ ô
	+ð
 �n‰n× Ñ ˆØ�m‰m×ÑˆÙ�˜SŸZ™ZÔ(Ù�˜cŸj™jÔ)Ù�˜cŸj™jÔ)Ù�˜cŸj™jÔ)Ù�˜cŸj™jÔ)Ù� #§*¡*Õ-r4   c                ó¸   — | j                   | j                  j                  «       z   |z   }t        j                  | j
                  «      }| j                  ||z  z   S r'   )rž   rw   Útext_vertical_distancer   rÀ   r¦   rœ   )rg   Úshiftr’   Útext_radial_dirs       r,   Údefault_locationz%_CurvedDimensionLine.default_location/  s[   € à× Ñ Ø×Ñ×5Ñ5Ó7ñ8àñð 	ô
 Ÿ/™/¨$×*?Ñ*?Ó@ˆØ×!Ñ! O°fÑ$<Ñ<Ð<r4   c                ó  — t        | j                  j                  | j                  | j                  «       | j
                  _        | j                  j                  d| j                  j                  z  z   }t        || j                  | j                  «       | _	        t        |dz  | j                  | j                  «       | j
                  _
        | j
                  j                  r| j
                  j                  €d| _        y y y )Nr™   gš™™™™™ñ?F)r•   r­   Úwidthrž   r   rw   Úis_wide_textÚarrowsÚ
arrow_sizer®   Útext_is_outsideÚuser_text_rotationrš   )rg   Úrequired_text_and_arrows_spaces     r,   r¯   z1_CurvedDimensionLine.setup_text_and_arrow_fitting8  sù   € ô -?Ø�M‰M×Ñ ×!5Ñ!5°t×7NÑ7Nó-
ð )
ˆ×ÑÔ%ð �M‰M×ÑØ�D—K‘K×*Ñ*Ñ*ñ+ð 	'ô #5Ø*Ø× Ñ Ø×#Ñ#ó#
ð 
ˆÔô 0BØ*¨SÑ0Ø× Ñ Ø×#Ñ#ó0
ð ,
ˆ×ÑÔ(ð ×Ñ×,Ò,Ø× Ñ ×3Ñ3Ð;ð 38ˆDÕ/ð	 <ð -r4   c                ó8  — | j                   }|j                  du }t        |j                  xs |j                  «      }|r†t        j                  | j                  «      }d}|j                  r)d|_	        |j                  r| j                  j                  }| j                  |¬«      |_        |j                  dkD  rï|síd| _        nå|j                  }t!        |t
        «      sJ ‚|j"                  r|| j$                  z  }||_        |j&                  dk(  r/| j(                  |z
  j*                  | _        | j/                  «        n@|j&                  dk(  r|j0                  €d|_        d|_        n|j&                  dk(  rd|_        |j                  | j(                  z
  j3                  «       }|j5                  d¬	«      }|r^|r\|j                  r"|xj                  ||j                  z  z  c_        |j                  r"|xj                  ||j                  z  z  c_        |j0                  €|j6                  }n|j0                  }| j8                  j:                  s<| j8                  j<                  j?                  |«      }	tA        |	«      rd|_!        |d
z  }||_"        y)z]Setup geometric text properties (location, rotation) and the TextBox
        object.
        Nç        r   )rÜ   r   FTrD   )Úccwr5   )#rw   Úuser_locationÚboolÚtext_shift_hÚtext_shift_vr   rÀ   r¦   rä   Útext_valignrá   Úextension_linesÚextension_aboverÞ   r±   rš   Ú
isinstanceÚrelative_user_locationrÁ   Útext_movement_rulerœ   Ú	magnituderž   r¯   rå   Ú	normalizeÚ
orthogonalÚ	angle_degr´   Úrequires_extrusionr¹   Úto_ocs_angle_degr   Úhas_upside_down_correctionr³   )
rg   rw   Úat_default_locationÚhas_text_shiftingrÝ   Úshift_text_upwardsrê   Útext_tangential_dirÚrotationÚ	wcs_angles
             r,   r°   z(_CurvedDimensionLine.setup_text_location\  s~  € ð ×&Ñ&ˆð %0×$=Ñ$=ÀÐ$EÐÜ"&Ø×$Ñ$Ò@¨×(@Ñ(@ó#
Ðñ ô #Ÿo™o¨d×.CÑ.CÓDˆOØ(+ÐØ×*Ò*à*+�Ô'Ø×+Ò+à)-×)=Ñ)=×)MÑ)MÐ&Ø(,×(=Ñ(=Ø(ð )>ó )ˆKÔ%ð ×'Ñ'¨!Ò+Ñ4Eð 7<�Õ3ð (×5Ñ5ˆMÜ˜m¬TÔ2Ð2Ð2Ø×1Ò1Ø ×!2Ñ!2Ñ2�Ø(5ˆKÔ%Ø×-Ñ-°Ò2ð
 ×&Ñ&¨Ñ6ß‘)ð Ô$ð
 ×1Ñ1Õ3Ø×/Ñ/°1Ò4ð ×1Ñ1Ð9à58�KÔ2Ø.2�Õ+Ø×/Ñ/°1Ò4ð /3�Ô+à×)Ñ)¨D×,>Ñ,>Ñ>ß‰i‹kð ð
 .×8Ñ8¸UÐ8ÓCÐáÑ#4à×'Ò'Ø×)Ò)Ø'¨+×*BÑ*BÑBñÕ)ð ×'Ò'Ø×)Ò)Ø# k×&>Ñ&>Ñ>ñÕ)ð
 ×)Ñ)Ð1Ø*×4Ñ4‰Hà"×5Ñ5ˆHà�}‰}×/Ò/ð Ÿ™×)Ñ)×:Ñ:¸8ÓDˆIÜ(¨Ô3Ø9=�Ô6Ø˜EÑ!�Ø$,ˆÕ!r4   c                ó@  — | j                   j                  dk(  r5t        | j                  | j                  | j
                  j                  «      S | j                  j                  \  }}}}| j                   j                  r||}}n||}}t        | j                  ||«      S )Nr   )
rw   rî   r   rÁ   r­   râ   rã   Úcornersrú   r   )rg   Úc0Úc1Úc2Úc3Úp1Úp2s          r,   Úget_leader_pointsz&_CurvedDimensionLine.get_leader_pointsÂ  s�   € ð ×Ñ×'Ñ'¨1Ò,Ü+Ø×!Ñ! 4§=¡=°$·+±+×2HÑ2Hóð ð "Ÿ]™]×2Ñ2‰NˆB��B˜Ø×Ñ×:Ò:Ø˜R�B‘à˜R�B�Ü& t×'8Ñ'8¸"¸bÓAÐAr4   c                óH  •— t         ‰| �  |«       | j                  «        | j                  «       \  }}| j                  }|j
                  rœ| j                  j                  rt        || j                  «      }n|j
                  }| j                  ||j                  |j                  «       |j                  r0| j                  «       \  }}| j                  | j                   ||«       | j#                  ||«       | j                  j%                  | j'                  «       «       y)z­Main method to create dimension geometry of basic DXF entities in the
        associated BLOCK layout.

        Args:
            block: target BLOCK for rendering

        N)rb   ÚrenderÚadd_extension_linesÚ
add_arrowsrw   rV   r´   Úsupports_dxf_r2000r   rª   Úadd_measurement_textr±   r³   Ú
has_leaderr	  Ú
add_leaderrÁ   Úadd_dimension_lineÚadd_defpointsrÉ   )	rg   ÚblockÚadjust_start_angleÚadjust_end_anglerw   rV   r  r  rl   s	           €r,   r  z_CurvedDimensionLine.renderÖ  sí   ø€ ô 	‰‰�uÔØ× Ñ Ô"Ø/3¯©Ó/@Ñ,ÐÐ,à×&Ñ&ˆØ×ÒØ�}‰}×/Ò/Ü$ [°$·(±(Ó;‘à"×'Ñ'�Ø×%Ñ%Ø�k×/Ñ/°×1JÑ1Jôð ×%Ò%Ø×/Ñ/Ó1‘��BØ—‘ × 1Ñ 1°2°rÔ:Ø×ÑÐ 2Ð4DÔEØ�‰×#Ñ# D×$6Ñ$6Ó$8Õ9r4   c                ó&  — | j                   }|j                  s6| j                  | j                  | j                  |j                  d«      «       |j                  s7| j                  | j                  | j                  |j                  d«      «       y y )Nr   rD   )	rï   Ú	suppress1Ú_add_ext_liner§   r    Ú
dxfattribsÚ	suppress2r¨   r¤   )rg   Ú	ext_liness     r,   r  z(_CurvedDimensionLine.add_extension_linesñ  sv   € Ø×(Ñ(ˆ	Ø×"Ò"Ø×ÑØ—‘ §¡°	×0DÑ0DÀQÓ0Gôð ×"Ò"Ø×ÑØ—‘ §¡°	×0DÑ0DÀQÓ0Gõð #r4   c                óR  — | j                   }| j                  }| j                  }|j                  }||z
  j                  |kD  }|j
                  r|j                  }	|r||	}}	||||	z
  z  z   }n|j                  }
|r| }|
 }
|||
z  z  }||||z   z  z   }| j                  |||¬«       y )N)r  )	rï   rœ   rž   rð   rô   Úhas_fixed_lengthÚlength_belowÚoffsetÚadd_line)rg   ÚstartÚ	directionr  r  r²   r’   Ú	ext_aboveÚ	is_insideÚ	ext_belowr   Úends               r,   r  z"_CurvedDimensionLine._add_ext_lineü  sÇ   € Ø×(Ñ(ˆ	Ø×#Ñ#ˆØ×%Ñ%ˆØ×-Ñ-ˆ	Ø˜V‘^×.Ñ.°Ñ7ˆ	à×%Ò%Ø!×.Ñ.ˆIÙØ'0°)˜9�	Ø˜Y¨&°9Ñ*<Ñ=Ñ=‰Eà×%Ñ%ˆFÙØ&˜J�	Ø ˜�Ø�Y Ñ'Ñ'ˆEØ�y F¨YÑ$6Ñ7Ñ7ˆØ�‰�e˜S¨ZˆÕ8r4   c                ó(  — | j                   }|j                  «       }| j                  }t        |«      dk  ry| j                  | j
                  |z  z   }| j                  | j                  |z  z   }| j
                  j                  «       j                  }| j                  j                  «       j                  }| j                  }|j                   }	|j                   }
d}d}|j                  dkD  rj|	r1| j                  t        j                  |||j                  dz  |¬«       |
r1| j                  t        j                  |||j                  dz  |¬«       ||fS |j                   }||z  dz  t"        z  }|dz   }|}|r|dz  }|dz  }| }|}|	r#| j                  |j$                  ||||z   |¬«       |
r#| j                  |j&                  ||||z
  |¬«       |s6|	rt)        |j$                  |«      |z  }|
rt)        |j&                  |«      |z  }||fS )	z�Add arrows or ticks to dimension.

        Returns: dimension start- and end angle offsets to adjust the
            dimension line

        gê-�™—q=)rè   rè   rè   r™   )Úinsertrÿ   Úscaler  g      à?r5   )r)  r*  rÿ   r  )râ   r  rž   Úabsrœ   r    r¤   rö   r÷   r®   r  r  Ú	tick_sizeÚadd_blockrefr   Úobliquerã   rR   Úarrow1_nameÚarrow2_namer   )rg   râ   Úattribsr’   r"  r'  Úangle1Úangle2ÚoutsideÚarrow1Úarrow2Ústart_angle_offsetÚend_angle_offsetrã   Ú
arrow_tiltÚstart_angleÚ	end_angler*  s                     r,   r  z_CurvedDimensionLine.add_arrows  sY  € ð —‘ˆØ×#Ñ#Ó%ˆØ×%Ñ%ˆÜˆv‹;˜ÒØà×"Ñ" T§]¡]°VÑ%;Ñ;ˆØ× Ñ  4§=¡=°6Ñ#9Ñ9ˆØ—‘×)Ñ)Ó+×5Ñ5ˆØ—‘×)Ñ)Ó+×5Ñ5ˆØ×%Ñ%ˆØ×%Ñ%Ð%ˆØ×%Ñ%Ð%ˆØ ÐØÐØ×Ñ˜cÒ!ÙØ×!Ñ!Ü—N‘NØ Ø#Ø ×*Ñ*¨SÑ0Ø&ð "ô ñ Ø×!Ñ!Ü—N‘NØØ#Ø ×*Ñ*¨SÑ0Ø&ð "ô ð` "Ð#3Ð3Ð3ðQ  ×*Ñ*ˆJð
 !+¨VÑ 3°cÑ 9¼CÑ ?ˆJØ  5™.ˆKØˆIÙØ˜uÑ$�Ø˜UÑ"�	Ø(˜[�
ØˆEÙØ×!Ñ!Ø×&Ñ&Ø ØØ(¨:Ñ5Ø&ð "ô ñ Ø×!Ñ!Ø×&Ñ&ØØØ&¨Ñ3Ø&ð "ô ñ ñ ä$ V×%7Ñ%7¸ÓDÀvÑMð 'ñ ä$ V×%7Ñ%7¸ÓDÀvÑMð %ð "Ð#3Ð3Ð3r4   c                óV  — | j                   }| j                  }| j                  }|j                  }| j                  }t        | j                  «      dz  }||kD  rd}||kD  rd}| j                  | j                  |||z   ||z
  | j                  j                  «       | j                  ¬«       | j                  rr|j                  set        |j                  ||«      \  }}| j!                  ||z
  ||z
  «       t        |j                  ||«      \  }}| j!                  ||z   ||z   «       y y y )Nr™   rè   )r  Úremove_hidden_lines)r¢   r¥   râ   rã   rž   r+  r   Úadd_arcrœ   Údimension_liner  rš   r®   Ú	has_ticksÚarrow_offset_anglesr/  Úadd_arrow_extension_line)	rg   Ústart_offsetÚ
end_offsetr:  r;  râ   Úsizer’   Úmax_adjustments	            r,   r  z'_CurvedDimensionLine.add_dimension_linec  sE  € ð "×1Ñ1ˆØ×-Ñ-ˆ	Ø—‘ˆØ× Ñ ˆØ×%Ñ%ˆÜ # D×$;Ñ$;Ó <¸sÑ Bˆà˜.Ò(ØˆLØ˜Ò&ØˆJà�‰Ø×ÑØØ˜,Ñ&Ø˜
Ñ"Ø×*Ñ*×5Ñ5Ó7à $× CÑ Cð 	ô 	
ð ×Ò v×'7Ò'7ä':Ø×"Ñ" D¨&ó(Ñ$ˆL˜*ð ×)Ñ)Ø˜jÑ(Ø˜lÑ*ôô (;Ø×"Ñ" D¨&ó(Ñ$ˆL˜*ð ×)Ñ)Ø˜LÑ(Ø˜JÑ&õð (8Ðr4   c                óˆ   — | j                  | j                  | j                  ||| j                  j	                  «       ¬«       y )N)r:  r;  r  )r>  rœ   rž   r?  r  )rg   r:  r;  s      r,   rB  z-_CurvedDimensionLine.add_arrow_extension_line‘  s=   € Ø�‰Ø×ÑØ× Ñ Ø#ØØ×*Ñ*×5Ñ5Ó7ð 	õ 	
r4   c                ób   — | j                   j                  «       }| j                  ||||¬«       y)z´Add measurement text to dimension BLOCK.

        Args:
            dim_text: dimension text
            pos: text location
            rotation: text rotation in degrees

        )Úposrÿ   r  N)rw   r  Úadd_text)rg   Údim_textrI  rÿ   r1  s        r,   r  z)_CurvedDimensionLine.add_measurement_textš  s,   € ð ×"Ñ"×-Ñ-Ó/ˆØ�‰�h C°(ÀwˆÕOr4   ©NN©r¶   r   r¹   zOptional[UCS]rº   zOptional[DimStyleOverride])rP   r   ©rP   r   ©rP   r}   ©rP   rO   ©rP   z
list[Vec2])rè   )rÜ   rO   rP   r   )rP   ztuple[Vec2, Vec2])r  r    rP   r}   )r"  r   r#  r   rP   r}   )rP   útuple[float, float])rC  rO   rD  rO   rP   r}   )r:  rO   r;  rO   )rK  rQ   rI  r   rÿ   rO   rP   r}   )r~   r   r€   rc   Úpropertyr¾   rÁ   r   r©   rŸ   r£   r›   r�   rÉ   rÙ   rÞ   r¯   r°   r	  r  r  r  r  r  rB  r  r�   r‚   s   @r,   r—   r—   »   sW  ø„ ð "Ø/3ð	4Jàð4Jð ð4Jð -õ	4Jðl òBó ðBð ò
ó ð
ð òó ðð òó ðð òó ðð òó ðð òó ðð òó ðó.ô&=ó"8óHd-óLBõ(:ó6	ó9ó*P4ðd,àð,ð ð,ð 
ó	,ó\
ðPØðPØ"&ðPØ27ðPà	÷Pr4   r—   c                  ó0   — e Zd Z	 	 	 	 	 	 dd„Zdd„Zdd„Zy)Ú_AngularCommonBasec                ór   — t        | j                  |j                  |j                  ||j                  ¬«      S )N)ri   rj   rk   rU   )r_   rh   Útext_heightÚtext_width_factorrU   )rg   r*  rw   s      r,   Úinit_tolerancez!_AngularCommonBase.init_toleranceª  s6   € ô  Ø�N‰NØ"×.Ñ.Ø$×6Ñ6ØØ#×/Ñ/ô
ð 	
r4   c                óX   — t        | j                  | j                  | j                  «      S r'   )r„   rh   Údefault_colorrk   ©rg   Úcolorr*  s      r,   Úinit_measurementz#_AngularCommonBase.init_measurementµ  s$   € ÜØ�N‰N˜D×.Ñ.°·±ó
ð 	
r4   c                óN   — | j                   j                  | j                  «       y r'   )rw   r‰   r   r½   s    r,   r©   z%_AngularCommonBase.update_measurementº  s   € Ø×Ñ×Ñ × 7Ñ 7Õ8r4   N)r*  rO   rw   r   rP   r   ©r]  r{   r*  rO   rP   r   rO  )r~   r   r€   rY  r^  r©   r(   r4   r,   rU  rU  ©  s)   „ ð	
Øð	
Ø)4ð	
à	ó	
ó
ô
9r4   rU  c                  ó\   ‡ — e Zd ZdZ	 	 d	 	 	 	 	 d	ˆ fd„Zd
d„Zdd„Zdd„Zdd„Zdd„Z	ˆ xZ
S )r!   a²  
    Angular dimension line renderer. The dimension line is defined by two lines.

    Supported render types:

    - default location above
    - default location center
    - user defined location, text aligned with dimension line
    - user defined location horizontal text

    Args:
        dimension: DIMENSION entity
        ucs: user defined coordinate system
        override: dimension style override management object

    c                óÂ  •— t        |d«      | _        t        |d«      | _        t        |d«      | _        t        |d«      | _        t        |d«      | _        t        ‰| �  |||«       t        | j                  | j
                  | j                  | j                  ¬«      | _
        t        | j                  | j
                  | j                  | j                  ¬«      | _        y )NrÓ   rÖ   rÕ   rÔ   r×   )r#  Úbaser  r  )r   Ú
leg1_startÚleg1_endÚ
leg2_startÚleg2_endÚdim_line_locationrb   rc   Údetect_closer_defpointr    r§   r¤   r¨   r¸   s       €r,   rc   zAngularDimension.__init__Ý  sµ   ø€ ô 0°	¸:ÓFˆŒÜ-¨i¸ÓEˆŒÜ/°	¸;ÓGˆŒÜ-¨i¸ÓEˆŒÜ!6°yÀ+Ó!NˆÔÜ‰Ñ˜ C¨Ô2ô
 1Ø—m‘mØ×'Ñ'Ø�‰Ø�}‰}ô	
ˆŒô 1Ø—m‘mØ×'Ñ'Ø�‰Ø�}‰}ô	
ˆ�r4   c                ót   — | j                   | j                  | j                  | j                  | j                  gS r'   )rd  re  rf  rg  rh  r½   s    r,   rÉ   zAngularDimension.get_defpointsú  s1   € à�O‰OØ�M‰MØ�O‰OØ�M‰MØ×"Ñ"ð
ð 	
r4   c                ó
  — t        | j                  | j                  f| j                  | j                  f«      }|€Ht
        j                  d| j                  › d�«       | j                  j                  | j                  «      }|S )Nz1Invalid colinear or parallel angle legs found in Ú))	r   rd  re  rf  rg  ÚloggerÚwarningr¶   Úlerp)rg   r²   s     r,   r›   z"AngularDimension.get_center_of_arc  sp   € Ü*Ø�_‰_˜dŸm™mÐ,Ø�_‰_˜dŸm™mÐ,ó
ˆð ˆ>Ü�N‰NØCÀDÇNÁNÐCSÐSTÐUôð —]‘]×'Ñ'¨¯©Ó6ˆFØˆr4   c                óH   — | j                   | j                  z
  j                  S r'   ©rh  rœ   rô   r½   s    r,   r�   z$AngularDimension.get_dim_line_radius  ó   € Ø×&Ñ&¨×);Ñ);Ñ;×FÑFÐFr4   c                ó¦   — | j                   }| j                  j                  |«      r| j                  n| j                  }||z
  j	                  «       S r'   )rœ   rd  Úisclosere  rõ   ©rg   r²   r"  s      r,   rŸ   zAngularDimension.get_ext1_dir  óK   € Ø×#Ñ#ˆð �‰×&Ñ& vÔ.ð �MŠMà—‘ð 	ð
 ˜‘×)Ñ)Ó+Ð+r4   c                ó¦   — | j                   }| j                  j                  |«      r| j                  n| j                  }||z
  j	                  «       S r'   )rœ   rf  rt  rg  rõ   ru  s      r,   r£   zAngularDimension.get_ext2_dir  rv  r4   rL  rM  rQ  rN  rP  ©r~   r   r€   Ú__doc__rc   rÉ   r›   r�   rŸ   r£   r�   r‚   s   @r,   r!   r!   ¾  sL   ø„ ñðB "Ø/3ð	
àð
ð ð
ð -õ	
ó:
óó Gó,÷,r4   r!   c                  ó\   ‡ — e Zd ZdZ	 	 d	 	 	 	 	 d	ˆ fd„Zd
d„Zdd„Zdd„Zdd„Zdd„Z	ˆ xZ
S )r"   a¹  
    Angular dimension line renderer. The dimension line is defined by three
    points.

    Supported render types:

    - default location above
    - default location center
    - user defined location, text aligned with dimension line
    - user defined location horizontal text

    Args:
        dimension: DIMENSION entity
        ucs: user defined coordinate system
        override: dimension style override management object

    c                óô   •— t        |d«      | _        t        |d«      | _        t        |d«      | _        t        |d«      | _        t
        ‰| �  |||«       | j                  | _        | j                  | _        y ©NrÓ   rÔ   rÕ   rÖ   )	r   rh  rd  rf  rœ   rb   rc   r§   r¨   r¸   s       €r,   rc   zAngular3PDimension.__init__B  sf   ø€ ô "7°yÀ*Ó!MˆÔÜ/°	¸;ÓGˆŒÜ/°	¸;ÓGˆŒÜ2°9¸kÓJˆÔÜ‰Ñ˜ C¨Ô2ØŸ/™/ˆŒØŸ/™/ˆ�r4   c                ó^   — | j                   | j                  | j                  | j                  gS r'   ©rh  rd  rf  rœ   r½   s    r,   rÉ   z Angular3PDimension.get_defpointsP  ó,   € à×"Ñ"Ø�O‰OØ�O‰OØ×Ñð	
ð 	
r4   c                ó   — | j                   S r'   ©rœ   r½   s    r,   r›   z$Angular3PDimension.get_center_of_arcX  ó   € Ø×!Ñ!Ð!r4   c                óH   — | j                   | j                  z
  j                  S r'   rq  r½   s    r,   r�   z&Angular3PDimension.get_dim_line_radius[  rr  r4   c                óP   — | j                   | j                  z
  j                  «       S r'   ©rd  rœ   rõ   r½   s    r,   rŸ   zAngular3PDimension.get_ext1_dir^  ó    € Ø—‘ $×"4Ñ"4Ñ4×?Ñ?ÓAÐAr4   c                óP   — | j                   | j                  z
  j                  «       S r'   ©rf  rœ   rõ   r½   s    r,   r£   zAngular3PDimension.get_ext2_dira  r†  r4   rL  rM  rQ  rN  rP  rx  r‚   s   @r,   r"   r"   )  sM   ø„ ñð6 "Ø/3ð	*àð*ð ð*ð -õ	*ó
ó"óGóB÷Br4   r"   c                  ó   — e Zd Zdd„Zy)ÚArcLengthMeasurementc                óä   — t        || j                  | j                  | j                  | j                  ¬«      }| j
                  r	t        |z   }| j                  rt        || j                  «      }|S )N)rT   r8   r9   r:   r;   )	r   Ú
text_roundro   rp   r�   Úhas_arc_length_prefixÚ
ARC_PREFIXrŽ   r   r�   s      r,   r   z ArcLengthMeasurement.format_textf  sf   € ÜØØ—?‘?Ø×&Ñ&Ø×&Ñ&Ø×*Ñ*ô
ˆð ×%Ò%Ü Ñ$ˆDØ×(Ò(Ü   t×'DÑ'DÓEˆDØˆr4   Nr|   )r~   r   r€   r   r(   r4   r,   rŠ  rŠ  e  s   „ ôr4   rŠ  c                  ól   ‡ — e Zd ZdZ	 	 d
	 	 	 	 	 dˆ fd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zˆ xZS )r#   a   Arc length dimension line renderer.
    Requires DXF R2004.

    Supported render types:

    - default location above
    - default location center
    - user defined location, text aligned with dimension line
    - user defined location horizontal text

    Args:
        dimension: DXF entity DIMENSION
        ucs: user defined coordinate system
        override: dimension style override management object

    c                óD  •— t        |d«      | _        t        |d«      | _        t        |d«      | _        t        |d«      | _        | j                  | j                  z
  j
                  | _        t        ‰| �!  |||«       | j                  | _	        | j                  | _
        y r|  )r   rh  rd  rf  rœ   rô   Ú
arc_radiusrb   rc   r§   r¨   r¸   s       €r,   rc   zArcLengthDimension.__init__�  s‚   ø€ ô "7°yÀ*Ó!MˆÔÜ/°	¸;ÓGˆŒÜ/°	¸;ÓGˆŒÜ2°9¸kÓJˆÔØŸ?™?¨T×-?Ñ-?Ñ?×JÑJˆŒÜ‰Ñ˜ C¨Ô2ØŸ/™/ˆŒØŸ/™/ˆ�r4   c                ó^   — | j                   | j                  | j                  | j                  gS r'   r~  r½   s    r,   rÉ   z ArcLengthDimension.get_defpointsœ  r  r4   c                óX   — t        | j                  | j                  | j                  «      S r'   )rŠ  rh   r[  rk   r\  s      r,   r^  z#ArcLengthDimension.init_measurement¤  s$   € Ü#Ø�N‰N˜D×.Ñ.°·±ó
ð 	
r4   c                ó   — | j                   S r'   r�  r½   s    r,   r›   z$ArcLengthDimension.get_center_of_arc©  r‚  r4   c                óH   — | j                   | j                  z
  j                  S r'   rq  r½   s    r,   r�   z&ArcLengthDimension.get_dim_line_radius¬  rr  r4   c                óP   — | j                   | j                  z
  j                  «       S r'   r…  r½   s    r,   rŸ   zArcLengthDimension.get_ext1_dir¯  r†  r4   c                óP   — | j                   | j                  z
  j                  «       S r'   rˆ  r½   s    r,   r£   zArcLengthDimension.get_ext2_dir²  r†  r4   c                ó˜   — t        | j                  | j                  «      }|| j                  z  }| j                  j                  |«       y r'   )r   r¢   r¥   r‘  rw   r‰   )rg   r¡   Ú
arc_lengths      r,   r©   z%ArcLengthDimension.update_measurementµ  s<   € Ü" 4×#7Ñ#7¸×9KÑ9KÓLˆØ˜TŸ_™_Ñ,ˆ
Ø×Ñ×Ñ 
Õ+r4   rL  rM  rQ  r`  rN  rP  rO  )r~   r   r€   ry  rc   rÉ   r^  r›   r�   rŸ   r£   r©   r�   r‚   s   @r,   r#   r#   u  sW   ø„ ñð4 "Ø/3ð	*àð*ð ð*ð -õ	*ó
ó
ó
"óGóBóB÷,r4   r#   c                óª   — | j                  |«      }| j                  |«      }| j                  |«      }t        ||z
  «      t        ||z
  «      k  r|S |S r'   )Údotr+  )r#  rc  r  r  Úd0Úd1Úd2s          r,   ri  ri  »  sP   € ð 
�‰�tÓ	€BØ	�‰�rÓ	€BØ	�‰�rÓ	€Bä
ˆ2�‰7ƒ|”s˜2 ™7“|Ò#Øˆ	Ø€Ir4   c                óN   — d}||z  }t        | |«      }|dkD  r
||z  }|dz  }||fS )Nrè   r™   )r   )Ú
arrow_namerE  r’   rC  rD  r‘   s         r,   rA  rA  È  sC   € ð €LØ˜v™€JÜ˜* dÓ+€FØ�‚|Ø ‘ˆØ�cÑˆ
Ø˜Ð#Ð#r4   )r1   r   r2   z	list[str])rT   rO   rU   r{   r8   zOptional[float]r9   r{   r:   r{   r;   rQ   rP   rQ   )rT   rO   r\   r{   rP   rO   )r‘   rO   r’   rO   r“   rO   rP   rë   )
r#  r   rc  r   r  r   r  r   rP   r   )r   rQ   rE  rO   r’   rO   rP   rR  )>Ú
__future__r   Útypingr   r   Úabcr   ÚloggingÚmathÚ
ezdxf.mathr   r   r	   r
   r   r   r   Úezdxf.entitiesr   r   r   Údim_baser   r   r   r   r   r   r   r   r   r   Úezdxf.render.arrowsr   r   Úezdxf.tools.textr   r   Úezdxf.eztypesr    Ú__all__Ú	getLoggerrm  rŽ  r3   ÚpirS   rR   rW   rZ   r]   r_   r„   r•   r—   rU  r!   r"   rŠ  r#   ri  rA  r(   r4   r,   Ú<module>r¯     s¼  ðõ #ß *Ý Û Û ÷÷ ñ ÷ BÑ A÷÷ ÷ ÷ 5Ý 6Ý 0áÝ/â
J€Ø	ˆ×	Ñ	˜7Ó	#€à€
óAð
 ˆt�w‰w�€Øˆd�g‰g�o€ð-Øð-àð-ð ð-ð ð	-ð
 ð-ð ð-ð 	ó-ðb ØØØð	€óô+P�yô +Pô\�{ô ó((ô
kPÐ0ô kPô\9Ð-ô 9ô*h,Ð)ô h,ôV9BÐ+ô 9BôxÐ,ô ô C,Ð-ô C,ðL
Øð
Øð
Ø%)ð
Ø/3ð
à	ó
ð	$Øð	$Ø ð	$Ø*/ð	$àô	$r4   