Ë
    £èhŽQ  ã                  óþ   — 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© ó    ú+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   € ä�D—K‘KÓ Ð rœ   c                óH   — | j                   r| j                   j                  S y r£   )rµ   r´   rÂ   s    r�   r´   zAuditor.entitydb�   s   € à�8Š8Ø—8‘8×$Ñ$Ð$àrœ   c                ó,   — t        | j                  «      S )z;Returns ``True`` if any unrecoverable errors were detected.)Úboolr¹   rÂ   s    r�   Ú
has_errorszAuditor.has_errors—   s   € ô �D—K‘KÓ Ð 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   € ô �D—J‘JÓÐ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   € ØÐ! f§o¢oØ ˜ 9¨T¨F°%¼¸F»°}ÀAÐFÐFà ˜ 9¨T¨F°"Ð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àˆ>Ü—Z‘ZˆFäˆv‹;˜!ÒØ�L‰LÐ=Õ>à�L‰LœC ›K˜=Ð(:Ð;Ô<Ü )¨&Ö 1‘��uØ—‘™Z¨°©	°5·:±:¸u¿|¹|ÓLÈtÑSÔTØ—‘˜U U§]¡]Ñ2°VÑ;Õ<ñ !2rœ   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   € ØÐ! f§o¢oØ ˜ 9¨T¨F°+¼cÀ&»k¸]È!ÐLÐLà ˜ 9¨T¨F°(Ð;Ð;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¨   € ò	<ð ˆ>Ü—Z‘ZˆFäˆt�z‰z‹?˜aÒØ�L‰LÐ/Õ0à�L‰LœC §
¡
›OÐ,Ð,>Ð?Ô@Ü )¨$¯*©*Ö 5‘��uØ—‘™Z¨°©	°5·:±:¸u¿|¹|ÓLÈtÑSÔTØ—‘˜U U§]¡]Ñ2°VÑ;Õ<ñ !6rœ   c                óR   — | j                   j                  t        ||||«      «       y r£   )r¹   Úappendr¡   r¨   s        r�   Ú	add_errorzAuditor.add_errorÓ   s!   € ð 	�‰×Ñœ: d¨G°ZÀÓFÕGrœ   c                óR   — | j                   j                  t        ||||«      «       y r£   )rº   rì   r¡   r¨   s        r�   Úfixed_errorzAuditor.fixed_errorÜ   s!   € ð 	�
‰
×Ñœ* T¨7°JÀÓEÕFrœ   c                ój   — | j                   D �cg c]  }|j                  |v sŒ|‘Œ c}| _         yc c}w )z¥Remove 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,   € ð '+§k¢kÓG¡k˜s°S·X±XÀÒ5F’s kÑ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    € Ø×ÒØ�N‰N× Ñ Õ"ð 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Ð!>Ø�N‰N×Ñ˜vŸz™z×0Ñ0Õ1à�N‰NÕ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¥   € Ø—8‘8×$Ñ$ˆØ×ÑÓ Ò-Ø�N‰NÜ×.Ñ.ð*Ü*-¨h«-¨¸ð;ôð
 Ø�<‰<×Ñ˜GÓ$¨Ò+Ø!$ˆH�L‰LÔØ×ÑÜ×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%  s^   € Ø—8‘8×$Ñ$ˆØ×ÑÓ Ò-Øß.ˆDØ˜8Ò#Ø—‘Ü#×DÑDØ6°t°fÐ=Ø'ð õ ñ /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=   € Ø�h‰h×!Ñ!Ó#ˆØ�|Š|Ø�N‰NÜ×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   € ð	Ø—X‘X×+Ñ+Ó-ˆFð ˆ>˜VŸ_™_°Ñ5Ø�N‰NÜ×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  sh   € ð
 �X‰X×ÑˆØˆŒ	ð !#ˆÔØ—i‘i–kˆ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º   € ð �x‰x˜6Ÿ:™:Ñ%ÐLÐ'LÓLÐ%Ø�z‰z×!Ñ! *Ô-ØÜ×+Ñ+¨F¯J©J×,?Ñ,?Ó@ˆàÐ-Ñ-Øà˜4Ÿ8™8×-Ñ-Ñ-à�J‰J×Ñ˜zÔ*Ø×ÑÜ×2Ñ2Ø5°h°Z¸tÄCÈÃ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¢   € à�x‰x˜6Ÿ:™:Ñ%ÐLÐ'LÓLÐ%Ø�z‰z×!Ñ! 'Ô*ØØ—
