Ë
    £èhk  ã                  óÂ  — U d dl mZ d dl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mZ d dlmZmZ d dl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 d dlmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*  e	jV                  d«      Z, G d„ d«      Z-g d¢Z.i 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-d.“d/d0“d1d2“d3d4“d5d6i¥Z/d7e0d8<    G d9„ d:«      Z1y);é    )Úannotations)ÚIterableÚIteratorÚOptionalÚTYPE_CHECKINGÚUnionÚcastN)Ú
Dictionary)ÚfactoryÚis_dxf_object)ÚconstÚ	validator)ÚEntitySpaceÚEntityDB)ÚEntityQuery)ÚUnderlayKeyGenerator)ÚAuditorÚ
AuditError)ÚDrawing)ÚAbstractTagWriter)	ÚGeoDataÚDictionaryVarÚDXFTagStorageÚ	DXFObjectÚImageDefÚUnderlayDefinitionÚDictionaryWithDefaultÚXRecordÚPlaceholder)ÚImageDefReactorÚezdxfc                  óŒ  — e Zd Zd&d'd„Zed(d„«       Zd)d„Zd„ fd*d„Zd+d„Zd,d„Z	d-d	„Z
d.d
„Zd/d„Zd0d„Zd1d„Zd.d„Zd2d„Zd„ Zed0d„«       Zd3d„Zd4d„Zd5d„Zd„ Zd6d7d„Zd8d„Zd9d:d„Z	 d;	 	 	 d<d„Zd=d>d„Zd?d@d„Zd?dAd„Z	 dB	 	 	 	 	 	 	 dCd„ZdDd„ZdEdFd„Z d3d „Z!	 d&	 	 	 	 	 	 	 dGd!„Z"dHd"„Z#	 dI	 	 	 	 	 	 	 dJd#„Z$dKdLd$„Z%d&dMd%„Z&y)NÚObjectsSectionNc                óˆ   — || _         t        «       | _        t        «       | _        |�| j                  t        |«      «       y y ©N)Údocr   Úunderlay_key_generatorr   Ú_entity_spaceÚ_buildÚiter)Úselfr&   Úentitiess      ú6lib/python3.12/site-packages/ezdxf/sections/objects.pyÚ__init__zObjectsSection.__init__*   s9   € ØˆŒÜ&:Ó&<ˆÔ#Ü(›]ˆÔØÐØ�K‰Kœ˜X›Õ'ð  ó    c                ó.   — | j                   j                  S )z/Returns drawing entity database. (internal API))r&   Úentitydb©r+   s    r-   r1   zObjectsSection.entitydb1   s   € ð �x‰x× Ñ Ð r/   c                ó   — | j                   S )z$Returns entity space. (internal API)©r(   r2   s    r-   Úget_entity_spacezObjectsSection.get_entity_space6   s   € à×!Ñ!Ð!r/   c                 ó   — y©NT© )Úks    r-   Ú<lambda>zObjectsSection.<lambda>:   s   € °Dr/   c                óN   — 	 | j                   j                  «       } ||«      r|S Œ%r%   )r'   Únext)r+   Ú	checkfuncÚkeys      r-   Únext_underlay_keyz ObjectsSection.next_underlay_key:   s*   € ØØ×-Ñ-×2Ñ2Ó4ˆCÙ˜Œ~Ø�
ð r/   c                óæ   — t        dt        |«      «      }|j                  «       dk7  s|j                  d   dk7  rt	        j
                  d«      ‚|D ]  }| j                  j                  |«       Œ y )Nr   ÚSECTIONé   )é   ÚOBJECTSz0Critical structure error in the OBJECTS section.)r	   r<   ÚdxftypeÚ
base_classr   ÚDXFStructureErrorr(   Úadd)r+   r,   Úsection_headÚentitys       r-   r)   zObjectsSection._build@   su   € Ü˜O¬T°(«^Ó<ˆà×ÑÓ! YÒ.°,×2IÑ2IÈ!Ñ2Lð Q
ò 3
ô ×)Ñ)ØBóð ó ˆFð ×Ñ×"Ñ" 6Õ*ñ r/   c                ó€   — |j                  d«       | j                  j                  |«       |j                  dd«       y)z0Export DXF entity by `tagwriter`. (internal API)z  0
SECTION
  2
OBJECTS
r   ÚENDSECN)Ú	write_strr(   Ú
export_dxfÚ
write_tag2)r+   Ú	tagwriters     r-   rN   zObjectsSection.export_dxfP   s5   € à×ÑÐ:Ô;Ø×Ñ×%Ñ% iÔ0Ø×Ñ˜Q Õ)r/   c                ó~   — t        j                  ||| j                  «      }| j                  j	                  |«       |S )zäCreate new DXF object, add it to the entity database and to the
        entity space.

        Args:
             _type: DXF type like `DICTIONARY`
             dxfattribs: DXF attributes as dict

        (internal API)
        )r   Úcreate_db_entryr&   r(   rH   )r+   Ú_typeÚ
