"""Round-trip CAD checks using the existing ground environment's ezdxf installation.""" import json from pathlib import Path import sys import ezdxf ROOT = Path(__file__).resolve().parent CACHE = ROOT / '.cache' path = Path(sys.argv[1]) if len(sys.argv) > 1 else CACHE / 'generated-general.dxf' doc = ezdxf.readfile(path) audit = doc.audit() dimensions = list(doc.modelspace().query('DIMENSION')) assert doc.units == 4, 'Model-space units must be mm' assert not audit.errors and not audit.fixes, 'DXF audit must not require repairs' assert dimensions, 'Native DIMENSION entities are required' assert all(d.dxf.geometry in doc.blocks for d in dimensions) assert all(e.has_xdata('PZ_GA') for e in doc.modelspace()), 'Source member linkage missing' paper = doc.layouts.get('Layout1') frames=list(paper.query('INSERT[name=="PZ_CXBLKA1"]')) assert len(frames)==1, 'Native title block insertion missing' frame=frames[0] assert len(frame.attribs)==38, 'Editable title block attributes missing' assert all(a.dxf.get('paperspace',0)==1 and a.dxf.owner in (paper.layout_key,frame.dxf.handle) for a in frame.attribs), 'Attribute paper-space ownership mismatch' assert len({a.dxf.tag for a in frame.attribs})==38, 'Duplicate title block tags' assert len(list(doc.blocks.get('PZ_CXBLKA1').query('ATTDEF')))==38 assert '_Dot' in doc.blocks, 'Reference dimension dot block missing' assert all(doc.dimstyles.get(d.dxf.dimstyle).dxf.dimblk=='_Dot' for d in dimensions) assert len(paper) > 100, 'Shortened general arrangement is missing from Layout1' assert all(e.has_xdata('PZ_GA') for e in paper), 'Paper member linkage missing' assert any(e.dxftype() == 'TEXT' and '교좌면' in e.dxf.text for e in paper), 'Bearing schedule missing' for layer in ['STRUCTURE', 'HIDDEN', 'CENTER', 'DIMENSION', 'TEXT', 'ELEVATION', 'BEARING', 'SECTION']: assert layer in doc.layers, layer delta = None if path.name == 'generated-general.dxf': expected = json.loads((CACHE / 'expected-dimensions.json').read_text()) assert len(dimensions) == len(expected) delta = max(abs(float(d.get_measurement()) - value) for d, value in zip(dimensions, expected)) assert delta < 1e-6, f'Native dimension measurement changed: {delta}' report = dict(file=path.name, units='mm', entities=len(doc.modelspace()), dimensions=len(dimensions), paper_entities=len(paper), audit_errors=len(audit.errors), audit_fixes=len(audit.fixes), max_dimension_delta_mm=delta) CACHE.mkdir(exist_ok=True) (CACHE / ('dxf-validation-' + path.stem + '.json')).write_text(json.dumps(report, indent=2), encoding='utf-8') print(json.dumps(report, indent=2))