Ë
    £èh“&  ã                  ó0  — d 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 ddlmZ ddlmZmZ ddl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 dZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ddgZ( G d„ d«      Z)d!d„Z*d"d„Z+d#d„Z,d$d„Z-d%d„Z. G d„ d«      Z/d&d„Z0y )'a
  
UserRecord(): store user data in a XRECORD entity.

The group code 302 is used as a structure tag.

All supported data types have a fixed group code:
    - str: 1
    - int: 90 - 32-bit values
    - float: 40 - doubles
    - Vec3, Vec2: 10, 20, 30 - Vec2 is stored as Vec3
    - list, tuple: starts with tag (302, "[") and ends with tag (302, "]")
    - dict: starts with tag (302, "{") and ends with tag (302, "}")

The str type can have a max. length of 2049 characters and cannot contain "
"
or "".

This is an advanced feature for experienced programmers, handle with care!
The attribute UserRecord.data is a simple Python list with read/write access.

The UserRecord can store nested list and dict objects.

BinaryData(): store arbitrary binary data in a XRECORD entity

é    )Úannotations)ÚTYPE_CHECKINGÚOptionalÚIterableÚSequenceÚMappingÚMutableSequenceÚcast)Úconst)ÚXRecord)ÚTagsÚbinary_data_to_dxf_tags)Údxftag)ÚVec3ÚVec2)Útake2)Úbytes_to_hexstr)ÚDrawingé   é   éZ   é(   é
   i.  Ú[Ú]Ú{Ú}Ú
UserRecordÚBinaryRecordc                  óV   — e Zd Z	 d	eddœ	 	 	 	 	 d
d„Zedd„«       Zd„ Zd„ Zd„ Z	dd„Z
y)r   N)ÚnameÚdocc               ó  — |€A|€t        j                  «       }n*t        t         |j                  j	                  di «      «      }|| _        t        |«      | _        t        | j
                  | j                  «      | _	        y)a²  Setup a :class:`UserRecord` with the given `name`.

        The data is stored in the given `xrecord` object, or in a new created
        :class:`~ezdxf.entities.XRecord` instance if ``None``. If `doc` is not
        ``None`` the new xrecord is added to the OBJECTS section of the DXF
        document.

        Changes of the content has to be committed at the end to be stored in
        the underlying :attr:`xrecord` object.

        Args:
            xrecord (XRecord): underlying :class:`~ezdxf.entities.XRecord` instance,
                if ``None`` a new one will be created
            name (str): name of the user list
            doc (Drawing): DXF document or ``None``

        NÚXRECORD)
r   Únewr
   ÚobjectsÚ
