
    Og.[                    b   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
Z
d dlmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ erd d	lmZ d d
lmZ d dlmZ ddgZ e	j>                  d      Z dZ!dZ"dddddZ# e$g d      Z% G d d      Z&h dZ' G d d      Z(ddddddd d!d"d#d$d%d&d'd(d)Z)d+d*Z*y),    )annotations)AnyOptionalUnionIterableTYPE_CHECKINGSetN)options)const)XTypeDXFAttributesDXFAttr)
cast_valuedxftag)Tags)ExtendedTags)	DXFEntity)AbstractTagWriterDXFNamespaceSubclassProcessorezdxfz(Invalid DXF attribute "{}" for entity {}z!DXF attribute "{}" does not existon_layer_changeon_linetype_changeon_style_changeon_dimstyle_change)layerlinetypestyledimstyle)_entityhandleownerc                  0   e Zd ZdZ	 	 d	 	 	 ddZddZd d!dZd"dZd#dZd Z		 	 d	 	 	 	 	 	 	 d$d	Z
d%d
Zd&dZd'dZd d(dZd%dZd&dZd&dZd)dZddd	 	 	 	 	 d*dZd'dZd+dZd+dZed,d       Zed-d       Zd%dZ	 	 	 	 	 	 d.dZ	 	 	 	 	 	 d/dZy)0r   az  :class:`DXFNamespace` manages all named DXF attributes of an entity.

    The DXFNamespace.__dict__ is used as DXF attribute storage, therefore only
    valid Python names can be used as attrib name.

    The namespace can only contain immutable objects: string, int, float, bool,
    Vec3. Because of the immutability, copy and deepcopy are the same.

    (internal class)
    Nc                <   |ry|j                   }|d   j                  dk(  rdnd}d }d }|D ]:  }|j                  }||k(  r|j                  }|s# n|dk(  s+|j                  }|s: n | j                  |||       y | j	                          | j                  |       y )Nr   DIMSTYLEi      J  )
base_classvaluecoderewirereset_handles)	self	processorentityr)   handle_coder!   r"   tag
group_codes	            Y/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/dxfns.py__init__zDXFNamespace.__init__3   s    
 "--J!+A!4!4
!B#K FE! 	 XX
, YYF3&IIE	 KK. KK    c                    | j                         }| j                  j                         D ]  \  }}||j                  |<    |j                  |       |S N)	__class____dict__itemsr,   )r.   r0   	namespacekvs        r4   copyzDXFNamespace.copyO   sR    NN$	MM'') 	&DAq$%Iq!	& r6   c                8    | j                  | j                        S r8   )r?   r    )r.   memodicts     r4   __deepcopy__zDXFNamespace.__deepcopy__V   s    yy&&r6   c                    | j                   S r8   r:   r.   s    r4   __getstate__zDXFNamespace.__getstate__Y   s    }}r6   c                    t        |t              s!t        dt        |      j                         t
        j                  | d|       y )Nzinvalid state: r:   )
isinstancedict	TypeErrortype__name__object__setattr__)r.   states     r4   __setstate__zDXFNamespace.__setstate__\   s;    %&od5k.B.B-CDEE4U3r6   c                @    d| j                   d<   d| j                   d<   y)zReset handle and owner to None.Nr!   r"   rD   rE   s    r4   r-   zDXFNamespace.reset_handlesb   s    "&h!%gr6   c                h    || j                   d<   ||| j                   d<   ||| j                   d<   yy)zRewire DXF namespace with parent entity

        Args:
            entity: new associated entity
            handle: new handle or None
            owner:  new entity owner handle or None

        r    Nr!   r"   rD   )r.   r0   r!   r"   s       r4   r,   zDXFNamespace.rewireg   s?     $*i &,DMM(#%*DMM'" r6   c                *   | j                   j                  |      }|rD|j                  t        j                  k(  r|j                  | j                        S |j                  S t        j                  t        j                  || j                              )zCalled if DXF attribute `key` does not exist, returns the DXF
        default value or ``None``.

        Raises:
            DXFAttributeError: attribute `key` is not supported

        )
