
    hm@                    r   S SK Jr  S SKJrJrJrJrJrJrJ	r	J
r
  S SKJr  S SKrS SKJrJr  S SKJrJrJr  S SKJr  S SKJrJrJr  S S	KJrJrJrJr  S S
KJ r   S SK!J"r"  S SK#J$r$  \(       a  S SK%J&r&  S SK'J(r(  / SQr)\RT                  " S5      r+SS jr, " S S5      r-SS jr. " S S\5      r/ " S S\5      r0g)    )annotations)TYPE_CHECKINGIterableAnyMutableSequenceMutableMappingIteratorUnionOptional)contextmanagerN)Vec3Matrix44)dxftagVALID_XDATA_GROUP_CODESDXFTag)Tags)XDATA_MARKERDXFValueErrorDXFTypeError)
xdata_listremove_named_list_from_xdataget_named_list_from_xdataNotFoundException)take2)options) filter_invalid_xdata_group_codes)	DXFEntity)AbstractTagWriter)XDataXDataUserListXDataUserDictezdxfc                &    [        S U  5       5      $ )Nc              3  F   #    U  H  oR                   [        ;   v   M     g 7fN)coder   ).0tags     F/var/www/html/env/lib/python3.13/site-packages/ezdxf/entities/xdata.py	<genexpr>.has_valid_xdata_group_codes.<locals>.<genexpr>(   s     Cdsxx22ds   !)all)tagss    r)   has_valid_xdata_group_codesr.   '   s    CdCCC    c                      \ rS rSrSSS jjr\SS j5       rS rSS jrS r	SS jr
      SS	 jrSS
 jrS rSS jrSS jrSS jrSS jrSS jrSS jrS S jrSrg)!r   +   Nc                ^    [        5       U l        Ub  U H  nU R                  U5        M     g g r%   )dictdata_add)selfxdatar4   s      r)   __init__XData.__init__,   s+    %)V			$  r/   c           
     b    U " U Vs/ s H  n[        [        U5      5      PM     sn5      $ s  snf r%   )r   r   )clsr7   r-   s      r)   	safe_initXData.safe_init2   s/    FKLedT2489eL
 	
