
    'jSO                       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dS )    )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@ZBdAS )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     E/DATA/AppData/hermes/venv/lib/python3.11/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dS )
ErrorEntry Ncodeintmessagestr
dxf_entityOptional[DXFEntity]datar   c                >    || _         || _        || _        || _        d S N)r   entityr   r   selfr   r   r   r   s        r   __init__zErrorEntry.__init__h   s$     	+5#			r   r   NN)r   r   r   r   r   r   r   r   )rX   rY   rZ   r   r   r   r   r   r   g   s8         *.
 
 
 
 
 
 
r   r   c                     e Zd ZdAdZdBdZdCdZdDd
ZdEdZed             Z	edDd            Z
edDd            ZedDd            Z	 	 dFdGdZdHdIdZ	 	 	 dJdKd Z	 	 	 dJdKd!ZdLd$ZdMd&Zd' ZdNd*ZedDd+            ZdOd.ZdDd/ZdBd0ZdBd1ZdBd2ZdBd3ZdBd4Zd5 ZdNd6ZdNd7ZdPd9Z dNd:Z!dPd;Z"dPd<Z#dNd=Z$dNd>Z%dNd?Z&dBd@Z'dS )Qr   docr   returnNonec                    ||j         |j        J || _        |j         j        j        | _        g | _        g | _        |j                                        | _	        g | _
        d S r   )rootdictentitydbr   dxfhandle_rootdict_handleerrorsfixesnew_trashcan	_trashcan_post_audit_jobsr   r   s     r   r   zAuditor.__init__v   sc    3<#;@X@XX # 0 7(*')
2244:<r   c                    | j                                          | j                                         |                                  d S r   )r   clearr   empty_trashcanr   s    r   resetzAuditor.reset   sB    
r   r   c                *    t          | j                  S )z Returns count of unfixed errors.)lenr   r   s    r   __len__zAuditor.__len__   s    4;r   boolc                2    |                                  dk    S )z-Returns ``True`` if any unfixed errors exist.r   )r   r   s    r   __bool__zAuditor.__bool__   s    ||~~!!r   Iterable[ErrorEntry]c                *    t          | j                  S )z Iterate over all unfixed errors.)iterr   r   s    r   __iter__zAuditor.__iter__   s    DK   r   c                ,    | j         r| j         j        S d S r   )r   r   r   s    r   r   zAuditor.entitydb   s    8 	8$$4r   c                *    t          | j                  S )z;Returns ``True`` if any unrecoverable errors were detected.)r   r   r   s    r   
has_errorszAuditor.has_errors   s     DK   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     DJr   c                    | j         p| 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   Nr   Optional[list[ErrorEntry]]streamOptional[TextIO]c                   d }|| j         }nt          |          }|t          j        }t	          |          dk    r|                    d           d S |                    t	          |           d           t          |          D ]U\  }}|                     ||dz   |j        |j                  dz              |                    d|j	        z   dz              Vd S )	Nc                X    | |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   sQ    !fo!FFFTFFFFFFF555T5555r   r   z No unrecoverable errors found.

z errors found.

r   
   

)
r   listsysstdoutr   write	enumerater   r   r   )r   r   r   r   r   errors         r   print_error_reportzAuditor.print_error_report   s    
	6 	6 	6 >[FF&\\F>ZFv;;!LL=>>>>>LLCKK;;;<<< )& 1 1 = =uZZ	5:u|LLtSTTTUU]2V;<<<<= =r   c                   d }|t           j        }t          | j                  dk    r|                    d           d S |                    t          | j                   d           t          | j                  D ]U\  }}|                     ||dz   |j        |j                  dz              |                    d|j        z   dz              Vd S )	Nc                X    | |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   sQ    !fo!LLLTLLc&kkLLLL;;;T;;;;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    	< 	< 	< >ZFtz??aLL/00000LLC
OO???@@@ )$* 5 5 = =uZZ	5:u|LLtSTTTUU]2V;<<<<= =r   r   r   r   r   r   r   r   r   c                Z    | j                             t          ||||                     d S r   )r   appendr   r   s        r   	add_errorzAuditor.add_error   s.     	:dGZFFGGGGGr   c                Z    | j                             t          ||||                     d S r   )r   r   r   r   s        r   fixed_errorzAuditor.fixed_error   s.     	
*T7JEEFFFFFr   codesset[int]c                8    fd| j         D             | _         dS )zRemove error messages defined by integer error `codes`.

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

        c                &    g | ]}|j         v |S r   )r   ).0errr   s     r   
