from __future__ import annotations import tempfile import unittest from pathlib import Path from engine.cdsl_engine.runtime import rebuild_cdsl def _spline_profile(sketch_id: str, z: float) -> dict: return { "id": sketch_id, "workplane": {"origin_mm": [0, 0, z], "x_dir": [1, 0, 0], "normal": [0, 0, 1]}, "profile": { "type": "analytic_contours", "contours": [{ "role": "outer", "closed": True, "segments": [{ "type": "bspline", "start": [0, 0], "end": [0, 0], "points": [[0, 0], [20, 0], [25, 10], [15, 18], [0, 10], [0, 0]], }], }], }, } class LoftGeometryTests(unittest.TestCase): def test_open_bspline_segment_can_close_with_other_contour_edges(self): cdsl = { "schema": "cad.cdsl.llm.v1", "schema_version": "1.1.0", "kind": "part", "part_id": "open-bspline-contour", "meta": {"unit": "mm"}, "geometry": {"sketches": [{ "id": "profile", "workplane": {"origin_mm": [0, 0, 0], "x_dir": [1, 0, 0], "normal": [0, 0, 1]}, "profile": {"type": "analytic_contours", "contours": [{ "role": "outer", "closed": True, "segments": [ {"type": "line", "start": [0, 0], "end": [0, 10]}, { "type": "bspline", "start": [0, 10], "end": [0, 0], "points": [[0, 10], [4, 10], [4, 0], [0, 0]], }, ], }]}, }]}, "features": [{ "id": "add", "atomic_id": "extrude_add_blind", "depends_on": [], "sketch_id": "profile", "params": {"distance_mm": 5}, }], } with tempfile.TemporaryDirectory() as tmp: rebuilt = rebuild_cdsl(cdsl, Path(tmp) / "open-bspline-contour.step") self.assertGreater(rebuilt["volume_mm3"], 1.0) def test_bspline_loft_and_mirror_replay_produce_step(self): cdsl = { "schema": "cad.cdsl.llm.v1", "schema_version": "1.1.0", "kind": "part", "part_id": "bspline-loft-mirror", "meta": {"unit": "mm"}, "geometry": {"sketches": [_spline_profile("lower", 0), _spline_profile("upper", 20)]}, "features": [ { "id": "mirror_plane", "atomic_id": "reference_plane", "depends_on": [], "params": {"plane": {"origin_mm": [35, 0, 0], "x_dir": [0, 1, 0], "normal": [1, 0, 0]}}, "execution_status": "supported", }, { "id": "loft", "atomic_id": "loft_add", "depends_on": [], "params": {"profile_sketch_ids": ["lower", "upper"]}, "execution_status": "supported", }, { "id": "mirror", "atomic_id": "pattern_mirror", "depends_on": ["mirror_plane", "loft"], "params": { "source_feature_ids": ["loft"], "mirror_plane": { "kind": "plane", "owner_feature_id": "mirror_plane", "stable_id": "mirror-plane", "source": "runtime_snapshot", "confidence": 1.0, }, }, "selectors": [{ "kind": "plane", "owner_feature_id": "mirror_plane", "stable_id": "mirror-plane", "source": "runtime_snapshot", "confidence": 1.0, }], "execution_status": "supported", }, ], } with tempfile.TemporaryDirectory() as tmp: rebuilt = rebuild_cdsl(cdsl, Path(tmp) / "loft.step") self.assertGreater(rebuilt["volume_mm3"], 1.0) self.assertEqual(rebuilt["solid_count"], 2) self.assertEqual([item["feature_id"] for item in rebuilt["feature_results"]], ["mirror_plane", "loft", "mirror.m.loft", "mirror"]) if __name__ == "__main__": unittest.main()