Ë
    £èh¡.  ã                  ó$  — d dl mZ d dlmZmZmZmZmZmZm	Z	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 d dlmZ d dlmZ d d	lmZmZ e	rd d
lmZ  ej:                  d«      ZdZ G d„ d«      Z dd„Z! G d„ d«      Z"	 	 	 	 	 	 dd„Z# G d„ d«      Z$y)é    )Úannotations)ÚAnyÚIterableÚIteratorÚKeysViewÚOptionalÚSequenceÚTYPE_CHECKINGÚUnionN)ÚOrderedDict)Úconst)Ú
group_tagsÚTagsÚDXFTag)Ústrtag)Úheader_validator)ÚHEADER_VAR_MAPÚversion_specific_group_code)ÚAbstractTagWriterÚezdxfzc  0
SECTION
  2
HEADER
  9
$ACADVER
  1
AC1009
  9
$DWGCODEPAGE
  3
ANSI_1252
  9
$HANDSEED
  5
FF
c                  ód   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zddd„Z	dd	„Z
ddd
„Zdd„Zdd„Zy)Ú
CustomVarsa*  The :class:`CustomVars` class stores custom properties in the DXF header as
    $CUSTOMPROPERTYTAG and $CUSTOMPROPERTY values. Custom properties require DXF R2004
    or later, `ezdxf` can create custom properties for older DXF versions as well, but
    AutoCAD will not show that properties.

    c                ó"   — t        «       | _        y ©N)ÚlistÚ
properties©Úselfs    ú5lib/python3.12/site-packages/ezdxf/sections/header.pyÚ__init__zCustomVars.__init__I   s   € Ü15³ˆ�ó    c                ó,   — t        | j                  «      S )zCount of custom properties.)Úlenr   r   s    r   Ú__len__zCustomVars.__len__L   s   € ä�4—?‘?Ó#Ð#r!   c                ó,   — t        | j                  «      S )z>Iterate over all custom properties as ``(tag, value)`` tuples.)Úiterr   r   s    r   Ú__iter__zCustomVars.__iter__P   s   € ä�D—O‘OÓ$Ð$r!   c                ó8   — | j                   j                  «        y)zRemove all custom properties.N)r   Úclearr   s    r   r)   zCustomVars.clearT   s   € à�‰×ÑÕr!   c                óP   — | j                   j                  |t        |«      f«       y)z.Add custom property as ``(tag, value)`` tuple.N)r   ÚappendÚstr)r   ÚtagÚvalues      r   r+   zCustomVars.appendX   s   € ð 	�‰×Ñ ¤S¨£ZÐ0Õ1r!   Nc                ó@   — | j                   D ]  \  }}||k(  sŒ|c S  |S )z5Returns the value of the first custom property `tag`.)r   )r   r-   ÚdefaultÚkeyr.   s        r   ÚgetzCustomVars.get]   s'   € àŸ/œ/‰JˆC�Ø�c‹zØ’ð *ð ˆNr!   c                ó(   — | j                  |«      duS )z0Returns ``True`` if custom property `tag` exist.N)r2   ©r   r-   s     r   Úhas_tagzCustomVars.has_tage   s   € à�x‰x˜‹} DÐ(Ð(r!   c                ó´   — d}| j                   D ],  }|d   |k(  sŒ| j                   j                  |«       d}|rŒ, y |st        j                  d|› d�«      ‚y)z¸Removes the first occurrence of custom property `tag`, removes all
        occurrences if `all` is ``True``.

        Raises `:class:`DXFValueError` if `tag`  does not exist.

        Fr   TNúTag 'ú' does not exist)r   Úremover   ÚDXFValueError)r   r-   ÚallÚ	found_tagÚitems        r   r9   zCustomVars.removei   sd   € ð ˆ	Ø—O”OˆDØ�A‰w˜#‹~Ø—‘×&Ñ& tÔ,Ø �	ÚÙð $ñ Ü×%Ñ%¨¨c¨UÐ2BÐ&CÓDÐDð r!   c                óª   — | j                   }t        t        |«      «      D ]  }||   d   }||k(  sŒ||f||<    y t        j                  d|› d�«      ‚)zšReplaces the value of the first custom property `tag` by a new
        `value`.

        Raises :class:`DXFValueError` if `tag`  does not exist.

        r   Nr7   r8   )r   Úranger#   r   r:   )r   r-   r.   r   ÚindexÚnames         r   ÚreplacezCustomVars.replacez   sd   € ð —_‘_ˆ
Üœ3˜z›?Ö+ˆEØ˜eÑ$ QÑ'ˆDØ�s‹{Ø%)¨5 M�
˜5Ñ!Ùð	 ,ô ×!Ñ! E¨#¨Ð.>Ð"?Ó@Ð@r!   c                ó`   — | j                   D ]  \  }}d|› d|› d�}|j                  |«       Œ! y)z4Export custom properties as DXF tags. (internal API)z  9
$CUSTOMPROPERTYTAG
  1
