Ë
    £èh~?  ã                  óä   — d dl 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 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 d dlmZ d dlmZ erd dlmZ h d£Z G d„ d«      Z G d„ d«      Z y)é    )Úannotations)ÚOptionalÚIterableÚTYPE_CHECKINGÚIterator)Úcontextmanager)ÚHandleGenerator)Úis_valid_handle)Ú	DXFEntity)Ú	DXFObject)Ú
AuditErrorÚAuditor)ÚDXFInternalEzdxfError)Úfactory)ÚEntityQuery)Údefault_copy)ÚAbstractTagWriter>   ÚEOFÚCLASSÚTABLEÚENDSECÚENDTABÚSECTIONÚ
ACDSRECORDÚ
ACDSSCHEMAc                  óè   — e Zd ZdZ G d„ d«      Zdd„Zdd„Zdd„Zdd„Zd d„Z	d!d	„Z
d"d
„Zd#d„Zd$d„Zd%d„Zd&d„Zd'd„Zd(d„Zd(d„Zd(d„Zd)d„Zd*d„Zd+d„Zed+d„«       Zdd„Zd,d„Zd-d„Zd.d/d„Zy)0ÚEntityDBzòA simple key/entity database.

    Every entity/object, except tables and sections, are represented as
    DXFEntity or inherited types, these entities are stored in the
    DXF document database, database-key is the `handle` as string.

    c                  ó&   — e Zd ZdZdd„Zdd„Zd„ Zy)úEntityDB.Trashcanz8Store handles to entities which should be deleted later.c                óD   — |j                   | _         t        «       | _        y ©N)Ú	_databaseÚsetÚ_handles)ÚselfÚdbs     ú.lib/python3.12/site-packages/ezdxf/entitydb.pyÚ__init__zEntityDB.Trashcan.__init__0   s   € ØŸ\™\ˆDŒNÜ&)£eˆD�Mó    c                ó:   — | j                   j                  |«       y)z’Put handle into trashcan to delete the entity later, this is
            required for deleting entities while iterating the database.
            N)r$   Úadd©r%   Úhandles     r'   r+   zEntityDB.Trashcan.add4   s   € ð �M‰M×Ñ˜fÕ%r)   c                óà   — | j                   }| j                  D ]9  }|j                  |«      }|r|j                  r|j	                  «        ||v sŒ7||= Œ; | j                  j                  «        y)zfRemove handles in trashcan from database and destroy entities if
            still alive.
            N)r"   r$   ÚgetÚis_aliveÚdestroyÚclear)r%   r&   r-   Úentitys       r'   r2   zEntityDB.Trashcan.clear:   s[   € ð —‘ˆBØŸ-œ-�ØŸ™ ›�Ù˜fŸošoØ—N‘NÔ$à˜R’<Ø˜6™
ð (ð �M‰M×ÑÕ!r)   N)r&   r   )r-   Ústr)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r+   r2   © r)   r'   ÚTrashcanr   -   s   „ ÙFó	,ó	&ó	"r)   r:   c                ó>   — i | _         t        «       | _        d| _        y )NF)r"   r	   ÚhandlesÚlocked©r%   s    r'   r(   zEntityDB.__init__I   s   € Ø/1ˆŒä&Ó(ˆŒØ!ˆ�r)   c                ó    — | j                   |   S )ziGet entity by `handle`, does not filter destroyed entities nor
        entities in the trashcan.
        )r"   r,   s     r'   Ú__getitem__zEntityDB.__getitem__O   s   € ð �~‰~˜fÑ%Ð%r)   c                ó4  — t        |t        «      sJ t        |«      «       ‚t        |t        «      sJ t        |«      «       ‚|j                  sJ d«       ‚| j
                  rt        d«      ‚|dk(  st        |«      st        d|› d�«      ‚|| j                  |<   y)zSet `entity` for `handle`.zCan not store destroyed entity.úLocked entity database.Ú0zInvalid handle Ú.N)
Ú
isinstancer4   Útyper   r0   r=   r   r
   Ú
