feat: unify CAD workflows on DesignIR 3.0

This commit is contained in:
Jerry
2026-07-28 14:41:26 +08:00
parent 6e33bc0e11
commit b5738e9109
36 changed files with 9690 additions and 1305 deletions
@@ -31,6 +31,41 @@ class DesignIRPipelineTests(unittest.TestCase):
self.assertEqual(1, result["facts"]["solid_count"])
self.assertGreater(result["facts"]["volume_mm3"], 30_000)
def test_legacy_model_migrates_to_semantic_designir_3(self) -> None:
migrated = MODULE.migrate_designir_2_to_3(self.payload())
self.assertEqual("3.0", migrated["schema_version"])
self.assertEqual(
"fully_semantic_parametric", migrated["reconstruction_mode"]
)
self.assertIn(
"outer_radius", migrated["edit_interface"]["semantic_parameters"]
)
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary) / "flange.step"
result = MODULE.compile_designir(migrated, output)
self.assertEqual(1, result["facts"]["solid_count"])
def test_generated_step_materializes_hybrid_surface_snapshot(self) -> None:
migrated = MODULE.migrate_designir_2_to_3(self.payload())
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary) / "flange.step"
MODULE.compile_designir(migrated, output)
hybrid = MODULE.materialize_hybrid_designir(migrated, output)
self.assertEqual(
"hybrid_semantic_surface_parametric",
hybrid["reconstruction_mode"],
)
self.assertTrue(hybrid["surface_layer"]["solids"])
self.assertTrue(
hybrid["compiled_surface_provenance"][
"semantic_layer_authoritative"
]
)
self.assertTrue(MODULE.anti_cheat(hybrid)["valid"])
rebuilt = Path(temporary) / "hybrid-rebuilt.step"
MODULE.compile_designir(hybrid, rebuilt)
self.assertTrue(rebuilt.is_file())
def test_teacher_dependency_is_rejected(self) -> None:
payload = self.payload()
payload["source_step"] = "teacher.step"
@@ -48,6 +83,51 @@ class DesignIRPipelineTests(unittest.TestCase):
self.assertGreater(result["facts"]["volume_mm3"], 30_000)
self.assertTrue(Path(result["model_json"]).is_file())
def test_arbitrary_axis_geometric_center_preserves_pose(self) -> None:
payload = self.payload()
payload["family"] = "axis_aligned_cylinder"
payload["parameters"] = {
"outer_radius": {"value": 10, "unit": "mm", "editable": True},
"overall_length": {"value": 400, "unit": "mm", "editable": True},
}
payload["expressions"] = {}
payload["features"] = [
{
"id": "main_body",
"operation": "extrude_circle",
"radius": {"parameter": "outer_radius"},
"height": {"parameter": "overall_length"},
"axis": [0, -1, 0],
"center": [7, 11, 13],
"anchor": "geometric_center",
}
]
payload["edit_interface"] = {
"editable_parameters": ["outer_radius", "overall_length"],
"preserved_interfaces": ["part_center", "primary_axis"],
}
payload["validation_contract"]["perturbations"] = [
{
"parameter": "outer_radius",
"scale": 1.1,
"expected_change": "radius",
"preserve": ["overall_length", "part_center"],
},
{
"parameter": "overall_length",
"scale": 1.1,
"expected_change": "length",
"preserve": ["outer_radius", "part_center"],
},
]
shape = MODULE.build_shape(payload)
bounds = shape.bounding_box()
self.assertAlmostEqual(-189, bounds.min.Y, places=6)
self.assertAlmostEqual(211, bounds.max.Y, places=6)
self.assertAlmostEqual(7, shape.center(MODULE.CenterOf.MASS).X, places=6)
self.assertAlmostEqual(11, shape.center(MODULE.CenterOf.MASS).Y, places=6)
self.assertAlmostEqual(13, shape.center(MODULE.CenterOf.MASS).Z, places=6)
def test_embedded_mesh_is_rejected(self) -> None:
payload = self.payload()
payload["features"][0]["mesh"] = {"vertices": [[0, 0, 0]]}
@@ -97,6 +177,10 @@ class DesignIRPipelineTests(unittest.TestCase):
json.dumps(
{
"model_id": f"case-{index}",
"teacher_sha256": f"teacher-{index}",
"applied_experience_ids": [
"reconstruction.flange.primary"
],
"next_state": "replay_validated",
}
),
@@ -107,6 +191,10 @@ class DesignIRPipelineTests(unittest.TestCase):
reports, ROOT / "config" / "promotion-policy.json"
)
self.assertTrue(result["eligible"])
self.assertEqual(
["reconstruction.flange.primary"],
result["validated_experience_ids"],
)
self.assertEqual("promoted", result["next_state"])