
    'j.-                    (   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$dS )    )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                  f    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dS )%
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.

    returnNonec                ,    t                      | _        d S N)list
propertiesselfs    O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/sections/header.py__init__zCustomVars.__init__I   s    15    intc                *    t          | j                  S )zCount of custom properties.)lenr   r   s    r!   __len__zCustomVars.__len__L   s    4?###r#   Iterator[tuple[str, str]]c                *    t          | j                  S )z>Iterate over all custom properties as ``(tag, value)`` tuples.)iterr   r   s    r!   __iter__zCustomVars.__iter__P   s    DO$$$r#   c                8    | j                                          dS )zRemove all custom properties.N)r   clearr   s    r!   r-   zCustomVars.clearT   s    r#   tagstrvaluec                X    | j                             |t          |          f           dS )z.Add custom property as ``(tag, value)`` tuple.N)r   appendr/   )r    r.   r0   s      r!   r2   zCustomVars.appendX   s+     	SZZ011111r#   NdefaultOptional[str]c                4    | j         D ]\  }}||k    r|c S |S )z5Returns the value of the first custom property `tag`.)r   )r    r.   r3   keyr0   s        r!   getzCustomVars.get]   s5    / 	 	JCczz  Nr#   boolc                0    |                      |          duS )z0Returns ``True`` if custom property `tag` exist.N)r7   r    r.   s     r!   has_tagzCustomVars.has_tage   s    xx}}D((r#   Fallc                    d}| j         D ]/}|d         |k    r!| j                             |           d}|s dS 0|st          j        d| d          dS )zRemoves 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.   r<   	found_tagitems        r!   r@   zCustomVars.removei   s     	O 	 	DAw#~~&&t,,, 	 FF 	E%&Cc&C&C&CDDD	E 	Er#   c                    | j         }t          t          |                    D ] }||         d         }||k    r
||f||<    dS !t          j        d| d          )zReplaces the value of the first custom property `tag` by a new
        `value`.

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

        r   Nr>   r?   )r   ranger&   r   rA   )r    r.   r0   r   indexnames         r!   replacezCustomVars.replacez   sy     _
3z??++ 	 	Ee$Q'Ds{{%)5M
5!  !"?#"?"?"?@@@r#   	tagwriterr   c                \    | j         D ]#\  }}d| d| d}|                    |           $dS )z4Export custom properties as DXF tags. (internal API)z  9
$CUSTOMPROPERTYTAG
  1
z
  9
$CUSTOMPROPERTY
  1

N)r   	write_str)r    rI   r.   r0   ss        r!   writezCustomVars.write   sQ    / 	# 	#JC\\\SX\\\A""""	# 	#r#   r   r   r   r$   )r   r(   )r.   r/   r0   r/   r   r   r   )r.   r/   r3   r4   )r.   r/   r   r8   )F)r.   r/   r<   r8   r   r   rI   r   r   r   )__name__
__module____qualname____doc__r"   r'   r+   r-   r2   r7   r;   r@   rH   rN    r#   r!   r   r   A   s         8 8 8 8$ $ $ $% % % %       2 2 2 2
    ) ) ) )E E E E E"A A A A # # # # # #r#   r   r   r   c                     t                      } t          j                    D ]1}t          t	          |j        |j                            | |j        <   2| S r   )r   r   values	HeaderVarr   coder3   rG   )varsvardefs     r!   default_varsr]      sO    ==D ')) K K%fV[&.&I&IJ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d0d Zd1d!Zd" ZdS )2HeaderSectionHEADERr   r   c                R    t                      | _        t                      | _        d S r   )r   hdrvarsr   custom_varsr   s    r!   r"   zHeaderSection.__init__   s    -8]]%<<r#   NtagsOptional[Iterable[DXFTag]]c                    | |                      t          j                  S  |             }|                    t	          |                     |S )zConstructor to generate header variables loaded from DXF files
        (untrusted environment).

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

        (internal API)
        N)
