Add optional kwarg inputs to mjSpec Python bindings for mjSpec add constructors.

PiperOrigin-RevId: 675929024
Change-Id: Idd8c584276d8f585b79585230f5167f79760eaef
This commit is contained in:
Taylor Howell
2024-09-18 04:00:52 -07:00
committed by Copybara-Service
parent 4975c35657
commit bfda9f4ace
3 changed files with 205 additions and 120 deletions
+61 -22
View File
@@ -232,15 +232,33 @@ def generate() -> None:
print(code)
def generate_body_add() -> None:
"""Generate add functions for bodies."""
for key in [
'mjsSite',
'mjsGeom',
'mjsJoint',
'mjsLight',
'mjsCamera',
'mjsBody',
def generate_add() -> None:
"""Generate add constructors with optional keyword arguments."""
for key, parent, default in [
('mjsSite', 'Body', True),
('mjsGeom', 'Body', True),
('mjsJoint', 'Body', True),
('mjsLight', 'Body', True),
('mjsCamera', 'Body', True),
('mjsBody', 'Body', True),
('mjsFrame', 'Body', True),
('mjsMaterial', 'Spec', True),
('mjsMesh', 'Spec', True),
('mjsPair', 'Spec', True),
('mjsEquality', 'Spec', True),
('mjsTendon', 'Spec', True),
('mjsActuator', 'Spec', True),
('mjsSkin', 'Spec', False),
('mjsTexture', 'Spec', False),
('mjsText', 'Spec', False),
('mjsTuple', 'Spec', False),
('mjsFlex', 'Spec', False),
('mjsHField', 'Spec', False),
('mjsKey', 'Spec', False),
('mjsNumeric', 'Spec', False),
('mjsExclude', 'Spec', False),
('mjsSensor', 'Spec', False),
('mjsPlugin', 'Spec', False),
]:
def _field(f: ast_nodes.StructFieldDecl):
@@ -262,11 +280,9 @@ def generate_body_add() -> None:
return f'set_vec("{f.name}", out->{f.name});', 'vec', f.name
elif isinstance(f.type, ast_nodes.ArrayType):
return (
(
f'set_array("{f.name}", out->{f.name},'
f' {f.type.extents[0]});'
),
'array', f.name
f'set_array("{f.name}", out->{f.name}, {f.type.extents[0]});',
'array',
f.name,
)
elif isinstance(f.type, ast_nodes.ValueType):
return f'set_value("{f.name}", out->{f.name});', 'value', f.name
@@ -289,10 +305,33 @@ def generate_body_add() -> None:
titlecase = 'Mjs' + elem
# function definition and call to mjs_add_
code = f"""
mjsBody.def("add_{elemlower}", [](raw::MjsBody& self, raw::MjsDefault* default_, py::kwargs kwargs) -> raw::{titlecase}* {{
auto out = mjs_add{elem}(&self, default_);
"""
if parent == 'Spec':
if default:
code = f"""
{'mj' + parent}.def("add_{elemlower}", []({'Mj' + parent}& self,
raw::MjsDefault* default_, py::kwargs kwargs) -> raw::{titlecase}* {{
auto out = mjs_add{elem}(self.ptr, default_);
"""
else:
code = f"""
{'mj' + parent}.def("add_{elemlower}", []({'Mj' + parent}& self, py::kwargs kwargs) -> raw::{titlecase}* {{
auto out = mjs_add{elem}(self.ptr);
"""
elif parent == 'Body':
if key == 'mjsFrame':
code = f"""
{'mjs' + parent}.def("add_{elemlower}", []({'raw::Mjs' + parent}& self,
raw::MjsFrame* parentframe_, py::kwargs kwargs) -> raw::{titlecase}* {{
auto out = mjs_add{elem}(&self, parentframe_);
"""
else:
code = f"""
{'mjs' + parent}.def("add_{elemlower}", []({'raw::Mjs' + parent}& self,
raw::MjsDefault* default_, py::kwargs kwargs) -> raw::{titlecase}* {{
auto out = mjs_add{elem}(&self, default_);
"""
else:
raise NotImplementedError(f'{parent} parent is not implement.')
# check for valid kwargs
code += '\n std::set<std::string> valid_kwargs = {'
@@ -381,10 +420,10 @@ def generate_body_add() -> None:
"""
code += code_field
code += """\n
code += f"""\n
return out;
},
py::arg_v("default", nullptr),
}},
{'py::arg_v("default", nullptr),' if default else ''}
py::return_value_policy::reference_internal);
"""
@@ -395,7 +434,7 @@ def main(argv: Sequence[str]) -> None:
if len(argv) > 1:
raise app.UsageError('Too many command-line arguments.')
generate()
generate_body_add()
generate_add()
if __name__ == '__main__':