dxfattribsÚ
dxf_entitys       r-   Ú
new_entityzObjectsSection.new_entityV   s6   € ô ×,Ñ,¨U°JÀÇÁÓIˆ
Ø×Ñ×Ñ˜zÔ*ØÐr/   c                óp   — | j                   j                  |«       | j                  j                  |«       y)zDRemove `entity` from entity space and destroy object. (internal API)N)r(   Úremover1   Údelete_entity©r+   rJ   s     r-   rY   zObjectsSection.delete_entityd   s(   € à×Ñ×!Ñ! &Ô)Ø�‰×#Ñ# FÕ+r/   c                ó”   — | j                   }| j                  D ]  }|j                  |«       Œ | j                  j                  «        y)z&Delete all DXF objects. (internal API)N)r1   r(   rY   Úclear)r+   ÚdbrJ   s      r-   Údelete_all_entitiesz"ObjectsSection.delete_all_entitiesi   s;   € à�]‰]ˆØ×(Ô(ˆFØ×Ñ˜VÕ$ð )à×Ñ× Ñ Õ"r/   c                ó’   — t        | «      rt        j                  d«      ‚t        j	                  d«       | j                  dd¬«      S )zcCreate a root dictionary. Has to be the first object in the objects
        section. (internal API)z=Can not create root dictionary in none empty objects section.zCreating ROOT dictionary.Ú0F©ÚownerÚ
hard_owned)Úlenr   rG   ÚloggerÚdebugÚadd_dictionaryr2   s    r-   Úsetup_rootdictzObjectsSection.setup_rootdictp   sF   € ô ˆtŒ9Ü×)Ñ)ØOóð ô 	�‰Ð0Ô1à×"Ñ"¨¸Ð"Ó?Ð?r/   c                óP  ‡ ‡— ˆˆ fd„}d
ˆˆ fd„}t         D ]Ž  }‰j                  |«      }t        |t        «      rŒ%t        j                  d|› d�«       |dk(  r |«        n‰j                  |d¬«       t        |t        «      sŒot        j                  |«      sŒ… |||¬«       Œ� y	)z0Setup required management tables. (internal API)c                 óÖ   •— ‰j                  ‰j                  j                  d¬«      } ‰j                  | j                  j                  ¬«      }| j	                  |«       || d<   | ‰d<   y )NFra   )rb   ÚNormalÚACAD_PLOTSTYLENAME)Úadd_dictionary_with_defaultÚdxfÚhandleÚadd_placeholderÚset_default)Úplot_style_name_dictÚplaceholderÚrootdictr+   s     €€r-   Úsetup_plot_style_name_tablezRObjectsSection.setup_object_management_tables.<locals>.setup_plot_style_name_table~   sp   ø€ Ø#'×#CÑ#CØ—l‘l×)Ñ)Ø ð $Dó $Ð ð ×.Ñ.Ð5I×5MÑ5M×5TÑ5TÐ.ÓUˆKØ ×,Ñ,¨[Ô9Ø-8Ð  Ñ*Ø-AˆHÐ)Ò*r/   c                óÎ   •— ‰j                  | «      }t        |t        «      rC‰j                  j                  j                  ||«      rt        j                  d| › d|› �«       y y y )Nzreset handle of table z to #)ÚgetÚ
isinstancer
   r&   r1   Úreset_handlere   rf   )Ú