ValueErrorr"   )r%   r-   r3   s      r'   Ú__setitem__zEntityDB.__setitem__U   s‰   € ä˜&¤#Ô&Ð4¬¨V«Ó4Ð&Ü˜&¤)Ô,Ð:¬d°6«lÓ:Ð,Ø�ŠÐAÐ AÓAˆØ�;Š;Ü'Ð(AÓBÐBà�SŠ=¤°Ô 7Ü˜¨v¨h°aÐ8Ó9Ð9Ø!'ˆ�‰�vÒr)   c                óL   — | j                   rt        d«      ‚| j                  |= y)zkDelete entity by `handle`. Removes entity only from database, does
        not destroy the entity.
        rB   N)r=   r   r"   r,   s     r'   Ú__delitem__zEntityDB.__delitem__a   s#   € ð �;Š;Ü'Ð(AÓBÐBØ�N‰N˜6Ñ"r)   c                ód   — |€yt        |t        «      sJ t        |«      «       ‚|| j                  v S )z'``True`` if database contains `handle`.F)rE   r4   rF   r"   r,   s     r'   Ú__contains__zEntityDB.__contains__i   s2   € àˆ>ØÜ˜&¤#Ô&Ð4¬¨V«Ó4Ð&Ø˜Ÿ™Ð'Ð'r)   c                ó,   — t        | j                  «      S )zCount of database items.)Úlenr"   r>   s    r'   Ú__len__zEntityDB.__len__p   s   € ä�4—>‘>Ó"Ð"r)   c                ó"   — | j                  «       S )zjIterable of all handles, does filter destroyed entities but not
        entities in the trashcan.
        )Úkeysr>   s    r'   Ú__iter__zEntityDB.__iter__t   s   € ð �y‰y‹{Ðr)   c                ó8   — | j                   j                  |«      S )zoReturns entity for `handle` or ``None`` if no entry exist, does
        not filter destroyed entities.
        )r"   r/   r,   s     r'   r/   zEntityDB.getz   s   € ð �~‰~×!Ñ! &Ó)Ð)r)   c                óZ   — 	 | j                   j                  «       }|| j                  vr|S Œ+)zReturns next unique handle.)r<   Únextr"   r,   s     r'   Únext_handlezEntityDB.next_handle€   s-   € àØ—\‘\×&Ñ&Ó(ˆFØ˜TŸ^™^Ñ+Ø�ð r)   c                ó0   — d„ | j                  «       D «       S )z8Iterable of all handles, does filter destroyed entities.c              3  ó&   K  — | ]	  \  }}|–— Œ y ­wr!   r9   ©Ú.0r-   r3   s      r'   Ú	<genexpr>z EntityDB.keys.<locals>.<genexpr>‰   ó   è ø€ Ð:©\™>˜6 6”©\ùó   ‚©Úitemsr>   s    r'   rQ   zEntityDB.keys‡   ó   € á:¨T¯Z©Z¬\Ó:Ð:r)   c                ó0   — d„ | j                  «       D «       S )z9Iterable of all entities, does filter destroyed entities.c              3  ó&   K  — | ]	  \  }}|–— Œ y ­wr!   r9   rY   s      r'   r[   z"EntityDB.values.<locals>.<genexpr>�   r\   r]   r^   r>   s    r'   ÚvalueszEntityDB.values‹   r`   r)   c                óD   — d„ | j                   j                  «       D «       S )zZIterable of all (handle, entities) pairs, does filter destroyed
        entities.
        c              3  óB   K  — | ]  \  }}|j                   r||f–— Œ y ­wr!   ©r0   rY   s      r'   r[   z!EntityDB.items.<locals>.<genexpr>“   s(   è ø€ ð 
