Ë
    £èh,l  ã                  ó`  — d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ erddlmZ dd	lmZ d
ZdZdez  Zdez  ZdZ G d„ de «      Z! G d„ d«      Z" e"«       Z# G d„ d«      Z$ G d„ de$«      Z% G d„ de$«      Z& G d„ de&«      Z' G d„ de$«      Z(dd„Z)y) aÚ  Dimension lines as composite entities build up by DXF primitives.

This add-on exist just for an easy transition from `dxfwrite` to `ezdxf`.

Classes
-------

- LinearDimension
- AngularDimension
- ArcDimension
- RadiusDimension
- DimStyle

This code was written long before I had any understanding of the DIMENSION
entity and therefore, the classes have completely different implementations and
styling features than the dimensions based on the DIMENSION entity .

.. warning::

    Try to not use these classes beside porting `dxfwrite` code to `ezdxf`
    and even for that case the usage of the regular DIMENSION entity is to
    prefer because this module will not get much maintenance and may be removed
    in the future.

é    )Úannotations)ÚAnyÚTYPE_CHECKINGÚIterableÚOptional)ÚradiansÚdegreesÚpi)Úabstractmethod)ÚTextEntityAlignment)ÚVec3ÚVec2ÚdistanceÚlerpÚConstructionRayÚUVec)ÚDrawing)ÚGenericLayoutTypeçš™™™™™©?Ú.ç     €f@g      i@ç      ð?c                  ó<   ‡ — e Zd ZdZg d¢Zdˆ fd„Zdd„Zdd„Zˆ xZS )	ÚDimStylezBDimStyle parameter struct, a dumb object just to store values
    ))ÚtickÚDIMTICK_ARCH)Ú
tickfactorr   )Útick2xF)Úscaleg      Y@)Úroundvalr   )Ú	roundhalfF)Ú	textcoloré   )Úheightç      à?)ÚprefixÚ )Úsuffixr'   )ÚstylezOpenSansCondensed-Light)ÚlayerÚ
DIMENSIONS)Údimlinecolorr#   )Ú
dimlineextç333333Ó?)Ú	textaboveçš™™™™™É?)Ú
dimextlineT)Údimextlinecoloré   )Údimextlinegapr.   c                ól   •— t         ‰| �  t        j                  «       || d<   | j	                  |«       y )NÚname)ÚsuperÚ__init__r   Údefault_valuesÚupdate)Úselfr6   ÚkwargsÚ	__class__s      €ú5lib/python3.12/site-packages/ezdxf/addons/dimlines.pyr8   zDimStyle.__init__\   s+   ø€ Ü‰Ñœ×0Ñ0Ô1àˆˆV‰Ø�‰�FÕó    c                ó   — | |   S ©N© )r;   Úattrs     r>   Ú__getattr__zDimStyle.__getattr__b   s   € Ø�D‰zÐr?   c                ó   — || |<   y rA   rB   )r;   rC   Úvalues      r>   Ú__setattr__zDimStyle.__setattr__e   s   € ØˆˆTŠ
r?   )r6   Ústr)rC   rH   Úreturnr   )rC   rH   rF   r   rI   ÚNone)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   r8   rD   rG   Ú__classcell__©r=   s   @r>   r   r   /   s   ø„ ñò'€NõRó÷r?   r   c                  ó:   — e Zd ZdZdd„Zdd„Zdd„Zed	d„«       Zy)
Ú	DimStylesz
    DimStyle container

    c           
     óò   — i | _         t        d«      | _        | j                  dt        t        d«      ddddd¬	«       | j                  d
t        dddddd¬	«       | j                  dt        dddddd¬	«       y )NÚDefaultú	angle.degô   Â°r   ÚDIMTICK_RADIUSTç        F)r   r(   r    r   r   r-   r1   z
angle.gradÚgonz	angle.radÚradé   )Ú_stylesr   ÚdefaultÚnewÚ	ANGLE_DEGrH   Ú
ANGLE_GRADÚ	ANGLE_RAD©r;   s    r>   r8   zDimStyles.__init__o   s˜   € Ø,.ˆŒÜ 	Ó*ˆŒà�‰ØÜÜ�t“9ØØ!ØØØð 	ô 		
ð 	�‰ØÜØØØ!ØØØð 	ô 		
ð 	�‰ØÜØØØ!ØØØð 	õ 		
r?   c                óN   — | j                   j                  || j                  «      S )z0
        Get DimStyle() object by name.
        )r\   Úgetr]   )r;   r6   s     r>   rd   zDimStyles.get’   s   € ð �|‰|×Ñ  d§l¡lÓ3Ð3r?   c                ó<   — t        |fi |¤Ž}|| j                  |<   |S )z'
        Create a new dimstyle
        )r   r\   )r;   r6   r<   r)   s       r>   r^   zDimStyles.new˜   s&   € ô ˜Ñ( Ñ(ˆØ"ˆ�‰�TÑØˆr?   c                óF  — t         j                  j                  ddœ}dddœ}dddœ}| j                  j	                  d«      }|j                  dd|¬«       |j                  d	d
|¬«       | j                  j	                  d«      }|j                  dd|¬«       |j                  dd|¬«       | j                  j	                  d«      }|j                  dd|¬«       |j                  g d¢|¬«       | j                  j	                  d«      }|j                  g d¢|¬«       y)zy
        Insert necessary definitions into drawing:

            ticks: DIMTICK_ARCH, DIMTICK_DOT, DIMTICK_ARROW
        ÚBYBLOCK©Úcolorr*   é   r#   r   )rX   r%   )rX   g      à¿©ÚstartÚendÚ
dxfattribs)çš™™™™™É¿ro   )r0   r0   ÚDIMTICK_DOT©r   r   gš™™™™™¹?)ÚcenterÚradiusrn   ÚDIMTICK_ARROW)rq   ©r.   r   ©r.   gš™™™™™©¿)rn   rW   )rq   ru   )g      Ð?rX   rv   N)Ú	dimstylesr]   r2   Úblocksr^   Úadd_lineÚ
add_circleÚ	add_solid)ÚdrawingÚdimcolorÚcolor4Úcolor7Úblocks        r>   ÚsetupzDimStyles.setup    s  € ô& ×&Ñ&×6Ñ6Øñ
ˆð  yÑ1ˆØ yÑ1ˆà—‘×"Ñ" >Ó2ˆØ�‰˜[¨kÀhˆÔOØ�‰˜\¨{ÀvˆÔNà—‘×"Ñ" =Ó1ˆØ�‰˜Z¨[ÀXˆÔNØ×Ñ ¨s¸vÐÔFà—‘×"Ñ" ?Ó3ˆà�‰˜Z¨\ÀhˆÔOØ�‰Ò;ÈˆÔOà—‘×"Ñ"Ð#3Ó4ˆØ�‰Ú<Èð 	õ 	
r?   N©rI   rJ   )r6   rH   rI   r   )r|   z	'Drawing')	rK   rL   rM   rN   r8   rd   r^   Ústaticmethodr�   rB   r?   r>   rR   rR   i   s+   „ ñó
!
óF4óð ò(
ó ñ(
r?   rR   c                  ó:   — e Zd ZdZdd„Zdd„Zd	d„Zed
d„«       Zy)Ú_DimensionBasez3
    Abstract base class for dimension lines.

    c                óT   — t         j                  |«      | _        || _        || _        y rA   )rw   rd   Údimstyler*   r    )r;   r‡   r*   r    s       r>   r8   z_DimensionBase.__init__Õ   s    € Ü!Ÿ™ hÓ/ˆŒØˆŒ
Ø ˆ�r?   c                óì   — |dk(  r.| j                   �| j                   S | j                  j                   S |dk(  r.| j                  �| j                  S | j                  j                  S | j                  |   S )zw
        Get dimension line properties by `property_name` with the possibility to override several properties.
        r*   r    )r*   r‡   r    )r;   Úproperty_names     r>   Úpropz_DimensionBase.propÚ   su   € ð ˜GÒ#Ø!%§¡Ð!7�4—:‘:ÐP¸T¿]¹]×=PÑ=PÐPØ˜jÒ(ð —=‘=Ð,ð —‘ðð —]‘]×+Ñ+ðð —=‘= Ñ/Ð/r?   c                óô   — dt        | j                  d«      «      z   dz   }||z  }t        |v r&|j                  d«       |j                  t        «       | j                  d«      |z   | j                  d«      z   S )z,
        Format the dimension text.
        z%.r    ÚfÚ0r&   r(   )rH   rŠ   ÚDIMENSIONS_FLOATINGPOINTÚrstrip)r;   ÚdimvalueÚ
dimtextfmtÚdimtexts       r>   Úformat_dimtextz_DimensionBase.format_dimtexté   sn   € ð œC §	¡	¨*Ó 5Ó6Ñ6¸Ñ<ˆ
Ø˜xÑ'ˆÜ# wÑ.à�N‰N˜3Ôà�N‰NÔ3Ô4Ø�y‰y˜Ó" WÑ,¨t¯y©y¸Ó/BÑBÐBr?   c                 ó   — y rA   rB   ©r;   Úlayouts     r>   Úrenderz_DimensionBase.renderö   s   € àr?   N)r‡   rH   r*   rH   r    Úint)r‰   rH   rI   r   )r�   ÚfloatrI   rH   )r–   ú'GenericLayoutType')	rK   rL   rM   rN   r8   rŠ   r“   r   r—   rB   r?   r>   r…   r…   Ï   s+   „ ñó
!ó
0óCð òó ñr?   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	e
dd„«       Ze
dd	„«       Zdd
„Zedd„«       Zdd„Zedd„«       Zdd„Zdd„Zdd„Zdd„Zd d„Zdd„Zˆ xZS )!ÚLinearDimensionzÌ
    Simple straight dimension line with two or more measure points, build with basic DXF entities. This is NOT a dxf
    dimension entity. And This is a 2D element, so all z-values will be ignored!

    c                ó®   •— t         ‰| �  |||«       || _        t        |«      | _        dg| j
                  z  | _        t        |«      | _        d| _	        y)að  
        LinearDimension Constructor.

        Args:
            pos: location as (x, y) tuple of dimension line, line goes through this point
            measure_points: list of points as (x, y) tuples to dimension (two or more)
            angle: angle (in degree) of dimension line
            dimstyle: dimstyle name, 'Default' - style is the default value
            layer: dimension line layer, override the default value of dimstyle
            roundval: count of decimal places

        r'   N)
r7   r8   ÚangleÚlistÚmeasure_pointsÚsection_countÚtext_overrider   Ú
dimlineposr–   )r;   Úposr    rž   r‡   r*   r    r=   s          €r>   r8   zLinearDimension.__init__  sQ   ø€ ô* 	‰Ñ˜ 5¨(Ô3ØˆŒ
Ü" >Ó2ˆÔØ ˜T D×$6Ñ$6Ñ6ˆÔÜ˜s›)ˆŒØˆ�r?   c                ó"   — || j                   |<   y)zg
        Set and override the text of the dimension text for the given dimension line section.
        N)r¢   )r;   ÚsectionÚtexts      r>   Úset_textzLinearDimension.set_text  s   € ð '+ˆ×Ñ˜7Ò#r?   c                óz  — | j                   D �cg c]  }t        |«      ‘Œ c}| _         t        | j                  t	        | j
                  «      ¬«      }| j                   D �cg c]  }| j                  ||«      ‘Œ c}| _        | j                  | j                  «      | _	        | j                  «        yc c}w c c}w )z`
        Calc setup values and determines the point order of the dimension line points.
        )rž   N)r    r   r   r£   r   rž   Ú_get_point_on_dimlineÚdimline_pointsÚ_indices_of_sorted_pointsÚpoint_orderÚ_build_vectors)r;   ÚpointÚ