Ls   ,c                ,    [        U R                  5      $ r%   )lenr4   r6   s    r)   __len__XData.__len__8   s    499~r/   c                    XR                   ;   $ )z0Returns ``True`` if  DXF tags for `appid` exist.r4   r6   appids     r)   __contains__XData.__contains__;   s    		!!r/   c                    U R                   R                  5        Vs0 s H  oS   R                  U_M     snU l         gs  snf )z!Update APPID keys. (internal API)r   N)r4   valuesvalue)r6   r-   s     r)   update_keysXData.update_keys?   s5    59YY5E5E5GH5GT!W]]D(5GH	Hs   ?c                   [        U5      n[        U5      (       ad  US   R                  nX R                  ;   a  [        R                  SU S35        [        U5      (       a  XR                  U'   g [        SU 35      eg )Nr   zDuplicate XDATA appid z in one entityz"found invalid XDATA group code in )r   r?   rK   r4   loggerinfor.   r   )r6   r-   rF   s      r)   r5   
XData._addC   sp    Dzt99GMME		!4UG>JK*400#'		% #&H$OPP r/   c                    [        S U 5       5      n[        U5      S:X  d  US   [        U4:w  a   UR                  S[	        [        U5      5        U R                  U5        g)a>  Add a list of DXF tags for `appid`. The `tags` argument is an
iterable of (group code, value) tuples, where the group code has to be
an integer value. The mandatory XDATA marker (1001, appid) is added
automatically if front of the tags if missing.

Each entity can contain only one list of tags for each `appid`.
Adding a second list of tags for the same `appid` replaces the
existing list of tags.

The valid XDATA group codes are restricted to some specific values in
the range from 1000 to 1071, for more information see also the
internals about :ref:`xdata_internals`.

c              3  <   #    U  H  u  p[        X5      v   M     g 7fr%   )r   )r'   r&   rK   s      r)   r*   XData.add.<locals>.<genexpr>_   s     @4KDF4''4s   r   N)r   r?   r   insertr   r5   )r6   rF   r-   r4   s       r)   add	XData.addN   sO    " @4@@t9>T!Wu(==KK6,67		$r/   c                T    XR                   ;   a  U R                   U   $ [        U5      e)zReturns the DXF tags as :class:`~ezdxf.lldxf.tags.Tags` list
stored by `appid`.

Raises:
     DXFValueError: no data for `appid` exist

)r4   r   rE   s     r)   get	XData.getd   s(     II99U##&&r/   c                >    XR                   ;   a  U R                   U	 gg)zHDelete DXF tags for `appid`. None existing appids are silently
ignored.
NrD   rE   s     r)   discardXData.discardq   s     II		%  r/   c                    U R                   R                  5        H?  u  p#[        R                  (       a  [	        [        U5      5      nUR                  U5        MA     g r%   )r4   itemsr   r   r   
write_tags)r6   	tagwriterrF   r-   s       r)   
export_dxfXData.export_dxfx   s@    99??,KE77<TBC  & -r/   c                H     U R                  X5        g! [         a     gf = f)zhReturns ``True`` if list `name` from XDATA `appid` exists.

Args:
    appid: APPID
    name: list name

TF)	get_xlistr   )r6   rF   names      r)   	has_xlistXData.has_xlist~   s,    	NN5'   		s    
!!c                |    U R                  U5      n [        X#5      $ ! [         a    [        SU SU S35      ef = f)a  Get list `name` from XDATA `appid`.

Args:
    appid: APPID
    name: list name

Returns: list of DXFTags including list name and curly braces '{' '}' tags

Raises:
    DXFKeyError: XDATA `appid` does not exist
    DXFValueError: list `name` does not exist

zNo data list "z" not found for APPID "")rY   r   r   r   )r6   rF   rf   r7   s       r)   re   XData.get_xlist   sP     	,T99  	 &=eWAF 	s   
 ;c                    XR                   ;  a5  [        U4/nUR                  [        X#5      5        U R	                  X5        gU R                  XU5        g)a  Create new list `name` of XDATA `appid` with `xdata_tags` and
replaces list `name` if already exists.

Args:
    appid: APPID
    name: list name
    tags: list content as DXFTags or (code, value) tuples, list name and
        curly braces '{' '}' tags will be added
N)r4   r   extendr   rV   replace_xlist)r6   rF   rf   r-   r4   s        r)   	set_xlistXData.set_xlist   sH     		!!5)*DKK
4./HHU!uD1r/   c                     U R                  U5      n [        X#5      nU R                  X5        g! [         a     gf = f! [         a     gf = f)zDeletes list `name` from XDATA `appid`. Ignores silently if XDATA
`appid` or list `name` not exist.

Args:
    appid: APPID
    name: list name

N)rY   r   rV   r   r   )r6   rF   rf   r7   r-   s        r)   discard_xlistXData.discard_xlist   sX    
	&HHUOE&3D@ % %   		s   A 1 
