
    Ogm@                    d   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mZ d dlZd dlmZmZ d dlmZmZmZ d dlmZ d dlmZmZmZ d d	lmZmZmZmZ d d
lm Z  d dl!m"Z" d dl#m$Z$ erd dl%m&Z& d dl'm(Z( g dZ) ejT                  d      Z+ddZ, G d d      Z-ddZ. G d de      Z/ G d de      Z0y)    )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                &    t        d | D              S )Nc              3  @   K   | ]  }|j                   t        v   y wN)coder   ).0tags     Y/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/xdata.py	<genexpr>z.has_valid_xdata_group_codes.<locals>.<genexpr>(   s     Cssxx22Cs   )all)tagss    r)   has_valid_xdata_group_codesr-   '   s    CdCCC    c                      e Zd ZdddZedd       Zd ZddZd ZddZ		 	 	 	 	 	 ddZ
dd	Zd
 ZddZddZddZddZddZddZddZy)r   Nc                X    t               | _        ||D ]  }| j                  |        y y r%   )dictdata_add)selfxdatar2   s      r)   __init__zXData.__init__,   s0    %)V	  		$  r.   c           
     \     | |D cg c]  }t        t        |             c}      S c c}w r%   )r   r   )clsr5   r,   s      r)   	safe_initzXData.safe_init2   s+    FKLdT2489L
 	
Ls   )c                ,    t        | j                        S r%   )lenr2   r4   s    r)   __len__zXData.__len__8   s    499~r.   c                    || j                   v S )z0Returns ``True`` if  DXF tags for `appid` exist.r2   r4   appids     r)   __contains__zXData.__contains__;   s    		!!r.   c                    | j                   j                         D ci c]  }|d   j                  | c}| _         yc c}w )z!Update APPID keys. (internal API)r   N)r2   valuesvalue)r4   r,   s     r)   update_keyszXData.update_keys?   s1    59YY5E5E5GHTT!W]]D(H	Hs   =c                    t        |      }t        |      r_|d   j                  }|| j                  v rt        j                  d| d       t        |      r|| j                  |<   y t        d|       y )Nr   zDuplicate XDATA appid z in one entityz"found invalid XDATA group code in )r   r;   rE   r2   loggerinfor-   r   )r4   r,   rA   s      r)   r3   z
XData._addC   so    Dzt9GMME		!4UG>JK*40#'		% #&H$OPP r.   c                    t        d |D              }t        |      dk(  s|d   t        |fk7  r |j                  dt	        t        |             | j                  |       y)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  :   K   | ]  \  }}t        ||        y wr%   )r   )r'   r&   rE   s      r)   r*   zXData.add.<locals>.<genexpr>_   s     @KD%F4'@s   r   N)r   r;   r   insertr   r3   )r4   rA   r,   r2   s       r)   addz	XData.addN   sO    " @4@@t9>T!Wu(==KK6,67		$r.   c                R    || j                   v r| j                   |   S t        |      )zReturns the DXF tags as :class:`~ezdxf.lldxf.tags.Tags` list
        stored by `appid`.

        Raises:
             DXFValueError: no data for `appid` exist

        )r2   r   r@   s     r)   getz	XData.getd   s*     DII99U##&&r.   c                <    || j                   v r| j                   |= yy)zXDelete DXF tags for `appid`. None existing appids are silently
        ignored.
        Nr?   r@   s     r)   discardzXData.discardq   s!     DII		%  r.   c                    | j                   j                         D ]:  \  }}t        j                  rt	        t        |            }|j                  |       < y r%   )r2   itemsr   r   r   
write_tags)r4   	tagwriterrA   r,   s       r)   
export_dxfzXData.export_dxfx   sG    99??, 	'KE477<TBC  &	'r.   c                H    	 | j                  ||       y# t        $ r Y yw xY w)zReturns ``True`` if list `name` from XDATA `appid` exists.

        Args:
            appid: APPID
            name: list name

        TF)	get_xlistr   )r4   rA   names      r)   	has_xlistzXData.has_xlist~   s.    	NN5$'   		s    	!!c                |    | j                  |      }	 t        ||      S # t        $ r t        d| d| d      w xY w)aB  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 "")rO   r   r   r   )r4   rA   rY   r5   s       r)   rX   zXData.get_xlist   sR     	,T599  	 &=eWAF 	s    ;c                    || j                   vr7t        |fg}|j                  t        ||             | j	                  ||       y| j                  |||       y)aC  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)r2   r   extendr   rM   replace_xlist)r4   rA   rY   r,   r2   s        r)   	set_xlistzXData.set_xlist   sP     		!!5)*DKK