dimlinerays      r>   Ú_setupzLinearDimension._setup$  s§   € ð 9=×8KÒ8KÓLÑ8K¨uœt E�{Ð8KÑLˆÔÜ$ T§_¡_¼GÀDÇJÁJÓ<OÔPˆ
ð ×,Ò,ó
á,�ð ×&Ñ& u¨jÕ9Ø,ñ
ˆÔð  ×9Ñ9¸$×:MÑ:MÓNˆÔØ×ÑÕùò Mùò
s   �B3Á!B8c                ó:   — | j                   | j                  |      S )zL
        Get point on the dimension line, index runs left to right.
        )r«   r­   )r;   Úindexs     r>   Ú_get_dimline_pointz"LinearDimension._get_dimline_point1  s    € ð ×"Ñ" 4×#3Ñ#3°EÑ#:Ñ;Ð;r?   c                óL   — | j                  |«      | j                  |dz   «      fS )zU
        Get start and end point on the dimension line of dimension section.
        é   ©r´   )r;   r¦   s     r>   Ú_get_section_pointsz#LinearDimension._get_section_points7  s0   € ð ×&Ñ& wÓ/°×1HÑ1HØ�a‰Kó2
ð 
ð 	
r?   c                óF   — | j                  d«      | j                  d«      fS )zE
        Get the first and the last point of dimension line.
        r   éÿÿÿÿr·   rb   s    r>   Ú_get_dimline_boundsz#LinearDimension._get_dimline_bounds?  s%   € ð ×&Ñ& qÓ)¨4×+BÑ+BÀ2Ó+FÐFÐFr?   c                ó2   — t        | j                  «      dz
  S )zcount of dimline sectionsr¶   ©Úlenr    rb   s    r>   r¡   zLinearDimension.section_countE  s   € ô �4×&Ñ&Ó'¨!Ñ+Ð+r?   c                ó,   — t        | j                  «      S )zcount of dimline pointsr½   rb   s    r>   Úpoint_countzLinearDimension.point_countJ  s   € ô �4×&Ñ&Ó'Ð'r?   c                óÎ   — | j                  «        | j                  |«       | j                  d«      r| j                  |«       | j	                  |«       | j                  |«       y©ú3build dimension line object with basic dxf entitiesr1   N)r±   Ú_draw_dimlinerŠ   Ú_draw_extension_linesÚ
