def read(stream: BinaryIO, errors: str = 'surrogateescape') -> Tuple['Drawing', 'Auditor']: """ Read a DXF document from a binary-stream similar to :func:`ezdxf.read`, but this function will detect the text encoding automatically and repair as much flaws as possible, runs the required audit process afterwards and returns the DXF document and the :class:`Auditor`. Args: stream: data stream to load in binary read mode errors: specify decoding error handler - "surrogateescape" to preserve possible binary data (default) - "ignore" to use the replacement char U+FFFD "\ufffd" for invalid data - "strict" to raise an :class:`UnicodeDecodeError` exception for invalid data Raises: DXFStructureError: for invalid or corrupted DXF structures UnicodeDecodeError: if `errors` is "strict" and a decoding error occurs """ from ezdxf.document import Drawing recover_tool = Recover.run(stream, errors=errors) doc = Drawing() doc._load_section_dict(recover_tool.section_dict) auditor = Auditor(doc) for code, msg in recover_tool.errors: auditor.add_error(code, msg) for code, msg in recover_tool.fixes: auditor.fixed_error(code, msg) auditor.run() return doc, auditor
def test_audit_fix_invalid_root_dict_owner(): doc = ezdxf.new() rootdict = doc.rootdict auditor = Auditor(doc) rootdict.dxf.owner = "FF" # set invalid owner auditor.run() assert len(auditor.fixes) == 1 assert auditor.fixes[0].code == AuditError.INVALID_OWNER_HANDLE assert rootdict.dxf.owner == "0"
def audit(self) -> Auditor: """Checks document integrity and fixes all fixable problems, not fixable problems are stored in :attr:`Auditor.errors`. If you are messing around with internal structures, call this method before saving to be sure to export valid DXF documents, but be aware this is a long running task. """ auditor = Auditor(self) auditor.run() return auditor
def _load_and_audit_document(recover_tool) -> Tuple['Drawing', 'Auditor']: from ezdxf.document import Drawing doc = Drawing() doc._load_section_dict(recover_tool.section_dict) auditor = Auditor(doc) for code, msg in recover_tool.errors: auditor.add_error(code, msg) for code, msg in recover_tool.fixes: auditor.fixed_error(code, msg) auditor.run() return doc, auditor
def run(start): if start > 0: start -= 1 names = list(chain(glob.glob(DIR1), glob.glob(DIR2))) names = names[start:] count = 0 for filename in names: count += 1 print("processing: {}/{} file: {}".format(count + start, len(names) + start, filename)) doc = ezdxf.readfile(filename, legacy_mode=LEGACY_MODE) auditor = Auditor(doc) errors = list(auditor.filter_zero_pointers(auditor.run())) if len(errors): auditor.print_error_report(errors)