dxfversion)newr   DXF12	load_tagsr*   )clsrd   sections      r!   loadzHeaderSection.load   sI     <77ek7222#%%$t**%%%r#   c                R    t                      }t                      |_        ||d<   |S )N$ACADVER)r_   r]   rb   )rk   rg   rl   s      r!   rh   zHeaderSection.new   s%    //&..(
r#   Iterable[DXFTag]c                   t          |          pt          | j                  }t          |          }t          |          }|dk    s|dk    rt          j        d          t          t          |          d          }g }|D ]M}|d         j        }|d         }	|dv r|                    |	j                   6t          |	          | j
        |<   N|                                 t          |          rd	 | j                            |                                |                                	           n# t          $ r Y d
S w xY wt          |          bd
S d
S )zConstructor 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.   r0   N)r*   MIN_HEADER_TAGSnextr   DXFStructureErrorr   r   r0   r2   rY   rb   reverser&   rc   pop
IndexError)
r    rd   _tagssection_tagname_taggroupscustom_property_stackgrouprG   r0   s
             r!   rj   zHeaderSection.load_tags   s    T

8d4#7885kk;;.((H,E,E)*WXXX,U33qAAA " 	6 	6E8>D!HE@@@%,,U[9999%.u%5%5T""%%''''(( 	 ''-1133/3355 (         '(( 	 	 	 	 	s   6A D7 7
EEtextr/   c                P    |                      t          j        |                    S )z&Load constructor from text for testing)rm   r   	from_text)rk   r   s     r!   r   zHeaderSection.from_text   s      xxt,,---r#   r6   r0   r   r   c                ~    |t           v rt           |         j        } ||          S t          j        d| d          )NzInvalid header variable .)r   factoryr   DXFKeyError)r    r6   r0   r   s       r!   _headervar_factoryz HeaderSection._headervar_factory   sE    .  $S)1G75>>!#$Es$E$E$EFFFr#   r$   c                *    t          | j                  S )z"Returns count of header variables.)r&   rb   r   s    r!   r'   zHeaderSection.__len__   s    4<   r#   r8   c                    || j         v S )z0Returns ``True`` if header variable `key` exist.)rb   r    r6   s     r!   __contains__zHeaderSection.__contains__   s    dl""r#   r   c                4    | j                                         S )z1Returns an iterable of all header variable names.)rb   keysr   s    r!   varnameszHeaderSection.varnames   s    |  """r#   rI   r   c                L   dfd}j         j        }                    d           | d	         }| d	<   t          | j                  D ]:\  }}|s|d
k    r |||           |dk    r| j                                       ;|| d	<                       d           dS )z2Exports header section as DXF tags. (internal API)rG   r/   r0   r   r   r   c                (   |j          t                              d|  d           d S                     d|            t	          |           }||j        k    rt          ||j         f          }                    t          |                     d S )Nzdid not write header var z, value is None.rt   )	r0   loggerinfo
write_tag2r   rZ   rY   rL   r/   )rG   r0   
group_coderg   rI   s      r!   _writez(HeaderSection.export_dxf.<locals>._write   s    {"NNNNOOO  D)))4T:FFJUZ''!:u{";<<E

+++++r#   z  0
SECTION
  2
HEADER
ro   z	$HANDSEEDz$LASTSAVEDBYz  0
ENDSEC
N)rG   r/   r0   r   r   r   )rg   write_handlesrL   header_vars_by_priorityrb   rc   rN   )r    rI   r   r   saverG   r0   rg   s    `     @r!   
export_dxfzHeaderSection.export_dxf   s    		, 		, 		, 		, 		, 		, 		, $.
!/9:::J%Z24<LL 	2 	2KD%  T[%8%8F4~%% &&y111ZO,,,,,r#   r3   c                B    || j         v r|                     |          S |S )z\Returns value of header variable `key` if exist, else the `default`
        value.

        )rb   __getitem__)r    r6   r3   s      r!   r7   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']`

        )rb   r0   KeyErrorr   r   r/   r   s     r!   r   zHeaderSection.__getitem__  sI    
	.<$** 	. 	. 	.#CHH---	.s	    ,A c                    	 |                      ||          }n6# t          t          f$ r" t          j        t          |                    w xY wt          |          | j        |<   dS )ztSet header variable `key` to `value` by index operator like:
        :code:`drawing.header['$ANGDIR'] = 1`

        N)r   r|   