_draw_textÚ_draw_ticksr•   s     r>   r—   zLinearDimension.renderO  sM   € à�‰ŒØ×Ñ˜6Ô"Ø�9‰9�\Ô"Ø×&Ñ& vÔ.Ø�‰˜ÔØ×Ñ˜Õ r?   c                ó¢   — t        | «      D ��cg c]	  \  }}||f‘Œ }}}|j                  «        |D ��cg c]  \  }}|‘Œ	 c}}S c c}}w c c}}w )z7get indices of points, for points sorted by x, y values)Ú	enumerateÚsort)ÚpointsÚidxr¯   Úindexed_pointss       r>   r¬   z)LinearDimension._indices_of_sorted_pointsX  sV   € ô :CÀ6Ô9JÔKÑ9J©:¨3°˜5 #š,Ð9JˆÑKØ×ÑÔÙ&4Ô5¡n™
˜˜s’ nÒ5Ð5ùó Lùã5s
   �AµAc                ó¼   — | j                  «       \  }}t        |«      t        |«      z
  j                  «       | _        | j                  j	                  «       | _        y)z9build unit vectors, parallel and normal to dimension lineN)r»   r   Ú	normalizeÚparallel_vectorÚ
orthogonalÚnormal_vector)r;   Úpoint1Úpoint2s      r>   r®   zLinearDimension._build_vectors_  sI   € à×1Ñ1Ó3‰ˆ�Ü $ V£¬t°F«|Ñ ;×FÑFÓHˆÔØ!×1Ñ1×<Ñ<Ó>ˆÕr?   c                óB   — |j                  |j                  | «      «      S )z=get the measure target point projection on the dimension line)Ú	intersectrÑ   )r¯   Údimrays     r>   rª   z%LinearDimension._get_point_on_dimlinee  s    € ð ×Ñ × 1Ñ 1°%Ó 8Ó9Ð9r?   c                ó  — | j                  «       \  }}| j                  d«      }|dkD  r$|| j                  |z  z
  }|| j                  |z  z   }| j                  d«      | j                  d«      dœ}|j                  |||¬«       y)zbuild dimension line entityr-   r   r,   r*   rh   rk   N)r»   rŠ   rÐ   ry   )r;   r–   Ústart_pointÚ	end_pointr-   Úattribss         r>   rÄ   zLinearDimension._draw_dimlinej  s‘   € à!%×!9Ñ!9Ó!;Ñˆ�Yà—Y‘Y˜|Ó,ˆ