table_namero   Ú	new_tablert   r+   s      €€r-   Úrestore_table_handlezKObjectsSection.setup_object_management_tables.<locals>.restore_table_handleˆ   s]   ø€ ð !Ÿ™ ZÓ0ˆIÜ˜)¤ZÔ0°T·X±X×5FÑ5F×5SÑ5SØ˜6ô6ô —‘Ð5°j°\ÀÀvÀhÐOÕPð6Ð0r/   z	creating z dictionaryrl   F)rc   )ro   N)rz   Ústrro   r}   ÚreturnÚNone)
Ú_OBJECT_TABLE_NAMESrw   rx   r
   re   ÚinfoÚadd_new_dictr}   r   Ú	is_handle)r+   rt   ru   r|   ÚnameÚtables   ``    r-   Úsetup_object_management_tablesz-ObjectsSection.setup_object_management_tables{   s�   ù€ õ	Bö	Q÷ (ˆDØ2:·,±,¸tÓ2DˆEô ˜%¤Ô,Øä�K‰K˜) D 6¨Ð5Ô6ØÐ+Ò+Ù+Õ-à×%Ñ% d°uÐ%Ô=ä˜%¤Õ%¬)×*=Ñ*=¸eÕ*DÙ$ T°%Ö8ñ (r/   c                óž   — t        |«      r| j                  j                  |«       yt        j                  d|j                  «       › d�«      ‚)z/Add `entity` to OBJECTS section. (internal API)zinvalid DXF type z for OBJECTS sectionN)r   r(   rH   r   ÚDXFTypeErrorrE   rZ   s     r-   Ú
add_objectzObjectsSection.add_object¤   sF   € ä˜Ô Ø×Ñ×"Ñ" 6Õ*ä×$Ñ$Ø# F§N¡NÓ$4Ð#5Ð5IÐJóð r/   c                óT   — | j                  ||«      }|j                  |d   g«       |S )z+Add DXF object with reactor. (internal API)rb   )rV   Úset_reactors)r+   rE   rT   Ú	dxfobjects       r-   Úadd_dxf_object_with_reactorz*ObjectsSection.add_dxf_object_with_reactor­   s.   € à—O‘O G¨ZÓ8ˆ	Ø×Ñ 
¨7Ñ 3Ð4Ô5ØÐr/   c                ó8   — | j                   j                  «        y r%   )r(   Úpurger2   s    r-   r�   zObjectsSection.purge³   s   € Ø×Ñ× Ñ Õ"r/   c                óV   — t        | «      r| j                  d   S | j                  «       S )z[Returns the root DICTIONARY, or as AutoCAD calls it:
        the named DICTIONARY.
        r   )rd   r(   rh   r2   s    r-   rt   zObjectsSection.rootdict¸   s+   € ô
 ˆtŒ9Ø×%Ñ% aÑ(Ð(à×&Ñ&Ó(Ð(r/   c                ó,   — t        | j                  «      S )z<Returns the count of all DXF objects in the OBJECTS section.)rd   r(   r2   s    r-   Ú__len__zObjectsSection.__len__Â   s   € ä�4×%Ñ%Ó&Ð&r/   c                ó,   — t        | j                  «      S )z>Returns an iterator of all DXF objects in the OBJECTS section.)r*   r(   r2   s    r-   Ú__iter__zObjectsSection.__iter__Æ   s   € ä�D×&Ñ&Ó'Ð'r/   c                ó    — | j                   |   S )a‡  Get entity at `index`.

        The underlying data structure for storing DXF objects is organized like
        a standard Python list, therefore `index` can be any valid list indexing
        or slicing term, like a single index ``objects[-1]`` to get the last
        entity, or an index slice ``objects[:10]`` to get the first 10 or fewer
        objects as ``list[DXFObject]``.

        r4   )r+   Úindexs     r-   Ú__getitem__zObjectsSection.__getitem__Ê   s   € ð ×!Ñ! %Ñ(Ð(r/   c                ó|   — t        |t        «      r	 | j                  |   }|| j                  v S # t        $ r Y yw xY w)z�Returns ``True`` if `entity` stored in OBJECTS section.

        Args:
             entity: :class:`DXFObject` or handle as hex string

        F)rx   r}   r1   ÚKeyErrorr(   rZ   s     r-   Ú__contains__zObjectsSection.__contains__Ö   sH   € ô �fœcÔ"ðØŸ™ vÑ.�ð ˜×+Ñ+Ð+Ð+øô ò Ùðús   ’/ ¯	;º;c                ó,   — t        t        | «      |«      S )z<Get all DXF objects matching the :ref:`entity query string`.)r   r*   )r+   Úquerys     r-   rœ   zObjectsSection.queryä   s   € äœ4 ›: uÓ-Ð-r/   c                óR  — | j                   |j                   u sJ d«       ‚| j                  D ]M  }t        |«      rŒ|j                  t        j
                  dt        |«      › d�¬«       |j                  |«       ŒO | j                  |«       | j                  j                  |«       y)aD  Audit and repair OBJECTS section.

        .. important::

            Do not delete entities while auditing process, because this
            would alter the entity database while iterating, instead use::

                auditor.trash(entity)

            to delete invalid entities after auditing automatically.

        z#Auditor for different DXF document.zRemoved invalid DXF entity z from OBJECTS section.©ÚcodeÚmessageN)
r&   r(   r   Úfixed_errorr   ÚREMOVED_INVALID_DXF_OBJECTr}   ÚtrashÚreorgÚaudit)r+   ÚauditorrJ   s      r-   r¥   zObjectsSection.auditè   sš   € ð �x‰x˜7Ÿ;™;Ñ&ÐMÐ(MÓMÐ&Ø×(Ô(ˆFÜ  Õ(Ø×#Ñ#Ü#×>Ñ>Ø9¼#¸f»+¸ð G,ð -ð $ô ð
 —‘˜fÕ%ð )ð 	�
‰
�7ÔØ×Ñ× Ñ  Õ)r/   c                óN   — | j                  d||dœ¬«      }t        t        |«      S )z¿Add new :class:`~ezdxf.entities.Dictionary` object.

        Args:
            owner: handle to owner as hex string.
            hard_owned: ``True`` to treat entries as hard owned.

        Ú
DICTIONARYra   ©rT   )rV   r	   r
   )r+   rb   rc   rJ   s       r-   rg   zObjectsSection.add_dictionary  s4   € ð —‘ØàØ(ñð !ó 
ˆô ”J Ó'Ð'r/   c                óH   — | j                  d|||dœ¬«      }t        d|«      S )zøAdd new :class:`~ezdxf.entities.DictionaryWithDefault` object.

        Args:
            owner: handle to owner as hex string.
            default: handle to default entry.
            hard_owned: ``True`` to treat entries as hard owned.

        ÚACDBDICTIONARYWDFLT)rb   Údefaultrc   r©   r   ©rV   r	   )r+   rb   r¬   rc   rJ   s        r-   rm   z*ObjectsSection.add_dictionary_with_default  s8   € ð —‘Ø!àØ"Ø(ñð !ó 
ˆô Ð+¨VÓ4Ð4r/   c                ó.   — | j                  d||dœ¬«      S )z¦Add a new :class:`~ezdxf.entities.DictionaryVar` object.

        Args:
            owner: handle to owner as hex string.
            value: value as string

        ÚDICTIONARYVAR)rb   Úvaluer©   ©rV   )r+   rb   r°   s      r-   Úadd_dictionary_varz!ObjectsSection.add_dictionary_var'  s$   € ð �‰Ø°%À%Ñ(Hð ó 
