
    OgSO                        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 erd dlmZ d d	lmZ d d
lmZ g dZ G d de      ZdZ G d d      Z G d d      Z G d d      ZddZy)    )annotations)TYPE_CHECKINGIterableTextIOAnyOptionalCallableN)IntEnum)const	validator)factory	DXFEntity)NULLVEC)Drawing)
DXFGraphic)BlocksSection)Auditor
AuditErrorauditBlockCycleDetectorc                     e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZByA)Br                           	   
                           d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w                                                                                 N)C__name__
__module____qualname__ MISSING_REQUIRED_ROOT_DICT_ENTRYDUPLICATE_TABLE_ENTRY_NAMEPOINTER_TARGET_NOT_EXISTTABLE_NOT_FOUNDMISSING_SECTION_TAGMISSING_SECTION_NAME_TAGMISSING_ENDSEC_TAGFOUND_TAG_OUTSIDE_SECTIONREMOVED_UNSUPPORTED_SECTIONREMOVED_UNSUPPORTED_TABLEREMOVED_INVALID_GRAPHIC_ENTITYREMOVED_INVALID_DXF_OBJECT REMOVED_STANDALONE_ATTRIB_ENTITYMISPLACED_ROOT_DICTROOT_DICT_NOT_FOUND(REMOVED_ENTITY_WITH_INVALID_OWNER_HANDLEMODELSPACE_NOT_FOUND"ACTIVE_PAPERSPACE_LAYOUT_NOT_FOUNDUNDEFINED_LINETYPEUNDEFINED_DIMENSION_STYLEUNDEFINED_TEXT_STYLEUNDEFINED_BLOCKINVALID_BLOCK_REFERENCE_CYCLEREMOVE_EMPTY_GROUP#GROUP_ENTITIES_IN_DIFFERENT_LAYOUTSMISSING_REQUIRED_SEQENDORPHANED_LAYOUT_ENTITY(ORPHANED_PAPER_SPACE_BLOCK_RECORD_ENTITYINVALID_TABLE_HANDLEDECODING_ERRORCREATED_MISSING_OBJECTRESET_MLINE_STYLEINVALID_GROUP_ENTITIESUNDEFINED_BLOCK_NAMEINVALID_INTEGER_VALUEINVALID_FLOATING_POINT_VALUEMISSING_PERSISTENT_REACTORBLOCK_NAME_MISMATCHINVALID_ENTITY_HANDLEINVALID_OWNER_HANDLEINVALID_LAYER_NAMEINVALID_COLOR_INDEXINVALID_LINEWEIGHTINVALID_MLINESTYLE_HANDLEINVALID_DIMSTYLEINVALID_EXTRUSION_VECTORINVALID_MAJOR_AXISINVALID_VERTEX_COUNTINVALID_DICTIONARY_ENTRYINVALID_CHARACTERINVALID_MLINE_VERTEX INVALID_MLINESTYLE_ELEMENT_COUNTINVALID_SPLINE_DEFINITION"INVALID_SPLINE_CONTROL_POINT_COUNTINVALID_SPLINE_FIT_POINT_COUNTINVALID_SPLINE_KNOT_VALUE_COUNTINVALID_SPLINE_WEIGHT_COUNT#INVALID_DIMENSION_GEOMETRY_LOCATIONINVALID_TRANSPARENCYINVALID_CREASE_VALUE_COUNTINVALID_ELLIPSE_RATIOINVALID_HATCH_BOUNDARY_PATHTAG_ATTRIBUTE_MISSINGINVALID_MESH_DATA     P/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/audit.pyr   r      s   '($!" O  !"# "%'"!#')$/1,)+& #O$'!*-'! /2,N  #& !$   #  #"'*$ #),&%("&)#"%*-'!$"%r   r   )
ACAD_GROUPACAD_PLOTSTYLENAMEc                  *    e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZy)
ErrorEntryNc                <    || _         || _        || _        || _        y N)codeentitymessagedataselfr   r   
dxf_entityr   s        r   __init__zErrorEntry.__init__h   s      	+5#	r    NN)r   intr   strr   Optional[DXFEntity]r   r   )rX   rY   rZ   r   r   r   r   r   r   g   s8     *.

 
 (	

 
r   r   c                     e Zd Zd&dZd'dZd(dZd)dZd*dZed        Z	ed)d       Z
ed)d       Zed)d	       Z	 	 d+	 	 	 	 	 d,dZd-d.dZ	 	 	 d/	 	 	 	 	 	 	 	 	 d0dZ	 	 	 d/	 	 	 	 	 	 	 	 	 d0dZd1dZd2dZd Zd3dZed)d       Zd4dZd)dZd'dZd'dZd'dZd'dZd'dZd Zd3dZd3dZd5dZ d3dZ!d5d Z"d5d!Z#d3d"Z$d3d#Z%d3d$Z&d'd%Z'y
)6r   c                    ||j                   |j                  J || _        |j                   j                  j                  | _        g | _        g | _        |j                  j                         | _	        g | _
        y r   )rootdictentitydbdocdxfhandle_rootdict_handleerrorsfixesnew_trashcan	_trashcan_post_audit_jobsr   r   s     r   r   zAuditor.__init__v   sh    3<<#;@XXX # 0 0 7 7(*')
