Ë
    £èháD  ã                  óö  — d dl mZ d dlmZmZ d dlmZ d dl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mZ d dlmZmZmZ d d	lmZmZmZmZmZ d d
lmZ d dlm Z  d dl!m"Z" ddl#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, erd dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 g d¢Z6 ed edejn                  e¬«       edde	jp                  e¬«       edde	jr                  e	jt                  ¬«       edd d¬«       ed d d¬«       ed!d"d¬«       ed#dde	jp                  e¬$«       ed%d d e	jv                  h d&£«      e¬$«       ed'd d e	jx                  d d(«      e¬$«       ed)ejn                  d¬*«       ed+d d¬«       ed,d d¬«       ed-ejn                  ede	jz                  e¬.«      d/œ«      Z> ee>«      Z? edd0 ed1d d e	jx                  d d2«      e¬$«      i«      Z@ ee@«      ZA ee*e?eA«      ZBe, G d3„ d4e'«      «       ZCd6d5„ZDy)7é    )Úannotations)ÚTYPE_CHECKINGÚOptional)ÚSelfN)Ú	validator)Úconst)ÚDXFAttrÚDXFAttributesÚDefSubclassÚXTypeÚRETURN_DEFAULTÚgroup_code_mappingÚmerge_group_code_mappings)ÚTextEntityAlignmentÚMAP_TEXT_ENUM_TO_ALIGN_FLAGSÚMAP_TEXT_ALIGN_FLAGS_TO_ENUM)ÚVec3ÚUVecÚMatrix44ÚNULLVECÚZ_AXIS)ÚOCSTransform)ÚAuditor)Ú
plain_texté   )Ú
base_classÚSubclassProcessor)Ú
DXFGraphicÚacdb_entityÚelevation_to_z_axisÚacdb_entity_group_codes)Úregister_entity)ÚDrawing)ÚDXFNamespaceÚ	DXFEntity)ÚAbstractTagWriter)Úxref)ÚTextÚ	acdb_textÚacdb_text_group_codesÚAcDbTexté
   )ÚxtypeÚdefaulté(   g      @)r.   r   ÚfixerÚ é2   T)r.   Úoptionalé3   é   ÚStandardé)   )r.   r3   r   r0   éG   >   r   é   é   é   éH   r;   é   )r-   r3   é&   é'   éÒ   )r-   r.   r3   r   r0   )ÚinsertÚheightÚtextÚrotationÚobliqueÚstyleÚwidthÚtext_generation_flagÚhalignÚalign_pointÚ	elevationÚ	thicknessÚ	extrusionÚvalignéI   r:   c                  ó®  ‡ — e Zd ZdZdZ eeeee	«      Z
dZdZdZdZdZdZdZdZdZeZeZ	 d	 	 	 dˆ fd„Zd ˆ fd	„Zd d
„Zd d„Z	 	 d!	 	 	 	 	 	 	 d"d„Zd#d„Zej                  fd$d„Zd%d„Zd&d„Zd'd„Z dd(ˆ fd„Z!d)ˆ fd„Z"d*ˆ fd„Z#d+d„Z$d,ˆ fd„Z%e&d-d„«       Z'e'jP                  d.d„«       Z'e&d-d„«       Z)e)jP                  d.d„«       Z)d/d„Z*d+d„Z+d0d„Z,ˆ xZ-S )1r(   zDXF TEXT entityÚTEXTr   r   r9   é   r:   c                óŽ   •— t         t        | �  |«      }|r.|j                  |t        «       |j
                  rt        |d«       |S )z!Loading interface. (internal API))rA   rJ   )Úsuperr   Úload_dxf_attribsÚsimple_dxfattribs_loaderÚmerged_text_group_codesÚr12r    )ÚselfÚ	processorÚdxfÚ	__class__s      €ú3lib/python3.12/site-packages/ezdxf/entities/text.pyrU   zText.load_dxf_attribs³   sA   ø€ ô ”J Ñ6°yÓAˆÙØ×.Ñ.¨sÔ4KÔLØ�}Š}ä# CÐ)BÔCØˆ
