45 lines
2.6 KiB
Python
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))
|