ð 	
r/   c                ó,   — | j                  dd|i¬«      S )z}Add a new :class:`~ezdxf.entities.XRecord` object.

        Args:
            owner: handle to owner as hex string.

        ÚXRECORDrb   r©   r±   ©r+   rb   s     r-   Úadd_xrecordzObjectsSection.add_xrecord3  s   € ð �‰˜y°g¸uÐ5EˆÓFÐFr/   c                ó,   — | j                  dd|i¬«      S )z�Add a new :class:`~ezdxf.entities.Placeholder` object.

        Args:
            owner: handle to owner as hex string.

        ÚACDBPLACEHOLDERrb   r©   r±   rµ   s     r-   rp   zObjectsSection.add_placeholder<  s$   € ð �‰Ø¨7°EÐ*:ð ó 
ð 	
r/   c           	     ó†  — t         j                  j                  |d«      }	 | j                  d   }||j                  _        ||j                  _        ||j                  _        y# t         j                  $ rH | j                  d| j                  j                  j                  |||dœ¬«      }|| j                  d<   Y yw xY w)ay  Set raster variables.

        Args:
            frame: ``0`` = do not show image frame; ``1`` = show image frame
            quality: ``0`` = draft; ``1`` = high
            units: units for inserting images. This defines the real world unit for one
                drawing unit for the purpose of inserting and scaling images with an
                associated resolution.

                   ===== ===========================
                   mm    Millimeter
                   cm    Centimeter
                   m     Meter (ezdxf default)
                   km    Kilometer
                   in    Inch
                   ft    Foot
                   yd    Yard
                   mi    Mile
                   none  None
                   ===== ===========================

        (internal API), public interface :meth:`~ezdxf.drawing.Drawing.set_raster_variables`

        r   ÚACAD_IMAGE_VARSÚRASTERVARIABLES)rb   ÚframeÚqualityÚunitsr©   N)r   ÚRASTER_UNITSrw   rt   rn   r¼   r½   r¾   ÚDXFKeyErrorr�   ro   )r+   r¼   r½   r¾   Úunits_Úraster_varss         r-   Úset_raster_variablesz#ObjectsSection.set_raster_variablesI  s·   € ô6 ×(Ñ(×,Ñ,¨U°AÓ6ˆð	+ØŸ-™-Ð(9Ñ:ˆKð %*ˆK�O‰OÔ!Ø&-ˆK�O‰OÔ#Ø$*ˆK�O‰OÕ!øô × Ñ ò 
	;Ø×:Ñ:Ø!à!Ÿ]™]×.Ñ.×5Ñ5Ø"Ø&Ø#ñ	ð ;ó ˆKð 0;ˆD�M‰MÐ+Ó,ð
	;ús   ¢A% Á%AC Â?C c                ó  — 	 | j                   d   }|j                  j                  |j                  j
                  t        j                  j                  |j                  j                  d«      fS # t        j                  $ r Y yw xY w)Nrº   )r   rB   ÚnonerÅ   )	rt   r   rÀ   rn   r¼   r½   ÚREVERSE_RASTER_UNITSrw   r¾   )r+   rÂ   s     r-   Úget_raster_variablesz#ObjectsSection.get_raster_variablesw  sv   € ð	 ØŸ-™-Ð(9Ñ:ˆKð �O‰O×!Ñ!Ø�O‰O×#Ñ#Ü×&Ñ&×*Ñ*¨;¯?©?×+@Ñ+@À&ÓIð
ð 	
øô × Ñ ò 	 Ùð	 ús   ‚A0 Á0BÂBc                ó"  — 	 | j                   d   }t        |«      |j                  _        y# t        j
                  $ rO | j                  d| j                   j                  j                  t        |«      dœ¬«      }|| j                   d<   Y yw xY w)z“Set wipeout variables.

        Args:
            frame: ``0`` = do not show image frame; ``1`` = show image frame

        (internal API)
        ÚACAD_WIPEOUT_VARSÚWIPEOUTVARIABLES)rb   r¼   r©   N)rt   Úintrn   r¼   r   rÀ   r�   ro   )r+   r¼   Úwipeout_varss      r-   Úset_wipeout_variablesz$ObjectsSection.set_wipeout_variables‚  s‰   € ð	0ØŸ=™=Ð)<Ñ=ˆLô &)¨£ZˆL×ÑÕ"øô × Ñ ò 	>Ø×;Ñ;Ø"à!Ÿ]™]×.Ñ.×5Ñ5Ü  ›Zñð <ó ˆLð 2>ˆD�M‰MÐ-Ó.ð	>ús   ‚, ¬ABÂBc                ó€   — 	 | j                   d   }|j                  j                  S # t        j                  $ r Y yw xY w)NrÉ   r   )rt   r   rÀ   rn   r¼   )r+   rÌ   s     r-   Úget_wipeout_frame_settingz(ObjectsSection.get_wipeout_frame_setting˜  sD   € ð	ØŸ=™=Ð)<Ñ=ˆLð ×Ñ×%Ñ%Ð%øô × Ñ ò 	Ùð	ús   ‚' §=¼=c                ó¸   — |€|}| j                   j                  d«      }| j                  d|j                  j                  ||dœ¬«      }|||<   t        d|«      S )a‹  Add an image definition to the objects section.

        Add an :class:`~ezdxf.entities.image.ImageDef` entity to the drawing
        (objects section). `filename` is the image file name as relative or
        absolute path and `size_in_pixel` is the image size in pixel as (x, y)
        tuple. To avoid dependencies to external packages, `ezdxf` can not
        determine the image size by itself. Returns a :class:`~ezdxf.entities.image.ImageDef`
        entity which is needed to create an image reference. `name` is the
        internal image name, if set to ``None``, name is auto-generated.

        Absolute image paths works best for AutoCAD but not really good, you
        have to update external references manually in AutoCAD, which is not
        possible in TrueView. If the drawing units differ from 1 meter, you also
        have to use: :meth:`set_raster_variables`.

        Args:
            filename: image file name (absolute path works best for AutoCAD)
            size_in_pixel: image size in pixel as (x, y) tuple
            name: image name for internal use, None for using filename as name
                (best for AutoCAD)

        ÚACAD_IMAGE_DICTÚIMAGEDEF)rb   ÚfilenameÚ