224:<r   c                    | j                   j                          | j                  j                          | j                          y r   )r   clearr   empty_trashcanr   s    r   resetzAuditor.reset   s.    

r   c                ,    t        | j                        S )z Returns count of unfixed errors.)lenr   r   s    r   __len__zAuditor.__len__   s    4;;r   c                (    | j                         dkD  S )z-Returns ``True`` if any unfixed errors exist.r   )r   r   s    r   __bool__zAuditor.__bool__   s    ||~!!r   c                ,    t        | j                        S )z Iterate over all unfixed errors.)iterr   r   s    r   __iter__zAuditor.__iter__   s    DKK  r   c                H    | j                   r| j                   j                  S y r   )r   r   r   s    r   r   zAuditor.entitydb   s    8888$$$r   c                ,    t        | j                        S )z;Returns ``True`` if any unrecoverable errors were detected.)boolr   r   s    r   
has_errorszAuditor.has_errors   s     DKK  r   c                ,    t        | j                        S )zEReturns ``True`` if any recoverable errors were fixed while auditing.)r   r   r   s    r   	has_fixeszAuditor.has_fixes   s     DJJr   c                6    | j                   xs | j                  S )z=Returns ``True`` if the DXF document has any errors or fixes.)r   r   r   s    r   
has_issueszAuditor.has_issues   s     ~~00r   Nc                   d }|| j                   }nt        |      }|t        j                  }t	        |      dk(  r|j                  d       y |j                  t	        |       d       t        |      D ]Y  \  }}|j                   ||dz   |j                  |j                        dz          |j                  d|j                  z   dz          [ y )	Nc                Z    |!|j                   r| dd| dt        |       dS | dd| dS )N4dz	. Error [z] in .z].is_aliver   countr   r   s      r   
entity_strz.Auditor.print_error_report.<locals>.entity_str   sB    !foo9TF%F}AFF9TF"55r   r   z No unrecoverable errors found.

z errors found.

r   
   

)
r   listsysstdoutr   write	enumerater   r   r   )r   r   streamr   r   errors         r   print_error_reportzAuditor.print_error_report   s    
	6 >[[F&\F>ZZFv;!LL=>LLCK=(:;< )& 1 =uZ	5::u||LtSTUU]]2V;<=r   c                   d }|t         j                  }t        | j                        dk(  r|j	                  d       y |j	                  t        | j                         d       t        | j                        D ]Y  \  }}|j	                   ||dz   |j                  |j                        dz          |j	                  d|j                  z   dz          [ y )	Nc                Z    |!|j                   r| dd| dt        |       dS | dd| dS )Nr   z	. Issue [z] fixed in r   z] fixed.r   r   s      r   r   z.Auditor.print_fixed_errors.<locals>.entity_str   sB    !foo9TF+c&k]!LL9TF(;;r   r   zNo issues fixed.

z issues fixed.

r   r   r   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r   r   s        r   print_fixed_errorszAuditor.print_fixed_errors   s    	< >ZZFtzz?aLL/0LLC

O,,>?@ )$** 5 =uZ	5::u||LtSTUU]]2V;<=r   c                R    | j                   j                  t        ||||             y r   )r   appendr   r   s        r   	add_errorzAuditor.add_error   s!     	:dGZFGr   c                R    | j                   j                  t        ||||             y r   )r   r   r   r   s        r   fixed_errorzAuditor.fixed_error   s!     	