dxfattribsgetxtyper   callbackget_callback_valuer    defaultr   DXFAttributeErrorERR_INVALID_DXF_ATTRIBformatdxftype)r.   key
attrib_defs      r4   __getattr__zDXFNamespace.__getattr__|   su     )-(;(;C(@
5>>1!44T\\BB!)))))&--c4<<@ r6   c                    d fdfd} j                   j                        rPj                  t        j                  k(  rj                   j                  |       nI ||       j                  <   n3t        j                  t        j                   j                              t        v r*t         j                  t           d      }|r	 ||       yyy)~Set DXF attribute `key` to `value`.

        Raises:
            DXFAttributeError: attribute `key` is not supported

        c                 z    j                  d      } j                  }|r|j                         d|  dz   S d|  S )Nr!   z(#)#)rU   r    r]   )r!   r    r.   s     r4   r0   z(DXFNamespace.__setattr__.<locals>.entity   sC    XXh'FllG(Rxq>996(|#r6   c           
     H   t        j                  |       } j                  |       syj                  r@j                  |       } t        j                  d d         dt        |        d       | S t        j                  dt        |        d d         d      | S )NzFixed invalid attribute "z" in entity z to "z".zInvalid value z for attribute ".)	r   r+   is_valid_valuefixerloggerdebugstrr   DXFValueError)r*   r_   r0   r^   s    r4   checkz'DXFNamespace.__setattr__.<locals>.check   s    z6E,,U3##&,,U3ELL3C5 9"H:U3u:,b: L	  --(U4DSE J""((1.  Lr6   Nreturnrl   )rT   rU   rV   r   rW   set_callback_valuer    r:   r   rZ   r[   r\   r]   SETTER_EVENTSgetattr)r.   r^   r*   rn   handlerr_   r0   s   ``   @@r4   rN   zDXFNamespace.__setattr__   s    	$	  )-(;(;C(@
5>>1--dllEB%*5\c"))&--c4<<@  -dllM#,>EG   r6   c                    | j                  |      r| j                  |= yt        j                  t        j                  |            )ztDelete DXF attribute `key`.

        Raises:
            DXFAttributeError: attribute `key` does not exist

        N)hasattrr:   r   rZ   ERR_DXF_ATTRIB_NOT_EXITSr\   r.   r^   s     r4   __delattr__zDXFNamespace.__delattr__   s9     <<c"))*B*I*I#*NOOr6   c                V   | j                  |      r| j                  |   S | j                  j                  |      }|r:|j                  t
        j                  k(  r|j                  | j                        S |S t        j                  t        j                  || j                              )zReturns value of DXF attribute `key` or the given `default` value
        not DXF default value for unset attributes.

        Raises:
            DXFAttributeError: attribute `key` is not supported

        )rv   r:   rT   rU   rV   r   rW   rX   r    r   rZ   r[   r\   r]   )r.   r^   rY   r_   s       r4   rU   zDXFNamespace.get   s     <<==%%*.//*=*=c*B
5>>1!44T\\BB))&--c4<<@ r6   c                P    | j                  |d      }|| j                  |      S |S )z8Returns DXF default value for unset DXF attribute `key`.N)rU   dxf_default_valuer.   r^   r*   s      r4   get_defaultzDXFNamespace.get_default   s,    d#.3mt%%c*FFr6   c                (    | j                  ||       y)rb   N)rN   r}   s      r4   setzDXFNamespace.set   s     	e$r6   c                "    || j                   |<   y)zSet DXF attribute `key` to `value` without any validity checks.

        Used for fast attribute setting without validity checks at loading time.

        (internal API)
        NrD   r}   s      r4   unprotected_setzDXFNamespace.unprotected_set   s     #cr6   c                6    t        | j                        }|d= |S )z@Returns all existing DXF attributes, except DXFEntity back-link.r    )rI   r:   )r.   attribss     r4   all_existing_dxf_attribsz%DXFNamespace.all_existing_dxf_attribs   s    t}}%Ir6   F)excludeignore_errorsc                   |t         }ndh|z  }| j                  }|j                         D ]  \  }}||vs	  |||        y# t        t        f$ r |s Y ,w xY w)z,Update DXF namespace attributes from a dict.Nr    )EXCLUDE_FROM_UPDATErN   r;   AttributeError