image_sizer©   r   )rt   Úget_required_dictr�   rn   ro   r	   )r+   rÓ   Úsize_in_pixelr„   Ú
image_dictÚ	image_defs         r-   Úadd_image_defzObjectsSection.add_image_defŸ  sl   € ð8 ˆ<ØˆDØ—]‘]×4Ñ4Ð5FÓGˆ
Ø×4Ñ4Øà#Ÿ™×.Ñ.Ø$Ø+ñð 5ó 
ˆ	ð %ˆ
�4ÑÜ�J 	Ó*Ð*r/   c                óF   — | j                  d||dœ¬«      }t        d|«      S )zZAdd required IMAGEDEF_REACTOR object for IMAGEDEF object.

        (internal API)
        ÚIMAGEDEF_REACTOR)rb   Úimage_handler©   r    r­   )r+   rÜ   Úimage_def_reactors      r-   Úadd_image_def_reactorz$ObjectsSection.add_image_def_reactorÉ  s7   € ð
 !ŸO™OØà%Ø ,ñð ,ó 
Ðô Ð%Ð'8Ó9Ð9r/   c                ót  ‡— |j                  «       }|dv rd|› d�}|› d�}nt        j                  d|› d�«      ‚|€|dk(  rd}n
|d	k(  rd
}nd}| j                  j	                  |«      Š| j                  |‰j                  j                  ||dœ¬«      }| j                  ˆfd„«      }|‰|<   t        d|«      S )a  Add an :class:`~ezdxf.entities.underlay.UnderlayDefinition` entity
        to the drawing (OBJECTS section). `filename` is the underlay file name
        as relative or absolute path and `fmt` as string (pdf, dwf, dgn).
        The underlay definition is required to create an underlay reference.

        Args:
            filename: underlay file name
            fmt: file format as string ``'pdf'|'dwf'|'dgn'``
            name: pdf format = page number to display; dgn format = ``'default'``; dwf: ????

        )ÚPDFÚDWFÚDGNÚACAD_ÚDEFINITIONSÚ
DEFINITIONzUnsupported file format: 'Ú'rà   Ú1râ   r¬   ÚModel)rb   rÓ   r„   r©   c                ó   •— | ‰vS r%   r8   )r9   Úunderlay_dicts    €r-   r:   z1ObjectsSection.add_underlay_def.<locals>.<lambda>ÿ  s
   ø€ ¨q¸Ñ/Er/   r   )
Úupperr   ÚDXFValueErrorrt   rÕ   rV   rn   ro   r?   r	   )	r+   rÓ   Úfmtr„   Úunderlay_dict_nameÚunderlay_def_entityÚunderlay_defr>   rê   s	           @r-   Úadd_underlay_defzObjectsSection.add_underlay_def×  sâ   ø€ ð �i‰i‹kˆØÐ'Ñ'Ø#(¨¨¨[Ð!9ÐØ%( E¨Ð"4Ñä×%Ñ%Ð(BÀ3À%ÀqÐ&IÓJÐJàˆ<Ø�eŠ|Ø‘Ø˜’Ø ‘à�àŸ™×7Ñ7Ð8JÓKˆØ—‘Øà&×*Ñ*×1Ñ1Ø$Øñð 'ó 
ˆð ×$Ñ$Ó%EÓFˆØ)ˆ�cÑÜÐ(¨,Ó7Ð7r/   c                óL   — |€i }||d<   t        d| j                  d|«      «      S )aÛ  Creates a new :class:`GeoData` entity and replaces existing ones.
        The GEODATA entity resides in the OBJECTS section and NOT in the layout
        entity space, and it is linked to the layout by an extension dictionary
        located in BLOCK_RECORD of the layout.

        The GEODATA entity requires DXF version R2010+. The DXF Reference does
        not document if other layouts than model space supports geo referencing,
        so getting/setting geo data may only make sense for the model space
        layout, but it is also available in paper space layouts.

        Args:
            owner: handle to owner as hex string
            dxfattribs: DXF attributes for :class:`~ezdxf.entities.GeoData` entity

        rb   r   ÚGEODATA)r	   r�   )r+   rb   rT   s      r-   Úadd_geodatazObjectsSection.add_geodata  s3   € ð  ÐØˆJØ#ˆ
