
    'j                        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j        d          Z G d de          ZdddZddZdS )    )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d0d1 fdZd Zd2d3 fd Zd) fd!Zd4 fd$Zd5 fd(Z xZS )6r   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.

    returnNonec                d    t                                                       g | _        d | _        d S N)super__init___sub_entitiesseqendself	__class__s    R/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/entities/subentity.pyr   zLinkedEntities.__init__   s,    /1(,    entityr   c                    t          |t                    sJ fd| j        D             |_        | j        r!                    | j                  |_        dS dS )z1Copy all sub-entities ands SEQEND. (internal API)c                :    g | ]}                     |          S  )copy).0ecopy_strategys     r"   
<listcomp>z,LinkedEntities.copy_data.<locals>.<listcomp>&   s4      
  
  
&'Mq!! 
  
  
r#   N)
isinstancer   r   r   r(   )r    r$   r+   s     `r"   	copy_datazLinkedEntities.copy_data#   sx    &.11111 
  
  
  
+/+= 
  
  
 ; 	<)..t{;;FMMM	< 	<r#   r   c                    t          |t                    sJ |                    | j        j        | j        j                   | j                            |           dS )zLink VERTEX to ATTRIB entities.N)r-   r
   	set_ownerdxfhandle
paperspacer   append)r    r$   s     r"   link_entityzLinkedEntities.link_entity,   sT    &*-----$(*=>>>!!&)))))r#   r   c                    | j         j        |j         _        | j        | j                                         || _        dS )z"Link SEQEND entity. (internal API)N)r1   ownerr   destroy)r    r   s     r"   link_seqendzLinkedEntities.link_seqend2   s7    8>
;"K!!!r#   c                @    | j         |                                  dS dS )zCreate always a SEQEND entity.N)r   
new_seqendr    s    r"   post_bind_hookzLinkedEntities.post_bind_hook9   s(    ;OO r#   Iterable[DXFEntity]c              #  H   K   | j         E d{V  | j        r| j        V  dS dS )z2Yields all sub-entities and SEQEND. (internal API)N)r   r   r<   s    r"   all_sub_entitieszLinkedEntities.all_sub_entities>   sI      %%%%%%%%; 	+	 	r#   funcCallable[[DXFEntity], None]c                X    |                                  D ]}|j        r ||           dS )z;Call `func` for all sub-entities and SEQEND. (internal API)N)r@   is_alive)r    rA   r$   s      r"   process_sub_entitiesz#LinkedEntities.process_sub_entitiesD   s?    ++-- 	 	F V	 	r#   dbr   c                     d fd} j         r j         j        s                                                       |           dS )zxAdd sub-entities (VERTEX, ATTRIB, SEQEND) to entity database `db`,
        called from EntityDB. (internal API)
        r$   r   c                J    j         | _                             |            d S r   )docadd)r$   rF   r    s    r"   rJ   z8LinkedEntities.add_sub_entities_to_entitydb.<locals>.addO   s    FJFF6NNNNNr#   N)r$   r   )r   rD   r;   rE   )r    rF   rJ   s   `` r"   add_sub_entities_to_entitydbz+LinkedEntities.add_sub_entities_to_entitydbJ   si    
	 	 	 	 	 	 	 { 	$+"6 	OO!!#&&&&&r#   c                    d| j         j        i}| j        rt          j        d|| j                  }nt          j        d|          }|                     |           dS )z*Create and bind new SEQEND. (internal API)layerSEQENDN)r1   rM   rI   r	   create_db_entrynewr9   )r    attribsr   s      r"   r;   zLinkedEntities.new_seqendW   s]    DHN+8 	4,XwIIFF[733F     r#   r   r7   Optional[str]r3   intc                t    t                                          ||           |                                  dS )z8Set owner of all sub-entities and SEQEND. (internal API)N)r   r0   take_ownership)r    r7   r3   r!   s      r"   r0   zLinkedEntities.set_owner`   s7    
 	%,,,r#   c                    | j         j        }| j         j        }|                                 D ]!}|j        r||j         _        ||j         _        "dS )z=Take ownership of all sub-entities and SEQEND. (internal API)N)r1   r2   r3   r@   rD   r7   )r    r2   r3   r$   s       r"   rU   zLinkedEntities.take_ownershiph   sY    X(
