Files
Pier_v1/도면작성/verify_dxf.py
T
2026-11-04 13:34:51 +09:00

45 lines
2.6 KiB
Python

"""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))