
    Og>                    D   d dl mZ d dl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mZmZ d dlmZ dd	l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"m#Z# er&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gZ0 ejb                  d      Z2 ed edd       eddejf                  e       eddejf                  e      d      Z4 ee4      Z5dZ6e G d  de             Z7	 d'	 	 	 	 	 	 	 d(d!Z8d)d"Z9d*d#Z:d+d$Z; G d% de e7         Z<d,d&Z=y)-    )annotations)TYPE_CHECKINGIterableIteratorcastUnionOptional)contextmanagerN)	validatorconst)DXFAttrDXFAttributesDefSubclassRETURN_DEFAULTgroup_code_mapping)
AuditError   )
base_classSubclassProcessor	DXFEntity)	DXFObject)register_entity)ObjectCollection)default_copyCopyNotSupported)Auditor)Drawing)DXFNamespace
Dictionary)EntityDB)Layouts)AbstractTagWriterDXFGroupGroupCollectionezdxf	AcDbGroupi,   )defaultF   )r(   r   fixerG   descriptionunnamed
selectableiT  c                       e Zd ZdZdZ eee      Zd fdZ	e
fdZ	 d	 	 	 d fdZd ZddZd fdZdd	Zdd
Zd dZd Zd!dZd"dZd# fdZe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  xZ!S )*r#   zGroups are not allowed in block definitions, and each entity can only
    reside in one group, so cloning of groups creates also new entities.

    GROUPc                N    t         |           t               | _        g | _        y N)super__init__set_handles_data)self	__class__s    ]/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/dxfgroups.pyr5   zDXFGroup.__init__N   s    "%%&(
    c                    t        d      )NzCopying of GROUP not supported.)r   )r9   copy_strategys     r;   copyzDXFGroup.copyS   s    @AAr<   c                ~    t         |   |      }|r*|j                  |t        dd      }| j	                  |       |S )Nr   F)log)r4   load_dxf_attribsfast_load_dxfattribsacdb_group_group_codes
load_group)r9   	processordxftagsr:   s       r;   rB   zDXFGroup.load_dxf_attribsV   sI     g&y111+QE 2 D OOD!
r<   c                b    |D ]*  \  }}|t         k(  s| j                  j                  |       , y r3   )GROUP_ITEM_CODEr7   add)r9   rH   codevalues       r;   rE   zDXFGroup.load_groupa   s1     	)KD%& !!%(		)r<   c                    | j                   J | j                  | j                          t        | j                        st	        j
                  d      y)NWAll entities have to be in the same layout and are not allowed to be in a block layout.T)docpurgeall_entities_on_same_layoutr8   r   DXFStructureError)r9   	tagwriters     r;   preprocess_exportzDXFGroup.preprocess_exporth   sK    xx###

488*4::6)),  r<   c                    t         |   |       |j                  t        j                  t
        j                         | j                  j                  |g d       | j                  |       y)z(Export entity specific data as DXF tags.r,   N)
r4   export_entity
write_tag2r   SUBCLASS_MARKER
acdb_groupnamerG   export_dxf_attribsexport_group)r9   rT   r:   s     r;   rW   zDXFGroup.export_entityt   sM    i(U22JOOD##I/WX)$r<   c                z    | j                   D ],  }|j                  t        |j                  j                         . y r3   )r8   rX   rJ   rG   handle)r9   rT   entitys      r;   r]   zDXFGroup.export_group{   s1    jj 	EF  &**2C2CD	Er<   c                (    d | j                   D        S )zIterate over all DXF entities in :class:`DXFGroup` as instances of
        :class:`DXFGraphic` or inherited (LINE, CIRCLE, ...).

        c              3  :   K   | ]  }|j                   s|  y wr3   )is_alive).0es     r;   	<genexpr>z$DXFGroup.__iter__.<locals>.<genexpr>   s     4a4s   r8   r9   s    r;   __iter__zDXFGroup.__iter__   s    
 54::44r<   c                ,    t        | j                        S )z7Returns the count of DXF entities in :class:`DXFGroup`.)lenr8   rh   s    r;   __len__zDXFGroup.__len__   s    4::r<   c                     | j                   |   S )z9Returns entities by standard Python indexing and slicing.rg   )r9   items     r;   __getitem__zDXFGroup.__getitem__   s    zz$r<   c                    t        |t              r|n|j                  j                  }|t	        | j                               v S )zReturns ``True`` if item is in :class:`DXFGroup`. `item` has to be
        a handle string or an object of type :class:`DXFEntity` or inherited.

        )