++-- 	3 	3F 3#)
 (2
%	3 	3r#   NotherOptional[Drawing]c                |    |                      fd           t                                                     dS )zqRemove all dependencies from current document to bind entity to
        `other` document. (internal API)
        c                .    |                                S r   )remove_dependencies)r*   rW   s    r"   <lambda>z4LinkedEntities.remove_dependencies.<locals>.<lambda>u   s    A,A,A%,H,H r#   N)rE   r   r[   )r    rW   r!   s    `r"   r[   z"LinkedEntities.remove_dependenciesq   sB     	!!"H"H"H"HIII##E*****r#   c                    | j         sdS |                     d            | `| `t	                                                       dS )z Destroy all data and references.Nc                *    |                                  S r   )r8   )r*   s    r"   r\   z(LinkedEntities.destroy.<locals>.<lambda>}   s     r#   )rA   )rD   rE   r   r   r   r8   r   s    r"   r8   zLinkedEntities.destroyx   sR    } 	F!!'<'<!===Kr#   registryxref.Registryc                |    t                                                     |                     fd           dS )z5Register required resources to the resource registry.c                .    |                                S r   )register_resources)r*   r_   s    r"   r\   z3LinkedEntities.register_resources.<locals>.<lambda>   s    A,@,@,J,J r#   N)r   rc   rE   )r    r_   r!   s    `r"   rc   z!LinkedEntities.register_resources   s@    ""8,,,!!"J"J"J"JKKKKKr#   clonemappingxref.ResourceMapperc                   t          |t                    sJ t                                          ||           t	          |                                 |                                          D ]\  }}|                    ||           dS )z3Translate resources from self to the copied entity.N)r-   r   r   map_resourceszipr@   )r    rd   re   source_cloner!   s        r"   rh   zLinkedEntities.map_resources   s    %00000eW---!$"7"7"9"95;Q;Q;S;STT 	2 	2NFF  1111	2 	2r#   )r   r   )r$   r   r   r   )r$   r   r   r   )r   r   r   r   )r   r>   )rA   rB   )rF   r   r   r   )r   )r7   rR   r3   rS   r   )rW   rX   )r_   r`   r   r   )rd   r   re   rf   r   r   )__name__
__module____qualname____doc__r   r   r.   r5   r9   r=   r@   rE   rK   r;   r0   rU   r[   r8   rc   rh   __classcell__)r!   s   @r"   r   r      s        - - - - - -
 5A < < < < <* * * *     
      ' ' ' '! ! !      3 3 3+ + + + + + +     L L L L L L
2 2 2 2 2 2 2 2 2 2r#   ATTRIBVERTEX)INSERTPOLYLINEr   Callable[[DXFEntity], bool]c                      dddfd} | S )	zCreate an DXF entities linker.N r$   r   r   boolc                   |                                  }d}Td}|dk    r                    |            dn|k    r                    |            nt          j        d| d          |t
          v r2|dk    r| j                            dd	          sn<| t
          |         n,|d
k    r&| j        j        t          
                    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

        FNTrN   zExpected DXF entity z
 or SEQENDrs   attribs_followr   MTEXTzFound attached MTEXT entity. Please open an issue at github: https://github.com/mozman/ezdxf/issues and provide a DXF example file.)dxftyper9   r5   r   DXFStructureErrorLINKED_ENTITIESr1   getr2   loggererror)r$   r|   are_linked_entitiesexpected_dxftypemain_entitys      r"   entity_linker_z%entity_linker.<locals>.entity_linker_   s    ~~'' $" #'(""''///" ,,,''////->7>>>   ''(""6:>>:JA+N+N" $#27#;     vz'8'@LL   
 #"r#   )r$   r   r   rx   r'   )r   r   r   s    @@r"   r   r      sB    '+K@# @# @# @# @# @# @#D r#   )r   ru   )
__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__	getLoggerr   r   r~   r   r'   r#   r"   <module>r      su   # " " " " " > > > > > > > > > > > > " " " " " " A A A A A A A A A A A A              &&&&&&(((((('''''' ,
-		7	#	#u2 u2 u2 u2 u2Z u2 u2 u2p &8<<G G G G G Gr#   