z
  9
$CUSTOMPROPERTY
  1
Ú
N)r   Ú	write_str)r   Ú	tagwriterr-   r.   Úss        r   ÚwritezCustomVars.writeŠ   s:   € àŸ/œ/‰JˆC�Ø0°°Ð5RÐSXÐRYÐY[Ð\ˆAØ×Ñ Õ"ñ *r!   ©ÚreturnÚNone©rJ   Úint)rJ   zIterator[tuple[str, str]])r-   r,   r.   r,   rJ   rK   r   )r-   r,   r0   zOptional[str])r-   r,   rJ   Úbool)F)r-   r,   r;   rN   rJ   rK   ©rF   r   rJ   rK   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r$   r'   r)   r+   r2   r5   r9   rB   rH   © r!   r   r   r   A   s;   „ ñó8ó$ó%ó ó2ô
ó)ôEó"Aô #r!   r   c                 ó¸   — t        «       } t        j                  «       D ]8  }t        t	        |j
                  |j                  «      «      | |j                  <   Œ: | S r   )r   r   ÚvaluesÚ	HeaderVarr   Úcoder0   rA   )ÚvarsÚvardefs     r   Údefault_varsr[   ‘   sC   € Ü‹=€DÜ ×'Ñ'Ö)ˆÜ%¤f¨V¯[©[¸&¿.¹.Ó&IÓJˆˆV�[‰[Òð *à€Kr!   c                  óä   — e Zd Z ej                  e«      ZdZdd„Ze	ddd„«       Z
e	ej                  f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d„Zdd„Zdd„Zd d„Zd„ Zy)!ÚHeaderSectionÚHEADERc                ó@   — t        «       | _        t        «       | _        y r   )r   Úhdrvarsr   Úcustom_varsr   s    r   r    zHeaderSection.__init__œ   s   € Ü-8«]ˆŒÜ%›<ˆÕr!   Nc                óŒ   — |€ | j                  t        j                  ¬«      S  | «       }|j                  t	        |«      «       |S )zÆConstructor to generate header variables loaded from DXF files
        (untrusted environment).

        Args:
            tags: DXF tags as Tags() or ExtendedTags()

        (internal API)
        )Ú
dxfversion)Únewr   ÚDXF12Ú	load_tagsr&   )ÚclsÚtagsÚsections      r   ÚloadzHeaderSection.load    s<   € ð ˆ<à—7‘7¤e§k¡k�7Ó2Ð2Ù“%ˆØ×Ñœ$˜t›*Ô%Øˆr!   c                óB   — t        «       }t        «       |_        ||d<   |S )Nú$ACADVER)r]   r[   r`   )rg   rc   ri   s      r   rd   zHeaderSection.new±   s!   € ä“/ˆÜ&›.ˆŒØ(ˆ�
ÑØˆr!   c                ój  — t        |«      xs t        | j                  «      }t        |«      }t        |«      }|dk7  s|dk7  rt        j                  d«      ‚t        t        |«      d¬«      }g }|D ]N  }|d   j                  }|d   }	|dv r|j                  |	j                  «       Œ7t        |	«      | j                  |<   ŒP |j                  «        t        |«      rG	 | j                  j                  |j                  «       |j                  «       ¬	«       t        |«      rŒFy
y
# t        $ r Y y
w xY w)z¯Constructor to generate header variables loaded from DXF files
        (untrusted environment).

        Args:
            tags: DXF tags as Tags() or ExtendedTags()

        )r   ÚSECTION)é   r^   z+Critical structure error in HEADER section.é	   )Ú	splitcoder   é   )z$CUSTOMPROPERTYTAGz$CUSTOMPROPERTY)r-   r.   N)r&   ÚMIN_HEADER_TAGSÚnextr   ÚDXFStructureErrorr   r   r.   r+   rW   r`   Úreverser#   ra   ÚpopÚ
IndexError)
r   rh   Ú_tagsÚsection_tagÚname_tagÚgroupsÚcustom_property_stackÚgrouprA   r.   s
             r   rf   zHeaderSection.load_tags¸   s"  € ô �T“