�7ÑÜ�I˜t×?Ñ?À	È:ÓVÓWÐWr/   c                ó’   — |€(| j                   €J d«       ‚t        | j                   «      }t        || «      }|j                  «        |S )z;Validate and recreate the integrity of the OBJECTS section.zvalid document required)r&   r   Ú
_SanitizerÚexecute)r+   r¦   Ú	sanitizers      r-   r¤   zObjectsSection.reorg  sH   € àˆ?Ø—8‘8Ð'ÐBÐ)BÓBÐ'Ü˜dŸh™hÓ'ˆGÜ˜w¨Ó-ˆ	Ø×ÑÔØˆr/   r%   )r&   r   r,   zOptional[Iterable[DXFObject]])r~   r   )r~   r   )r~   r}   )r,   úIterator[DXFObject]r~   r   )rP   r   r~   r   )rS   r}   rT   Údictr~   r   )rJ   r   r~   r   ©r~   r   )r~   r
   )rt   r
   r~   r   )rE   r}   r~   r   )r~   rË   )r~   rù   )r~   r   )Ú*)rœ   r}   r~   r   )r¦   r   r~   r   )r`   T)rb   r}   rc   Úboolr~   r
   )r`   r`   T)rc   rý   r~   r   )r`   Ú )rb   r}   r°   r}   r~   r   )r`   )rb   r}   r~   r   )rb   r}   r~   r   )r   rB   Úm)r¼   rË   r½   rË   r¾   r}   r~   r   )r~   ztuple[int, int, str])r   )r¼   rË   r~   r   )rÓ   r}   rÖ   ztuple[int, int]r„   úOptional[str]r~   r   )rÜ   r}   r~   r    )ÚpdfN)rÓ   r}   rí   r}   r„   r   r~   r   )r`   N)rb   r}   r~   r   )r¦   zOptional[Auditor]r~   r   )'Ú__name__Ú
__module__Ú__qualname__r.   Úpropertyr1   r5   r?   r)   rN   rV   rY   r^   rh   r†   r‰   r�   r�   rt   r’   r”   r—   rš   rœ   r¥   rg   rm   r²   r¶   rp   rÃ   rÇ   rÍ   rÏ   rÙ   rÞ   rñ   rô   r¤   r8   r/   r-   r#   r#   )   sh  „ ô(ð ò!ó ð!ó"ñ +9ô ó+ó *óó,ó
#ó	@ó'9óRóò#ð
 ò)ó ð)ó'ó(ó
)ò,ô.ó*ô2(ð$ :>ð5Ø26ð5à	ó5ô*

ôGô	
ð >Að,+Øð,+Ø'*ð,+Ø7:ð,+à	ó,+ó\	
ô0ó,&ð #ð	(+àð(+ð 'ð(+ð ð	(+ð
 
ó(+óT:ð FJð*8Øð*8Ø"%ð*8Ø5Bð*8à	ó*8ôXXõ*r/   r#   )Ú
ACAD_COLORÚ
ACAD_GROUPÚACAD_LAYOUTÚACAD_MATERIALÚACAD_MLEADERSTYLEÚACAD_MLINESTYLEÚACAD_PLOTSETTINGSrl   ÚACAD_SCALELISTÚACAD_TABLESTYLEÚACAD_VISUALSTYLEr  ÚDBCOLORr  ÚGROUPrÑ   rÒ   ÚACAD_DETAILVIEWSTYLEÚACDBDETAILVIEWSTYLEr  ÚLAYOUTr	  ÚMATERIALr
  ÚMLEADERSTYLEr  Ú
MLINESTYLEr  ÚPLOTSETTINGSÚACAD_RENDER_ACTIVE_SETTINGSÚMENTALRAYRENDERSETTINGSr  ÚSCALEÚACAD_SECTIONVIEWSTYLEÚACDBSECTIONVIEWSTYLEr  Ú
TABLESTYLEÚACAD_PDFDEFINITIONSÚPDFDEFINITIONÚACAD_DWFDEFINITIONSÚDWFDEFINITIONÚACAD_DGNDEFINITIONSÚDGNDEFINITIONr  ÚVISUALSTYLEÚAcDbVariableDictionaryr¯   zdict[str, str]ÚKNOWN_DICT_CONTENTc                  óP   — e Zd Zdd„Zdd„Zddd„Zdd„Zdd„Zdd„Zd„ Z	d„ Z
d	„ Zy
)rö   c                óP   — || _         || _        |j                  | _        d| _        y r7   )Úobjectsr¦   rt   Úremoved_entity)r+   r¦   r*  s      r-   r.   z_Sanitizer.__init__G  s%   € ØˆŒØˆŒØ×(Ñ(ˆŒØ"ˆÕr/   c              #  óX   K  — | j                   D ]  }t        |t        «      sŒ|–— Œ y ­wr%   )r*  rx   r
   )r+   Úds     r-   Údictionariesz_Sanitizer.dictionariesM  s#   è ø€ Ø—”ˆAÜ˜!œZÕ(Ø“ñ ùs   ‚ *£*c                ó  — | j                  «        | j                  «        d}d| _        | j                  rC||k  r>|dz  }d| _        | j                  «        | j	                  «        | j                  r||k  rŒ>| j                  «        y )Nr   TrB   F)Ú+restore_owner_handles_of_dictionary_entriesÚvalidate_known_dictionariesr+  Úremove_orphaned_dictionariesÚaudit_objectsÚcreate_required_structures)r+   Ú	max_loopsÚloopss      r-   r÷   z_Sanitizer.executeR  s‚   € Ø×8Ñ8Ô:Ø×(Ñ(Ô*ØˆØ"ˆÔØ×!Ò! e¨iÒ&7Ø�Q‰JˆEØ"'ˆDÔØ×-Ñ-Ô/ð ×ÑÔ ð ×!Ò! e¨iÓ&7ð 	×'Ñ'Õ)r/   c                ó
  ‡ ‡‡‡‡	‡
— dˆˆˆ fd„}ˆˆ	ˆ
ˆ fd„}‰ j                   j                  }‰ j                  «       D ]Ä  Šg Š
‰j                  j                  Š‰j                  «       D ]  \  Š	Št        ‰t        «      r |«        Œ‰j                  j                  d«      }|‰k(  rŒ?|j                  |«      }t        |t        «      r|j                  ‰«      r |«        Œy |«        Œ� ‰
D ]  Š	‰j                  ‰	«       Œ ŒÆ y )Nc                 ó„   •— ‰ ‰j                   _        ‰j                  j                  t        j
                  d‰› d�«       y )NzFixed invalid owner handle of Ú.)rn   rb   r¦   r¡   r   ÚINVALID_OWNER_HANDLE)Údict_handlerJ   r+   s   €€€r-   Úreclaim_entityzN_Sanitizer.restore_owner_handles_of_dictionary_entries.<locals>.reclaim_entitya  s6   ø€ Ø*ˆF�J‰JÔØ�L‰L×$Ñ$Ü×/Ñ/Ø0°°¸Ð:õr/   c            	     óœ   •— ‰j                  ‰«       ‰j                  j                  t        j                  d‰› dt        ‰ «      › d�«       y )NzRemoved invalid key z in r9  )Úappendr¦   r¡   r   r:  r}   )Ú