ó    c                óh   •— t         ‰| �  |«       | j                  |«       | j                  |«       y)z7Export entity specific data as DXF tags. (internal API)N)rT   Úexport_entityÚexport_acdb_textÚexport_acdb_text2)rY   Ú	tagwriterr\   s     €r]   r`   zText.export_entity¿   s,   ø€ ä‰Ñ˜iÔ(Ø×Ñ˜iÔ(Ø×Ñ˜yÕ)r^   c                óÖ   — |j                   t        j                  kD  r.|j                  t        j                  t
        j                  «       | j                  j                  |g d¢«       y)ú,Export TEXT data as DXF tags. (internal API))rA   rB   rC   rL   rD   rE   rF   rG   rH   rI   rJ   rM   N)	Ú
dxfversionr   ÚDXF12Ú
write_tag2ÚSUBCLASS_MARKERr)   Únamer[   Úexport_dxf_attribs©rY   rc   s     r]   ra   zText.export_acdb_textÅ   sH   € à×Ñ¤%§+¡+Ò-Ø× Ñ ¤×!6Ñ!6¼	¿¹ÔGØ�‰×#Ñ#Øòõ	
r^   c                óÒ   — |j                   t        j                  kD  r.|j                  t        j                  t
        j                  «       | j                  j                  |d«       y)re   rN   N)	rf   r   rg   rh   ri   Ú
acdb_text2rj   r[   rk   rl   s     r]   rb   zText.export_acdb_text2Û   sB   € à×Ñ¤%§+¡+Ò-Ø× Ñ ¤×!6Ñ!6¼
¿¹ÔHØ�‰×#Ñ# I¨xÕ8r^   c                óF  — |€| j                  «       }n#t        |t        «      sJ ‚| j                  |«       || j                  _        |t        j                  t        j                  fv r$|€$t        j                  dt        |«      › d�«      ‚|}|| j                  _        | S )a¢  Set text alignment and location.

        The alignments :attr:`ALIGNED` and :attr:`FIT`
        are special, they require a second alignment point, the text is aligned
        on the virtual line between these two points and sits vertically at the
        baseline.

        - :attr:`ALIGNED`: Text is stretched or compressed
          to fit exactly between `p1` and `p2` and the text height is also
          adjusted to preserve height/width ratio.
        - :attr:`FIT`: Text is stretched or compressed to fit
          exactly between `p1` and `p2` but only the text width is adjusted,
          the text height is fixed by the :attr:`dxf.height` attribute.
        - :attr:`MIDDLE`: also a special adjustment, centered
          text like :attr:`MIDDLE_CENTER`, but vertically
          centred at the total height of the text.

        Args:
            p1: first alignment point as (x, y[, z])
            p2: second alignment point as (x, y[, z]), required for :attr:`ALIGNED`
                and :attr:`FIT` else ignored
            align: new alignment as enum :class:`~ezdxf.enums.TextEntityAlignment`,
                ``None`` to preserve the existing alignment.

        zAlignment 'z$' requires a second alignment point.)Úget_align_enumÚ
isinstancer   Úset_align_enumr[   rA   ÚALIGNEDÚFITr   ÚDXFValueErrorÚstrrJ   ©rY   Úp1Úp2Úaligns       r]   Úset_placementzText.set_placementá   s�   € ð> ˆ=Ø×'Ñ'Ó)‰Eä˜eÔ%8Ô9Ð9Ð9Ø×Ñ Ô&Øˆ�‰ŒØÔ(×0Ñ0Ô2E×2IÑ2IÐJÑJØˆzÜ×)Ñ)Ø!¤# e£* Ð-QÐRóð ð ˆBØ!ˆ�‰ÔØˆr^   c                ó0  — t        | j                  j                  «      }t        | j                  j                  d|«      «      }| j	                  «       }|t
        j                  u r||dfS |t
        j                  t
        j                  fv r|||fS ||dfS )a  Returns a tuple (`align`, `p1`, `p2`), `align` is the alignment
        enum :class:`~ezdxf.enum.TextEntityAlignment`, `p1` is the
        alignment point, `p2` is only relevant if `align` is :attr:`ALIGNED` or
        :attr:`FIT`, otherwise it is ``None``.

        rJ   N)	r   r[   rA   Úgetrp   r   ÚLEFTrt   rs   rw   s       r]   Úget_placementzText.get_placement  s�   € ô �$—(‘(—/‘/Ó"ˆô �$—(‘(—,‘,˜}¨bÓ1Ó2ˆØ×#Ñ#Ó%ˆØÔ'×,Ñ,Ñ,Ø˜"˜d�?Ð"ØÔ(×,Ñ,Ô.A×.IÑ.IÐJÑJØ˜"˜b�=Ð Ø�b˜$ˆÐr^   c                ób   — t         |   \  }}|| j                  _        || j                  _        | S )a  Just for experts: Sets the text alignment without setting the
        alignment points, set adjustment points attr:`dxf.insert` and
        :attr:`dxf.align_point` manually.

        Args:
            align: :class:`~ezdxf.enums.TextEntityAlignment`

        )r   r[   rI   rN   )rY   rz   rI   rN   s       r]   rr   zText.set_align_enum"  s-   € ô 6°eÑ<‰ˆ�Ø ˆ�‰ŒØ ˆ�‰ŒØˆr^   c                óÌ   — | j                   j                  dd«      }| j                   j                  dd«      }|dkD  rd}t        j                  ||ft        j                  «      S )z�Returns the current text alignment as :class:`~ezdxf.enums.TextEntityAlignment`,
        see also :meth:`set_placement`.
        rI   r   rN   r9   )r[   r}   r   r   r~   )rY   rI   rN   s      r]   rp   zText.get_align_enum0  s\   € ð —‘—‘˜h¨Ó*ˆØ—‘—‘˜h¨Ó*ˆØ�AŠ:ØˆFÜ+×/Ñ/Ø�VÐÔ1×6Ñ6ó
ð 	
r^   c                ó  — | j                   }|j                  d«      s|j                  |_        t	        | j                   j
                  |«      }|j                  |j                  «      |_        |j                  |j                  «      |_        |j                  }|j                  |«      }|j                  t        j                  |«      «      }|j                  t        j                  |dz   «      «      }|j                  sxt        j                  |dz   |j                  z
  «      }|dz   |j                  |«      j                  z
  }	|	|_        |t!        j"                  t!        j$                  |	«      «      z  }|xj&                  ||z  z  c_        |xj(                  |z  c_        ||_        |j                  d«      r |j+                  |j,                  «      |_        |j.                  |_        | j1                  |«       | S )z?Transform the TEXT entity by transformation matrix `m` inplace.rJ   g     €V@rL   )r[   ÚhasattrrA   rJ   r   rM   Útransform_vertexrD   Útransform_deg_angleÚtransform_lengthr   Úfrom_deg_angleÚscale_uniformrE   Útransform_directionÚ	angle_degÚmathÚcosÚradiansrG   rB   Útransform_thicknessrL   Únew_extrusionÚpost_transform)
rY   Úmr[   ÚocsÚold_rotationÚnew_rotationÚx_scaleÚy_scaleÚoblique_vecÚnew_oblique_degs
             r]   Ú	transformzText.transform<  s˜  € à�h‰hˆØ�{‰{˜=Ô)Ø!Ÿj™jˆCŒOÜ˜4Ÿ8™8×-Ñ-¨qÓ1ˆØ×)Ñ)¨#¯*©*Ó5ˆŒ
Ø×.Ñ.¨s¯©Ó?ˆŒØ—|‘|ˆØ×.Ñ.¨|Ó<ˆØ×&Ñ&¤t×':Ñ':¸<Ó'HÓIˆØ×&Ñ&¤t×':Ñ':¸<È$Ñ;NÓ'OÓPˆà× Ò Ü×-Ñ-¨l¸TÑ.AÀCÇKÁKÑ.OÓPˆKàØñà×)Ñ)¨+Ó6×@Ñ@ñAð ð
 *ˆCŒKØ”t—x‘x¤§¡¨_Ó =Ó>Ñ>ˆGà�	Š	�W˜wÑ&Ñ&�	Ø�
Š
�gÑ�
Ø#ˆŒà�;‰;�{Ô#Ø×3Ñ3°C·M±MÓBˆCŒMØ×)Ñ)ˆŒØ×Ñ˜AÔØˆr^   c                ó¦  — | j                  «       }| j                  }t        |||«      }|j                  ||j	                  |j
                  «      z   «      |_        |j                  d«      r2|j                  ||j	                  |j                  «      z   «      |_        | j                  r&| j                  t        j                  |||«      «       | S )zƒOptimized TEXT/ATTRIB/ATTDEF translation about `dx` in x-axis, `dy`
        in y-axis and `dz` in z-axis, returns `self`.

        rJ   )r’   r[   r   Úfrom_wcsÚto_wcsrA   rƒ   rJ   Úis_post_transform_requiredr�   r   Ú	translate)rY   ÚdxÚdyÚdzr’   r[   Úvecs          r]   rž   zText.translate]  s¡   € ð
 �h‰h‹jˆØ�h‰hˆÜ�2�r˜2Óˆà—\‘\ #¨¯
©
°3·:±:Ó(>Ñ">Ó?ˆŒ
Ø�;‰;�}Ô%Ø!Ÿl™l¨3°·±¸C¿O¹OÓ1LÑ+LÓMˆCŒOà×*Ò*Ø×Ñ¤× 2Ñ 2°2°r¸2Ó >Ô?Øˆr^   c                ó´   •— | j                   syt        ‰| �	  «        |duxr" | j                  j                  |j
                  v }|sd| j                  _        yy)zNRemove all dependencies from actual document.

        (internal API)
        Nr6   )Úis_aliverT   Úremove_dependenciesr[   rF   Ústyles)rY   ÚotherÚ	has_styler\   s      €r]   r¥   zText.remove_dependenciesn  sM   ø€ ð
 �}Š}Øä‰Ñ#Ô%Ø Ð%ÒJ¨4¯8©8¯>©>¸U¿\¹\Ð+Iˆ	ÙØ'ˆD�H‰H�Nð r^   c                ó¦   •— t         ‰| �  |«       | j                  j                  d«      r&|j	                  | j                  j
                  «       yy)z5Register required resources to the resource registry.rF   N)rT   Úregister_resourcesr[   rƒ   Úadd_text_stylerF   )rY   Úregistryr\   s     €r]   rª   zText.register_resources{  s=   ø€ ä‰Ñ" 8Ô,Ø�8‰8×Ñ˜GÔ$Ø×#Ñ# D§H¡H§N¡NÕ3ð %r^   c                óÆ   •— t         ‰| �  ||«       |j                  j                  d«      r5|j	                  |j                  j
                  «      |j                  _        yy)z3Translate resources from self to the copied entity.rF   N)rT   Úmap_resourcesr[   rƒ   Úget_text_stylerF   )rY   ÚcloneÚmappingr\   s      €r]   r®   zText.map_resources�  sG   ø€ ä‰Ñ˜e WÔ-Ø�9‰9×Ñ˜WÔ%Ø%×4Ñ4°U·Y±Y·_±_ÓEˆE�I‰I�Oð &r^   c                ó@   — t        | j                  j                  «      S )z.Returns text content without formatting codes.)r   r[   rC   ©rY   s    r]   r   zText.plain_text‡  s   € ä˜$Ÿ(™(Ÿ-™-Ó(Ð(r^   c                óF   •— t         ‰| �  |«       |j                  | «       y)zValidity check.N)rT   ÚauditÚcheck_text_style)rY   Úauditorr\   s     €r]   rµ   z
Text.audit‹  s   ø€ ä‰‰�gÔØ× Ñ  Õ&r^   c                ób   — t        | j                  j                  t        j                  z  «      S )z\Get/set text generation flag BACKWARDS, for mirrored text along the
        x-axis.
        )Úboolr[   rH   r   ÚBACKWARDr³   s    r]   Úis_backwardzText.is_backward�  s"   € ô
 �D—H‘H×1Ñ1´E·N±NÑBÓCÐCr^   c                óF   — | j                  t        j                  |d«       y ©NrH   )Úset_flag_stater   rº   ©rY   Ústates     r]   r»   zText.is_backward—  s   € à×ÑœEŸN™N¨EÐ3IÕJr^   c                ób   — t        | j                  j                  t        j                  z  «      S )z_Get/set text generation flag UPSIDE_DOWN, for mirrored text along
        the y-axis.

        )r¹   r[   rH   r   ÚUPSIDE_DOWNr³   s    r]   Úis_upside_downzText.is_upside_down›  s$   € ô �D—H‘H×1Ñ1´E×4EÑ4EÑEÓFÐFr^   c                óF   — | j                  t        j                  |d«       y r½   )r¾   r   rÂ   r¿   s     r]   rÃ   zText.is_upside_down£  s   € à×ÑœE×-Ñ-¨uÐ6LÕMr^   c                ó   — t        | «      S ©N)Útext_transformation_matrixr³   s    r]   Úwcs_transformation_matrixzText.wcs_transformation_matrix§  s   € Ü)¨$Ó/Ð/r^   c                óê   — d}| j                   j                  }| j                  r>	 | j                  j                  j	                  |«      }|j                   j
                  }|S |S # t        $ r Y |S w xY w)z;Returns the font name of the associated :class:`Textstyle`.z	arial.ttf)r[   rF   Údocr¦   r}   ÚfontÚ
ValueError)rY   Ú	font_nameÚ
style_namerF   s       r]   rÍ   zText.font_nameª  sl   € àˆ	Ø—X‘X—^‘^ˆ
Ø�8Š8ðØŸ™Ÿ™×+Ñ+¨JÓ7�Ø!ŸI™IŸN™N�	ð ÐˆyÐøô ò ØØÐðús   ¦;A% Á%	A2Á1A2c                ó˜   — d}| j                  «       \  }}}|t        j                  t        j                  fv r|j	                  |«      }|S )zìReturns the text length for alignments :attr:`TextEntityAlignment.FIT`
        and :attr:`TextEntityAlignment.ALIGNED`, defined by the distance from
        the insertion point to the align point or 0 for all other alignments.

        g        )r   r   rt   rs   Údistance)rY   Úlengthrz   rx   ry   s        r]   Ú
fit_lengthzText.fit_length¶  sJ   € ð ˆØ×*Ñ*Ó,‰ˆˆr�2ØÔ(×,Ñ,Ô.A×.IÑ.IÐJÑJà—[‘[ “_ˆFØˆr^   rÆ   )rZ   zOptional[SubclassProcessor]Úreturnr$   )rc   r&   rÓ   ÚNone)NN)rx   r   ry   zOptional[UVec]rz   zOptional[TextEntityAlignment]rÓ   r(   )rÓ   z0tuple[TextEntityAlignment, Vec3, Optional[Vec3]])rÓ   r(   )rÓ   r   )r‘   r   rÓ   r(   )rŸ   Úfloatr    rÕ   r¡   rÕ   rÓ   r(   )r§   zOptional[Drawing]rÓ   rÔ   )r¬   zxref.RegistryrÓ   rÔ   )r°   r   r±   zxref.ResourceMapperrÓ   rÔ   )rÓ   rv   )r·   r   )rÓ   r¹   )rÓ   rÔ   )rÓ   r   )rÓ   rÕ   ).Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚDXFTYPEr
   r   r   r)   rn   Ú
DXFATTRIBSr~   ÚCENTERÚRIGHTÚBASELINEÚBOTTOMÚMIDDLEÚTOPÚMIRROR_XÚMIRROR_Yrº   rÂ   rU   r`   ra   rb   r{   r   r   rr   rp   r™   rž   r¥   rª   r®   r   rµ   Úpropertyr»   ÚsetterrÃ   rÈ   rÍ   rÒ   Ú__classcell__)r\   s   @r]   r(   r(   ž   sa  ø„ áà€GÙ˜z¨;¸	À:ÓN€Jà€DØ€FØ€Eà€HØ€FØ€FØ
€Cà€HØ€HØ€HØ€Kð 8<ð
Ø4ð
à	õ
õ*ó
ó,9ð "Ø/3ð	-àð-ð ð-ð -ð	-ð
 
ó-ó^ð$ $7×#;Ñ#;ô ó

óóBö"(õ4õFó)õ'ð
 òDó ðDð ×ÑòKó ðKð òGó ðGð ×ÑòNó ðNó0ó
÷r^   r(   c                ól  — t        j                  | j                  j                  «      }| j                  j                  }| j                  «       \  }}}| j                  rdnd}| j                  rdnd}t        j                  | j                  j                  «      }|}	|t        j                  t        j                  fv r$d}|j                  |d¬«      }	||z
  j                  }t        «       }
