
    hSO                    
   S SK Jr  S SKJrJrJrJrJrJr  S SK	r	S SK
Jr  S SKJrJr  S SKJrJr  S SKJr  \(       a  S SKJr  S S	KJr  S S
KJr  / SQr " S S\5      rSr " S S5      r " S S5      r " S S5      rSS jrg)    )annotations)TYPE_CHECKINGIterableTextIOAnyOptionalCallableN)IntEnum)const	validator)factory	DXFEntity)NULLVEC)Drawing)
DXFGraphic)BlocksSection)Auditor
AuditErrorauditBlockCycleDetectorc                     \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr Sr!S r"S!r#S"r$S#r%S$r&S%r'S&r(S'r)S(r*S)r+S*r,S+r-S,r.S-r/S.r0S/r1S0r2S1r3S2r4S3r5S4r6S5r7S6r8S7r9S8r:S9r;S:r<S;r=S<r>S=r?S>r@S?rAS@rBSArCSBrDgC)Dr                              	   
                           d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w                                                                                  N)E__name__
__module____qualname____firstlineno__ 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__static_attributes__rY       =/var/www/html/env/lib/python3.13/site-packages/ezdxf/audit.pyr   r      s   '($!" O  !"# "%'"!#')$/1,)+& #O$'!*-'! /2,N  #& !$   #  #"'*$ #),&%("&)#"%*-'!$"%r   r   )
ACAD_GROUPACAD_PLOTSTYLENAMEc                  6    \ rS rSr   S       SS jjrSrg)
ErrorEntryr.   Nc                4    Xl         X0l        X l        X@l        g N)codeentitymessagedataselfr   r   
dxf_entityr   s        r   __init__ErrorEntry.__init__h   s     	+5#	r   )r   r   r   r    NN)r   intr   strr   Optional[DXFEntity]r   r   )rZ   r[   r\   r]   r   r   rY   r   r   r   r   g   s=     *.

 
 (	

 
 
r   r   c                     \ rS rSrS(S jrS)S jrS*S jrS+S jrS,S jr\	S 5       r
\	S+S j5       r\	S+S	 j5       r\	S+S
 j5       r  S-     S.S jjrS/S0S jjr   S1         S2S jjr   S1         S2S jjrS3S jrS4S jrS rS5S jr\	S+S j5       rS6S jrS+S jrS)S jrS)S jrS)S jrS)S jrS)S jrS rS5S jrS5S jr S7S jr!S5S  jr"S7S! jr#S7S" jr$S5S# jr%S5S$ jr&S5S% jr'S)S& jr(S'r)g)8r   r<   c                    Ub  UR                   b  UR                  c   eXl        UR                   R                  R                  U l        / U l        / U l        UR                  R                  5       U l	        / U l
        g r   )rootdictentitydbdocdxfhandle_rootdict_handleerrorsfixesnew_trashcan	_trashcan_post_audit_jobsr   r   s     r   r   Auditor.__init__v   sf    3<<#;@XXX # 0 0 7 7(*')
224:<r   c                    U R                   R                  5         U R                  R                  5         U R                  5         g r   )r   clearr   empty_trashcanr   s    r   resetAuditor.reset   s.    