Ø˜Š>Ø%¨×)=Ñ)=À
Ñ)JÑKˆKØ! T×%9Ñ%9¸JÑ%FÑGˆIð —Y‘Y˜~Ó.Ø—Y‘Y˜wÓ'ñ
ˆð 	�‰ØØØð 	õ 	
r?   c                óV  — | j                  d«      }| j                  d«      | j                  d«      dœ}t        | j                  | j                  «      D ]R  \  }}t	        ||«      t        |t        «      kD  sŒ$||z
  j                  «       }|||z  z
  }|j                  |||¬«       ŒT y)ú"build the extension lines entitiesr4   r,   r*   rh   rk   N)	rŠ   Úzipr«   r    r   ÚmaxÚDIMENSIONS_MIN_DISTANCErÏ   ry   )r;   r–   r4   rÛ   Údimline_pointÚtarget_pointÚdirection_vectors          r>   rÅ   z%LinearDimension._draw_extension_lines}  s´   € àŸ	™	 /Ó2ˆà—Y‘Y˜~Ó.Ø—Y‘Y˜wÓ'ñ
ˆô
 ,/Ø×Ñ ×!4Ñ!4ö,
Ñ'ˆM˜<ô ˜ |Ó4´sØÔ6ó8ó ð %1°=Ñ$@×#KÑ#KÓ#MÐ Ø+Ð/?À-Ñ/OÑP�Ø—‘Ø'Ø$Ø&ð  õ ñ,
r?   c                ó|  — | j                  d«      | j                  d«      | j                  d«      | j                  | j                  d«      dœ}t        | j                  «      D ]V  }| j	                  |«      }| j                  |«      }|j                  ||¬«      j                  |t        j                  ¬«       ŒX y)	z%build the dimension value text entityr$   r"   r*   r)   )r$   ri   r*   Úrotationr)   ©r§   rn   ©ÚalignN)
rŠ   rž   Úranger¡   Ú_get_dimvalue_textÚ_get_text_insert_pointÚadd_textÚset_placementr   ÚMIDDLE_CENTER)r;   r–   rÛ   r¦   Údimvalue_textÚinsert_points         r>   rÆ   zLinearDimension._draw_text“  s­   € ð —i‘i Ó)Ø—Y‘Y˜{Ó+Ø—Y‘Y˜wÓ'ØŸ
™
Ø—Y‘Y˜wÓ'ñ
ˆô ˜T×/Ñ/Ö0ˆGØ ×3Ñ3°GÓ<ˆMØ×6Ñ6°wÓ?ˆLØ�O‰OØ"Ø"ð ó ÷ ‰mØÔ$7×$EÑ$Eð õ ñ 1r?   c                óÀ   — | j                   |   }t        |«      r|S | j                  |«      \  }}t        ||«      | j	                  d«      z  }| j                  |«      S )z?get the dimension value as text, distance from point1 to point2r   )r¢   r¾   r¸   r   rŠ   r“   )r;   r¦   ÚoverriderÓ   rÔ   r�   s         r>   rê   z"LinearDimension._get_dimvalue_text¦  s]   € à×%Ñ% gÑ.ˆÜˆxŒ=ØˆOØ×1Ñ1°'Ó:‰ˆ�ä˜F FÓ+¨d¯i©i¸Ó.@Ñ@ˆØ×"Ñ" 8Ó,Ð,r?   c                ó®   — | j                  |«      \  }}| j                  d«      dz  | j                  d«      z   }t        ||«      | j                  |z  z   S )z)get the dimension value text insert pointr$   ç       @r/   )r¸   rŠ   r   rÒ   )r;   r¦   rÓ   rÔ   Údists        r>   rë   z&LinearDimension._get_text_insert_point°  sT   € à×1Ñ1°'Ó:‰ˆ�Ø�y‰y˜Ó" SÑ(¨4¯9©9°[Ó+AÑAˆÜ�F˜FÓ# t×'9Ñ'9¸DÑ'@ÑAÐAr?   c                ó‚  ‡ ‡‡— ‰ j                  d«      ‰ j                  d«      ‰ j                  d«      dœŠddˆˆˆ fd„}‰ j                  d«      rLt        d‰ j                  dz
  «      D ]  } ||d«       Œ t        d‰ j                  «      D ]  } ||d	«       Œ y