ValueError)r.   rT   r   r   set_attributer=   r>   s          r4   updatezDXFNamespace.update   sy     ?)G kG+G(($$& 	DAq!!Q'	 '
3 ( )s   	AAAc                >    	 | j                   |= y# t        $ r Y yw xY w)z:Delete DXF attribute `key` silently without any exception.N)r:   KeyErrorrx   s     r4   discardzDXFNamespace.discard  s%    	c" 		s    	c                    || j                   v S )a  Returns True if DXF attribute `key` is supported else False.
        Does not grant that attribute `key` really exists and does not
        check if the actual DXF version of the document supports this
        attribute, unsupported attributes will be ignored at export.

        )rT   rx   s     r4   is_supportedzDXFNamespace.is_supported  s     doo%%r6   c                    || j                   v S )z9Returns True if attribute `key` really exists else False.rD   rx   s     r4   rv   zDXFNamespace.hasattr&  s    dmm##r6   c                .    | j                   j                  S )zReturns the DXF entity type.)r    DXFTYPErE   s    r4   r]   zDXFNamespace.dxftype*  s     ||###r6   c                .    | j                   j                  S )z%Returns the DXF attribute definition.)r    
DXFATTRIBSrE   s    r4   rT   zDXFNamespace.dxfattribs/  s     ||&&&r6   c                V    | j                   j                  |      }|r|j                  S y)z9Returns the default value as defined in the DXF standard.N)rT   rU   rY   )r.   r^   attribs      r4   r|   zDXFNamespace.dxf_default_value4  s&    $(OO$7$7$<>>!r6   c                |    t        |t              r| j                  ||       y|D ]  }| j                  ||        y)a  Exports DXF attribute `name` by `tagwriter`. Non-optional attributes
        are forced and optional tags are only written if different to default
        value. DXF version check is always on: does not export DXF attribs
        which are not supported by tagwriter.dxfversion.

        Args:
            tagwriter: tag writer object
            attribs: DXF attribute name as string or an iterable of names

        N)rH   rl   _export_dxf_attribute_optional)r.   	tagwriterr   names       r4   export_dxf_attribszDXFNamespace.export_dxf_attribs<  s?     gs#//	7C E33ItDEr6   c                   |j                   }|j                   }| j                  j                  |      }|r|j                  }|j
                  }| j                  |d      }||s|}|||j                   k\  r|r
