
    Og                        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
mZmZmZ d dlmZ ddlmZ d dlZerd d	lmZ d d
l	mZ d dlmZ d dlmZ ddgZ ej4                  d      Z G d de      ZdddZddZy)    )annotations)TYPE_CHECKINGIterableCallableOptional)Self)factory
DXFGraphicSeqEnd	DXFEntity)const   )default_copyN)Drawing)r   )EntityDB)xrefentity_linkerLinkedEntitiesezdxfc                       e Zd ZdZd fdZefddZddZddZd Z	ddZ
ddZdd	Zd
 Zdd fdZd Zdd fdZd fdZd fdZd fdZ xZS )r   zSuper class for common features of the INSERT and the POLYLINE entity.
    Both have linked entities like the VERTEX or ATTRIB entity and a
    SEQEND entity.

    c                >    t         |           g | _        d | _        y N)super__init___sub_entitiesseqendself	__class__s    ]/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/subentity.pyr   zLinkedEntities.__init__   s    /1(,    c                    t        |t              sJ | j                  D cg c]  }|j                  |       c}|_        | j                  r!|j                  | j                        |_        yyc c}w )z1Copy all sub-entities ands SEQEND. (internal API)N)
isinstancer   r   copyr   )r   entitycopy_strategyes       r    	copy_datazLinkedEntities.copy_data#   sd    &.111+/+=+= 
&'Mq! 
 ;;)..t{{;FM  
s   A/c                    t        |t              sJ |j                  | j                  j                  | j                  j
                         | j                  j                  |       y)zLink VERTEX to ATTRIB entities.N)r#   r
   	set_ownerdxfhandle
paperspacer   append)r   r%   s     r    link_entityzLinkedEntities.link_entity,   sH    &*---$((*=*=>!!&)r!   c                    | j                   j                  |j                   _        | j                  | j                  j                          || _        y)z"Link SEQEND entity. (internal API)N)r+   ownerr   destroy)r   r   s     r    link_seqendzLinkedEntities.link_seqend2   s7    88>>

;;"KK!r!   c                >    | j                   | j                          yy)zCreate always a SEQEND entity.N)r   
new_seqendr   s    r    post_bind_hookzLinkedEntities.post_bind_hook9   s    ;;OO r!   c              #  n   K   | j                   E d{    | j                  r| j                   yy7  w)z2Yields all sub-entities and SEQEND. (internal API)N)r   r   r6   s    r    all_sub_entitieszLinkedEntities.all_sub_entities>   s0     %%%%;;++  	&s   53!5c                X    | j                         D ]  }|j                  s ||        y)z;Call `func` for all sub-entities and SEQEND. (internal API)N)r9   is_alive)r   funcr%   s      r    process_sub_entitiesz#LinkedEntities.process_sub_entitiesD   s(    ++- 	FV	r!   c                     d fd} j                   r j                   j                  s j                           j                  |       y)zxAdd sub-entities (VERTEX, ATTRIB, SEQEND) to entity database `db`,
        called from EntityDB. (internal API)
        c                J    j                   | _         j                  |        y r   )docadd)r%   dbr   s    r    rA   z8LinkedEntities.add_sub_entities_to_entitydb.<locals>.addO   s    FJFF6Nr!   N)r%   r   )r   r;   r5   r=   )r   rB   rA   s   `` r    add_sub_entities_to_entitydbz+LinkedEntities.add_sub_entities_to_entitydbJ   s5    
	 {{$++"6"6OO!!#&r!   c                    d| j                   j                  i}| j                  r"t        j                  d|| j                        }nt        j
                  d|      }| j                  |       y)z*Create and bind new SEQEND. (internal API)layerSEQENDN)r+   rE   r@   r	   create_db_entrynewr3   )r   attribsr   s      r    r5   zLinkedEntities.new_seqendW   sQ    DHHNN+88,,XwIF[[73F r!   c                F    t         |   ||       | j                          y)z8Set owner of all sub-entities and SEQEND. (internal API)N)r   r*   take_ownership)r   r1   r-   r   s      r    r*   zLinkedEntities.set_owner`   s     
 	%,r!   c                    | j                   j                  }| j                   j                  }| j                         D ]1  }|j                  s||j                   _        ||j                   _        3 y)z=Take ownership of all sub-entities and SEQEND. (internal API)N)r+   r,   r-   r9   r;   r1   )r   r,   r-   r%   s       r    rK   zLinkedEntities.take_ownershiph   sU    XX((
++- 	3F#)

 (2

%	3r!   c                N    | j                  fd       t        | 	         y)zqRemove all dependencies from current document to bind entity to
        `other` document. (internal API)
        c                &    | j                        S r   )remove_dependencies)r'   others    r    <lambda>z4LinkedEntities.remove_dependencies.<locals>.<lambda>u   s    A,A,A%,H r!   N)r=   r   rO   )r   rP   r   s    `r    rO   z"LinkedEntities.remove_dependenciesq   s!     	!!"HI#E*r!   c                j    | j                   sy| j                  d        | `| `t        |           y)z Destroy all data and references.Nc                "    | j                         S r   )r2   )r'   s    r    rQ   z(LinkedEntities.destroy.<locals>.<lambda>}   s     r!   )r<   )r;   r=   r   r   r   r2   r   s    r    r2   zLinkedEntities.destroyx   s4    }}!!'<!=Kr!   c                N    t         |          | j                  fd       y)z5Register required resources to the resource registry.c                &    | j                        S r   )register_resources)r'   registrys    r    rQ   z3LinkedEntities.register_resources.<locals>.<lambda>   s    A,@,@,J r!   N)r   rV   r=   )r   rW   r   s    `r    rV   z!LinkedEntities.register_resources   s    "8,!!"JKr!   c                    t        |t              sJ t        |   ||       t	        | j                         |j                               D ]  \  }}|j                  ||        y)z3Translate resources from self to the copied entity.N)r#   r   r   map_resourceszipr9   )r   clonemappingsource_cloner   s        r    rY   zLinkedEntities.map_resources   s^    %000eW-!$"7"7"95;Q;Q;ST 	2NFF  1	2r!   )returnNone)r%   r   r_   r`   )r%   r   r_   r`   )r   r   r_   r`   )r_   zIterable[DXFEntity])r<   zCallable[[DXFEntity], None])rB   r   r_   r`   )r   )r1   zOptional[str]r-   intr   )rP   zOptional[Drawing])rW   zxref.Registryr_   r`   )r[   r   r\   zxref.ResourceMapperr_   r`   )__name__