t        ‰ j                  «      D ]  } ||d«       Œ y
)z@insert the dimension line ticks, (markers on the dimension line)r   r*   ©ÚxscaleÚyscaler*   Fc                ó–   •— ‰j                   |rdndz   ‰d<   ‰j                  ‰j                  | «      ‰j                  d«      ‰¬«       y)z*build the insert-entity for the tick blockr   rX   rå   r   ©Úinsertr6   rn   N)rž   Úadd_blockrefr´   rŠ   )r³   ÚrotaterÛ   r–   r;   s     €€€r>   Úadd_tickz-LinearDimension._draw_ticks.<locals>.add_tick¾  sJ   ø€ à"&§*¡*¹±ÀSÑ"IˆG�JÑØ×ÑØ×.Ñ.¨uÓ5Ø—Y‘Y˜vÓ&Ø"ð  õ r?   r   r   r¶   TN)F)r³   r˜   rþ   ÚboolrI   rJ   )rŠ   ré   rÀ   )r;   r–   rÿ   r³   rÛ   s   ``  @r>   rÇ   zLinearDimension._draw_ticks¶  s°   ú€ ð —i‘i Ó-Ø—i‘i Ó-Ø—Y‘Y˜wÓ'ñ
ˆ÷	ð 	ð �9‰9�XÔÜ˜q $×"2Ñ"2°QÑ"6Ö7�Ù˜ Õ&ð 8ä˜q $×"2Ñ"2Ö3�Ù˜ Õ%ñ 4ô ˜t×/Ñ/Ö0�Ù˜ Õ&ñ 1r?   )rX   rT   NN)r¤   r   r    úIterable[UVec]rž   r™   r‡   rH   r*   úOptional[str]r    úOptional[int])r¦   r˜   r§   rH   rI   rJ   r‚   )r³   r˜   rI   r   )r¦   r˜   rI   útuple[Vec3, Vec3])rI   r  )rI   r˜   ©r–   rš   rI   rJ   )rË   r  rI   z	list[int])r¯   r   r×   r   rI   r   )r¦   r˜   rI   rH   )r¦   r˜   rI   r   )rK   rL   rM   rN   r8   r¨   r±   r´   r¸   r»   Úpropertyr¡   rÀ   r—   rƒ   r¬   r®   rª   rÄ   rÅ   rÆ   rê   rë   rÇ   rO   rP   s   @r>   rœ   rœ   û   sè   ø„ ñð Ø!Ø#Ø"&ðàðð 'ðð ð	ð
 ðð ðð  õó8+óó<ó
óGð ò,ó ð,ð ò(ó ð(ó!ð ò6ó ð6ó?ð ò:ó ð:ó
ó&ó,ó&-óB÷'r?   rœ   c                  ó¢   ‡ — e Zd ZdZeZeZe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dd
„Zdd„Zdd„Zˆ xZS )ÚAngularDimensionz˜
    Draw an angle dimensioning line at dimline pos from start to end, dimension text is the angle build of the three
    points start-center-end.

    c                ó¨   •— t         ‰| �  |||«       t        |«      | _        t        |«      | _        t        |«      | _        t        |«      | _        y)a2  
        AngularDimension constructor.

        Args:
            pos: location as (x, y) tuple of dimension line, line goes through this point
            center: center point as (x, y) tuple of angle
            start: line from center to start is the first side of the angle
            end: line from center to end is the second side of the angle
            dimstyle: dimstyle name, 'Default' - style is the default value
            layer: dimension line layer, override the default value of dimstyle
            roundval: count of decimal places

        N)r7   r8   r   r£   rr   rl   rm   )	r;   r¤   rr   rl   rm   r‡   r*   r    r=   s	           €r>   r8   zAngularDimension.__init__Ü  sB   ø€ ô. 	‰Ñ˜ 5¨(Ô3Ü˜s›)ˆŒÜ˜6“lˆŒÜ˜%“[ˆŒ
Ü˜“9ˆ�r?   c                ó´  — t        | j                  | j                  «      | _        t        | j                  | j                  «      | _        | j                  | j                  z
  j                  «       | _        | j                  | j                  z
  j                  «       | _	        | j                  j                  | _        | j                  j                  | _        y)zsetup calculation valuesN)r   rr   r£   Ú