dictionaryr>   r�   r+   s   €€€€r-   Ú	purge_keyzI_Sanitizer.restore_owner_handles_of_dictionary_entries.<locals>.purge_keyh  sA   ø€ Ø�L‰L˜ÔØ�L‰L×$Ñ$Ü×/Ñ/Ø& s e¨4´°J³Ð/@ÀÐBõr/   rb   rû   )r¦   r1   r.  rn   ro   Úitemsrx   r}   rw   r
   Úfind_keyÚdiscard)r+   r<  r@  r1   Úowner_handleÚparent_dictr;  r?  rJ   r>   r�   s   `     @@@@@r-   r0  z6_Sanitizer.restore_owner_handles_of_dictionary_entries`  sÖ   ý€ ÷	÷	ð —<‘<×(Ñ(ˆØ×+Ñ+Ö-ˆJØ!ˆEØ$Ÿ.™.×/Ñ/ˆKØ)×/Ñ/Ö1‘��VÜ˜f¤cÔ*á”KØØ%Ÿz™zŸ~™~¨gÓ6�Ø ;Ò.ØØ&Ÿl™l¨<Ó8�Ü˜k¬:Ô6¸;×;OÑ;OÐPVÔ;Wá•Ká"Õ$ð  2ó �Ø×"Ñ" 3Õ'ñ ñ# .r/   c                óL  ‡‡— ˆˆfd„}| j                   j                  Š| j                  }| j                  «       D ]g  Š‰|u rŒ‰j	                  ‰j
                  j	                  d«      «      }|€ |«        Œ<t        |t        «      sŒM|j                  ‰«      }|rŒa |«        Œi y )Nc                 óH   •— ‰j                  ‰ «       ‰ j                  «        y r%   )rC  Ú_silent_kill)r?  r1   s   €€r-   Úkill_dictionaryz@_Sanitizer.remove_orphaned_dictionaries.<locals>.kill_dictionary…  s   ø€ Ø×Ñ˜ZÔ(Ø×#Ñ#Õ%r/   rb   )	r¦   r1   rt   r.  rw   rn   rx   r
   rB  )r+   rI  rt   rb   r>   r?  r1   s        @@r-   r2  z'_Sanitizer.remove_orphaned_dictionaries„  s‘   ù€ õ	&ð —<‘<×(Ñ(ˆØ—=‘=ˆØ×+Ñ+Ö-ˆJØ˜XÑ%ØØ—L‘L §¡×!3Ñ!3°GÓ!<Ó=ˆEØˆ}ñ  Ô!ØÜ˜e¤ZÔ0ØØ—.‘. Ó,ˆCÚÙÕ!ñ! .r/   c                óú  — ddl m} | j                  }t        j	                  «       D ]Ò  \  }}| j
                  j                  |«      }t        |t        «      sŒ2g }|j	                  «       D ]t  \  }}t        ||«      sŒ|j                  «       |k7  sŒ'|j                  t        j                  d|› d|› d|› d|› �«       |j                  |«       |j                  |«       Œv |D ]  }|j                  |«       Œ ŒÔ y )Nr   )Ú	DXFEntityzRemoved invalid type z from Ú<z>, expected type )Úezdxf.entitiesrK  r¦   r'  rA  rt   rw   rx   r
   rE   r¡   r   r¢   r>  r£   rC  )	r+   rK  r¦   Ú	dict_nameÚexpected_typeÚobject_dictÚ