‘
× Ñ ˆØ˜Ÿ™Ÿ™Ñ'à�J‰J×Ñ˜wÔ'Ø×ÑÜ×4Ñ4Ø8¸¸¸wÄsÈ6Ã{ÀmÐSTÐ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    € à�x‰x˜6Ÿ:™:Ñ%ÐLÐ'LÓLÐ%Ø�z‰z×!Ñ! *Ô-ØØ—:‘:×&Ñ&ˆØ˜4Ÿ8™8×-Ñ-Ñ-à",ˆF�J‰JÔØ×ÑÜ×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   € à�z‰z×ÑˆÜ×,Ñ,¨TÔ2à�N‰NÜ×2Ñ2Ø.¨t¨f°E¼#¸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   € Ø—
‘
× Ñ ˆð �1Š9˜ šØ�J‰J×Ñ˜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Ó$DˆF�J‰JÔ!Ø×ÑÜ×2Ñ2Ø6´s¸6³{°mÀ1Ð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�  € Ø�x‰x˜6Ÿ:™:Ñ%ÐLÐ'LÓLÐ%Ø�z‰z×!Ñ! 'Ô*ØØ�h‰hˆØ—z‘z×'Ñ'ˆØ—‘—‘ ¨#Ó.ˆØ˜3Òà˜×.Ñ.Ò.°&·.±.Ó2BÀgÒ2MØØ˜sŸ|™|Ò+Ø˜×.Ñ.Ò.Ø#&�—
‘
Ô Ø× Ñ Ü#×8Ñ8ØAÄ#ÀfÃ+ÀÈaÐPð !õ ð —‘Ó! WÒ,Ø—z‘z—~‘~ f¨iÓ8�Ø#&�—
‘
Ô Ø× Ñ Ü#×8Ñ8Ø=¸d¸VÀ7ÐKð !õ ð
 × Ñ Ü#×8Ñ8Ø&¤s¨6£{ mð 4Ø+˜n¨Að/ð !ô ð
 —
‘
˜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Ø�J‰J×Ñ˜{Ô+Ø×ÑÜ×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   € Ø—
‘
×'Ñ'ˆØˆ=ØÜ×(Ñ(¨Ô/Ø�J‰J×Ñ˜~Ô.Ø×ÑÜ×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ø  sl   € Ü+¨D¯H©HÓ5ˆØ—X‘X—_”_ˆEØ×'Ñ'¨¯
©
Õ3Ø—‘Ü#×AÑAðØ#Ÿj™j˜\¨ð-à$×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ó$ò"#ó
ó,ó ó"
óóó5óBó
ô	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'   € Ø—:‘:—>‘>ˆŒØ×.Ñ.¨s¯z©zÓ:ˆ�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	  st   € ØˆÛˆEàCHÇ;Á;ÈxÔCXóÙCX¸�—‘˜Ÿ™Ÿ™¨°Ó3Õ4ÐCXð ð ð ,3ˆF�4—8‘8˜EŸJ™JÓ'Ò(ð	 ð
 ˆùò	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  sd   ø€ ðØŸ+™+ dÑ+�ð �K‰K˜ÔÛ�Ø˜‘9ÙÙ˜1•XÙð	 ð
 �H‰HŒJØøô ò Ùðús   ƒA Á	AÁA)rj  )r©   Ú
block_namerw  rx  s   ` @@r�   r`  zBlockCycleDetector.has_cycle  s(   ú€ ö	ð  ˆØ—X‘X˜jÓ)ˆ
Ù�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 )zÜSetup 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^   € ð �?Š?ÜÐ.Ó/Ð/ð ‡z�z×ÑÐ$¬W×-=Ñ-=¸fÀcÔ-JÜÐEÓFÐFä�c‹l€GØ
‡L�L�ÔØ€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œ   