new_entityÚxrecordÚstrr!   Úparse_xrecordÚdata)Úselfr(   r!   r"   s       ú-lib/python3.12/site-packages/ezdxf/urecord.pyÚ__init__zUserRecord.__init__@   s^   € ð0 ˆ?Øˆ{Ü!Ÿ+™+›-‘äœw¨¯©×(>Ñ(>¸yÈ"Ó(MÓN�àˆŒÜ˜“IˆŒ	Ü%2°4·<±<ÀÇÁÓ%Kˆ�	ó    c                óL   — | j                   j                  j                  d«      S ©zGDXF handle of the underlying :class:`~ezdxf.entities.XRecord` instance.Úhandle©r(   ÚdxfÚget©r,   s    r-   r2   zUserRecord.handleb   ó   € ð �|‰|×Ñ×#Ñ# HÓ-Ð-r/   c                ó   — | S ©N© r6   s    r-   Ú	__enter__zUserRecord.__enter__g   ó   € Øˆr/   c                ó$   — | j                  «        y r9   ©Úcommit©r,   Úexc_typeÚexc_valÚexc_tbs       r-   Ú__exit__zUserRecord.__exit__j   ó   € Ø�‰�r/   c                ó,   — t        | j                  «      S ©zReturn str(self).)r)   r+   r6   s    r-   Ú__str__zUserRecord.__str__m   s   € ä�4—9‘9‹~Ðr/   c                óx   — t        | j                  | j                  «      | j                  _        | j                  S )a8  Store :attr:`data` in the underlying :class:`~ezdxf.entities.XRecord`
        instance. This call is not required if using the class by the ``with``
        statement.

        Raises:
            DXFValueError: invalid chars ``"\n"`` or ``"\r"`` in a string
            DXFTypeError: invalid data type

        )Úcompile_user_recordr!   r+   r(   Útagsr6   s    r-   r?   zUserRecord.commitq   s)   € ô 0°·	±	¸4¿9¹9ÓEˆ�‰ÔØ�|‰|Ðr/   r9   )r(   úOptional[XRecord]r!   r)   r"   úOptional[Drawing]©ÚreturnzOptional[str]©rO   r   )Ú__name__Ú
__module__Ú__qualname__ÚDEFAULT_NAMEr.   Úpropertyr2   r;   rD   rH   r?   r:   r/   r-   r   r   ?   sc   „ ð &*ð Lð !Ø!%ñ Là"ð Lð ð	 Lð
 ó LðD ò.ó ð.òòòôr/   c                óà   — g }| j                   }|r]|d   \  }}|t        k7  r(||k7  r#t        j                  t	        | «      › d|› �«      ‚|j                  d„ t        |dd  «      D «       «       |S )Nr   z is not an user record of type c              3  ó    K  — | ]  }|–— Œ y ­wr9   r:   )Ú.0Úitems     r-   Ú	<genexpr>z parse_xrecord.<locals>.<genexpr>ˆ   s   è ø€ Ð;Ñ%:˜T”DÑ%:ùs   ‚r   )rK   ÚTYPE_GROUP_CODEr   ÚDXFTypeErrorr)   ÚextendÚparse_items)r(   r!   r+   rK   ÚcodeÚvalues         r-   r*   r*      sx   € Ø€DØ�<‰<€DÙØ˜1‘g‰ˆˆeØ”?Ò" u°¢}Ü×$Ñ$Ü�w“<�.Ð ?À¸vÐFóð ð 	�‰Ñ;¤[°°a°b°Ô%:Ó;Ô;Ø€Kr/   c                óJ  — g }g }| D �]O  }|\  }}|t         k(  r|j                  t        |«      «       Œ-|t        k(  r|j                  t	        |«      «       ŒQ|t
        k(  r|j                  t        |«      «       Œu|t        k(  r|j                  t        |«      «       Œ™|t        k(  r&|t        k(  s	|t        k(  r|j                  |«       g }ŒÈ|t        k(  re|t        k(  s	|t        k(  rS	 |j                  «       }|t        k(  r$|j                  t%        t'        |«      «      «       n|j                  |«       |}�Œ6t!        j(                  d|› d|› d�«      ‚ |rt!        j"                  dt        › d�«      ‚|S # t        $ r t!        j"                  dt        › d�«      ‚w xY w)Nz6invalid nested structure, mismatch of structure tags (z, ...)zinvalid group code in tag: (z, Ú)z5invalid nested structure, mismatch of structure tags()ÚSTR_GROUP_CODEÚappendr)   ÚINT_GROUP_CODEÚintÚFLOAT_GROUP_CODEÚfloatÚVEC3_GROUP_CODEr   ÚCOLLECTION_GROUP_CODEÚ
START_LISTÚ
START_DICTÚEND_LISTÚEND_DICTÚpopÚ
IndexErrorr   ÚDXFStructureErrorÚdictr   ÚDXFValueError)rK   ÚstackÚitemsÚtagr_   r`   Ú
prev_levels          r-   r^   r^   Œ   s’  € Ø€EØ€EÜˆØ‰ˆˆeØ”>Ò!Ø�L‰Lœ˜U›Õ$Ø”^Ò#Ø�L‰Lœ˜U›Õ$ØÔ%Ò%Ø�L‰Lœ˜u›Õ&Ø”_Ò$Ø�L‰Lœ˜e›Õ%ØÔ*Ò*Ø”ZÒ 5¬JÒ#6à�L‰L˜ÔØ‰EØÔ*Ò*Ø”XÒ ¬(Ò!2ðØ"ŸY™Y›[�
ð œÒ Ø×!Ñ!¤$¤u¨U£|Ó"4Õ5à×!Ñ! %Ô(ØŠEä×%Ñ%Ø.¨t¨f°B°u°g¸QÐ?óð ð? ñD Ü×%Ñ%ðÜ%Ð& fð.ó
ð 	
ð €Løô' ò Ü×-Ñ-ðÜ.Ð/¨vð7óð ðús   Ã+E;Å;'F"c                óŒ   — t        «       }|j                  t        t        | «      «       |j	                  t        |«      «       |S r9   )r   rd   r   r[   r]   Útags_from_list)r!   r+   rK   s      r-   rJ   rJ   ¹   s2   € Ü‹6€DØ‡K�K””¨Ó-Ô.Ø‡K�K”˜tÓ$Ô%Ø€Kr/   c           	     óº  — t        «       }| D �]J  }t        |t        «      r`t        |«      dkD  rt	        j
                  d«      ‚d|v sd|v rt	        j
                  d«      ‚|j                  t        t        |«      «       Œtt        |t        «      r |j                  t        t        |«      «       Œ¤t        |t        «      r |j                  t        t        |«      «       ŒÔt        |t        «      r!|j                  t        t        |«      «       �Œt        |t        «      r*|j                  t        t        t        |«      «      «       �Œ?t        |t         «      rb|j                  t        t"        t$        «      «       |j'                  t)        |«      «       |j                  t        t"        t*        «      «       �Œ±t        |t,        «      rk|j                  t        t"        t.        «      «       |j'                  t)        t1        |«      «      «       |j                  t        t"        t2        «      «       �Œ,t	        j4                  dt7        |«      › �«      ‚ |S )Ni  z%string too long, max. 2049 charactersÚ
Úz%found invalid line break '\n' or '\r'zunsupported type: )r   Ú
isinstancer)   Úlenr   rs   rd   r   rc   rf   re   rh   rg   r   ri   r   r   rj   rk   r]   ry   rm   r   rl   Úkey_value_listrn   r\   Útype)ru   rK   rY   s      r-   ry   ry   À   s¡  € Ü‹6€DÜˆÜ�dœCÔ Ü�4‹y˜4ÒÜ×)Ñ)Ø;óð ð �t‰|˜t t™|Ü×)Ñ)Ø=óð ð �K‰Kœœ~¨tÓ4Õ5Ü˜œcÔ"Ø�K‰Kœœ~¨tÓ4Õ5Ü˜œeÔ$Ø�K‰KœÔ/°Ó6Õ7Ü˜œdÔ#Ø�K‰Kœœ°Ó5Ö6Ü˜œdÔ#Ø�K‰Kœœ´°T³
Ó;Ö<Ü˜œhÔ'Ø�K‰KœÔ4´jÓAÔBØ�K‰Kœ tÓ,Ô-Ø�K‰KœÔ4´hÓ?Ö@Ü˜œgÔ&Ø�K‰KœÔ4´jÓAÔBØ�K‰Kœ¤~°dÓ';Ó<Ô=Ø�K‰KœÔ4´hÓ?Ö@ä×$Ñ$Ð'9¼$¸t»*¸Ð%FÓGÐGð9 ð: €Kr/   c              #  óL   K  — | j                  «       D ]  \  }}|–— |–— Œ y ­wr9   )ru   )r+   ÚkÚvs      r-   r   r   â   s$   è ø€ Ø—
‘
–‰ˆˆ1ØŠØ‹ñ ùs   ‚"$c                  óR   — e Zd Z	 d	ddœ	 	 	 d
d„Zedd„«       Zd„ Zd„ Zdd„Zdd„Z	y)r   N)r"   c               óà   — |€A|€t        j                  «       }n*t        t         |j                  j	                  di «      «      }|| _        t        | j
                  j                  «      | _        y)ap  Setup a :class:`BinaryRecord`.

        The data is stored in the given `xrecord` object, or in a new created
        :class:`~ezdxf.entities.XRecord` instance if ``None``. If `doc` is not
        ``None`` the new xrecord is added to the OBJECTS section of the DXF
        document.

        Changes of the content has to be committed at the end to be stored in
        the underlying :attr:`xrecord` object.

        Args:
            xrecord (XRecord): underlying :class:`~ezdxf.entities.XRecord` instance,
                if ``None`` a new one will be created
            doc (Drawing): DXF document or ``None``

        Nr$   )	r   r%   r
   r&   r'   r(   Úparse_binary_datarK   r+   )r,   r(   r"   s      r-   r.   zBinaryRecord.__init__é   sS   € ð, ˆ?Øˆ{Ü!Ÿ+™+›-‘äœw¨¯©×(>Ñ(>¸yÈ"Ó(MÓN�àˆŒÜ,¨T¯\©\×->Ñ->Ó?ˆ�	r/   c                óL   — | j                   j                  j                  d«      S r1   r3   r6   s    r-   r2   zBinaryRecord.handle  r7   r/   c                ó   — | S r9   r:   r6   s    r-   r;   zBinaryRecord.__enter__  r<   r/   c                ó$   — | j                  «        y r9   r>   r@   s       r-   rD   zBinaryRecord.__exit__  rE   r/   c                ó,   — t        | j                  «      S rG   )r   r+   r6   s    r-   rH   zBinaryRecord.__str__  s   € ä˜tŸy™yÓ)Ð)r/   c                óÂ   — t        | j                  t        t        t        f«      sJ d«       ‚t        | j                  ddd¬«      | j                  _        | j                  S )z¸Store binary :attr:`data` in the underlying :class:`~ezdxf.entities.XRecord`
        instance. This call is not required if using the class by the ``with``
        statement.

        zexpected binary dataé    é6  é   )Úlength_group_codeÚvalue_group_codeÚ