isinstancestrrG   r_   r6   handles)r9   rn   r_   s      r;   __contains__zDXFGroup.__contains__   s2    
 $D#.DHHOOT\\^,,,r<   c                    d | D        S )z=Iterable of handles of all DXF entities in :class:`DXFGroup`.c              3  H   K   | ]  }|j                   j                    y wr3   )rG   r_   rd   r`   s     r;   rf   z#DXFGroup.handles.<locals>.<genexpr>   s     5f

!!5    " rh   s    r;   rs   zDXFGroup.handles   s    555r<   c                     t            |       |j                  j                   fd} fd}t	         |              _         `|S )Nc                     t              } t        j                  j                  |       }t	        |      s*j                          t        j                  d|  d       y |_        y )NCleared z&, had entities from different layouts.)rr   filter_invalid_entitiesr8   rP   rR   clearloggerdebug)r[   entitiesr9   s     r;   set_group_entitiesz3DXFGroup.post_load_hook.<locals>.set_group_entities   sP    t9D.tzz488TJH.x8

xv-STU%
r<   c               3  h   K   j                   D ]  }  |       }|s|j                  s|   y wr3   )r7   rc   )r_   r`   db_getr9   s     r;   r   z)DXFGroup.post_load_hook.<locals>.entities   s1     -- !foo L!s   222)r4   post_load_hookentitydbgetlistr8   r7   )r9   rP   r   r   r   r:   s   `   @r;   r   zDXFGroup.post_load_hook   sD    s#!!	&	! (*%
M!!r<   c              #  L   K   t        |       }| | j                  |       yw)aD  Context manager which yields all the group entities as
        standard Python list::

            with group.edit_data() as data:
               # add new entities to a group
               data.append(modelspace.add_line((0, 0), (3, 0)))
               # remove last entity from a group
               data.pop()

        N)r   set_data)r9   datas     r;   	edit_datazDXFGroup.edit_data   s"      Dz
ds   "$c                   | j                   J t        |      }t        || j                   t        |             }t	        |      t	        |      k7  rt        j                  d      t        |      st        j                  d      |S )Nzinvalid entities foundrO   )rP   r   r}   rr   rk   r   rS   rR   r9   r   valid_entitiess      r;   _validate_entitieszDXFGroup._validate_entities   s|    xx###>0488SYO~#h-/))*BCC*>:)),  r<   c                v    | j                  |      }| j                          | j                  |       || _        y)a!  Set `entities` as new group content, entities should be an iterable of
        :class:`DXFGraphic` (LINE, CIRCLE, ...).

        Raises:
            DXFValueError: not all entities are located on the same layout (modelspace
                or any paperspace layout but not block)

        N)r   r~   _add_group_reactorr8   r   s      r;   r   zDXFGroup.set_data   s2     00:

/#
r<   c                
   | j                  |      }t        | j                               }|D cg c]  }|j                  j                  |vs| }}| j                  |       | j                  j                  |       yc c}w )a!  Add `entities` to :class:`DXFGroup`, entities should be an iterable of
        :class:`DXFGraphic` (LINE, CIRCLE, ...).

        Raises:
            DXFValueError: not all entities are located on the same layout (modelspace
                or any paperspace layout but not block)

        N)r   r6   rs   rG   r_   r   r8   extend)r9   r   r   rs   re   s        r;   r   zDXFGroup.extend   sl     00:dlln%%3Squu||77R!SS/

.) Ts   B B c                H    | j                  | j                         g | _        y)z|Remove all entities from :class:`DXFGroup`, does not delete any
        drawing entities referenced by this group.

        N)_remove_group_reactorr8   rh   s    r;   r~   zDXFGroup.clear   s     	""4::.
