diff --git a/python/mujoco/codegen/generate_spec_bindings.py b/python/mujoco/codegen/generate_spec_bindings.py index bb52643d..1db57b3c 100644 --- a/python/mujoco/codegen/generate_spec_bindings.py +++ b/python/mujoco/codegen/generate_spec_bindings.py @@ -84,6 +84,7 @@ def _value_binding_code( fulltype = fulltype.replace('mjOption', 'raw::MjOption') fulltype = fulltype.replace('mjVisual', 'raw::MjVisual') fulltype = fulltype.replace('mjStatistic', 'raw::MjStatistic') + element = '.element' if fullvarname == 'plugin' else '' def_property_args = ( f'"{varname}"', @@ -91,7 +92,7 @@ def _value_binding_code( return self.{fullvarname}; }}""", f"""[]({rawclassname}& self, {fulltype} {varname}) {{ - self.{fullvarname} = {varname}; + self.{fullvarname}{element} = {varname}{element}; }}""", ) diff --git a/python/mujoco/specs.cc b/python/mujoco/specs.cc index ec444f52..313de159 100644 --- a/python/mujoco/specs.cc +++ b/python/mujoco/specs.cc @@ -483,6 +483,13 @@ PYBIND11_MODULE(_specs, m) { py::arg("suffix") = py::none(), py::arg("site") = py::none(), py::arg("frame") = py::none(), py::return_value_policy::reference_internal); + mjSpec.def( + "activate_plugin", + [](MjSpec& self, std::string& name) { + mjs_activatePlugin(self.ptr, name.c_str()); + }, + py::arg("name"), + py::return_value_policy::reference_internal); // ============================= MJSBODY ===================================== mjsBody.def( diff --git a/python/mujoco/specs_test.py b/python/mujoco/specs_test.py index bfefd71f..1b46bd4b 100644 --- a/python/mujoco/specs_test.py +++ b/python/mujoco/specs_test.py @@ -835,22 +835,19 @@ class SpecsTest(absltest.TestCase): self.assertEqual(model.nsensor, 9) def test_plugin(self): - xml = """ - - - - - - """ - - spec = mujoco.MjSpec.from_string(xml) - self.assertIsNotNone(spec.worldbody) + spec = mujoco.MjSpec() + spec.activate_plugin('mujoco.elasticity.cable') + plugin = spec.add_plugin( + name='instance_name', + plugin_name='mujoco.elasticity.cable', + active=True, + info='info', + ) body = spec.worldbody.add_body() + body.plugin = plugin body.plugin.plugin_name = 'mujoco.elasticity.cable' - body.plugin.id = spec.add_plugin() body.plugin.active = True - self.assertEqual(body.plugin.id, 0) geom = body.add_geom() geom.type = mujoco.mjtGeom.mjGEOM_BOX