__module____qualname____doc__r   r   r(   r/   r3   r7   r9   r=   rC   r5   r*   rK   rO   r2   rV   rY   __classcell__)r   s   @r    r   r      s_    -
 5A <*
'!3+L
2 2r!   ATTRIBVERTEX)INSERTPOLYLINEc                      dddfd} | S )zCreate an DXF entities linker.N c                   | j                         }d}Md}|dk(  rj                  |        d|S |k(  rj                  |        |S t        j                  d| d      |t
        v r1|dk(  r| j                  j                  dd	      s	 |S | t
        |   |S |d
k(  r+| j                  j                  t        j                  d       |S )a  Collect and link entities which are linked to a parent entity:

        - VERTEX -> POLYLINE
        - ATTRIB -> INSERT

        Args:
             entity: examined DXF entity

        Returns:
             True if `entity` is linked to a parent entity

        FNTrF   zExpected DXF entity z
 or SEQENDri   attribs_followr   MTEXTzFound attached MTEXT entity. Please open an issue at github: https://github.com/mozman/ezdxf/issues and provide a DXF example file.)dxftyper3   r/   r   DXFStructureErrorLINKED_ENTITIESr+   getr,   loggererror)r%   rp   are_linked_entitiesexpected_dxftypemain_entitys      r    entity_linker_z%entity_linker.<locals>.entity_linker_   s    ~~' $" #'("''/"N #"G ,,''/D #"A --*7):>  '("6::>>:JA+N  #" %#27#;  #"  vzz'8'8'@LL 
 #"r!   )r%   r   r_   bool )ry   rw   rx   s    @@r    r   r      s    '+K@#D r!   )r_   zCallable[[DXFEntity], bool])
__future__r   typingr   r   r   r   typing_extensionsr   ezdxf.entitiesr	   r
   r   r   ezdxf.lldxfr   r$   r   loggingezdxf.documentr   ezdxf.entitydbr   r   r   __all__	getLoggerrt   r   rr   r   r{   r!   r    <module>r      sq    # > > " A A   &(' ,
-			7	#u2Z u2p &8<Gr!   