r<   c                `    | j                   j                  }|D ]  }|j                  |        y r3   )rG   r_   append_reactor_handler9   r   group_handler`   s       r;   r   zDXFGroup._add_group_reactor   s,    xx 	7F((6	7r<   c                `    | j                   j                  }|D ]  }|j                  |        y r3   )rG   r_   discard_reactor_handler   s       r;   r   zDXFGroup._remove_group_reactor   s,    xx 	8F)),7	8r<   c           	        t        |       }|j                  J | j                  |j                         |t        |       z
  }|dkD  r0|j                  t        j
                  d| dt        |               t        | j                        s>|j                  t        j                  dt        |        d       | j                          | j                  j                  }|sy| j                  D ]V  }|j                  ||j                  vs|j                  t        j                  d| d	| d
       |j                  |       X y)zRemove invalid entities from :class:`DXFGroup`.

        Invalid entities are:

        - deleted entities
        - all entities which do not reside in model- or paper space
        - all entities if they do not reside in the same layout

        Nr   zRemoved z invalid entities from rL   messager|   z2, not all entities are located in the same layout.zEntity z in group #z* does not have group as persistent reactor)rk   rP   rQ   fixed_errorr   INVALID_GROUP_ENTITIESrr   rR   r8   #GROUP_ENTITIES_IN_DIFFERENT_LAYOUTSr~   rG   r_   reactorsMISSING_PERSISTENT_REACTORr   )r9   auditorentity_countremoved_entity_countr   r`   s         r;   auditzDXFGroup.audit   sC    4y{{&&&

7;;+c$i7!#66"#7"88OPSTXPY{[    +4::6CC"3t9+ .# $   
 JJLxxjj 	;F&,foo*M###>>%fX[ G2 3 $ 
 ,,\:	;r<   c                P    t        | j                  |t        |             | _        y)zRemove invalid group entities.)r   rP   
group_nameN)r}   r8   rr   )r9   rP   s     r;   rQ   zDXFGroup.purge(  s    ,ZZSSY

r<   )returnNoner3   )rF   zOptional[SubclassProcessor]r   r   )rT   r"   r   bool)rT   r"   r   r   )rT   r"   )r   zIterator[DXFEntity])r   int)rn   zUnion[str, DXFEntity]r   r   )r   zIterable[str])rP   z	'Drawing')r   list[DXFEntity])r   Iterable[DXFEntity]r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   )rP   r   r   r   )"__name__
__module____qualname____doc__DXFTYPEr   r   rZ   
DXFATTRIBSr5   r   r?   rB   rE   rU   rW   r]   ri   rl   ro   rt   rs   r   r
   r   r   r   r   r~   r   r   r   rQ   __classcell__r:   s   @r;   r#   r#   D   s    
 Gz:6J)
 ". B 8<	4			)
%E5 -6"2  $*7
8
&;P
r<   c                x   |J |j                   }t        |j                        }g }| D ]  }|j                  r3t	        |j
                  j                  ||      r|j                  |       B|sE|j                  r%t        j                  t        |       d| d       vt        j                  d|         |S )Nz in z has an invalid owner.zRemoved deleted entity in )r   valid_layout_handleslayoutsrc   _has_valid_ownerrG   ownerappendr   r   rr   )r   rP   r   dbvalid_owner_handlesr   r`   s          r;   r}   r}   /  s    
 ??	B.s{{;&(N 	H??/JJb"5 
 !!&)F}D<RST9*FG	H r<   c                    | y|r| |vry|j                  |       }||j                  sy|j                  j                  dk7  S )NF0)r   rc   rG   layout)r   r   r   r   s       r;   r   r   E  sJ    }u,??VVE]F~V__
 ::##r<   c                B    t        d | D              }t        |      dk  S )zgCheck if all entities are on the same layout (model space or any paper
    layout but not block).

    c              3  H   K   | ]  }|j                   j                    y wr3   )rG   r   rw   s     r;   rf   z.all_entities_on_same_layout.<locals>.<genexpr>\  s     9f!!9rx      )r6   rk   )r   ownerss     r;   rR   rR   W  s"    
 999Fv;?r<   c                &    t        d | D              S )z-Returns valid layout keys for group entities.c              3  N   K   | ]  }|j                   s|j                    y wr3   )is_any_layout
layout_key)rd   r   s     r;   rf   z'valid_layout_handles.<locals>.<genexpr>c  s     OV&:N:Nv  Os   %%)r6   )r   s    r;   r   r   a  s    OwOOOr<   c                  j     e Zd Zd fdZd	dZd
dZd
dZ	 	 	 d	 	 	 	 	 	 	 ddZd fdZddZ	 xZ
S )r$   c                8    t         |   |dd       d| _        y )N
ACAD_GROUPr1   )	dict_nameobject_typer   )r4   r5   _next_unnamed_number)r9   rP   r:   s     r;   r5   zGroupCollection.__init__g  s    'J$%!r<   c              #  (   K   | D ]	  \  }}|  yw)z Iterable of all existing groups.Nry   )r9   r[   groups      r;   groupszGroupCollection.groupsk  s      	KD%K	s   c                X    | j                         }|| v r| j                         }|| v r|S r3   )
_next_name)r9   r[   s     r;   	next_namezGroupCollection.next_namep  s/     dl??$D dlr<   c                J    | xj                   dz  c_         d| j                    S )Nr   z*A)r   rh   s    r;   r   zGroupCollection._next_namev  s'    !!Q&!D--.//r<   c                    ||| v rt        j                  d| d      || j                         }d}nd}||t        t	        |            d}t        t        | j                  ||            S )a`  Creates a new group. If `name` is ``None`` an unnamed group is
        created, which has an automatically generated name like "\*Annnn".
        Group names are case-insensitive.

        Args:
            name: group name as string
            description: group description as string
            selectable: group is selectable if ``True``

        zGROUP 'z' already exists.r   r   r,   )r   DXFValueErrorr   r   r   r   r#   _new)r9   r[   r-   r/   r.   