>>
AAc                    U R                  U5      n [        X$5      n[        X#5      nUR	                  U5        U R                  X5        g! [         a    Un N<f = f)a  Replaces list `name` of existing XDATA `appid` by `tags`. Appends
new list if list `name` do not exist, but raises `DXFValueError` if
XDATA `appid` do not exist.

Low level interface, if not sure use `set_xdata_list()` instead.

Args:
    appid: APPID
    name: list name
    tags: list content as DXFTags or (code, value) tuples, list name and
        curly braces '{' '}' tags will be added
Raises:
    DXFValueError: XDATA `appid` do not exist

N)rY   r   r   r   rm   rV   )r6   rF   rf   r-   r7   r4   xlists          r)   rn   XData.replace_xlist   sZ      	/<D 4&E	 ! 	D	s   A AAc                    [        5       nU R                  R                  5        H  u  p4[        [	        XA5      5      X#'   M     X l        g)zTransform XDATA tags with group codes 1011, 1012, 1013, 1041 and
1042 inplace. For more information see :ref:`xdata_internals` Internals.

N)r3   r4   r_   r   transform_xdata_tags)r6   mtransformed_datakeyr-   s        r)   	transformXData.transform   s<    
  6*IC$()=d)F$G! +$	r/   rD   r%   )r7   zOptional[Iterable[Tags]])r7   zIterable[Tags])rF   strreturnbool)r-   r   r   None)rF   r~   r-   z(Iterable[Union[tuple[int, Any], DXFTag]]r   r   )rF   r~   r   r   )ra   r   r   r   )rF   r~   rf   r~   r   r   )rF   r~   rf   r~   r   zlist[tuple])rF   r~   rf   r~   r-   r   r   r   )rF   r~   rf   r~   r   r   )ry   r   r   r   )__name__
__module____qualname____firstlineno__r8   classmethodr<   rA   rG   rL   r5   rV   rY   r\   rb   rg   re   ro   rr   rn   r|   __static_attributes__ r/   r)   r   r   +   s{      
 

"I	Q H	,'!',2"&*2%r/   r   c           	   #    #    U  H  nUu  p4US:X  a'  [        X1R                  [        U5      5      5      v   M4  US:X  a'  [        X1R                  [        U5      5      5      v   Ma  US:X  aR  [        U5      nUR                  nUS:  a/  UR                  U5      R                  U5      n[        X55      v   M  Uv   M  US:X  d  US:X  a5  UR                  [        USS5      5      n[        X5R                  5      v   M  Uv   GM     g 7f)Ni  i  i  g-q=i  i  r   )r   r|   r   transform_direction	magnitude	normalize)r-   ry   r(   r&   rK   veclengths          r)   rx   rx      s     4<{{4;788T\44T%[ABBT\u+C]]F~++C0::6BT''	T\TT\''UAq(9:C}}--I- s   DD	c                      \ rS rSrSr\\\\S.r	\S\S\S\S0r
 S SS	 jjr\\ S   SS
 jj5       5       rS rS rS rSS jrS rS rS rSS jrSS jrSS jrSrg)r    i  zManage named XDATA lists as a list-like object.

Stores just a few data types with fixed group codes:

    1000 str
    1010 Vec3
    1040 float
    1071 32bit int

)      /  r   r   r   r   Nc                   Uc
  [        5       nXl        [        U5      U l        [        U5      U l         UR                  U R                  U R                  5      nU R                  U5      U l        g! [         a    / n N%f = f)a  Setup a XDATA user list `name` for the given `appid`.

The data is stored in the given `xdata` object, or in a new created
:class:`XData` instance if ``None``.
Changes of the content has to be committed at the end to be stored in
the underlying `xdata` object.

Args:
    xdata (XData): underlying :class:`XData` instance, if ``None`` a
        new one will be created
    name (str): name of the user list
    appid (str): application specific AppID

N)	r   r7   r~   _appid_namere   r   _parse_list_data)r6   r7   rf   rF   r4   s        r)   r8   XDataUserList.__init__   sr    " =GE
%jY
	??4;;

;D  ++D1
  	D	s   &A2 2B Bc              #     #    UR                   nUc  [        5       nXAl         U " XBU5      nUv   UR                  5         g7f)a@  Context manager to manage a XDATA list `name` for a given DXF
`entity`. Appends the user list to the existing :class:`XData` instance
or creates new :class:`XData` instance.

Args:
    entity (DXFEntity): target DXF entity for the XDATA
    name (str): name of the user list
    appid (str): application specific AppID