Ò8œd 4×#7Ñ#7Ó8ˆÜ˜5“kˆÜ˜“;ˆà˜.Ò(¨H¸Ò,EÜ×)Ñ)Ð*WÓXÐXäÔ,¨UÓ3¸qÔAˆØ "ÐÛˆEØ˜‘8—>‘>ˆDØ˜!‘HˆEØÐ@Ñ@Ø%×,Ñ,¨U¯[©[Õ9ä%.¨uÓ%5�—‘˜TÒ"ð ð 	×%Ñ%Ô'ÜÐ'Ô(ðØ× Ñ ×'Ñ'Ø-×1Ñ1Ó3Ø/×3Ñ3Ó5ð (ô ô Ð'×(øô ò Ùðús   Ã9D& Ä&	D2Ä1D2c                óJ   — | j                  t        j                  |«      «      S )z&Load constructor from text for testing)rj   r   Ú	from_text)rg   Útexts     r   r€   zHeaderSection.from_textÛ   s   € ð �x‰xœŸ™ tÓ,Ó-Ð-r!   c                óz   — |t         v rt         |   j                  } ||«      S t        j                  d|› d�«      ‚)NzInvalid header variable Ú.)r   Úfactoryr   ÚDXFKeyError)r   r1   r.   r„   s       r   Ú_headervar_factoryz HeaderSection._headervar_factoryà   s?   € Ø”.Ñ Ü$ SÑ)×1Ñ1ˆGÙ˜5“>Ð!ä×#Ñ#Ð&>¸s¸eÀ1Ð$EÓFÐFr!   c                ó,   — t        | j                  «      S )z"Returns count of header variables.)r#   r`   r   s    r   r$   zHeaderSection.__len__ç   s   € ä�4—<‘<Ó Ð r!   c                ó   — || j                   v S )z0Returns ``True`` if header variable `key` exist.)r`   ©r   r1   s     r   Ú__contains__zHeaderSection.__contains__ë   s   € à�d—l‘lÐ"Ð"r!   c                ó6   — | j                   j                  «       S )z1Returns an iterable of all header variable names.)r`   Úkeysr   s    r   ÚvarnameszHeaderSection.varnamesï   s   € à�|‰|× Ñ Ó"Ð"r!   c                óH  ‡‡— dˆˆfd„}‰j                   Š‰j                  }‰j                  d«       | d   }‰| d<   t        | j                  ‰«      D ]7  \  }}|s|dk(  rŒ |||«       |dk(  sŒ| j
                  j                  ‰«       Œ9 || d<   ‰j                  d«       y)	z2Exports header section as DXF tags. (internal API)c                ó  •— |j                   €t        j                  d| › d�«       y ‰j                  d| «       t	        | ‰«      }||j
                  k7  rt        ||j                   f«      }‰j                  t        |«      «       y )Nzdid not write header var z, value is None.rp   )	r.   ÚloggerÚinfoÚ
