Add mjs_getCompiler C API and compiler property to Python spec elements.
PiperOrigin-RevId: 881488083 Change-Id: I3aa1c0562bf2fd27057b8056048e3156fc1b067c
This commit is contained in:
committed by
Copybara-Service
parent
d6aac2041e
commit
6890e133c0
@@ -947,6 +947,24 @@ def generate_name() -> None:
|
||||
print(code)
|
||||
|
||||
|
||||
def generate_compiler() -> None:
|
||||
"""Generate compiler property for all spec element types."""
|
||||
for key, _, _, _, _ in SPECS:
|
||||
elem = key.removeprefix('mjs')
|
||||
titlecase = 'Mjs' + elem
|
||||
code = f"""\n
|
||||
{key}.def_property_readonly("compiler",
|
||||
[](raw::{titlecase}& self) -> raw::MjsCompiler& {{
|
||||
::mjsCompiler* compiler = mjs_getCompiler(self.element);
|
||||
if (!compiler) {{
|
||||
throw pybind11::value_error("Element is not attached to a spec.");
|
||||
}}
|
||||
return *compiler;
|
||||
}}, py::return_value_policy::reference_internal);
|
||||
"""
|
||||
print(code)
|
||||
|
||||
|
||||
def main(argv: Sequence[str]) -> None:
|
||||
if len(argv) > 1:
|
||||
raise app.UsageError('Too many command-line arguments.')
|
||||
@@ -956,6 +974,7 @@ def main(argv: Sequence[str]) -> None:
|
||||
generate_signature()
|
||||
generate_id()
|
||||
generate_name()
|
||||
generate_compiler()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -10823,6 +10823,22 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
|
||||
),
|
||||
doc='Get spec from body.',
|
||||
)),
|
||||
('mjs_getCompiler',
|
||||
FunctionDecl(
|
||||
name='mjs_getCompiler',
|
||||
return_type=PointerType(
|
||||
inner_type=ValueType(name='mjsCompiler'),
|
||||
),
|
||||
parameters=(
|
||||
FunctionParameterDecl(
|
||||
name='element',
|
||||
type=PointerType(
|
||||
inner_type=ValueType(name='mjsElement'),
|
||||
),
|
||||
),
|
||||
),
|
||||
doc="Get compiler associated with element's origin spec.",
|
||||
)),
|
||||
('mjs_findSpec',
|
||||
FunctionDecl(
|
||||
name='mjs_findSpec',
|
||||
|
||||
@@ -1188,6 +1188,36 @@ class SpecsTest(absltest.TestCase):
|
||||
model = parent.compile()
|
||||
np.testing.assert_almost_equal(model.body_quat[1], [1, 0, 0, 0])
|
||||
|
||||
def test_compiler_from_element(self):
|
||||
child = mujoco.MjSpec()
|
||||
child.meshdir = '/child/meshes'
|
||||
child.texturedir = '/child/textures'
|
||||
child_body = child.worldbody.add_body()
|
||||
child_geom = child_body.add_geom()
|
||||
child_geom.size[0] = 1
|
||||
child_site = child_body.add_site()
|
||||
|
||||
parent = mujoco.MjSpec()
|
||||
parent.meshdir = '/parent/meshes'
|
||||
parent.texturedir = '/parent/textures'
|
||||
parent_geom = parent.worldbody.add_geom()
|
||||
parent_geom.size[0] = 1
|
||||
parent_site = parent.worldbody.add_site()
|
||||
|
||||
self.assertEqual(parent_geom.compiler.meshdir, '/parent/meshes')
|
||||
self.assertEqual(parent_geom.compiler.texturedir, '/parent/textures')
|
||||
self.assertEqual(child_geom.compiler.meshdir, '/child/meshes')
|
||||
self.assertEqual(child_site.compiler.meshdir, '/child/meshes')
|
||||
|
||||
frame = parent.worldbody.add_frame()
|
||||
frame.attach_body(child_body, prefix='child-')
|
||||
|
||||
self.assertEqual(parent_geom.compiler.meshdir, '/parent/meshes')
|
||||
self.assertEqual(parent_site.compiler.meshdir, '/parent/meshes')
|
||||
self.assertEqual(child_geom.compiler.meshdir, '/child/meshes')
|
||||
self.assertEqual(child_geom.compiler.texturedir, '/child/textures')
|
||||
self.assertEqual(child_site.compiler.meshdir, '/child/meshes')
|
||||
|
||||
def test_attach_to_site(self):
|
||||
parent = mujoco.MjSpec()
|
||||
parent.assets = {'path/cube.obj': 'cube_content'}
|
||||
|
||||
Reference in New Issue
Block a user