pos_radiusrl   rs   rÏ   Ústart_vectorrm   Ú
end_vectorrž   Ústart_angleÚ	end_anglerb   s    r>   r±   zAngularDimension._setupù  sŽ   € ä" 4§;¡;°·±Ó@ˆŒÜ˜tŸ{™{¨D¯J©JÓ7ˆŒØ!ŸZ™Z¨$¯+©+Ñ5×@Ñ@ÓBˆÔØŸ8™8 d§k¡kÑ1×<Ñ<Ó>ˆŒØ×,Ñ,×2Ñ2ˆÔØŸ™×.Ñ.ˆ�r?   c                óÎ   — | j                  «        | j                  |«       | j                  d«      r| j                  |«       | j	                  |«       | j                  |«       yrÂ   )r±   Ú_draw_dimension_linerŠ   rÅ   Ú_draw_dimension_textrÇ   r•   s     r>   r—   zAngularDimension.render  sQ   € ð 	�‰ŒØ×!Ñ! &Ô)Ø�9‰9�\Ô"Ø×&Ñ& vÔ.Ø×!Ñ! &Ô)Ø×Ñ˜Õ r?   c           
     óæ   — |j                  | j                  | j                  t        | j                  «      t        | j
                  «      | j                  d«      | j                  d«      dœ¬«       y)z0draw the dimension line from start- to endangle.r*   r,   ©r*   ri   )rs   rr   r  r  rn   N)Úadd_arcr  rr   r	   r  r  rŠ   r•   s     r>   r  z%AngularDimension._draw_dimension_line  sX   € à�‰Ø—?‘?Ø—;‘;Ü × 0Ñ 0Ó1Ü˜dŸn™nÓ-àŸ™ 7Ó+ØŸ™ >Ó2ñð 	õ 		
r?   c           	     óä   — | j                   | j                  fD ]U  }|j                  | j                  |«      | j	                  |«      | j                  d«      | j                  d«      dœ¬«       ŒW y)rÝ   r*   r2   r  rk   N)r  r  ry   Ú_get_extline_startÚ_get_extline_endrŠ   )r;   r–   Úvectors      r>   rÅ   z&AngularDimension._draw_extension_lines  sf   € à×(Ñ(¨$¯/©/Ó:ˆFØ�O‰OØ×-Ñ-¨fÓ5Ø×)Ñ)¨&Ó1à!ŸY™Y wÓ/Ø!ŸY™YÐ'8Ó9ñð õ ñ ;r?   c                óD   — | j                   || j                  d«      z  z   S ©Nr4   )rr   rŠ   ©r;   r  s     r>   r  z#AngularDimension._get_extline_start%  s   € Ø�{‰{˜f t§y¡y°Ó'AÑAÑBÐBr?   c                ó:   — | j                   || j                  z  z   S rA   ©rr   r  r  s     r>   r  z!AngularDimension._get_extline_end(  ó   € Ø�{‰{˜f t§¡Ñ6Ñ7Ð7r?   c                ó‚  — | j                  d«      t        | j                  | j                  z   dz  t        dz  z
  «      | j                  d«      | j                  d«      | j                  d«      dœ}|j                  | j                  «       |¬«      j                  | j                  «       t        j                  ¬	«       y )
Nr$   é   rô   r*   r)   r"   ©r$   rå   r*   r)   ri   ræ   rç   )rŠ   r	   r  r  r
   rì   Ú_get_dimtextrí   rë   r   rî   )r;   r–   rÛ   s      r>   r  z%AngularDimension._draw_dimension_text+  s«   € à—i‘i Ó)ÜØ×!Ñ! D§N¡NÑ2°aÑ7¼"¸s¹(ÑBóð —Y‘Y˜wÓ'Ø—Y‘Y˜wÓ'Ø—Y‘Y˜{Ó+ñ
ˆð 	�‰Ø×"Ñ"Ó$Øð 	ó 	
÷ ‰-Ø×'Ñ'Ó)Ü%×3Ñ3ð õ 
r?   c                óà   — | j                   | j                  z   dz  j                  «       }| j                  | j	                  d«      z   | j	                  d«      dz  z   }| j
                  ||z  z   S )Nrô   r/   r$   )r  r  rÏ   r  rŠ   rr   )r;   Ú	midvectorÚlengths      r>   rë   z'AngularDimension._get_text_insert_point=  sg   € Ø×'Ñ'¨$¯/©/Ñ9¸SÑ@×KÑKÓMˆ	à�O‰O˜dŸi™i¨Ó4Ñ4°t·y±yÀÓ7JÈSÑ7PÑPð 	ð �{‰{˜i¨&Ñ0Ñ1Ð1r?   c                ó¬  — | j                  d«      | j                  d«      | j                  d«      dœ}| j                  df| j                  | j                  d«      ffD ]s  \  }}| j                  || j                  z  z   }|j
                  t        dz  z   }t        ||rt        ndz   «      |d<   |j                  || j                  d	«      |¬
«       Œu y )Nr   r*   r÷   Fr   rô   rX   rå   r   rû   )	rŠ   r  r  rr   r  rž   r
   r	   rý   )r;   r–   rÛ   r  Úmirrorrð   rå   s          r>   rÇ   zAngularDimension._draw_ticksD  sÊ   € à—i‘i Ó-Ø—i‘i Ó-Ø—Y‘Y˜wÓ'ñ