<listcomp>z!Auditor.purge.<locals>.<listcomp>   s%    GGGsSX5F5Fs5F5F5Fr   N)r   )r   r   s    `r   purgezAuditor.purge   s'     HGGGdkGGGr   list[ErrorEntry]c                   |                                  s| j        S | 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   s6   ##%% 	;%%%$$&&&##%%%&&(((t$$$d###d###t$$$((***))+++   {r   c                J    | j         r| j                                         d S d S r   )has_trashcanr   r   r   s    r   r   zAuditor.empty_trashcan  s1     	#N  """""	# 	#r   r   r   c                    ||j         sd S | j        r2|j        j        &| j                            |j        j                   d S |                                 d S r   )r   r  r   r   r   adddestroyr   r   s     r   trashzAuditor.trash  s^    >>F 	!2!>Nvz011111NNr   c                    | j         d uS r   )r   r   s    r   r  zAuditor.has_trashcan  s    ~T))r   jobr	   c                :    | j                             |           d S r   )r   r   )r   r  s     r   add_post_audit_jobzAuditor.add_post_audit_job  s    $$S)))))r   c                l   | j         j        }|                                dk    r3|                     t          j        dt          |           d           dS |j                            d          dk    r>d|j        _	        | 
                    t          j        dt          |           d           d	S )
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    8$--NN.;*-h--; ; ;  
 5<G$$++!$HL4Nc(mmNNN     tr   c                    | j         j        }|                                dk    rd S t          D ]+}||vr%|                     t
          j        d| |           ,d S )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%  s|    8$--F. 	 	D8###D=t=='    	 	r   c                    | j                                         }|j        s#|                     t          j        d           d S d S )Nz%Required modelspace layout not found.r  )r   
modelspacer   r   r   rk   )r   msps     r   r  zAuditor.check_modelspace_exist1  sW    h!!##| 	NN4@      	 	r   c                    	 | j                                         }n# t          j        $ r d }Y nw xY w|	|j        du r#|                     t          j        d           d S d S )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  s    	X++--FF& 	 	 	FFF	 >V_55NNBG       65s    00c                   | j         j        }|j                            |            |j                            |            |j                            |            |j                            |            |j                            |            |j                            |            |j	                            |            |j
                            |            |j                            |            d S 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 | _        |                                D ]}|j        r|                    |            d|_        |                                  |                                  dS )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  s    
 X	 !#iikk 	# 	#F #T"""	!!#####r   c                <    | j         D ]} |             g | _         d S r   )r   )r   calls     r   r8  zAuditor.exec_post_audit_jobsb  s/    ) 	 	DDFFFF "r   c           	     v   | j         |j         u s
J d            |j                            d          sdS t          j        |j        j                  }|dv rdS || j         j        vrR|j                            d           |                     t          j
        d| dt          |           ||           dS dS )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_keyr>  r,  discardr   r   rm   r   )r   r   r>  s      r   check_entity_linetypezAuditor.check_entity_linetypeg  s     x6:%%%'L%%%z!!*-- 	F+FJ,?@@---F48---Jz***2QhQQCKKQQ!	       .-r   c           	     H   | j         |j         u s
J d            |j                            d          sdS |j        j        }|| j         j        vrS|j                            d           |                     t          j        d| dt          |           d||           dS dS )z)Check for usage of undefined text styles.r=  styleNzRemoved undefined text style "z" from r   rA  )
r   r   rB  rG  r.  rD  r   r   ro   r   )r   r   rG  s      r   check_text_stylezAuditor.check_text_style}  s    x6:%%%'L%%%z!!'** 	F
 ''Jw'''4UUUs6{{UUU!	       ('r   r   c           	     ,   | j         |j         u s
J d            |j                            d          sdS |j        j        }|| j         j        vrEd|j        _        |                     t          j        d| dt          |           d||           dS dS )	z.Check for usage of undefined dimension styles.r=  dimstyleNStandardzReplaced undefined dimstyle "" in z by "Standard".rA  )	r   r   rB  rJ  r2  r   r   rn   r   )r   r   rJ  s      r   check_dimension_stylezAuditor.check_dimension_style  s    x6:%%%'L%%%z!!*-- 	F:&48---",FJ90 0 0v;;0 0 0!       .-r   c           	         |j         j        }t          j        |          s8|                     t
          j        d| dt          |           ||           dS dS )z5Check layer names for invalid characters: <>/":;?*|='zInvalid layer name "rL  rA  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  ss    z,T22 	NN2GtGG#f++GG!	      	 	r   c                    |j         j        }|dk     s|dk    rP|j                             d           |                     t          j        dt          |           d||           d S d S )Nr   i  colorzRemoved invalid color index of r   rA  )r   rS  rD  r   r   r   r   )r   r   rS  s      r   check_entity_color_indexz Auditor.check_entity_color_index  s    
  199Jw'''3H#f++HHH!	       $r   c                    |j         j        }|t          j        vrSt	          j        |          |j         _        |                     t          j        dt          |           d|           d S d S )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  s{    &:::$-$<V$D$DFJ!2Es6{{EEE!       ;:r   c                ^   | j         |j         u s
J d            |j                            d          sd S | j         }|j        j        }|j                            dd          }|dk    r%|| j        k    s|                                dk    rd S ||j        vr|| j        k    r@d|j        _        |                     t          j
        dt          |           d           d S |                                dk    rN|j                            d	d
          }d|j        _        |                     t          j
        d| d           d S |                     t          j
        dt          |           d| d           |                     |j                            |                     d S d S )Nr=  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   rB  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   x6:%%%'L%%%z!!'** 	Fhz'#..3...&..2B2Bg2M2Ms|++...#&
   #8P#f++PPP !      !!W,,z~~fi88#&
   #8KdKKK !     
   #8/s6{{ / /+/ / / !   
 

3<++F3344444) ,+r   c                    t          j        |j        j                  rO|j                            d           |                     t          j        dt          |           d|           d S d S )N	extrusionz#Fixed extrusion vector for entity: r   r  )	r   iscloser   ra  rD  r   r   r   r   r  s     r   check_extrusion_vectorzAuditor.check_extrusion_vector  s}    ?6:/00 	J{+++8Lc&kkLLL!      	 	r   c                    |j         j        }|d S t          j        |          sO|j                             d           |                     t          j        dt          |           d|           d S d S )Ntransparencyz'Fixed invalid transparency for entity: r   r  )	r   re  r   is_transparencyrD  r   r   r   r   )r   r   values      r   check_transparencyzAuditor.check_transparency  s    
'=F(// 	J~...4P#f++PPP!      	 	r   c                    t          | j                  }| j        j        D ]L}|                    |j                  r0|                     t          j        d|j         d|j                   Md S )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  s    +DH55X_ 	 	E''
33 #A-#j- - -$1	    	 	r   )r   r   r   r   )r   r   )r   r   )r   r   )r   r   )NN)r   r   r   r   r   r   r   )r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r   r   )r   r   )r   r   r   r   )r  r	   )r   r   r   r   )(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  r8  rE  rH  rM  rQ  rT  rZ  r_  rc  rh  r	  r   r   r   r   r   u   sR       = = = =   
       " " " "! ! ! !   X ! ! ! X!       X  1 1 1 X1 .2#'= = = = =6= = = = =* *.H H H H H *.G G G G GH H H H   &# # #    * * * X** * * *   "
 
 
 
   
 
 
 

0 
0 
0 
0$ $ $ $"# # #
   ,       "
 
 
 
      5 5 5 5B   
 
 
 
	 	 	 	 	 	r   r   c                  &    e Zd ZddZddZddZdS )r   r   r   c                f    |j         j        | _        |                     |j                   | _         d S r   )r  key_build_block_ledgerr   s     r   r   zBlockCycleDetector.__init__  s(    :>..sz::r   r  r   r   dict[str, set[str]]c                     i }|D ]@} fd|                     d          D             }||                     |j                  <   A|S )Nc                l    h | ]0}                     |j                            d d                    1S )r!  r   )rq  r   r  )r   insertr   s     r   	<setcomp>z9BlockCycleDetector._build_block_ledger.<locals>.<setcomp>  sB       9?3344  r   INSERT)queryrq  r!  )r   r  ledgerrm  insertss   `    r   rr  z&BlockCycleDetector._build_block_ledger	  sm     	3 	3E   CH;;xCXCX  G ,3F488EJ''((r   
block_namer   r   c                Z      fdg                       |          } |          S )Nc                    	 j         |          }n# t          $ r Y dS w xY w                    |            |D ]}|v r dS  |          r dS                                  dS )NFT)r  KeyErrorr   pop)r!  r{  ncheckpathr   s      r   r  z+BlockCycleDetector.has_cycle.<locals>.check  s    +d+   uuKK    9944U1XX  44 HHJJJ5s    
)rq  )r   r|  r  r  s   ` @@r   rj  zBlockCycleDetector.has_cycle  sP    	 	 	 	 	 	 	  XXj))
uZ   r   N)r   r   )r  r   r   rs  )r|  r   r   r   )rX   rY   rZ   r   rr  rj  r   r   r   r   r     sP        ; ; ; ;   ! ! ! ! ! !r   r   r   r   r   r   r   c                    | j         st          d          | j        j        $t	          j        | |          st          d          t          |          }|                     |           |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.Nz*Entity is bound to different DXF document.)	r   	TypeErrorr   r   r   is_bound
ValueErrorr   r   )r   r   auditors      r   r   r   (  sm     ? 0./// z$W-=fc-J-J$EFFFcllG
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   r   r   r   r   r   r   r   r   <module>r     s   # " " " " "                


       ( ( ( ( ( ( ( ( - - - - - - - -       4&&&&&&))))))333333 C
B
BF F F F F F F FR B        L L L L L L L L^!! !! !! !! !! !! !! !!H     r   