|r|
t        j                  |¬«      z  }
||z  }|}|dk7  s|dk7  r|
t        j                   ||d«      z  }
|r|
t        j"                  |«      z  }
|	r8|
t        j$                  |	j&                  |	j(                  |	j*                  «      z  }
| j-                  «       }|j.                  r|
|j0                  z  }
|
S )zzApply rotation, width factor, translation to the insertion point
    and if necessary transformation from OCS to WCS.
    éÿÿÿÿr   g      ð?g      à?)Úfactor)Úangle_x)r‹   r�   r[   rD   rG   r   r»   rÃ   rE   r   rs   rt   ÚlerpÚangler   Úshear_xyÚscaleÚz_rotaterž   ÚxÚyÚzr’   r™   Úmatrix)Úentityrì   Úwidth_factorrz   rx   ry   Úmirror_xÚmirror_yrE   Úlocationr‘   ÚsxÚsyr’   s                 r]   rÇ   rÇ   Ä  so  € ô �L‰L˜Ÿ™×,Ñ,Ó-€EØ—:‘:×#Ñ#€LØ×(Ñ(Ó*�M€Eˆ2ˆrØ×'Ò'‰r¨Q€HØ×*Ò*‰r°€HÜ�l‰l˜6Ÿ:™:×-Ñ-Ó.€GØ€HØÔ$×,Ñ,Ô.A×.EÑ.EÐFÑFØˆØ—7‘7˜2 c�7Ó*ˆØ�b‘—‘ˆä‹