á"8‘�˜Ø�Šð �VÔÙ"8ùs   ‚)r"   r_   r>   s    r'   r_   zEntityDB.items�   s!   € ñ
à"&§.¡.×"6Ñ"6Ô"8ó
ð 	
r)   c                óH  — |j                  «       t        v r0|j                  j                  �|| |j                  j                  <   y|j                  j                  }|€!| j	                  «       }|j                  |«       || |<   t        |d«      r|j                  | «       yy)zÞAdd `entity` to database, assigns a new handle to the `entity`
        if :attr:`entity.dxf.handle` is ``None``. Adding the same entity
        multiple times is possible and creates only a single database entry.

        NÚadd_sub_entities_to_entitydb)ÚdxftypeÚDATABASE_EXCLUDEÚdxfr-   rV   Úupdate_handleÚhasattrrh   ©r%   r3   r-   s      r'   r+   zEntityDB.add™   s–   € ð �>‰>ÓÔ/Ñ/Ø�z‰z× Ñ Ð,ð +1��V—Z‘Z×&Ñ&Ñ'ØØ—j‘j×'Ñ'ˆØˆ>Ø×%Ñ%Ó'ˆFØ× Ñ  Ô(ØˆˆV‰ô �6Ð9Ô:Ø×/Ñ/°Õ5ð ;r)   c                ól   — |j                   r(| |j                  j                  = |j                  «        yy)z7Remove `entity` from database and destroy the `entity`.N)r0   rk   r-   r1   ©r%   r3   s     r'   Údelete_entityzEntityDB.delete_entity°   s*   € à�?Š?Ø�V—Z‘Z×&Ñ&Ð'Ø�N‰NÕð r)   c                óè   ‡ — |j                   rVt        |d«      r|j                  ˆ fd„«       |j                  j                  }	 ‰ j
                  |= d|j                  _        yy# t        $ r Y yw xY w)z?Discard `entity` from database without destroying the `entity`.Úprocess_sub_entitiesc                ó&   •— ‰j                  | «      S r!   )Údiscard)Úer%   s    €r'   Ú<lambda>z"EntityDB.discard.<locals>.<lambda>º   s   ø€ °d·l±lÀ1´or)   N)r0   rm   rs   rk   r-   r"   ÚKeyErrorrn   s   `  r'   ru   zEntityDB.discard¶   si   ø€ à�?Š?Ü�vÐ5Ô6Ø×+Ñ+Ó,EÔFà—Z‘Z×&Ñ&ˆFðØ—N‘N 6Ð*Ø$(�—
‘
Õ!ð øô ò Ùðús   ÁA% Á%	A1Á0A1c                ó   — |j                   }|€J d«       ‚| j                  «       }|j                  t        ¬«      }||j                  _        t        j                  ||«       t        |t        «      r|j                  j                  |«       |S )aò  Duplicates `entity` and its sub entities (VERTEX, ATTRIB, SEQEND)
        and store them with new handles in the entity database.
        Graphical entities have to be added to a layout by
        :meth:`~ezdxf.layouts.BaseLayout.add_entity`. DXF objects will
        automatically added to the OBJECTS section.

        A new owner handle will be set by adding the duplicated entity to a
        layout.

        Raises:
            CopyNotSupported: copying of `entity` is not supported

        zvalid DXF document required)Úcopy_strategy)ÚdocrV   Úcopyr   rk   r-   r   ÚbindrE   r   ÚobjectsÚ
add_object)r%   r3   r{   Ú
new_handleÚ
new_entitys        r'   Úduplicate_entityzEntityDB.duplicate_entityÃ   sw   € ð �j‰jˆØˆÐ=Ð =Ó=ˆØ×%Ñ%Ó'ˆ
Ø &§¡¼, Ó Gˆ
Ø *ˆ
�‰ÔÜ�‰�Z Ô%Ü�j¤)Ô,à�K‰K×"Ñ" :Ô.ØÐr)   c           
     óZ  — | j                   du sJ d«       ‚g }| j                  «       5 }| j                  «       D ]§  \  }}t        |«      sG|j	                  t
        j                  d|j                  «       › d|› d�¬«       |j                  |«       ||j                  j                  d«      k7  sŒwd| j                  |<   |j                  |«       |j                  |«       Œ© 	 ddd«       | j                  «        |D ]Ÿ  }|j                  j                  d«      }|€4|j	                  t
        j                  d|j                  «       › d	�¬«       ŒTt        |«      r|d
k(  r7|j	                  t
        j                  d|j                  «       › d|› d�¬«       Œ›|| |<   Œ¡ y# 1 sw Y   Œ¾xY w)a  Restore database integrity:

        - restore database entries with modified handles (key != entity.dxf.handle)
        - remove entities with invalid handles
        - empty trashcan - destroy all entities in the trashcan
        - removes destroyed database entries (purge)

        FzDatabase is locked!úRemoved entity z with invalid handle "z" from entity database.)ÚcodeÚmessager-   Nz% without handle from entity database.rC   )r=   Útrashcanr_   r
   Úfixed_errorr   ÚINVALID_ENTITY_HANDLEri   r+   rk   r/   r"   ÚappendÚpurge)r%   ÚauditorÚadd_entitiesÚtrashr-   r3   s         r'   ÚauditzEntityDB.auditÜ   s¢  € ð �{‰{˜eÑ#Ð:Ð%:Ó:Ð#Øˆà�]‰]Œ_ Ø"&§*¡*¦,‘�˜ä& vÔ.Ø×'Ñ'Ü'×=Ñ=Ø"1°&·.±.Ó2BÐ1Cð D#Ø#) (Ð*Að!Cð (ô ð
 —I‘I˜fÔ%Ø˜VŸZ™ZŸ^™^¨HÓ5Ó5ð .2�D—N‘N 6Ñ*Ø—I‘I˜fÔ%Ø ×'Ñ'¨Õ/ñ #/÷ ð$ 	�
‰
Œã"ˆFØ—Z‘Z—^‘^ HÓ-ˆFØˆ~Ø×#Ñ#Ü#×9Ñ9Ø-¨f¯n©nÓ.>Ð-?ð @,ð -ð $ô ð
 Ü" 6Ô*¨f¸ªmØ×#Ñ#Ü#×9Ñ9Ø-¨f¯n©nÓ.>Ð-?ð @Ø%˜hÐ&=ð?ð $ô ð
 Ø!ˆD�ŠLñ! #÷) ˆ_ús   ¨BF!Â03F!Æ!F*c                ó,   — t         j                  | «      S )z_Returns a new trashcan, empty trashcan manually by: :
        func:`Trashcan.clear()`.
        )r   r:   r>   s    r'   Únew_trashcanzEntityDB.new_trashcan  s   € ô × Ñ  Ó&Ð&r)   c              #  óT   K  — | j                  «       }|–— |j                  «        y­w)zoReturns a new trashcan in context manager mode, trashcan will be
        emptied when leaving context.
        N)r‘   r2   )r%   Ú	trashcan_s     r'   r‡   zEntityDB.trashcan  s'   è ø€ ð
 ×%Ñ%Ó'ˆ	ØŠð 	�‰Õùs   ‚&(c                óš   — | j                   }|j                  «       D ��cg c]  \  }}|j                  rŒ|‘Œ }}}|D ]  }||= Œ yc c}}w )z^Remove all destroyed entities from database, but does not empty the
        trashcan.
        N)r"   r_   r0   )r%   r&   r-   r3   Údead_handless        r'   r‹   zEntityDB.purge  sH   € ð
 �^‰^ˆØ57·X±X´ZÔW±Z¡> 6¨6ÀvÇÃš°ZˆÑWÛ"ˆFØ�6‘
ñ #ùó Xs
    AµAc                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr!   )ri   )rZ   r3   s     r'   r[   z,EntityDB.dxf_types_in_use.<locals>.<genexpr>*  s   è ø€ Ð@±-¨�6—>‘>×#±-ùs   ‚)r#   rc   r>   s    r'   Údxf_types_in_usezEntityDB.dxf_types_in_use)  s   € ÜÑ@°$·+±+´-Ó@Ó@Ð@r)   c                óˆ   — || j                   v ry| j                  |«       ||j                  _        | j	                  |«       y)z|Try to reset the entity handle to a certain value.
        Returns ``True`` if successful and ``False`` otherwise.

        FT)r"   ru   rk   r-   r+   rn   s      r'   Úreset_handlezEntityDB.reset_handle,  s:   € ð
 �T—^‘^Ñ#ØØ�‰�VÔØ"ˆ�
‰
ÔØ�‰�ÔØr)   c                óX   — t        d„ | j                  j                  «       D «       |«      S )zÄEntity query over all entities in the DXF document.

        Args:
            query: query string

        .. seealso::

            :ref:`entity query string` and :ref:`entity queries`

        c              3  ó:   K  — | ]  }|j                   sŒ|–— Œ y ­wr!   rf   ©rZ   rv   s     r'   r[   z!EntityDB.query.<locals>.<genexpr>C  s   è ø€ ÐMÑ'> !À!Ç*Ã*œAÑ'>ùó   ‚”)r   r"   rc   )r%   Úquerys     r'   rŸ   zEntityDB.query8  s$   € ô ÑM t§~¡~×'<Ñ'<Ô'>ÓMÈuÓUÐUr)   N©ÚreturnÚNone)r-   r4   r¡   r   )r-   r4   r3   r   r¡   r¢   )r-   r4   r¡   r¢   ©r-   r4   r¡   Úbool©r¡   Úint)r¡   zIterator[str])r-   r4   r¡   zOptional[DXFEntity])r¡   r4   )r¡   zIterable[str])r¡   úIterable[DXFEntity])r¡   zIterable[tuple[str, DXFEntity]]©r3   r   r¡   r¢   )r3   r   r¡   r   )rŒ   r   )r¡   r   )r¡   zset[str])r3   r   r-   r4   r¡   r¤   )Ú*)rŸ   r4   r¡   r   )r5   r6   r7   r8   r:   r(   r@   rH   rJ   rL   rO   rR   r/   rV   rQ   rc   r_   r+   rq   ru   r‚   r�   r‘   r   r‡   r‹   r˜   rš   rŸ   r9   r)   r'   r   r   $   s–   „ ñ÷"ñ "ó8"ó&ó