ˆð ×Ñ Ð&Ø�_‰_˜dŸi™i¨Ó1Ð2ó
‰NˆF�Fð  Ÿ;™;¨&°4·?±?Ñ*BÑCˆLØ—|‘|¤b¨3¡hÑ.ˆHÜ")¨(¹FµbÈÑ*LÓ"MˆG�JÑØ×ÑØ#Ø—Y‘Y˜vÓ&Ø"ð  õ ñ
r?   c                óz   — | j                   | j                  z
  | j                  d«      z  }| j                  |«      S ©Nr   )r  r  rŠ   r“   )r;   rž   s     r>   r#  zAngularDimension._get_dimtextW  s7   € ð —‘ $×"2Ñ"2Ñ2°d·i±iÀÓ6HÑHˆØ×"Ñ" 5Ó)Ð)r?   )rU   NN)r¤   r   rr   r   rl   r   rm   r   r‡   rH   r*   r  r    r  r‚   r  ©r  r   rI   r   ©rI   r   ©rI   rH   )rK   rL   rM   rN   r_   ÚDEGr`   ÚGRADra   ÚRADr8   r±   r—   r  rÅ   r  r  r  rë   rÇ   r#  rO   rP   s   @r>   r  r  Ñ  s    ø„ ñð €CØ€DØ
€Cð $Ø#Ø"&ðàðð ðð ð	ð
 ðð ðð ðð  õó:/ó!ó
ó
óCó8ó
ó$2ó÷&*r?   r  c                  óp   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd	ˆ fd„Zd
d„Zd
d„Zdd„Zˆ xZ	S )ÚArcDimensionzê
    Arc is defined by start- and endpoint on arc and the center point, or by three points lying on the arc if acr3points
    is True. Measured length goes from start- to endpoint. The dimension line goes through the dimlinepos.

    c	           	     ó>   •— t         ‰	| �  |||||||«       || _        y)a  
        Args:
            pos: location as (x, y) tuple of dimension line, line goes through this point
            center: center point of arc
            start: start point of arc
            end: end point of arc
            arc3points: if **True** arc is defined by three points on the arc (center, start, end)
            dimstyle: dimstyle name, 'Default' - style is the default value
            layer: dimension line layer, override the default value of dimstyle
            roundval: count of decimal places

        N)r7   r8   Ú
arc3points)
r;   r¤   rr   rl   rm   r4  r‡   r*   r    r=   s
            €r>   r8   zArcDimension.__init__f  s%   ø€ ô. 	‰Ñ˜˜f e¨S°(¸EÀ8ÔLØ$ˆ�r?   c                óœ   •— t         ‰| �  «        | j                  r1t        | j                  | j
                  | j                  «      | _        y y rA   )r7   r±   r4  Úcenter_of_3points_arcrr   rl   rm   )r;   r=   s    €r>   r±   zArcDimension._setup€  s8   ø€ Ü‰‰ÔØ�?Š?Ü/Ø—‘˜TŸZ™Z¨¯©óˆD�Kð r?   c                ó^   — | j                   || j                  | j                  d«      z   z  z   S r  )rr   rs   rŠ   r  s     r>   r  zArcDimension._get_extline_start‡  s-   € Ø�{‰{Ø�d—k‘k D§I¡I¨oÓ$>Ñ>Ñ?ñ
ð 	
r?   c                ó:   — | j                   || j                  z  z   S rA   r  r  s     r>   r  zArcDimension._get_extline_endŒ  r  r?   c                ó”   — | j                   | j                  z
  | j                  z  | j                  d«      z  }| j	                  |«      S r*  )r  r  rs   rŠ   r“   )r;   Ú
arc_lengths     r>   r#  zArcDimension._get_dimtext�  sI   € à�^‰^˜d×.Ñ.Ñ.Ø�k‰kñà�i‰i˜Ó ñ!ð 	ð
 ×"Ñ" :Ó.Ð.r?   )FrT   NN)r¤   r   rr   r   rl   r   rm   r   r4  r   r‡   rH   r*   r  r    r  r‚   r+  r-  )
rK   rL   rM   rN   r8   r±   r  r  r#  rO   rP   s   @r>   r2  r2  _  s}   ø„ ñð !Ø!Ø#Ø"&ð%àð%ð ð%ð ð	%ð
 ð%ð ð%ð ð%ð ð%ð  õ%õ4ó
ó
8÷/r?   r2  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	dd„Z
dd	„Zˆ xZS )ÚRadialDimensionz‘
    Draw a radius dimension line from `target` in direction of `center` with length drawing units. RadiusDimension has
    a special tick!!
    c                óˆ   •— t         ‰| �  |||«       t        |«      | _        t        |«      | _        t        |«      | _        y)at  
        Args:
            center: center point of radius
            target: target point of radius
            length: length of radius arrow (drawing length)
            dimstyle: dimstyle name, 'Default' - style is the default value
            layer: dimension line layer, override the default value of dimstyle
            roundval: count of decimal places

        N)r7   r8   r   rr   Útargetr™   r&  )r;   rr   r>  r&  r‡   r*   r    r=   s          €r>   r8   zRadialDimension.__init__ž  s7   ø€ ô& 	‰Ñ˜ 5¨(Ô3Ü˜6“lˆŒÜ˜6“lˆŒÜ˜F“mˆ�r?   c                ó¦   — | j                   | j                  z
  j                  «       | _        t	        | j                  | j                   «      | _        y rA   )r>  rr   rÏ   Útarget_vectorr   rs   rb   s    r>   r±   zRadialDimension._setup¶  s9   € à�K‰K˜$Ÿ+™+Ñ%ß