€AÙØ	ŒX×Ñ wÔ/Ñ/ˆØ	˜Ñ	 €BØ	€BØ	ˆQ‚w�"˜’'Ø	ŒX�^‰^˜B  AÓ&Ñ&ˆÙØ	ŒX×Ñ˜uÓ%Ñ%ˆÙØ	ŒX×Ñ §
¡
¨H¯J©J¸¿
¹
ÓCÑCˆà
�*‰*‹,€CØ
‡}‚}Ø	ˆS�Z‰Z‰ˆØ€Hr^   )rô   r(   rÓ   r   )EÚ
__future__r   Útypingr   r   Útyping_extensionsr   r‹   Úezdxf.lldxfr   r   Úezdxf.lldxf.attributesr	   r
   r   r   r   r   r   Úezdxf.enumsr   r   r   Ú
ezdxf.mathr   r   r   r   r   Úezdxf.math.transformtoolsr   Úezdxf.auditr   Úezdxf.tools.textr   Ú	dxfentityr   r   Údxfgfxr   r   r    r!   Úfactoryr"   Úezdxf.documentr#   Úezdxf.entitiesr$   r%   Úezdxf.lldxf.tagwriterr&   Úezdxfr'   Ú__all__Úpoint3dÚis_greater_zeroÚis_valid_one_line_textÚfix_one_line_textÚ	is_one_ofÚis_in_integer_rangeÚis_not_null_vectorr)   r*   rn   Úacdb_text2_group_codesrW   r(   rÇ   © r^   r]   Ú<module>r     sB  ðõ #ß *Ý "Û å !Ý ÷÷ ñ ÷ñ ÷
 =Õ <Ý 2Ý Ý 'ç 4÷ó õ %áÝ&ß6Ý7Ýâ
8€áØñ ˜" E§M¡M¸7ÔCáØØØ×/Ñ/Ø ô	
ñ ØØØ×6Ñ6Ø×-Ñ-ô	
ñ ˜B¨°DÔ9á˜2 q°4Ô8ñ ˜ J¸Ô>ñ ØØØØ×/Ñ/Ø ô
ñ !(ØØØØ)�i×)Ñ)ª,Ó7Ø ô!
ñ  ØØØØ3�i×3Ñ3°A°qÓ9Ø ô
ñ ˜r¨¯©ÀÔFñ ˜R¨°TÔ:ñ ˜R¨°TÔ:áØØ—-‘-ØØØ×2Ñ2Ø ô
ñKMóP€	ñb +¨9Ó5Ð ÙØð 	‘'ØØØØ3�i×3Ñ3°A°qÓ9Ø ô
ðó€
ñ" ,¨JÓ7Ð Ù3ØØØóÐ ð ôbˆ:ó bó ðbôJ	r^   