Files
cadSet/designir-pipeline/tests/test_robot_description_export.py
T

79 lines
2.5 KiB
Python

from __future__ import annotations
import importlib.util
import tempfile
import unittest
from pathlib import Path
import xml.etree.ElementTree as ET
import zipfile
from build123d import Box, export_step
ROOT = Path(__file__).resolve().parents[1]
def load_module(name: str, path: Path):
spec = importlib.util.spec_from_file_location(name, path)
module = importlib.util.module_from_spec(spec)
assert spec.loader
spec.loader.exec_module(module)
return module
SURFACEIR = load_module(
"surfaceir_pipeline_robot_export_test",
ROOT / "scripts" / "surfaceir_pipeline.py",
)
ROBOT_EXPORT = load_module(
"robot_description_export_test",
ROOT / "scripts" / "robot_description_export.py",
)
class RobotDescriptionExportTests(unittest.TestCase):
def test_portable_urdf_and_mjcf_packages_rebuild_from_designir(self) -> None:
with tempfile.TemporaryDirectory() as temporary:
root = Path(temporary)
teacher = root / "teacher.step"
designir = root / "box.designir.json"
export_step(Box(10, 20, 30), teacher)
SURFACEIR.write_json(
designir,
SURFACEIR.extract_surfaceir(teacher),
)
teacher.unlink()
for output_format, description_suffix, xml_root in (
("urdf", ".urdf", "robot"),
("mjcf", ".mjcf.xml", "mujoco"),
):
result = ROBOT_EXPORT.export_robot_package(
designir,
root / output_format,
output_format,
)
package = Path(result["package"])
self.assertTrue(package.is_file())
with zipfile.ZipFile(package) as archive:
names = archive.namelist()
description = next(
name
for name in names
if name.endswith(description_suffix)
)
self.assertTrue(
any(name.startswith("meshes/") and name.endswith(".stl") for name in names)
)
self.assertIn("robot-export.json", names)
root_element = ET.fromstring(archive.read(description))
self.assertEqual(xml_root, root_element.tag)
self.assertEqual(
"static_single_link",
result["robot_structure"],
)
if __name__ == "__main__":
unittest.main()