value_size)r}   r+   ÚbytesÚ	bytearrayÚ
memoryviewr   r(   rK   r6   s    r-   r?   zBinaryRecord.commit  s]   € ô Ø�I‰Iœœy¬*Ð5ô
ð 	"à!ó	"ð 
ô 4Ø�I‰IØ!Ø Øô	
ˆ�‰Ôð �|‰|Ðr/   r9   )r(   rL   r"   rM   rN   )rO   r)   rP   )
rQ   rR   rS   r.   rU   r2   r;   rD   rH   r?   r:   r/   r-   r   r   è   sT   „ ð &*ð@ð "&ñ	@à"ð@ð ó	@ð> ò.ó ð.òòó*ôr/   c                ó\   — | r*| d   j                   dk(  rdj                  d„ | D «       «      S y)Nr   rŒ   r/   c              3  óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­w)r�   N)r_   r`   )rX   Úts     r-   rZ   z$parse_binary_data.<locals>.<genexpr>,  s   è ø€ Ð?© A°·±¸3³˜Ÿ�©ùs   ‚(—()r_   Újoin)rK   s    r-   r†   r†   *  s,   € Ù��Q‘—‘ Ò#Ø�x‰xÑ?©Ó?Ó?Ð?àr/   N)r(   r   r!   r)   rO   Úlist)rK   r   rO   r™   )r!   r)   r+   r   rO   r   )ru   r   rO   r   )r+   r   rO   r   )rK   r   rO   r’   )1Ú__doc__Ú
__future__r   Útypingr   r   r   r   r   r	   r
   Úezdxf.lldxfr   Úezdxf.entitiesr   Úezdxf.lldxf.tagsr   r   Úezdxf.lldxf.typesr   Ú
ezdxf.mathr   r   Úezdxf.toolsr   Úezdxf.tools.binarydatar   Úezdxf.documentr   r[   rc   re   rg   ri   rj   rk   rm   rl   rn   rT   Ú__all__r   r*   r^   rJ   ry   r   r   r†   r:   r/   r-   Ú<module>r¦      s´   ðñõ0 #÷÷ ñ õ Ý "ß :Ý $ß !Ý Ý 2áÝ&à€Ø€Ø€ØÐ Ø€ØÐ Ø€
Ø€Ø€
Ø€Ø€à˜Ð
(€÷=ñ =ó@
ó*óZóóD÷?ñ ?ôDr/   