‰)‹+ð 	Ôô ˜tŸ{™{¨D¯K©KÓ8ˆ�r?   c                óŠ   — | j                  «        | j                  |«       | j                  |«       | j                  |«       y)rÃ   N)r±   r  r  rÇ   r•   s     r>   r—   zRadialDimension.render¼  s5   € à�‰ŒØ×!Ñ! &Ô)Ø×!Ñ! &Ô)Ø×Ñ˜Õ r?   c                óè   — | j                   | j                  | j                  | j                  z
  z  z   }|j	                  || j
                  | j                  d«      | j                  d«      dœ¬«       y )Nr,   r*   rh   rk   )rr   r@  rs   r&  ry   r>  rŠ   )r;   r–   rÙ   s      r>   r  z$RadialDimension._draw_dimension_lineÃ  se   € Ø—k‘kØ×Ñ $§+¡+°·±Ñ";Ñ<ñ
ˆð 	�‰ØØ—‘àŸ™ >Ó2ØŸ™ 7Ó+ñð 	õ 	
r?   c           
     óL  — |j                  | j                  «       | j                  d«      | j                  j                  | j                  d«      | j                  d«      | j                  d«      dœ¬«      j                  | j                  «       t        j                  ¬«       y )Nr$   r*   r)   r"   r"  ræ   rç   )	rì   r#  rŠ   r@  Ú	angle_degrí   Ú_get_insert_pointr   ÚMIDDLE_RIGHTr•   s     r>   r  z$RadialDimension._draw_dimension_textÐ  s‰   € Ø�‰Ø×"Ñ"Ó$àŸ)™) HÓ-Ø ×.Ñ.×8Ñ8ØŸ™ 7Ó+ØŸ™ 7Ó+ØŸ™ ;Ó/ñð 	ó 		
÷ ‰-Ø×"Ñ"Ó$Ô,?×,LÑ,Lð õ 
r?   c                ór   — | j                   | j                  | j                  | j                  d«      z   z  z
  S )Nr/   )r>  r@  r&  rŠ   rb   s    r>   rE  z!RadialDimension._get_insert_pointÞ  s3   € Ø�{‰{Ø×Ñ $§+¡+°·	±	¸+Ó0FÑ"FÑGñ
ð 	
r?   c                ó\   — | j                  | j                  | j                  d«      z  «      S r*  )r“   rs   rŠ   rb   s    r>   r#  zRadialDimension._get_dimtextã  s%   € Ø×"Ñ" 4§;¡;°·±¸7Ó1CÑ#CÓDÐDr?   c           
     óÒ   — |j                  | j                  d| j                  j                  dz   | j	                  d«      | j	                  d«      | j	                  d«      dœ¬«       y )NrW   é´   r   r*   )rå   rø   rù   r*   rû   )rý   r>  r@  rD  rŠ   r•   s     r>   rÇ   zRadialDimension._draw_ticksæ  s\   € Ø×ÑØ—;‘;Ø!à ×.Ñ.×8Ñ8¸3Ñ>ØŸ)™) LÓ1ØŸ)™) LÓ1ØŸ™ 7Ó+ñ	ð 	õ 		
r?   )r   rT   NN)rr   r   r>  r   r&  r™   r‡   rH   r*   r  r    r  r‚   r  r,  r-  )rK   rL   rM   rN   r8   r±   r—   r  r  rE  r#  rÇ   rO   rP   s   @r>   r<  r<  ˜  sy   ø„ ñð Ø!Ø#Ø"&ð$àð$ð ð$ð ð	$ð
 ð$ð ð$ð  õ$ó09ó!ó
ó
ó
ó
E÷

r?   r<  c                óÈ   — t        | |«      }t        | |«      }t        | |«      }t        | |«      }|j                  |«      }|j                  |«      }|j                  |«      S )zƒ
    Calc center point of 3 point arc. ConstructionCircle is defined by 3 points
    on the circle: point1, point2 and point3.
    )r   r   rÑ   rÖ   )	rÓ   rÔ   Úpoint3Úray1Úray2Ú	midpoint1Ú	midpoint2Úcenter_ray1Úcenter_ray2s	            r>   r6  r6  ó  sa   € ô
 ˜6 6Ó*€DÜ˜6 6Ó*€DÜ�V˜VÓ$€IÜ�V˜VÓ$€IØ—/‘/ )Ó,€KØ—/‘/ )Ó,€KØ× Ñ  Ó-Ð-r?   N)rÓ   r   rÔ   r   rL  r   rI   r   )*rN   Ú
__future__r   Útypingr   r   r   r   Úmathr   r	   r
   Úabcr   Úezdxf.enumsr   Ú
ezdxf.mathr   r   r   r   r   r   Úezdxf.documentr   Úezdxf.eztypesr   rà   rŽ   r_   r`   ra   Údictr   rR   rw   r…   rœ   r  r2  r<  r6  rB   r?   r>   Ú<module>r\     sÁ   ðñõ2 #ß 9Ó 9ß %Ñ %Ý Ý +ß H× HáÝ&Ý/àÐ ØÐ à�B‰J€	Ø�R‰Z€
Ø€	ô7ˆtô 7÷t`
ñ `
ñF ‹K€	÷)ñ )ôXS'�nô S'ôlK*�~ô K*ô\6/Ð#ô 6/ôrX
�nô X
ôv.r?   