r   c                ,    [        U R                  5      $ )z Returns count of unfixed errors.)lenr   r   s    r   __len__Auditor.__len__   s    4;;r   c                (    U R                  5       S:  $ )z-Returns ``True`` if any unfixed errors exist.r   )r   r   s    r   __bool__Auditor.__bool__   s    ||~!!r   c                ,    [        U R                  5      $ )z Iterate over all unfixed errors.)iterr   r   s    r   __iter__Auditor.__iter__   s    DKK  r   c                R    U R                   (       a  U R                   R                  $ g r   )r   r   r   s    r   r   Auditor.entitydb   s    8888$$$r   c                ,    [        U R                  5      $ )z;Returns ``True`` if any unrecoverable errors were detected.)boolr   r   s    r   
has_errorsAuditor.has_errors   s     DKK  r   c                ,    [        U R                  5      $ )zEReturns ``True`` if any recoverable errors were fixed while auditing.)r   r   r   s    r   	has_fixesAuditor.has_fixes   s     DJJr   c                @    U R                   =(       d    U R                  $ )z=Returns ``True`` if the DXF document has any errors or fixes.)r   r   r   s    r   
has_issuesAuditor.has_issues   s     ~~00r   Nc                   S nUc  U R                   nO[        U5      nUc  [        R                  n[	        U5      S:X  a  UR                  S5        g UR                  [	        U5       S35        [        U5       HY  u  pEUR                  U" US-   UR                  UR                  5      S-   5        UR                  SUR                  -   S-   5        M[     g )	Nc                f    Ub&  UR                   (       a  U S SU S[        U5       S3$ U S SU S3$ )N4dz	. Error [z] in .z].is_aliver   countr   r   s      r   
entity_str.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_reportAuditor.print_error_report   s    
	6 >[[F&\F>ZZFv;!LL=>LLCK=(:;< )& 1Z	5::u||LtSTUU]]2V;< !2r   c                   S nUc  [         R                  n[        U R                  5      S:X  a  UR	                  S5        g UR	                  [        U R                  5       S35        [        U R                  5       HY  u  p4UR	                  U" US-   UR                  UR                  5      S-   5        UR	                  SUR                  -   S-   5        M[     g )	Nc                f    Ub&  UR                   (       a  U S SU S[        U5       S3$ U S SU S3$ )Nr   z	. Issue [z] fixed in r   z] fixed.r   r   s      r   r   .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_errorsAuditor.print_fixed_errors   s    	< >ZZFtzz?aLL/0LLC

O,,>?@ )$** 5Z	5::u||LtSTUU]]2V;< !6r   c                N    U R                   R                  [        XX45      5        g r   )r   appendr   r   s        r   	add_errorAuditor.add_error   s     	:dZFGr   c                N    U R                   R                  [        XX45      5        g r   )r   r   r   r   s        r   fixed_errorAuditor.fixed_error   s     	

*TJEFr   c                t    U R                    Vs/ s H  o"R                  U;   d  M  UPM     snU l         gs  snf )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   purgeAuditor.purge   s*     '+kkGksXX5FskGGs   55c                   U R                  5       (       d  U R                  $ U R                  R                  R	                  U 5        U R                  5         U R                  5         U R                  5         U R                  5         U R                  R                  R	                  U 5        U R                  R                  R	                  U 5        U R                  R                  R	                  U 5        U R                  R                  R	                  U 5        U R                  5         U R                  5         U R                  5         U R                  R                  R!                  5         U R                  $ 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   runAuditor.run   s   ##%%;;%$$&##%&&(t$d#d#t$((*))+ {{r   c                \    U R                   (       a  U R                  R                  5         g g r   )has_trashcanr   r   r   s    r   r   Auditor.empty_trashcan  s     NN  " r   c                    Ub  UR                   (       d  g U R                  (       aG  UR                  R                  b0  U R                  R                  UR                  R                  5        g UR                  5         g r   )r   r  r   r   r   adddestroyr   r   s     r   trashAuditor.trash  sN    >!2!2!>NNvzz001NNr   c                    U R                   S L$ r   )r   r   s    r   r  Auditor.has_trashcan  s    ~~T))r   c                :    U R                   R                  U5        g r   )r   r   )r   jobs     r   add_post_audit_jobAuditor.add_post_audit_job  s    $$S)r   c                j   U R                   R                  nUR                  5       S:w  a.  U R                  [        R
                  S[        U5       S35        gUR                  R                  S5      S:w  a<  SUR                  l	        U R                  [        R                  S[        U5       S3S9  g	)
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   rl   r   r   getr'  r  r   )r   r   s     r   r	  Auditor.check_root_dict  s    88$$-NN..**-h-;
 <<G$+!$HLL44=c(m_AN   r   c                    U R                   R                  nUR                  5       S:w  a  g [         H,  nX!;  d  M
  U R	                  [
        R                  SU 3US9  M.     g )Nr&  zMissing rootdict entry: r   r   r   )r   r   r+  REQUIRED_ROOT_DICT_ENTRIESr   r   r^   )r   r   names      r   r
  Auditor.check_root_dict_entries%  s\    88$$-.D##DD6tf='   /r   c                    U R                   R                  5       nUR                  (       d  U R                  [        R
                  SS9  g g )Nz%Required modelspace layout not found.r*  )r   
modelspacer   r   r   rn   )r   msps     r   r  Auditor.check_modelspace_exist1  s=    hh!!#||NN44?   r   c                     U R                   R                  5       nUb  UR                  SL a  U R                  [        R                  SS9  g g ! [        R                   a    S n NJf = f)NFz,Required active paperspace layout not found.r*  )r   active_layoutr   DXFStructureErrorr   r   r   ro   )r   layouts     r   r  !Auditor.check_active_layout_exist9  si    	XX++-F >V__5NNBBF   6 && 	F	s   A A'&A'c                   U R                   R                  nUR                  R                  U 5        UR                  R                  U 5        UR
                  R                  U 5        UR                  R                  U 5        UR                  R                  U 5        UR                  R                  U 5        UR                  R                  U 5        UR                  R                  U 5        UR                  R                  U 5        g r   )r   tables	viewportsr   	linetypeslayersstylesviewsucsappids	dimstylesblock_records)r   table_sections     r   r  Auditor.check_tablesE  s    %%d+%%d+""4(""4(!!$'%""4(%%d+##))$/r   c                   U R                   R                  nSUl        / U l        UR	                  5        H'  nUR
                  (       d  M  UR                  U 5        M)     SUl        U R                  5         U R                  5         g)z1Audit all entities stored in the entity database.TFN)	r   r   lockedr   valuesr   r   r   exec_post_audit_jobs)r   dbr   s      r   r  #Auditor.audit_all_database_entitiesQ  sj    
 XX	 !#iikFT" " 	!!#r   c                F    U R                    H
  nU" 5         M     / U l         g r   )r   )r   calls     r   rL  Auditor.exec_post_audit_jobsb  s    ))DF * "r   c           	        U R                   UR                   L d   S5       eUR                  R                  S5      (       d  g[        R                  " UR                  R
                  5      nUS;   a  gX R                   R                  ;  aK  UR                  R                  S5        U R                  [        R                  SU S[        U5       3UUS9  gg)zdCheck 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_keyrT  r?  discardr  r   rp   r   )r   r   rT  s      r   check_entity_linetypeAuditor.check_entity_linetypeg  s     xx6::%L'LL%zz!!*--++FJJ,?,?@--88---JJz*225hZtCK=Q!	   .r   c           	     |   U R                   UR                   L d   S5       eUR                  R                  S5      (       d  gUR                  R                  nX R                   R                  ;  aL  UR                  R                  S5        U R                  [        R                  SU S[        U5       S3UUS9  gg)z)Check for usage of undefined text styles.rS  styleNzRemoved undefined text style "z" from r   rW  )
r   r   rX  r^  rA  rZ  r  r   rr   r   )r   r   r^  s      r   check_text_styleAuditor.check_text_style}  s    xx6::%L'LL%zz!!'**

  'JJw'448ws6{mSTU!	   (r   c           	     h   U R                   UR                   L d   S5       eUR                  R                  S5      (       d  gUR                  R                  nX R                   R                  ;  aB  SUR                  l        U R                  [        R                  SU S[        U5       S3UUS9  gg)	z.Check for usage of undefined dimension styles.rS  dimstyleNStandardzReplaced undefined dimstyle "" in z by "Standard".rW  )	r   r   rX  rb  rE  r  r   rq   r   )r   r   rb  s      r   check_dimension_styleAuditor.check_dimension_style  s    xx6::%L'LL%zz!!*--::&&88---",FJJ997zv;-0!   .r   c           	         UR                   R                  n[        R                  " U5      (       d0  U R	                  [
        R                  SU S[        U5       3UUS9  gg)z5Check layer names for invalid characters: <>/":;?*|='zInvalid layer name "rd  rW  N)r   layerr   is_valid_layer_namer   r   r   r   )r   r   r1  s      r   check_for_valid_layer_name"Auditor.check_for_valid_layer_name  s[    zz,,T22NN22.tfE#f+G!	   3r   c                    UR                   R                  nUS:  d  US:  aI  UR                   R                  S5        U R                  [        R
                  S[        U5       S3UUS9  g g )Nr   i  colorzRemoved invalid color index of r   rW  )r   rm  rZ  r  r   r   r   )r   r   rm  s      r   check_entity_color_index Auditor.check_entity_color_index  si    

   19JJw'339#f+aH!	   $r   c                    UR                   R                  nU[        R                  ;  aR  [        R
                  " U5      UR                   l        U R                  [        R                  S[        U5       S3US9  g g )NzFixed invalid lineweight of r   r/  )