*T7JEFr   c                j    | j                   D cg c]  }|j                  |v s| c}| _         yc c}w )zRemove error messages defined by integer error `codes`.

        This is useful to remove errors which are not important for a specific
        file usage.

        N)r   r   )r   codeserrs      r   purgezAuditor.purge   s(     '+kkGsSXX5FsGGs   00c                   | j                         s| j                  S | j                  j                  j	                  |        | j                          | j                          | j                          | j                          | j                  j                  j	                  |        | j                  j                  j	                  |        | j                  j                  j	                  |        | j                  j                  j	                  |        | j                          | j                          | j                          | j                  j                  j!                          | j                  S r   )check_root_dictr   r   r   r   check_root_dict_entriescheck_modelspace_existcheck_active_layout_existcheck_tablesobjectsblocksgroupslayoutsaudit_all_database_entitiescheck_block_reference_cyclesr   r   r   s    r   runzAuditor.run   s    ##%;;%$$&##%&&(t$d#d#t$((*))+ {{r   c                R    | j                   r| j                  j                          y y r   )has_trashcanr   r   r   s    r   r   zAuditor.empty_trashcan  s     NN  " r   c                    ||j                   sy | j                  rF|j                  j                  0| j                  j                  |j                  j                         y |j                          y r   )r   r  r   r   r   adddestroyr   r   s     r   trashzAuditor.trash  sN    >!2!2!>NNvzz001NNr   c                    | j                   d uS r   )r   r   s    r   r  zAuditor.has_trashcan  s    ~~T))r   c                :    | j                   j                  |       y r   )r   r   )r   jobs     r   add_post_audit_jobzAuditor.add_post_audit_job  s    $$S)r   c                l   | j                   j                  }|j                         dk7  r.| j                  t        j
                  dt        |       d       y|j                  j                  d      dk7  r?d|j                  _	        | j                  t        j                  dt        |       d       y	)
N
DICTIONARYz\Critical error - first object in OBJECTS section is not the expected root dictionary, found r   Fowner0#Fixed invalid owner handle in root r   r   T)r   r   dxftyper   r   ri   r   r   getr  r   r   )r   r   s     r   r   zAuditor.check_root_dict  s    88$$-NN..**-h-;
 <<G$+!$HLL44=c(m_AN   r   c                    | j                   j                  }|j                         dk7  ry t        D ],  }||vs| j	                  t
        j                  d| |       . y )Nr  zMissing rootdict entry: r   r   r   )r   r   r  REQUIRED_ROOT_DICT_ENTRIESr   r   r[   )r   r   names      r   r   zAuditor.check_root_dict_entries%  sc    88$$-. 	D8##DD6tf='  	r   c                    | j                   j                         }|j                  s"| j                  t        j
                  d       y y )Nz%Required modelspace layout not found.r  )r   
modelspacer   r   r   rk   )r   msps     r   r   zAuditor.check_modelspace_exist1  s=    hh!!#||NN44?   r   c                    	 | j                   j                         }||j                  du r"| j                  t        j                  d       y y # t        j                  $ r d }Y Jw xY w)NFz,Required active paperspace layout not found.r  )r   active_layoutr   DXFStructureErrorr   r   r   rl   )r   layouts     r   r   z!Auditor.check_active_layout_exist9  si    	XX++-F >V__5NNBBF   6 && 	F	s   A A'&A'c                   | j                   j                  }|j                  j                  |        |j                  j                  |        |j
                  j                  |        |j                  j                  |        |j                  j                  |        |j                  j                  |        |j                  j                  |        |j                  j                  |        |j                  j                  |        y r   )r   tables	viewportsr   	linetypeslayersstylesviewsucsappids	dimstylesblock_records)r   table_sections     r   r   zAuditor.check_tablesE  s    %%d+%%d+""4(""4(!!$'%""4(%%d+##))$/r   c                    | j                   j                  }d|_        g | _        |j	                         D ]   }|j
                  s|j                  |        " d|_        | j                          | j                          y)z1Audit all entities stored in the entity database.TFN)	r   r   lockedr   valuesr   r   r   exec_post_audit_jobs)r   dbr   s      r   r   z#Auditor.audit_all_database_entitiesQ  sm    
 XX	 !#iik 	#FT"	# 	!!#r   c                B    | j                   D ]	  } |         g | _         y r   )r   )r   calls     r   r.  zAuditor.exec_post_audit_jobsb  s$    )) 	DF	 "r   c           	        | j                   |j                   u sJ d       |j                  j                  d      syt        j                  |j                  j
                        }|dv ry|| j                   j                  vrN|j                  j                  d       | j                  t        j                  d| dt        |       ||       yy)ztCheck for usage of undefined line types. AutoCAD does not load
        DXF files with undefined line types.
        #Entity from different DXF document.linetypeN)bylayerbyblockzRemoved undefined linetype z in r   r   r   r   )r   r   hasattrr   make_table_keyr4  r"  discardr   r   rm   r   )r   r   r4  s      r   check_entity_linetypezAuditor.check_entity_linetypeg  s     xx6::%L'LL%zz!!*-++FJJ,?,?@--488---JJz*225hZtCK=Q!	   .r   c           	     t   | j                   |j                   u sJ d       |j                  j                  d      sy|j                  j                  }|| j                   j                  vrO|j                  j                  d       | j                  t        j                  d| dt        |       d||       yy)z)Check for usage of undefined text styles.r3  styleNzRemoved undefined text style "z" from r   r7  )