(ó#ó(ó#óó*óó;ó;ó
ó6ó.óóó20"ód'ð òó ðóóAó
õVr)   r   c                  ó‚   — e Zd ZdZddd„Zd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d„Zdd„Zdd„Zy)ÚEntitySpaceat  
    An :class:`EntitySpace` is a collection of :class:`~ezdxf.entities.DXFEntity`
    objects, that stores only  references to :class:`DXFEntity` objects.

    The :class:`~ezdxf.layouts.Modelspace`, any :class:`~ezdxf.layouts.Paperspace`
    layout and :class:`~ezdxf.layouts.BlockLayout` objects have an
    :class:`EntitySpace` container to store their entities.

    Nc                óF   — |rt        d„ |D «       «      | _        y g | _        y )Nc              3  ó:   K  — | ]  }|j                   sŒ|–— Œ y ­wr!   rf   r�   s     r'   r[   z'EntitySpace.__init__.<locals>.<genexpr>S  s   è ø€ Ð3™H�q¨¯
«
”™Hùrž   ©ÚlistÚentities)r%   r°   s     r'   r(   zEntitySpace.__init__Q  s#   € á7?ŒDÑ3™HÓ3Ó3ð 	�ØEGð 	�r)   c                ó(   — d„ | j                   D «       S )z5Iterable of all entities, filters destroyed entities.c              3  ó:   K  — | ]  }|j                   sŒ|–— Œ y ­wr!   rf   r�   s     r'   r[   z'EntitySpace.__iter__.<locals>.<genexpr>X  s   è ø€ Ð7™=�a¨A¯J«J”™=ùrž   ©r°   r>   s    r'   rR   zEntitySpace.__iter__V  s   € á7˜4Ÿ=š=Ó7Ð7r)   c                ó    — | j                   |   S )aŽ  Get entity at index `item`

        :class:`EntitySpace` has a standard Python list like interface,
        therefore `index` can be any valid list indexing or slicing term, like
        a single index ``layout[-1]`` to get the last entity, or an index slice
        ``layout[:10]`` to get the first 10 or fewer entities as
        ``list[DXFEntity]``. Does not filter destroyed entities.

        r³   ©r%   Úindexs     r'   r@   zEntitySpace.__getitem__Z  s   € ð �}‰}˜UÑ#Ð#r)   c                ó,   — t        | j                  «      S )z/Count of entities including destroyed entities.)rN   r°   r>   s    r'   rO   zEntitySpace.__len__f  s   € ä�4—=‘=Ó!Ð!r)   c                ól   ‡— t        ‰t        «      sJ t        ‰«      «       ‚t        ˆfd„| D «       «      S )z@``True`` if `handle` is present, does filter destroyed entities.c              3  óP   •K  — | ]  }|j                   j                  ‰k(  –— Œ y ­wr!   )rk   r-   )rZ   rv   r-   s     €r'   r[   z)EntitySpace.has_handle.<locals>.<genexpr>m  s   øè ø€ Ð8±4¨a�1—5‘5—<‘< 6Õ)±4ùs   ƒ#&)rE   r4   rF   Úanyr,   s    `r'   Ú