dxfattribss         r;   newzGroupCollection.newz  s|      %%v5F&GHH<>>#DGG 'd:./


 Hdiij9::r<   c                "   | j                   j                  }|J t        |t              r|}n9|j	                         dk(  rt        ||      }nt        |j	                               || v rt        | !  |       yt        j                  d      )zoDelete `group`, `group` can be an object of type :class:`DXFGroup`
        or a group name as string.

        Nr1   z$GROUP not in group table registered.)rP   r   rq   rr   dxftypeget_group_name	TypeErrorr4   deleter   r   )r9   r   r   r[   r:   s       r;   r   zGroupCollection.delete  s    
 88$$###eS!D]]_'!%2DEMMO,,4<GN4 %%&LMMr<   c                   g }| D ]C  \  }}t        t        |      }|j                  |       t        |      r3|j	                  |       E |D ]8  }|j                  t        j                  d| d       | j                  |       : y)z9Removes empty groups and invalid handles from all groups.zRemoved empty group "z".r   N)	r   r#   r   rk   r   r   r   REMOVE_EMPTY_GROUPr   )r9   r   trashr[   r   s        r;   r   zGroupCollection.audit  s     	#KD%5)EKK u:T"	#  	D22/vR8    KK	r<   )rP   r   )r   zIterator[DXFGroup])r   rr   )Nr'   T)r[   zOptional[str]r-   rr   r/   r   r   r#   )r   zUnion[DXFGroup, str]r   r   r   )r   r   r   r5   r   r   r   r   r   r   r   r   s   @r;   r$   r$   f  sY    &
0 #	;; ; 	;
 
;@N(r<   c                    t        d|| j                  j                           }|j                         D ]  \  }}|| u s|c S  y)zGet name of `group`.r   r'   )r   rG   r   items)r   r   group_tabler[   r`   s        r;   r   r     sH    |R		%89K#))+ fU?K r<   )r'   )r   r   rP   r   r   rr   r   r   )r   rr   r   r    r   set[str]r   r   )r   r   )r   r!   r   r   )r   r#   r   r    r   rr   )>
__future__r   typingr   r   r   r   r   r	   
contextlibr
   loggingezdxf.lldxfr   r   ezdxf.lldxf.attributesr   r   r   r   r   ezdxf.auditr   	dxfentityr   r   r   dxfobjr   factoryr   objectcollectionr   r?   r   r   r   ezdxf.documentr   ezdxf.entitiesr   r   ezdxf.entitydbr    ezdxf.layoutsr!   ezdxf.lldxf.tagwriterr"   __all__	getLoggerr   is_integer_boolrZ   rD   rJ   r#   r}   r   rR   r   r$   r   ry   r<   r;   <module>r      sQ   #  &  (  # ? ?  $ . 0#&7'%7(
)			7	# sB/ // 	
 // 	

0 ,J7  g
y g
 g
Z !	  	,$$P
X&x0 Xvr<   