r   r   r8  r=  r$  r:  r   r   ro   r   )r   r   r=  s      r   check_text_stylezAuditor.check_text_style}  s    xx6::%L'LL%zz!!'*

  'JJw'448ws6{mSTU!	   (r   c           	     `   | j                   |j                   u sJ d       |j                  j                  d      sy|j                  j                  }|| j                   j                  vrEd|j                  _        | j                  t        j                  d| dt        |       d||       yy)	z.Check for usage of undefined dimension styles.r3  dimstyleNStandardzReplaced undefined dimstyle "" in z by "Standard".r7  )	r   r   r8  r@  r(  r   r   rn   r   )r   r   r@  s      r   check_dimension_stylezAuditor.check_dimension_style  s    xx6::%L'LL%zz!!*-::&&488---",FJJ997zv;-0!   .r   c           	         |j                   j                  }t        j                  |      s3| j	                  t
        j                  d| dt        |       ||       yy)z5Check layer names for invalid characters: <>/":;?*|='zInvalid layer name "rB  r7  N)r   layerr   is_valid_layer_namer   r   r   r   )r   r   r  s      r   check_for_valid_layer_namez"Auditor.check_for_valid_layer_name  sX    zz,,T2NN22.tfE#f+G!	   3r   c                    |j                   j                  }|dk  s|dkD  rL|j                   j                  d       | j                  t        j
                  dt        |       d||       y y )Nr   i  colorzRemoved invalid color index of r   r7  )r   rI  r:  r   r   r   r   )r   r   rI  s      r   check_entity_color_indexz Auditor.check_entity_color_index  si    

   19JJw'339#f+aH!	   $r   c                    |j                   j                  }|t        j                  vrTt	        j
                  |      |j                   _        | j                  t        j                  dt        |       d|       y y )NzFixed invalid lineweight of r   r  )
r   
lineweightr   VALID_DXF_LINEWEIGHT_VALUESr   fix_lineweightr   r   r   r   )r   r   weights      r   check_entity_lineweightzAuditor.check_entity_lineweight  sj    &&:::$-$<$<V$DFJJ!226s6{m1E!   ;r   c                   | j                   |j                   u sJ d       |j                  j                  d      sy | j                   }|j                  j                  }|j                  j	                  dd      }|dk(  r#|| j
                  k(  s|j                         dk(  ry ||j                  vr|| j
                  k(  r@d|j                  _        | j                  t        j                  dt        |       d       y |j                         dk(  rS|j                  j	                  d	d
      }d|j                  _        | j                  t        j                  d| d       y | j                  t        j                  dt        |       d| d       | j                  |j                  j	                  |             y y )Nr3  r  r   r  TABLEr  r   r  r  UNKNOWNzFixed invalid owner handle for z table.zDeleted z# entity with invalid owner handle #)r   r   r8  r  r  r   r  r   r   r   r   r   r  )r   r   r   owner_handler   r  s         r   check_owner_existzAuditor.check_owner_exist  s   xx6::%L'LL%zz!!'*hhzz''#.3...&..2Bg2Ms||+...#&

   #88A#f+aP !  !W,zz~~fi8#&

   #88=dV7K ! 
   #88&s6{m 4+nA/ ! 
 

3<<++F34) ,r   c                    t        j                  |j                  j                        rK|j                  j	                  d       | j                  t        j                  dt        |       d|       y y )N	extrusionz#Fixed extrusion vector for entity: r   r  )	r   iscloser   rW  r:  r   r   r   r   r  s     r   check_extrusion_vectorzAuditor.check_extrusion_vector  s^    ??6:://0JJ{+88=c&k]!L!   1r   c                    |j                   j                  }|y t        j                  |      sK|j                   j	                  d       | j                  t        j                  dt        |       d|       y y )Ntransparencyz'Fixed invalid transparency for entity: r   r  )	r   r[  r   is_transparencyr:  r   r   r   r   )r   r   values      r   check_transparencyzAuditor.check_transparency  sm    

''=((/JJ~.44A#f+aP!   0r   c                   t        | j                        }| j                  j                  D ]X  }|j                  |j                        s| j                  t        j                  d|j                   d|j                         Z y )Nz1Invalid block reference cycle detected in block "z".r  )	r   r   r   	has_cycler  r   r   rq   block_record)r   cycle_detectorblocks      r   r   z$Auditor.check_block_reference_cycles  sq    +DHH5XX__ 	E''

3#AA#jj\-$11	  	r   )r   r   returnNone)rd  re  )rd  r   )rd  r   )rd  zIterable[ErrorEntry])NN)r   zOptional[list[ErrorEntry]]r   Optional[TextIO]rd  re  r   )r   rf  rd  re  r   )
r   r   r   r   r   r   r   r   rd  re  )r   zset[int])rd  zlist[ErrorEntry])r   r   rd  re  )r
  r	   )r   r   rd  re  )(rX   rY   rZ   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   r   r   r.  r;  r>  rC  rG  rJ  rP  rU  rY  r^  r   r   r   r   r   r   u   s   =
 "!   ! !     1 1 .2#'=*= != 
	=6=* *.HH H (	H
 H 
H *.GG G (	G
 G 
GH&# * **"


0$"#
, "
5B
	r   r   c                  $    e Zd ZddZddZddZy)r   c                z    |j                   j                  | _        | j                  |j                         | _         y r   )r   key_build_block_ledgerr   s     r   r   zBlockCycleDetector.__init__  s'    ::>>..szz:r   c           
         i }|D ]g  }|j                  d      D ch c]-  }| j                  |j                  j                  dd            / }}||| j                  |j                        <   i |S c c}w )NINSERTr  r   )queryrj  r   r  r  )r   r   ledgerrc  insertinsertss         r   rk  z&BlockCycleDetector._build_block_ledger	  sv     	3ECH;;xCX9?34G  ,3F488EJJ'(		3
 	s   2A1c                L      fdg  j                  |      } |      S )Nc                    	 j                   |    }j                  |        |D ]  }|v r y |      s y j                          y# t        $ r Y yw xY w)NFT)r   KeyErrorr   pop)r  rq  ncheckpathr   s      r   rw  z+BlockCycleDetector.has_cycle.<locals>.check  si    ++d+ KK  91X	 
 HHJ  s   A 	AA)rj  )r   
block_namerw  rx  s   ` @@r   r`  zBlockCycleDetector.has_cycle  s(    	  XXj)
Z  r   N)r   r   )r   r   rd  zdict[str, set[str]])ry  r   rd  r   )rX   rY   rZ   r   rk  r`  r   r   r   r   r     s    ;!r   r   c                    | j                   st        d      | j                  j                  !t	        j
                  | |      st        d      t        |      }| j                  |       |S )zSetup an :class:`Auditor` object, run the audit process for `entity`
    and return result as :class:`Auditor` object.

    Args:
        entity: DXF entity to validate
        doc: bounded DXF document of `entity`

    zEntity is destroyed.z*Entity is bound to different DXF document.)	r   	TypeErrorr   r   r   is_bound
ValueErrorr   r   )r   r   auditors      r   r   r   (  s^     ??.// zz$W-=-=fc-JEFFclG
LLNr   )r   r   r   r   rd  r   ) 
__future__r   typingr   r   r   r   r   r	   r   enumr
   ezdxf.lldxfr   r   ezdxf.entitiesr   r   
ezdxf.mathr   ezdxf.documentr   r   ezdxf.sections.blocksr   __all__r   r  r   r   r   r   r   r   r   <module>r     sx    #    ( - &)3 CF FR B  L L^!! !!Hr   