Adds production-grade engineering features and tools: 2D GD&T (feature control frames + datum features) via engineering/gdt.py, ISO‑129 dimension tolerance support (engineering/tolerances.py) and an ezdxf/COM plumbing for toleranced dims, a scalar drawing score + invalidity ratio (engineering/scoring.py) wired into drawing_finalize, in-place entity editors (entity_edit_text/entity_edit_geometry), and a friendly drawing_settings facade. Includes server tool wiring, COM/ezdxf backend implementations, datum-consistency critique, many unit tests, README/CLAUDE/CHANGELOG updates, and a version bump to 1.2.0. Also corrects COM backend capability label (entities_2d).
109 lines
2.9 KiB
Python
109 lines
2.9 KiB
Python
"""Tests for ISO 129 dimension tolerances (engineering/tolerances.py + the
|
|
ezdxf dimension_* override plumbing)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from engineering.tolerances import build_dim_override
|
|
|
|
pytestmark = pytest.mark.asyncio
|
|
|
|
|
|
# ── pure: override builder ──────────────────────────────────────────────────
|
|
|
|
|
|
async def test_none_mode_is_empty():
|
|
override, text = build_dim_override(tol_mode="none")
|
|
assert override == {}
|
|
assert text is None
|
|
|
|
|
|
async def test_symmetric_sets_equal_tp_tm():
|
|
override, _ = build_dim_override(tol_upper=0.05, tol_mode="symmetric")
|
|
assert override["dimtol"] == 1
|
|
assert override["dimtp"] == 0.05
|
|
assert override["dimtm"] == 0.05
|
|
|
|
|
|
async def test_deviation_sets_distinct_tp_tm():
|
|
override, _ = build_dim_override(0.02, 0.01, "deviation")
|
|
assert override["dimtp"] == 0.02
|
|
assert override["dimtm"] == 0.01
|
|
assert override["dimtol"] == 1
|
|
|
|
|
|
async def test_limit_mode_sets_dimlim():
|
|
override, _ = build_dim_override(0.02, 0.01, "limit")
|
|
assert override["dimlim"] == 1
|
|
assert override["dimtol"] == 0
|
|
|
|
|
|
async def test_basic_mode_boxes_text():
|
|
override, _ = build_dim_override(tol_mode="basic")
|
|
assert override["dimgap"] < 0
|
|
|
|
|
|
async def test_text_override_passthrough():
|
|
_, text = build_dim_override(text_override="20 H7")
|
|
assert text == "20 H7"
|
|
|
|
|
|
async def test_bad_mode_and_missing_values_raise():
|
|
with pytest.raises(ValueError):
|
|
build_dim_override(tol_mode="wat")
|
|
with pytest.raises(ValueError):
|
|
build_dim_override(tol_mode="symmetric") # no tol_upper
|
|
with pytest.raises(ValueError):
|
|
build_dim_override(0.02, None, "deviation") # no tol_lower
|
|
|
|
|
|
# ── backend: toleranced dims are created without error ──────────────────────
|
|
|
|
|
|
async def test_linear_dim_with_symmetric_tolerance(backend):
|
|
await backend.drawing_apply_iso_layers("mech")
|
|
dim = await backend.dimension_linear(
|
|
0,
|
|
0,
|
|
100,
|
|
0,
|
|
50,
|
|
20,
|
|
layer="DIM",
|
|
tol_upper=0.05,
|
|
tol_mode="symmetric",
|
|
)
|
|
assert dim.handle
|
|
assert dim.type in ("DIMENSION", "DIMLINEAR")
|
|
|
|
|
|
async def test_diameter_dim_with_text_override(backend):
|
|
await backend.drawing_apply_iso_layers("mech")
|
|
c = await backend.entity_create_circle(0, 0, 10, layer="GEOMETRY")
|
|
assert c.handle
|
|
dim = await backend.dimension_diameter(
|
|
-10,
|
|
0,
|
|
10,
|
|
0,
|
|
layer="DIM",
|
|
text_override="<> H7",
|
|
)
|
|
assert dim.handle
|
|
|
|
|
|
async def test_radius_dim_with_deviation_tolerance(backend):
|
|
await backend.drawing_apply_iso_layers("mech")
|
|
dim = await backend.dimension_radius(
|
|
0,
|
|
0,
|
|
10,
|
|
0,
|
|
layer="DIM",
|
|
tol_upper=0.03,
|
|
tol_lower=0.01,
|
|
tol_mode="deviation",
|
|
)
|
|
assert dim.handle
|