4./HHUD!udD1r.   c                    	 | j                  |      }	 t        ||      }| j                  ||       y# t        $ r Y yw xY w# t        $ r Y yw xY w)zDeletes list `name` from XDATA `appid`. Ignores silently if XDATA
        `appid` or list `name` not exist.

        Args:
            appid: APPID
            name: list name

        N)rO   r   rM   r   r   )r4   rA   rY   r5   r,   s        r)   discard_xlistzXData.discard_xlist   s\    
	&HHUOE&3D%@ % %   		s   A 3 	??	AAc                    | j                  |      }	 t        ||      }t        ||      }|j	                  |       | j                  ||       y# t        $ r |}Y =w xY w)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)rO   r   r   r   r^   rM   )r4   rA   rY   r,   r5   r2   xlists          r)   r_   zXData.replace_xlist   s`      	/e<D 4&E	 ! 	D	s   A AAc                    t               }| j                  j                         D ]  \  }}t        t	        ||            ||<    || _        y)zTransform XDATA tags with group codes 1011, 1012, 1013, 1041 and
        1042 inplace. For more information see :ref:`xdata_internals` Internals.

        N)r1   r2   rS   r   transform_xdata_tags)r4   mtransformed_datakeyr,   s        r)   	transformzXData.transform   sK    
  6* 	HIC$()=dA)F$GS!	H$	r.   r%   )r5   zOptional[Iterable[Tags]])r5   zIterable[Tags])rA   strreturnbool)r,   r   rl   None)rA   rk   r,   z(Iterable[Union[tuple[int, Any], DXFTag]]rl   rn   )rA   rk   rl   r   )rU   r   rl   rn   )rA   rk   rY   rk   rl   rm   )rA   rk   rY   rk   rl   zlist[tuple])rA   rk   rY   rk   r,   r   rl   rn   )rA   rk   rY   rk   rl   rn   )rg   r   rl   rn   )__name__
__module____qualname__r6   classmethodr9   r=   rB   rF   r3   rM   rO   rQ   rV   rZ   rX   r`   rb   r_   rj    r.   r)   r   r   +   s{      
 

"I	Q H	,'!',2"&*2%r.   r   c           	   #    K   | D ]  }|\  }}|dk(  r't        ||j                  t        |                   4|dk(  r't        ||j                  t        |                   `|dk(  rPt        |      }|j                  }|dkD  r/|j                  |      j                  |      }t        ||       | |dk(  s|dk(  r5|j                  t        |dd            }t        ||j                         |  y w)Ni  i  i  g-q=i  i  r   )r   rj   r   transform_direction	magnitude	normalize)r,   rg   r(   r&   rE   veclengths          r)   rf   rf      s      e4<q{{4;788T\q44T%[ABBT\u+C]]F~++C0::6BT3''	T\TT\''UAq(9:Cs}}--I-s   C>D c                      e Zd ZdZeeeedZedededediZ		 d	 ddZ
ee	 d	 	 	 dd	              Zd
 Zd Zd ZddZd Zd Zd ZddZddZddZy)r    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                   |
t               }|| _        t        |      | _        t        |      | _        	 |j                  | j                  | j                        }| j                  |      | _        y# t        $ r g }Y $w xY w)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   r5   rk   _appid_namerX   r   _parse_list_data)r4   r5   rY   rA   r2   s        r)   r6   zXDataUserList.__init__   st    " =GE
%jY
	??4;;

;D  ++D1
  	D	s   &A2 2B ?B c              #     K   |j                   }|t               }||_          | |||      }| |j                          yw)ax  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r5   r   commit)r8   entityrY   rA   r5   rd   s         r)   r   zXDataUserList.entity<  @      =GE FLE4'   ?Ac                    | S r%   rs   r<   s    r)   	__enter__zXDataUserList.__enter__S      r.   c                $    | j                          y r%   r   r4   exc_typeexc_valexc_tbs       r)   __exit__zXDataUserList.__exit__V      r.   c                ,    t        | j                        S zReturn str(self).)rk   r   r<   s    r)   __str__zXDataUserList.__str__Y      4::r.   c                <    | j                   j                  ||       y r%   )r   rL   )r4   indexrE   s      r)   rL   zXDataUserList.insert]  s    

%'r.   c                     | j                   |   S )zGet self[item].)r   r4   items     r)   __getitem__zXDataUserList.__getitem__`  s    zz$r.   c                <    | j                   j                  ||       y)zSet self[item] to value.N)r   __setitem__)r4   r   rE   s      r)   r   zXDataUserList.__setitem__d  s    

tU+r.   c                :    | j                   j                  |       y)zDelete self[item].N)r   __delitem__r   s     r)   r   zXDataUserList.__delitem__h  s    