ValueErrorr   rA   r/   rY   rb   )r    r6   r0   rd   s       r!   __setitem__zHeaderSection.__setitem__$  sm    
	2**366DDJ' 	2 	2 	2%c%jj111	2%dOOSs	    3Ac                v    	 | j         |= dS # t          $ r" t          j        t	          |                    w xY w)zlDelete header variable `key` by index operator like:
        :code:`del drawing.header['$ANGDIR']`

        N)rb   r   r   r   r/   r   s     r!   __delitem__zHeaderSection.__delitem__/  sI    
	.S!!! 	. 	. 	.#CHH---	.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<   dS )z1Reset the current UCS settings to the :ref:`WCS`. z$UCSBASEz$UCSNAME)r   r   r   z$UCSORG)rv   r   r   z$UCSXDIR)r   rv   r   z$UCSYDIRz$UCSORTHOREFr   z$UCSORTHOVIEWz
$UCSORGTOPz$UCSORGBOTTOMz$UCSORGLEFTz$UCSORGRIGHTz$UCSORGFRONTz$UCSORGBACKNrV   r   s    r!   	reset_wcszHeaderSection.reset_wcs9  s    ZZ#Y$Z$Z!^ !_&\ )_'](^(^']r#   rO   r   )rd   re   r   r_   )r   r_   )rd   rp   r   r   )r   r/   r   r_   )r6   r/   r0   r   r   r   rP   r   r8   )r   r   rQ   )r6   r/   r3   r   r   r   )r6   r/   r   r   )r6   r/   r0   r   r   r   )r6   r/   r   r   )rR   rS   rT   r   r   MIN_HEADER_TEXTrw   rG   r"   classmethodrm   r   LATEST_DXF_VERSIONrh   rj   r   r'   r   r   r   r7   r   r   r   r   rV   r#   r!   r_   r_      s       $dn_55OD( ( ( (     [  !4     [! ! ! !F . . . [.G G G G! ! ! !# # # ## # # #- - - -:    . . . .	, 	, 	, 	,. . . .( ( ( ( (r#   r_   header_varsdict[str, HeaderVar]rg   r/   Iterable[tuple]c              #  d  K   g }|                                  D ]v\  }}t          j        |d           }|"t                              d| d| d           >|j        |cxk    r|j        k    r!n X|                    |j        ||ff           w|	                                 |D ]	\  }}|V  
d S )NzHeader variable z ignored, dxfversion=r   )
itemsr   r7   r   r   mindxfmaxdxfr2   prioritysort)r   rg   orderrG   r0   r\   r   r.   s           r!   r   r   J  s       E"((** ; ;e#D$//>KKS4SSjSSSTTT=J7777&-77777LL&/D%=9:::	JJLLL  #				 r#   c                  f    e Zd ZddZedd            Zedd            Zedd
            ZddZdS )rY   r.   Union[DXFTag, Sequence]c                    || _         d S r   r.   r:   s     r!   r"   zHeaderVar.__init__[  s    r#   r   r$   c                    | j         d         S )Nr   r   r   s    r!   rZ   zHeaderVar.code^      x{r#   r   c                    | j         d         S )Nrv   r   r   s    r!   r0   zHeaderVar.valueb  r   r#   r8   c                    | j         dk    S )N
   )rZ   r   s    r!   ispointzHeaderVar.ispointf  s    yBr#   r/   c                    | j         rO| j        \  }}g }|D ]+}|                    t          ||f                     |dz  },d                    |          S t          | j                  S )Nr   r   )r   r.   r2   r   join)r    rZ   r0   rM   coords        r!   __str__zHeaderVar.__str__j  st    < 	$(KD%A  u..///
771::$(###r#   N)r.   r   rP   )r   r   r   )r   r/   )	rR   rS   rT   r"   propertyrZ   r0   r   r   rV   r#   r!   rY   rY   Z  s               X    X    X	$ 	$ 	$ 	$ 	$ 	$r#   rY   )r   r   )r   r   rg   r/   r   r   )%
__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   rY   rV   r#   r!   <module>r      s   # " " " " "	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  # # # # # #       5 5 5 5 5 5 5 5 5 5 $ $ $ $ $ $ 2 2 2 2 2 2       
  8777777		7	#	#DM# M# M# M# M# M# M# M#`   o( o( o( o( o( o( o( o(d    $ $ $ $ $ $ $ $ $ $r#   