|r|||k(  ry|j                  t        j                  k(  r't        |      dkD  r	 |j                  |j                  f}t        |t              rd|vsJ d       d|vsJ d       t        |j                   |      }	|j#                  |	       yyyt%        j&                  t(        j+                  || j,                              # t        $ r |dd }Y w xY w)zExports DXF attribute `name` by `tagwriter`. Optional tags are only
        written if different to default value.

        Args:
            tagwriter: tag writer object
            name: DXF attribute name

        N   
zline break '\n' not allowedzline break '\r' not allowed)
dxfversionforce_optionalrT   rU   optionalrY   rV   r   point2dlenxyr   rH   rl   r   r+   	write_tagr   rZ   r[   r\   r]   )
r.   r   r   export_dxf_versionnot_force_optionalr   r   rY   r*   r2   s
             r4   r   z+DXFNamespace._export_dxf_attribute_optionalO  se    '11!*!9!99$(OO$7$7$=HnnGHHT4(E}X !"f&7&77
 *+5(<<5==0SZ!^*!&%'' 2 eS)u,L.LL,u,L.LL,V[[%0##C(- 8 "2 ))&--dDLLA  * * %bq	*s   0E EE)NN)r/   zOptional[SubclassProcessor]r0   Optional[DXFEntity])r0   r   r8   )rA   zOptional[dict])rp   rM   )rO   rM   rp   None)r0   r   r!   Optional[str]r"   r   rp   r   )r^   rl   rp   r   )r^   rl   r*   r   rp   r   )r^   rl   rp   r   )r^   rl   rY   r   rp   r   )rp   rI   )rT   zdict[str, Any]r   zOptional[Set[str]]rp   r   )r^   rl   rp   boolro   )rp   r   )r   r   r   zUnion[str, Iterable]rp   r   )r   r   r   rl   rp   r   )rL   
__module____qualname____doc__r5   r?   rB   rF   rP   r-   r,   r`   rN   ry   rU   r~   r   r   r   r   r   r   rv   propertyr]   rT   r|   r   r    r6   r4   r   r   '   s@   	 26&* .  $ 8'4& !%#	+#+ + 	+
 
+*&/b
P.G
%# '+" $	 
,&$ $ $ ' 'E*E5IE	E&4*4254	4r6   >   r   r'   r(   f   c                      e Zd ZdZdddZed        Z	 	 d	 	 	 	 	 ddZddZddZ		 	 	 	 	 	 	 	 ddZ
d	d
d	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 ddZy)r   z=Helper class for loading tags into entities. (internal class)Nc                   t        |j                        dk(  rt        d      t        |j                        | _        |j                  xs g | _        || _        |t        j                  k(  xs t        | j                        dk(  | _        |j                         | _
        |  	 |j                         | _        y # t        j                  $ r
 d| _        Y y w xY w)Nr   zInvalid tags.   <?>)r   
subclassesr   listembedded_objectsr   r   DXF12r12r]   r   
get_handler!   rm   )r.   tagsr   s      r4   r5   zSubclassProcessor.__init__  s    t1$_--&*4??&;,0,A,A,GR)3 %3 
 A% 	 		 //+DK"" 	 DK	 s   $B: :CCc                     | j                   d   S Nr   )r   rE   s    r4   r)   zSubclassProcessor.base_class  s    q!!r6   c                    t         j                  r8|D ]2  }d}|rd| }t        j                  dt	        |       d| |z          4 y y )N z in entity #zignored z in subclass )r
   log_unprocessed_tagsrj   inforepr)r.   unprocessed_tagssubclassr!   r2   r0   s         r4   r   z&SubclassProcessor.log_unprocessed_tags  sZ     ''' +F84FtCykxjAFJ	 (r6   c                j    | j                   D ]$  }t        |      s|d   j                  |k(  s"|c S  y r   )r   r   r*   )r.   r   r   s      r4   find_subclasszSubclassProcessor.find_subclass  s7     	 H8}!!2!2d!:	  r6   c                @    	 | j                   |   S # t        $ r Y y w xY wr8   )r   
IndexError)r.   indexs     r4   subclass_by_indexz#SubclassProcessor.subclass_by_index  s(    	??5)) 		s    	c                    | j                  |      }|r.t        |      dkD  r |d   }|j                  |k(  r|j                  S |S )Nr   )r   r   r+   r*   )r.   subclass_indexr3   rY   r   r2   s         r4   detect_implementation_versionz/SubclassProcessor.detect_implementation_version  sF     )).9H)1+Cxx:%yy r6   FT)recoverlogc               p   | j                   r| j                  d   }nFt        |t              r| j	                  |      }n$t        |t
              r| j                  |      }n|}t               }|t        |      dk(  r|S t               }|j                  }	|j                  }
|j                  }|j                  }|d   j                  dv rdnd}||d D ]z  } |	|j                        }t        |t              r|}d}|D ]  }||vs|} ||        n |r1|d   dk7  sK ||t!        |j                  |j"                               s |
|       | | j                   r|S |rt        |      rt%        ||      }t        |      r4|r2|d   j"                  }| j'                  |||j                  d             |S )a2  Load DXF attributes into the DXF namespace and returns the
        unprocessed tags without leading subclass marker(100, AcDb...).
        Bypasses the DXF attribute validity checks.

        Args:
            dxf: entity DXF namespace
            group_code_mapping: group code to DXF attribute name mapping,
                callback attributes have to be marked with a leading "*"
            subclass: subclass by index, by name or as Tags()
            recover: recover graphic attributes
            log: enable/disable logging of unprocessed tags

        r   N)r   d   r   *r!   )r   r!   )r   r   rH   intr   rl   r   r   r   r   rU   appendr   addr+   r   r   r*   recover_graphic_attributesr   )r.   dxfgroup_code_mappingr   r   r   r   r   processed_namesget_attrib_nameappend_unprocessed_tagunprotected_set_attribmark_attrib_as_processedstartr2   r   namesname_s                     r4   fast_load_dxfattribsz&SubclassProcessor.fast_load_dxfattribs  s   , 88??1%D(C(--h7Hc*))(36<3t9>##$'E,00!1!8!8!$!4!4#2#6#6  !W\\X-1< 	,C"388,D$%  # EO3$07	
  7c>*j399= 's+-	,0 88
 $# s+,  ::JCP S7==D%%tCGGH,= &   r6   c                    | j                   ry| j                  d   }|d   dk(  r&|j                  d | j                  d   D               yy)zIt is valid to mix up the base class with AcDbEntity class.
        This method appends all none base class group codes to the
        AcDbEntity class.
        Nr   r   )r   
AcDbEntityc              3  D   K   | ]  }|j                   t        vr|  y wr8   )r+   BASE_CLASS_CODES).0r2   s     r4   	<genexpr>zESubclassProcessor.append_base_class_to_acdb_entity.<locals>.<genexpr>5  s%      $88#33 $s    )r   r   extend)r.   acdb_entity_tagss     r4    append_base_class_to_acdb_entityz2SubclassProcessor.append_base_class_to_acdb_entity&  sT     88??1-A"55## $??1-$  6r6   c                L   t         j                  j                  | j                        }|j                  }|j
                  }|D ]^  } ||j                        }t        |t              s&|j                  d      r8 ||t        |j                  |j                               ` y)a  Load DXF attributes from all subclasses into the DXF namespace.

        Can not handle same group codes in different subclasses, does not remove
        processed tags or log unprocessed tags and bypasses the DXF attribute
        validity checks.

        This method ignores the subclass structure and can load data from
        very malformed DXF files, like such in issue #604.
        This method works only for very simple DXF entities with unique group
        codes in all subclasses, the old DXF R12 entities:

            - POINT
            - LINE
            - CIRCLE
            - ARC
            - INSERT
            - SHAPE
            - SOLID/TRACE/3DFACE
            - TEXT (ATTRIB/ATTDEF bypasses TEXT loader)
            - BLOCK/ENDBLK
            - POLYLINE/VERTEX/SEQEND
            - DIMENSION and subclasses
            - all table entries: LAYER, LTYPE, ...

        And the newer DXF entities:

            - ELLIPSE
            - RAY/XLINE

        The recover mode for graphical attributes is automatically included.
        Logging of unprocessed tags is not possible but also not required for
        this simple and well known entities.

        Args:
            dxf: entity DXF namespace
            group_code_mapping: group code name mapping for all DXF attributes
                from all subclasses, callback attributes have to be marked with
                a leading "*"

        r   N)	itertoolschainfrom_iterabler   rU   r   r+   rH   rl   