write_tag2r   rX   rW   rE   r,   )rA   r.   Ú
group_coderc   rF   s      €€r   Ú_writez(HeaderSection.export_dxf.<locals>._writeö   st   ø€ Ø�{‰{Ð"Ü—‘Ð7¸°vÐ=MÐNÔOØØ× Ñ   DÔ)Ü4°T¸:ÓFˆJà˜UŸZ™ZÒ'Ü! :¨u¯{©{Ð";Ó<�Ø×Ñ¤ E£
Õ+r!   z  0
SECTION
  2
HEADER
rl   z	$HANDSEEDz$LASTSAVEDBYz  0
ENDSEC
N)rA   r,   r.   r   rJ   rK   )rc   Úwrite_handlesrE   Úheader_vars_by_priorityr`   ra   rH   )r   rF   r”   r•   ÚsaverA   r.   rc   s    `     @r   Ú
export_dxfzHeaderSection.export_dxfó   sª   ù€ ö		,ð $×.Ñ.ˆ
Ø!×/Ñ/ˆà×ÑÐ9Ô:Ø�JÑˆØ%ˆˆZÑÜ2°4·<±<ÀÖL‰KˆD�%Ù  T¨[Ò%8ØÙ�4˜ÔØ�~Ó%Ø× Ñ ×&Ñ& yÕ1ð Mð  ˆˆZÑØ×Ñ˜OÕ,r!   c                óD   — || j                   v r| j                  |«      S |S )z\Returns value of header variable `key` if exist, else the `default`
        value.

        )r`   Ú__getitem__)r   r1   r0   s      r   r2   zHeaderSection.get  s&   € ð
 �$—,‘,ÑØ×#Ñ# CÓ(Ð(àˆNr!   c                óŒ   — 	 | j                   |   j                  S # t        $ r t        j                  t        |«      «      ‚w xY w)zfGet header variable `key` by index operator like:
        :code:`drawing.header['$ACADVER']`

        )r`   r.   ÚKeyErrorr   r…   r,   r‰   s     r   rš   zHeaderSection.__getitem__  s@   € ð
	.Ø—<‘< Ñ$×*Ñ*Ð*øÜò 	.Ü×#Ñ#¤C¨£HÓ-Ð-ð	.ús	   ‚ ›(Ac                ó¼   — 	 | j                  ||«      }t        |«      | j                  |<   y# t        t        f$ r t        j                  t        |«      «      ‚w xY w)ztSet header variable `key` to `value` by index operator like:
        :code:`drawing.header['$ANGDIR'] = 1`

        N)r†   rx   Ú
ValueErrorr   r:   r,   rW   r`   )r   r1   r.   rh   s       r   Ú__setitem__zHeaderSection.__setitem__$  sX   € ð
	2Ø×*Ñ*¨3°Ó6ˆDô & d›Oˆ�‰�SÒøô œJÐ'ò 	2Ü×%Ñ%¤c¨%£jÓ1Ð1ð	2ús	   ‚- ­.Ac                óv   — 	 | j                   |= y# t        $ r t        j                  t	        |«      «      ‚w xY w)zlDelete header variable `key` by index operator like:
        :code:`del drawing.header['$ANGDIR']`

        N)r`   rœ   r   r…   r,   r‰   s     r   Ú__delitem__zHeaderSection.__delitem__/  s7   € ð
	.Ø—‘˜SÑ!øÜò 	.Ü×#Ñ#¤C¨£HÓ-Ð-ð	.ús   ‚ �(8c                ó†   — d| d<   d| d<   d| d<   d| d<   d| d	<   d| d
<   d| d<   d| d<   d| d<   d| d<   d| d<   d| d<   d| d<   y)z1Reset the current UCS settings to the :ref:`WCS`.Ú z$UCSBASEz$UCSNAME)r   r   r   z$UCSORG)rr   r   r   z$UCSXDIR)r   rr   r   z$UCSYDIRz$UCSORTHOREFr   z$UCSORTHOVIEWz
$UCSORGTOPz$UCSORGBOTTOMz$UCSORGLEFTz$UCSORGRIGHTz$UCSORGFRONTz$UCSORGBACKNrT   r   s    r   Ú	reset_wcszHeaderSection.reset_wcs9  sƒ   € àˆˆZÑØˆˆZÑØ#ˆˆY‰Ø$ˆˆZÑØ$ˆˆZÑØ!ˆˆ^ÑØ !ˆˆ_ÑØ&ˆˆ\ÑØ )ˆˆ_ÑØ'ˆˆ]ÑØ(ˆˆ^ÑØ(ˆˆ^ÑØ'ˆˆ]Òr!   rI   r   )rh   zOptional[Iterable[DXFTag]]rJ   r]   )rJ   r]   )rh   zIterable[DXFTag]rJ   rK   )r�   r,   rJ   r]   )r1   r,   r.   r   rJ   r   rL   ©rJ   rN   )rJ   r   rO   )r1   r,   r0   r   rJ   r   )r1   r,   rJ   r   )r1   r,   r.   r   rJ   rK   )r1   r,   rJ   rK   )rP   rQ   rR   r   r€   ÚMIN_HEADER_TEXTrs   rA   r    Úclassmethodrj   r   ÚLATEST_DXF_VERSIONrd   rf   r†   r$   rŠ   r�   r˜   r2   rš   rŸ   r¡   r¤   rT   r!   r   r]   r]   ˜   sš   „ Ø$�d—n‘n _Ó5€OØ€Dó(ð óó ðð  Ø!×4Ñ4ó ó ðó!ðF ò.ó ð.óGó!ó#ó#ó-ô:ó.ó	,ó.ó(r!   r]   c              #  ój  K  — g }| j                  «       D ]|  \  }}t        j                  |d «      }|€t        j	                  d|› d|› d�«       Œ;|j
                  |cxk  r|j                  k  sŒ[n Œ^|j                  |j                  ||ff«       Œ~ |j                  «        |D ]	  \  }}|–— Œ y ­w)NzHeader variable z ignored, dxfversion=rƒ   )