Nr7   r   commit)r;   entityrf   rF   r7   ru   s         r)   r   XDataUserList.entity<  ;      =GE LE'   >A c                    U $ r%   r   r@   s    r)   	__enter__XDataUserList.__enter__S      r/   c                $    U R                  5         g r%   r   r6   exc_typeexc_valexc_tbs       r)   __exit__XDataUserList.__exit__V      r/   c                ,    [        U R                  5      $ zReturn str(self).)r~   r   r@   s    r)   __str__XDataUserList.__str__Y      4::r/   c                :    U R                   R                  X5        g r%   )r   rU   )r6   indexrK   s      r)   rU   XDataUserList.insert]  s    

%'r/   c                     U R                   U   $ )zGet self[item].)r   r6   items     r)   __getitem__XDataUserList.__getitem__`  s    zz$r/   c                :    U R                   R                  X5        g)zSet self[item] to value.N)r   __setitem__)r6   r   rK   s      r)   r   XDataUserList.__setitem__d  s    

t+r/   c                :    U R                   R                  U5        g)zDelete self[item].N)r   __delitem__r   s     r)   r   XDataUserList.__delitem__h  s    

t$r/   c                    [        U5      n/ nUSS  HL  u  pEU R                  R                  U5      nU(       a  UR                  U" U5      5        M@  [	        SU 35      e   U$ )N   zunsupported group code: )list	converterrY   appendr   )r6   r-   r4   contentr&   rK   factorys          r)   r   XDataUserList._parse_listl  sc    Dz":KDnn((.Gwu~.#&>tf$EFF & r/   c                ,    [        U R                  5      $ zReturns len(self).)r?   r   r@   s    r)   rA   XDataUserList.__len__w  r   r/   c                   / nU R                    H  n[        U[        5      (       a1  [        U5      S:  a  [	        S5      eSU;   d  SU;   a  [	        S5      eU R
                  R                  [        U5      5      nU(       a  UR                  [        X25      5        M  [        S[        U5       35      e   U R                  R                  U R                  U R                  U5        g)Store all changes to the underlying :class:`XData` instance.
This call is not required if using the :meth:`entity` context manager.

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

   z$string too long, max. 255 characters
z%found invalid line break '\n' or '\r'zinvalid type: N)r   
isinstancer~   r?   r   group_codesrY   typer   r   r   r7   ro   r   r   )r6   r4   rK   r&   s       r)   r   XDataUserList.commit{  s     ZZE%%%u:#'(NOO5=DEM'A  ##''U4DF4/0"^DK=#ABB   	

T[[$**d;r/   )r   r   r   r7   )NDefaultListEZDXFr7   zOptional[XData])r   r   )r   r   r   zIterator[XDataUserList])r   intr   r   )r-   zIterable[tuple]r   r   )r   r   r   r   )r   r   r   r   __doc__r~   r   floatr   r   r   r8   r   r   r   r   r   r   rU   r   r   r   r   rA   r   r   r   r/   r)   r    r      s    	 	I 	TdtT	K HO2$28 :A	   *( ,%	<r/   r    c                      \ rS rSrSr S SS jjrSS jrS rS rS r	\
\ S   SS	 jj5       5       r\S
 5       rS rS rS rS rS rS rSS jrSrg)r!   i  a	  Manage named XDATA lists as a dict-like object.

Uses XDataUserList to store key, value pairs in XDATA.

This class does not create the required AppID table entry, only the
default AppID "EZDXF" exist by default.

Implements the :class:`MutableMapping` interface.

Nc                P    [        XU5      U l        U R                  5       U l        g)a  Setup a XDATA user dict `name` for the given `appid`.

The data is stored in the given `xdata` object, or in a new created
:class:`XData` instance if ``None``.
Changes of the content has to be committed at the end to be stored in
the underlying `xdata` object.

Args:
    xdata (XData): underlying :class:`XData` instance, if ``None`` a
        new one will be created
    name (str): name of the user list
    appid (str): application specific AppID