t$r.   c                    t        |      }g }|dd D ]G  \  }}| j                  j                  |      }|r|j                   ||             ;t	        d|        |S )N   zunsupported group code: )list	converterrO   appendr   )r4   r,   r2   contentr&   rE   factorys          r)   r   zXDataUserList._parse_listl  sl    Dz": 	GKD%nn((.Gwu~.#&>tf$EFF	G r.   c                ,    t        | j                        S zReturns len(self).)r;   r   r<   s    r)   r=   zXDataUserList.__len__w  r   r.   c                   g }| j                   D ]  }t        |t              r,t        |      dkD  rt	        d      d|v sd|v rt	        d      | j
                  j                  t        |            }|r|j                  t        ||             t        dt        |              | j                  j                  | j                  | j                  |       y)  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   
isinstancerk   r;   r   group_codesrO   typer   r   r   r5   r`   r   r   )r4   r2   rE   r&   s       r)   r   zXDataUserList.commit{  s     ZZ 	CE%%u:#'(NOO5=DEM'A  ##''U4DF4/0"^DK=#ABB	C 	

T[[$**d;r.   )NDefaultListEZDXFr5   zOptional[XData])r   r   )r   r   rl   zIterator[XDataUserList])r   intrl   rn   )r,   zIterable[tuple]rl   r   )rl   r   rl   rn   )ro   rp   rq   __doc__rk   r   floatr   r   r   r6   rr   r   r   r   r   r   rL   r   r   r   r   r=   r   rs   r.   r)   r    r      s    	 	I 	TdtT	K HO2$28 :A	   *( ,%	<r.   r    c                      e Zd ZdZ	 d	 ddZddZd Zd Zd Ze	e
	 d	 	 	 dd              Zed	        Zd
 Zd Zd Zd Zd Zd ZddZy)r!   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                R    t        |||      | _        | j                         | _        y)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)r4   r5   rY   rA   s       r)   r6   zXDataUserDict.__init__  s$    " $E47*.*;*;*=r.   c                j    | j                   rt        t        | j                               S t               S r%   )r   r1   r   r<   s    r)   r   zXDataUserDict._parse_xlist  s$    ;;dkk*++6Mr.   c                    | S r%   rs   r<   s    r)   r   zXDataUserDict.__enter__  r   r.   c                $    | j                          y r%   r   r   s       r)   r   zXDataUserDict.__exit__  r   r.   c                ,    t        | j                        S r   )rk   r   r<   s    r)   r   zXDataUserDict.__str__      4??##r.   c              #     K   |j                   }|t               }||_          | |||      }| |j                          yw)ax  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   )r8   r   rY   rA   r5   xdicts         r)   r   zXDataUserDict.entity  r   r   c                .    | j                   j                  S r%   )r   r5   r<   s    r)   r5   zXDataUserDict.xdata  s    {{   r.   c                ,    t        | j                        S r   )r;   r   r<   s    r)   r=   zXDataUserDict.__len__  r   r.   c                     | j                   |   S )zGet self[key].r   r4   ri   s     r)   r   zXDataUserDict.__getitem__  s    s##r.   c                X    t        |t              st        d      || j                  |<   y)zxSet self[key] to value, key has to be a string.

        Raises:
            DXFTypeError: key is not a string

        zkey is not a stringN)r   rk   r   r   )r4   ri   r   s      r)   r   zXDataUserDict.__setitem__  s(     #s#455#r.   c                    | j                   |= y)zDelete self[key].Nr   r   s     r)   r   zXDataUserDict.__delitem__  s    OOC r.   c                ,    t        | j                        S )zImplement iter(self).)iterr   r<   s    r)   __iter__zXDataUserDict.__iter__  s    DOO$$r.   c                >    	 | j                   |= y# t        $ r Y yw xY w)z`Delete self[key], without raising a :class:`KeyError` if `key` does
        not exist.

        N)r   KeyErrorr   s     r)   rQ   zXDataUserDict.discard  s%    
	$ 		s    	c                    | j                   }|j                          | j                  j                         D ]'  \  }}|j	                  |       |j	                  |       ) |j                          y)r   N)r   clearr   rS   r   r   )r4   rd   ri   rE   s       r)   r   zXDataUserDict.commit  sY     ////1 	 JCLLLL	  	r.   )NDefaultDictr   r   )rl   r1   )r   r   )r   r   rl   zIterator[XDataUserDict]r   )ro   rp   rq   r   r6   r   r   r   r   rr   r   r   propertyr5   r=   r   r   r   r   rQ   r   rs   r.   r)   r!   r!     s    	 HO>$>($ :A	   * ! !$$	$!%r.   r!   )r,   r   rl   rm   )r,   r   rg   r   rl   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__	getLoggerrH   r-   r   rf   r    r!   rs   r.   r)   <module>r      s    #	 	 	 &  % E E ! G G    ?(7
5			7	#D% %D4K<O K<\~N ~r.   