feat: integrate SimpleCADAPI 2.0.2 CAD workflows
This commit is contained in:
@@ -6,7 +6,7 @@ import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from build123d import Plane, Rectangle
|
||||
from build123d import Align, Box, Plane, Rectangle, Sphere, export_step
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
@@ -29,6 +29,57 @@ DESIGNIR = load_module(
|
||||
|
||||
|
||||
class SurfaceIRPipelineTests(unittest.TestCase):
|
||||
def test_closed_single_face_sphere_roundtrip(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temporary:
|
||||
directory = Path(temporary)
|
||||
teacher = directory / "sphere.step"
|
||||
rebuilt_path = directory / "sphere-rebuilt.step"
|
||||
expected = Sphere(1)
|
||||
export_step(expected, teacher)
|
||||
|
||||
payload = SURFACEIR.extract_surfaceir(teacher)
|
||||
shell = payload["surface_layer"]["solids"][0]["shells"][0]
|
||||
self.assertEqual(1, len(shell["faces"]))
|
||||
|
||||
rebuilt = SURFACEIR.build_surfaceir(
|
||||
payload, "exact_3d_pcurve"
|
||||
)
|
||||
SURFACEIR.export_step_shape(rebuilt, rebuilt_path)
|
||||
actual = DESIGNIR.import_step(rebuilt_path)
|
||||
self.assertTrue(actual.is_valid)
|
||||
self.assertEqual(1, len(actual.solids()))
|
||||
self.assertAlmostEqual(expected.volume, actual.volume, places=9)
|
||||
|
||||
def test_multi_shell_solid_preserves_periodic_inner_shell(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temporary:
|
||||
directory = Path(temporary)
|
||||
teacher = directory / "cavity.step"
|
||||
rebuilt_path = directory / "cavity-rebuilt.step"
|
||||
expected = Box(
|
||||
10,
|
||||
10,
|
||||
10,
|
||||
align=(Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
) - Sphere(1)
|
||||
export_step(expected, teacher)
|
||||
|
||||
payload = SURFACEIR.extract_surfaceir(teacher)
|
||||
shells = payload["surface_layer"]["solids"][0]["shells"]
|
||||
self.assertEqual(2, len(shells))
|
||||
self.assertTrue(any(len(shell["faces"]) == 1 for shell in shells))
|
||||
|
||||
rebuilt = SURFACEIR.build_surfaceir(
|
||||
payload, "exact_3d_pcurve"
|
||||
)
|
||||
SURFACEIR.export_step_shape(rebuilt, rebuilt_path)
|
||||
actual = DESIGNIR.import_step(rebuilt_path)
|
||||
self.assertTrue(actual.is_valid)
|
||||
self.assertEqual(1, len(actual.solids()))
|
||||
self.assertEqual(2, len(actual.solids()[0].shells()))
|
||||
self.assertLess(
|
||||
abs(expected.volume - actual.volume) / expected.volume, 1e-10
|
||||
)
|
||||
|
||||
def test_independent_json_roundtrip_preserves_exact_geometry(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temporary:
|
||||
directory = Path(temporary)
|
||||
@@ -42,12 +93,27 @@ class SurfaceIRPipelineTests(unittest.TestCase):
|
||||
teacher.unlink()
|
||||
|
||||
serialized = portable_json.read_text(encoding="utf-8").lower()
|
||||
stored = json.loads(serialized)
|
||||
self.assertEqual(
|
||||
"gzip+base64+json",
|
||||
stored["surface_layer"]["encoding"],
|
||||
)
|
||||
self.assertEqual(
|
||||
"surfaceir-3.0",
|
||||
stored["surface_layer"]["format"],
|
||||
)
|
||||
self.assertNotIn("teacher.step", serialized)
|
||||
self.assertNotIn("source_path", serialized)
|
||||
self.assertNotIn("import_step", serialized)
|
||||
self.assertNotIn('"mesh"', serialized)
|
||||
|
||||
rebuilt_shape = SURFACEIR.build_surfaceir(surfaceir)
|
||||
decoded = SURFACEIR.read_designir(portable_json)
|
||||
self.assertEqual(surfaceir["surface_layer"], decoded["surface_layer"])
|
||||
self.assertIn(
|
||||
"overall_scale",
|
||||
decoded["edit_interface"]["semantic_parameters"],
|
||||
)
|
||||
rebuilt_shape = SURFACEIR.build_surfaceir(decoded)
|
||||
SURFACEIR.export_step_shape(rebuilt_shape, rebuilt)
|
||||
self.assertTrue(rebuilt.is_file())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user