r   
lineweightr   VALID_DXF_LINEWEIGHT_VALUESr   fix_lineweightr  r   r   r   )r   r   weights      r   check_entity_lineweightAuditor.check_entity_lineweight  sj    &&:::$-$<$<V$DFJJ!226s6{m1E!   ;r   c                   U R                   UR                   L d   S5       eUR                  R                  S5      (       d  g U R                   nUR                  R                  nUR                  R	                  SS5      nUS:X  a$  X@R
                  :X  d  UR                  5       S:X  a  g X2R                  ;  Ga	  X@R
                  :X  a=  SUR                  l        U R                  [        R                  S[        U5       S3S9  g UR                  5       S:X  aP  UR                  R	                  S	S
5      nSUR                  l        U R                  [        R                  SU S3S9  g U R                  [        R                  S[        U5       SU S3S9  U R                  UR                  R	                  U5      5        g g )NrS  r'  r   r(  TABLEr)  r   r*  r1  UNKNOWNzFixed invalid owner handle for z table.zDeleted z# entity with invalid owner handle #)r   r   rX  r'  r,  r   r+  r   r  r   r   r   r  )r   r   r   owner_handler   r1  s         r   check_owner_existAuditor.check_owner_exist  s   xx6::%L'LL%zz!!'**hhzz''#.3...&..2Bg2M||+...#&

   #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                    [         R                  " UR                  R                  5      (       aH  UR                  R	                  S5        U R                  [        R                  S[        U5       S3US9  g g )N	extrusionz#Fixed extrusion vector for entity: r   r/  )	r   iscloser   r~  rZ  r  r   r   r   r  s     r   check_extrusion_vectorAuditor.check_extrusion_vector  sa    ??6:://00JJ{+88=c&k]!L!   1r   c                    UR                   R                  nUc  g [        R                  " U5      (       dH  UR                   R	                  S5        U R                  [        R                  S[        U5       S3US9  g g )Ntransparencyz'Fixed invalid transparency for entity: r   r/  )	r   r  r   is_transparencyrZ  r  r   r   r   )r   r   values      r   check_transparencyAuditor.check_transparency  sp    

''=((//JJ~.44A#f+aP!   0r   c                   [        U R                  5      nU R                  R                   H\  nUR                  UR                  5      (       d  M%  U R                  [        R                  SUR                   S3UR                  S9  M^     g )Nz1Invalid block reference cycle detected in block "z".r/  )	r   r   r  	has_cycler1  r   r   rt   block_record)r   cycle_detectorblocks      r   r  $Auditor.check_block_reference_cycles  so    +DHH5XX__E''

33#AA#jj\-$11	   %r   )r   r   r   r   r   r   )r   r   returnNone)r  r  )r  r   )r  r   )r  zIterable[ErrorEntry])NN)r   zOptional[list[ErrorEntry]]r   Optional[TextIO]r  r  r   )r   r  r  r  r   )
r   r   r   r   r   r   r   r   r  r  )r  zset[int])r  zlist[ErrorEntry])r   r   r  r  )r"  r	   )r   r   r  r  )*rZ   r[   r\   r]   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  rL  r[  r_  re  rj  rn  ru  r{  r  r  r  r   rY   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                  2    \ rS rSrSS jrSS jrS	S jrSrg)
r   i  c                z    UR                   R                  U l        U R                  UR                   5      U l         g r   )r  key_build_block_ledgerr   s     r   r   BlockCycleDetector.__init__  s'    ::>>..szz:r   c           
         0 nU Hi  nUR                  S5       Vs1 s H-  o@R                  UR                  R                  SS5      5      iM/     nnXRU R                  UR                  5      '   Mk     U$ s  snf )NINSERTr1  r   )queryr  r   r,  r1  )r   r  ledgerr  insertinsertss         r   r  &BlockCycleDetector._build_block_ledger	  sp    ECH;;xCXCX34CX   ,3488EJJ'(	 
 	s   4A4c                N   ^ ^^ UUU 4S jm/ mT R                  U5      nT" U5      $ )Nc                   >  TR                   U    nTR                  U 5        U H  nUT;   a    gT" U5      (       d  M    g   TR                  5         g! [         a     gf = f)NFT)r  KeyErrorr   pop)r1  r  ncheckpathr   s      r   r  +BlockCycleDetector.has_cycle.<locals>.check  sf    ++d+ KK91XX	 
 HHJ  s   A 
A! A!)r  )r   
block_namer  r  s   ` @@r   r  BlockCycleDetector.has_cycle  s(    	  XXj)
Z  r   )r  r  N)r   r   )r  r   r  zdict[str, set[str]])r  r   r  r   )rZ   r[   r\   r]   r   r  r  r   rY   r   r   r   r     s    ;!r   r   c                    U R                   (       d  [        S5      eU R                  R                  b&  [        R
                  " X5      (       d  [        S5      e[        U5      nU R                  U5        U$ )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-=-=f-J-JEFFclG
LLNr   )r   r   r   r   r  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   r0  r   r   r   r   rY   r   r   <module>r     sx    #    ( - &)3 CF FR B  L L^!! !!Hr   