Files
pdf2cad/tests/test_dxf_writer.py
2026-03-03 21:24:02 +00:00

107 lines
3.6 KiB
Python

"""Tests for DXF 3D writer."""
import pytest
import ezdxf
from pathlib import Path
from pdf2imos.output.dxf_writer import write_dxf
from pdf2imos.models import PartGeometry
@pytest.fixture
def test_part():
return PartGeometry(
width_mm=600.0,
height_mm=720.0,
depth_mm=18.0,
origin=(0.0, 0.0, 0.0),
name="test_panel",
)
@pytest.fixture
def output_dxf(tmp_path):
return tmp_path / "test_panel.dxf"
class TestWriteDxf:
def test_returns_path(self, test_part, output_dxf):
result = write_dxf(test_part, output_dxf)
assert isinstance(result, Path)
def test_file_created(self, test_part, output_dxf):
write_dxf(test_part, output_dxf)
assert output_dxf.exists()
def test_dxf_audit_clean(self, test_part, output_dxf):
"""Generated DXF must pass audit with no errors."""
write_dxf(test_part, output_dxf)
doc = ezdxf.readfile(str(output_dxf))
auditor = doc.audit()
assert len(auditor.errors) == 0, f"DXF audit errors: {auditor.errors}"
def test_mesh_entity_present(self, test_part, output_dxf):
"""Modelspace must contain at least one MESH entity."""
write_dxf(test_part, output_dxf)
doc = ezdxf.readfile(str(output_dxf))
msp = doc.modelspace()
meshes = list(msp.query("MESH"))
assert len(meshes) >= 1, "No MESH entity found in modelspace"
def test_layers_created(self, test_part, output_dxf):
"""Required layers must exist."""
write_dxf(test_part, output_dxf)
doc = ezdxf.readfile(str(output_dxf))
layer_names = {layer.dxf.name for layer in doc.layers}
assert "GEOMETRY" in layer_names, "GEOMETRY layer missing"
assert "DIMENSIONS" in layer_names, "DIMENSIONS layer missing"
assert "ANNOTATIONS" in layer_names, "ANNOTATIONS layer missing"
def test_bounding_box_matches_dimensions(self, test_part, output_dxf):
"""Mesh bounding box should match part dimensions within tolerance."""
write_dxf(test_part, output_dxf)
doc = ezdxf.readfile(str(output_dxf))
msp = doc.modelspace()
meshes = list(msp.query("MESH"))
assert len(meshes) >= 1
# Get mesh vertices and compute bounding box
mesh = meshes[0]
vertices = list(mesh.vertices)
if not vertices:
pytest.skip("No vertices in mesh")
xs = [v[0] for v in vertices]
ys = [v[1] for v in vertices]
zs = [v[2] for v in vertices]
width_actual = max(xs) - min(xs)
depth_actual = max(ys) - min(ys)
height_actual = max(zs) - min(zs)
assert abs(width_actual - test_part.width_mm) < 0.01, (
f"Width mismatch: {width_actual} vs {test_part.width_mm}"
)
assert abs(height_actual - test_part.height_mm) < 0.01, (
f"Height mismatch: {height_actual} vs {test_part.height_mm}"
)
assert abs(depth_actual - test_part.depth_mm) < 0.01, (
f"Depth mismatch: {depth_actual} vs {test_part.depth_mm}"
)
def test_different_part_sizes(self, tmp_path):
"""Test various part sizes."""
for w, h, d in [(300, 200, 15), (1200, 800, 18), (600, 720, 400)]:
part = PartGeometry(
width_mm=float(w),
height_mm=float(h),
depth_mm=float(d),
origin=(0.0, 0.0, 0.0),
name=f"part_{w}x{h}x{d}",
)
output = tmp_path / f"part_{w}x{h}x{d}.dxf"
write_dxf(part, output)
doc = ezdxf.readfile(str(output))
assert len(doc.audit().errors) == 0