Add convenient plugin assignment in Python bindings.

PiperOrigin-RevId: 861168536
Change-Id: I274fbf3460d475434f837ab58bf5e2b0988369fd
This commit is contained in:
Alessio Quaglino
2026-01-26 06:36:56 -08:00
committed by Copybara-Service
parent bdb553ff8a
commit 54ace777c1
2 changed files with 31 additions and 4 deletions
@@ -93,16 +93,26 @@ 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 ''
element = ''
if field.name == 'mjsPlugin':
setter = f"""[]({rawclassname}& self, {fulltype} {varname}) {{
if (self.{fullvarname}.name && {varname}.name) *self.{fullvarname}.name = *{varname}.name;
if (self.{fullvarname}.plugin_name && {varname}.plugin_name) *self.{fullvarname}.plugin_name = *{varname}.plugin_name;
self.{fullvarname}.active = {varname}.active;
if (self.{fullvarname}.info && {varname}.info) *self.{fullvarname}.info = *{varname}.info;
}}"""
else:
setter = f"""[]({rawclassname}& self, {fulltype} {varname}) {{
self.{fullvarname}{element} = {varname}{element};
}}"""
def_property_args = (
f'"{varname}"',
f"""[]({rawclassname}& self) -> {fulltype} {{
return self.{fullvarname};
}}""",
f"""[]({rawclassname}& self, {fulltype} {varname}) {{
self.{fullvarname}{element} = {varname}{element};
}}""",
setter,
)
if field.name not in SCALAR_TYPES:
+17
View File
@@ -996,6 +996,23 @@ class SpecsTest(absltest.TestCase):
self.assertIsNotNone(model)
self.assertEqual(model.nplugin, 0)
def testPluginAssignment(self):
spec = mujoco.MjSpec()
body = spec.worldbody.add_body()
body.name = 'test_body'
plugin = spec.add_plugin(
name='test_instance', plugin_name='mujoco.elasticity.cable', active=True
)
plugin.config = {'twist': '1e2', 'bend': '4e1'}
# Assignment should copy active flag and names
body.plugin = plugin
self.assertTrue(body.plugin.active)
self.assertEqual(body.plugin.name, 'test_instance')
self.assertEqual(body.plugin.plugin_name, 'mujoco.elasticity.cable')
def test_access_option_stat_visual(self):
spec = mujoco.MjSpec.from_string("""
<mujoco model="MuJoCo Model">