purge_keysr>   Úentrys	            r-   r1  z&_Sanitizer.validate_known_dictionaries�  së   € Ý,à—,‘,ˆÜ(:×(@Ñ(@Ö(BÑ$ˆI�}ØŸ-™-×+Ñ+¨IÓ6ˆKÜ˜k¬:Ô6ØØ$&ˆJØ)×/Ñ/Ö1‘
��UÜ˜e YÕ/°E·M±M³OÀ}Ó4TØ×'Ñ'Ü"×=Ñ=Ø/°¨w°f¸[¸MÈÈ9È+ð V)Ø)6¨ð9ôð
 ×%Ñ% cÔ*Ø—M‘M %Õ(ð 2ó "�Ø×#Ñ# CÕ(ñ "ñ )Cr/   c                óæ  — | j                   j                  | j                  «       | j                   j                  }|j                  j                  «        |j                  j                  «        |j                  j                  «        |j                  j                  «        |j                  j                  «        |j                  j                  «        |j                  j                  «        y r%   )
r*  r†   rt   r&   Ú	materialsÚupdate_object_dictÚcreate_required_entriesÚmline_stylesÚmleader_stylesÚgroups)r+   r&   s     r-   r4  z%_Sanitizer.create_required_structures²  sŸ   € Ø�‰×3Ñ3°D·M±MÔBØ�l‰l×Ñˆà�‰×(Ñ(Ô*Ø�‰×-Ñ-Ô/Ø×Ñ×+Ñ+Ô-Ø×Ñ×0Ñ0Ô2Ø×Ñ×-Ñ-Ô/Ø×Ñ×2Ñ2Ô4Ø�
‰
×%Ñ%Õ'r/   c                ó€   — | j                   j                  «        | j                   j                  j                  «        y r%   )r¦   Úempty_trashcanr1   r�   r2   s    r-   Úcleanup_entitydbz_Sanitizer.cleanup_entitydb¾  s(   € Ø�‰×#Ñ#Ô%Ø�‰×Ñ×#Ñ#Õ%r/   c                óâ  — | j                  «        | j                  }t        |j                  «      }| j                  D ]  }|j
                  j                  d«      s@|j                  t        j                  dt        |«      › d�¬«       |j                  |«       Œ^|j                  |«       |j                  |«       Œ� |j                  «        |t        |j                  «      k7  rd| _        y y )Nrb   zDeleted z entity without owner handle.rž   T)r\  r¦   rd   r1   r*  rn   Úhasattrr¡   r   r:  r}   r£   Úcheck_owner_existr¥   r[  r+  )r+   r¦   Úcurrent_db_sizerJ   s       r-   r3  z_Sanitizer.audit_objectsÂ  sÍ   € Ø×ÑÔØ—,‘,ˆÜ˜g×.Ñ.Ó/ˆà—l”lˆFØ—:‘:×%Ñ% gÔ.à×#Ñ#Ü#×8Ñ8Ø&¤s¨6£{ mÐ3PÐQð $ô ð —‘˜fÔ%ØØ×%Ñ% fÔ-Ø�L‰L˜Õ!ð #ð 	×ÑÔ Øœc '×"2Ñ"2Ó3Ò3Ø"&ˆDÕð 4r/   N)r¦   r   r*  r#   r~   r   )r~   zIterator[Dictionary])éd   rû   )r  r  r  r.   r.  r÷   r0  r2  r1  r4  r\  r3  r8   r/   r-   rö   rö   F  s0   „ ó#óô
*ó"(óH"ó2)ò*
(ò&ó'r/   rö   )2Ú
__future__r   Útypingr   r   r   r   r   r	   ÚloggingÚezdxf.entities.dictionaryr
   rM  r   r   Úezdxf.lldxfr   r   Úezdxf.entitydbr   r   Úezdxf.queryr   Úezdxf.tools.handler   Úezdxf.auditr   r   Úezdxf.documentr   Úezdxf.lldxf.tagwriterr   r   r   r   r   r   r   r   r   r   Úezdxf.entities.imager    Ú	getLoggerre   r#   r€   r'  Ú__annotations__rö   r8   r/   r-   Ú<module>rp     sd  ðö #÷÷ ó å 0ß 1ß (ß 0Ý #Ý 3ß +áÝ&Ý7÷
÷ 
õ 
õ 5à	ˆ×	Ñ	˜7Ó	#€÷vñ vòrÐ ð&Ø�)ð&à�'ð&ð �zð&ð Ð1ð	&ð
 �8ð&ð �Zð&ð ˜ð&ð �|ð&ð ˜ð&ð "Ð#<ð&ð �gð&ð Ð3ð&ð �|ð&ð ˜?ð&ð ˜?ð&ð  ˜?ð!&ð" ˜ð#&ð$ ˜oñ%&Ð �Nó ÷,O'ò O'r/   