has_handlezEntitySpace.has_handlej  s-   ø€ ä˜&¤#Ô&Ð4¬¨V«Ó4Ð&ÜÓ8±4Ó8Ó8Ð8r)   c                ó$   — t        | «      | _        y)z0Remove all destroyed entities from entity space.Nr®   r>   s    r'   r‹   zEntitySpace.purgeo  s   € ä˜T›
ˆ�r)   c                ó    — t        |t        «      sJ t        |«      «       ‚|j                  sJ d«       ‚| j                  j                  |«       y)zAdd `entity`.z Can not store destroyed entitiesN)rE   r   rF   r0   r°   rŠ   rp   s     r'   r+   zEntitySpace.adds  s?   € ä˜&¤)Ô,Ð:¬d°6«lÓ:Ð,Ø�ŠÐBÐ BÓBˆØ�‰×Ñ˜VÕ$r)   c                ó4   — |D ]  }| j                  |«       Œ y)zAdd multiple `entities`.N)r+   )r%   r°   r3   s      r'   ÚextendzEntitySpace.extendy  s   € ãˆFØ�H‰H�VÕñ r)   c                óF   — t        | «      D ]  }|j                  |«       Œ y)zRExport all entities into DXF file by `tagwriter`.

        (internal API)
        N)ÚiterÚ
export_dxf)r%   Ú	tagwriterr3   s      r'   rÂ   zEntitySpace.export_dxf~  s    € ô
 ˜4–jˆFØ×Ñ˜iÕ(ñ !r)   c                ó:   — | j                   j                  |«       y)zRemove `entity`.N)r°   Úremoverp   s     r'   rÅ   zEntitySpace.remove†  s   € à�‰×Ñ˜VÕ$r)   c                ó"   — t        «       | _        y)zRemove all entities.Nr®   r>   s    r'   r2   zEntitySpace.clearŠ  s   € ô ›ˆ�r)   c                ó8   — | j                   j                  |«      S r!   )r°   Úpoprµ   s     r'   rÈ   zEntitySpace.pop�  s   € Ø�}‰}× Ñ  Ó'Ð'r)   c                ó<   — | j                   j                  ||«       y r!   )r°   Úinsert)r%   r¶   r3   s      r'   rÊ   zEntitySpace.insert’  s   € Ø�‰×Ñ˜U FÕ+r)   c                óX  — |j                   j                  }g }| D ]X  }|j                  j                  }| ||«      usŒ$|j	                  t
        j                  d|› d�«       |j                  |«       ŒZ |sy |D ]-  }| j                  j                  |«       |j                  «        Œ/ y )Nr„   z8 with a conflicting handle and without a database entry.)Úentitydbr/   rk   r-   rˆ   r   ÚREMOVED_INVALID_DXF_OBJECTrŠ   r°   rÅ   Ú_silent_kill)r%   rŒ   Údb_getr‹   r3   r-   s         r'   r�   zEntitySpace.audit•  s©   € Ø×!Ñ!×%Ñ%ˆØ!#ˆó ˆFØ—Z‘Z×&Ñ&ˆFØ™V F›^Ò+ð ×#Ñ#Ü×9Ñ9Ø% f Xð .&ð 'ôð
 —‘˜VÕ$ð ñ  ØÛˆFØ�M‰M× Ñ  Ô(ð ×ÑÕ!ñ	 r)   r!   )r°   zOptional[Iterable[DXFEntity]])r¡   zIterator[DXFEntity])r¡   r   r¥   r£   r¨   )r°   r§   r¡   r¢   )rÃ   r   r¡   r¢   r    )éÿÿÿÿ)r¶   r¦   r¡   r   )r¶   r¦   r3   r   r¡   r¢   )rŒ   r   r¡   r¢   )r5   r6   r7   r8   r(   rR   r@   rO   r»   r‹   r+   r¿   rÂ   rÅ   r2   rÈ   rÊ   r�   r9   r)   r'   r«   r«   F  sM   „ ñô
ó
8ó
$ó"ó9ò
#ó%óó
)ó%óô
(ó,ô"r)   r«   N)!Ú
__future__r   Útypingr   r   r   r   Ú
contextlibr   Úezdxf.tools.handler	   Úezdxf.lldxf.typesr
   Úezdxf.entities.dxfentityr   Úezdxf.entities.dxfobjr   Úezdxf.auditr   r   Úezdxf.lldxf.constr   Úezdxf.entitiesr   Úezdxf.queryr   Úezdxf.entities.copyr   Úezdxf.lldxf.tagwriterr   rj   r   r«   r9   r)   r'   Ú<module>rÞ      s]   ðõ #÷ó õ &Ý .Ý -Ý .Ý +ß +Ý 3Ý "Ý #Ý ,áÝ7ò	Ð ÷_Vñ _V÷D	j"ò j"r)   