N)r    _xlist_parse_xlist
_user_dict)r6   r7   rf   rF   s       r)   r8   XDataUserDict.__init__  s"    " $E7*.*;*;*=r/   c                t    U R                   (       a  [        [        U R                   5      5      $ [        5       $ r%   )r   r3   r   r@   s    r)   r   XDataUserDict._parse_xlist  s$    ;;dkk*++6Mr/   c                    U $ r%   r   r@   s    r)   r   XDataUserDict.__enter__  r   r/   c                $    U R                  5         g r%   r   r   s       r)   r   XDataUserDict.__exit__  r   r/   c                ,    [        U R                  5      $ r   )r~   r   r@   s    r)   r   XDataUserDict.__str__      4??##r/   c              #     #    UR                   nUc  [        5       nXAl         U " XBU5      nUv   UR                  5         g7f)a@  Context manager to manage a XDATA dict `name` for a given DXF
`entity`. Appends the user dict to the existing :class:`XData` instance
or creates new :class:`XData` instance.

Args:
    entity (DXFEntity): target DXF entity for the XDATA
    name (str): name of the user list
    appid (str): application specific AppID

Nr   )r;   r   rf   rF   r7   xdicts         r)   r   XDataUserDict.entity  r   r   c                .    U R                   R                  $ r%   )r   r7   r@   s    r)   r7   XDataUserDict.xdata  s    {{   r/   c                ,    [        U R                  5      $ r   )r?   r   r@   s    r)   rA   XDataUserDict.__len__  r   r/   c                     U R                   U   $ )zGet self[key].r   r6   r{   s     r)   r   XDataUserDict.__getitem__  s    s##r/   c                `    [        U[        5      (       d  [        S5      eX R                  U'   g)z`Set self[key] to value, key has to be a string.

Raises:
    DXFTypeError: key is not a string

zkey is not a stringN)r   r~   r   r   )r6   r{   r   s      r)   r   XDataUserDict.__setitem__  s)     #s##455#r/   c                    U R                   U	 g)zDelete self[key].Nr   r   s     r)   r   XDataUserDict.__delitem__  s    OOC r/   c                ,    [        U R                  5      $ )zImplement iter(self).)iterr   r@   s    r)   __iter__XDataUserDict.__iter__  s    DOO$$r/   c                @     U R                   U	 g! [         a     gf = f)zPDelete self[key], without raising a :class:`KeyError` if `key` does
not exist.

N)r   KeyErrorr   s     r)   r\   XDataUserDict.discard  s%    
	$ 		s    
c                    U R                   nUR                  5         U R                  R                  5        H'  u  p#UR	                  U5        UR	                  U5        M)     UR                  5         g)r   N)r   clearr   r_   r   r   )r6   ru   r{   rK   s       r)   r   XDataUserDict.commit  sR     ////1JCLLLL 2 	r/   )r   r   )NDefaultDictr   r   )r   r3   )r  r   )r   r   r   zIterator[XDataUserDict]r   )r   r   r   r   r   r8   r   r   r   r   r   r   r   propertyr7   rA   r   r   r   r   r\   r   r   r   r/   r)   r!   r!     s    	 HO>$>($ :A	   * ! !$$	$!%r/   r!   )r-   r   r   r   )r-   r   ry   r   r   zIterator[DXFTag])1
__future__r   typingr   r   r   r   r   r	   r
   r   
contextlibr   logging
ezdxf.mathr   r   ezdxf.lldxf.typesr   r   r   ezdxf.lldxf.tagsr   ezdxf.lldxf.constr   r   r   r   r   r   r   ezdxf.toolsr   r"   r   ezdxf.lldxf.repairr   ezdxf.entitiesr   ezdxf.lldxf.tagwriterr   __all__	getLoggerrO   r.   r   rx   r    r!   r   r/   r)   <module>r     s    #	 	 	 &  % E E ! G G    ?(7
5			7	#D% %D4K<O K<\~N ~r/   