startswithr   r*   )r.   r   r   r   r   r   r2   r   s           r4   simple_dxfattribs_loaderz*SubclassProcessor.simple_dxfattribs_loader;  s    X ,,T__=,00!$!4!4 	C"388,D$$T__S-A&*SXXsyy9	r6   r8   )r   r   r   r   )r   N)r   r   r!   r   rp   r   )r   rl   rp   Optional[Tags])r   r   rp   r   )r   r   r3   r   rY   r   rp   r   )r   r   r   zdict[int, Union[str, list]]r   zUnion[int, str, Tags]rp   r   )rp   r   )r   r   r   zdict[int, str]rp   r   )rL   r   r   r   r5   r   r)   r   r   r   r   r   r   r   r   r6   r4   r   r     s    G , " "  $	" 	
 
	!	/2	=@			$ W W  8W  (	W  
W r*445C4	4r6   r   r   color
paperspace
lineweightltscale	invisible
true_color
color_nametransparencyshadow_modematerial_handlevisualstyle_handleplotstyle_enumplotstyle_handle)      >   C   ir  0   <   i  i  i  i  i[  i\  i|  i  c                    t               }| D ]b  }t        j                  |j                        }|r.|j	                  |      s|j                  ||j                         R|j                  |       d |S r8   )r   GRAPHIC_ATTRIBUTES_TO_RECOVERrU   r+   rv   r   r*   r   )r   r   r   r2   attrib_names        r4   r   r     se    v )377A s{{;7GGK+##C() r6   )r   r   r   r   rp   r   )+
__future__r   typingr   r   r   r   r   r	   loggingr   r   r
   ezdxf.lldxfr   ezdxf.lldxf.attributesr   r   r   ezdxf.lldxf.typesr   r   ezdxf.lldxf.tagsr   ezdxf.lldxf.extendedtagsr   ezdxf.entitiesr   ezdxf.lldxf.tagwriterr   __all__	getLoggerrj   r[   rw   rr   	frozensetr   r   r   r   r  r   r   r6   r4   <module>r     s    # E E     @ @ 0 !5(7 .
/			7	#C >  $$	   >? \ \~
 $ f fT 									! *
r6   