Úitemsr   r2   r�   r‘   ÚmindxfÚmaxdxfr+   ÚpriorityÚsort)Úheader_varsrc   ÚorderrA   r.   rZ   r­   r-   s           r   r–   r–   J  s¨   è ø€ ð €EØ"×(Ñ(Ö*‰ˆˆeÜ×#Ñ# D¨$Ó/ˆØˆ>Ü�K‰KÐ*¨4¨&Ð0EÀjÀ\ÐQRÐSÔTØØ�=‰=˜JÔ7¨&¯-©-Ö7Ø�L‰L˜&Ÿ/™/¨D°%¨=Ð9Õ:ð +ð 
‡J�J„LÛ‰ˆ�#Ø‹	ñ ùs   ‚A-B3Á0AB3c                  óR   — e Zd Zdd„Zedd„«       Zed	d„«       Zed
d„«       Zdd„Zy)rW   c                ó   — || _         y r   ©r-   r4   s     r   r    zHeaderVar.__init__[  s	   € Øˆ�r!   c                ó    — | j                   d   S )Nr   r³   r   s    r   rX   zHeaderVar.code^  ó   € à�x‰x˜‰{Ðr!   c                ó    — | j                   d   S )Nrr   r³   r   s    r   r.   zHeaderVar.valueb  rµ   r!   c                ó    — | j                   dk(  S )Né
   )rX   r   s    r   ÚispointzHeaderVar.ispointf  s   € à�y‰y˜B‰Ðr!   c                óØ   — | j                   rJ| j                  \  }}g }|D ]#  }|j                  t        ||f«      «       |dz  }Œ% dj	                  |«      S t        | j                  «      S )Nr¸   r£   )r¹   r-   r+   r   Újoin)r   rX   r.   rG   Úcoords        r   Ú__str__zHeaderVar.__str__j  sb   € Ø�<Š<ØŸ(™(‰KˆD�%ØˆAÛ�Ø—‘œ  u Ó.Ô/Ø˜‘
‘ð ð —7‘7˜1“:Ðä˜$Ÿ(™(Ó#Ð#r!   N)r-   zUnion[DXFTag, Sequence]rL   )rJ   r   r¥   )rJ   r,   )	rP   rQ   rR   r    ÚpropertyrX   r.   r¹   r½   rT   r!   r   rW   rW   Z  sH   „ óð òó ðð òó ðð òó ðô	$r!   rW   )rJ   r   )r¯   zdict[str, HeaderVar]rc   r,   rJ   zIterable[tuple])%Ú
__future__r   Útypingr   r   r   r   r   r	   r
   r   ÚloggingÚcollectionsr   Úezdxf.lldxfr   Úezdxf.lldxf.tagsr   r   r   Úezdxf.lldxf.typesr   Úezdxf.lldxf.validatorr   Úezdxf.sections.headervarsr   r   Úezdxf.lldxf.tagwriterr   Ú	getLoggerr�   r¦   r   r[   r]   r–   rW   rT   r!   r   Ú<module>rÊ      s�   ðõ #÷	÷ 	ó 	ó Ý #å ß 5Ñ 5Ý $Ý 2÷ñ
 Ý7à	ˆ×	Ñ	˜7Ó	#€ð€÷DM#ñ M#ó`÷o(ñ o(ðdØ%ðØ36ðàó÷ $ò $r!   