Capture mjs_attach error message in the Python bindings.
PiperOrigin-RevId: 682409212 Change-Id: I391ee48626e7dcd985f65a231370ef5ec16124d7
This commit is contained in:
committed by
Copybara-Service
parent
3091665c16
commit
6e66cafe76
@@ -4126,6 +4126,15 @@ mjs_getSpec
|
|||||||
|
|
||||||
Get spec from body.
|
Get spec from body.
|
||||||
|
|
||||||
|
.. _mjs_getSpecFromFrame:
|
||||||
|
|
||||||
|
mjs_getSpecFromFrame
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. mujoco-include:: mjs_getSpecFromFrame
|
||||||
|
|
||||||
|
Get spec from frame.
|
||||||
|
|
||||||
.. _mjs_findBody:
|
.. _mjs_findBody:
|
||||||
|
|
||||||
mjs_findBody
|
mjs_findBody
|
||||||
|
|||||||
@@ -3590,6 +3590,7 @@ mjsSkin* mjs_addSkin(mjSpec* s);
|
|||||||
mjsTexture* mjs_addTexture(mjSpec* s);
|
mjsTexture* mjs_addTexture(mjSpec* s);
|
||||||
mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def);
|
mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def);
|
||||||
mjSpec* mjs_getSpec(mjsBody* body);
|
mjSpec* mjs_getSpec(mjsBody* body);
|
||||||
|
mjSpec* mjs_getSpecFromFrame(mjsFrame* frame);
|
||||||
mjsBody* mjs_findBody(mjSpec* s, const char* name);
|
mjsBody* mjs_findBody(mjSpec* s, const char* name);
|
||||||
mjsElement* mjs_findElement(mjSpec* s, mjtObj type, const char* name);
|
mjsElement* mjs_findElement(mjSpec* s, mjtObj type, const char* name);
|
||||||
mjsBody* mjs_findChild(mjsBody* body, const char* name);
|
mjsBody* mjs_findChild(mjsBody* body, const char* name);
|
||||||
|
|||||||
@@ -1526,6 +1526,9 @@ MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def);
|
|||||||
// Get spec from body.
|
// Get spec from body.
|
||||||
MJAPI mjSpec* mjs_getSpec(mjsBody* body);
|
MJAPI mjSpec* mjs_getSpec(mjsBody* body);
|
||||||
|
|
||||||
|
// Get spec from frame.
|
||||||
|
MJAPI mjSpec* mjs_getSpecFromFrame(mjsFrame* frame);
|
||||||
|
|
||||||
// Find body in spec by name.
|
// Find body in spec by name.
|
||||||
MJAPI mjsBody* mjs_findBody(mjSpec* s, const char* name);
|
MJAPI mjsBody* mjs_findBody(mjSpec* s, const char* name);
|
||||||
|
|
||||||
|
|||||||
@@ -9682,6 +9682,22 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
|
|||||||
),
|
),
|
||||||
doc='Get spec from body.',
|
doc='Get spec from body.',
|
||||||
)),
|
)),
|
||||||
|
('mjs_getSpecFromFrame',
|
||||||
|
FunctionDecl(
|
||||||
|
name='mjs_getSpecFromFrame',
|
||||||
|
return_type=PointerType(
|
||||||
|
inner_type=ValueType(name='mjSpec'),
|
||||||
|
),
|
||||||
|
parameters=(
|
||||||
|
FunctionParameterDecl(
|
||||||
|
name='frame',
|
||||||
|
type=PointerType(
|
||||||
|
inner_type=ValueType(name='mjsFrame'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
doc='Get spec from frame.',
|
||||||
|
)),
|
||||||
('mjs_findBody',
|
('mjs_findBody',
|
||||||
FunctionDecl(
|
FunctionDecl(
|
||||||
name='mjs_findBody',
|
name='mjs_findBody',
|
||||||
|
|||||||
+13
-2
@@ -563,7 +563,12 @@ PYBIND11_MODULE(_specs, m) {
|
|||||||
"attach_frame",
|
"attach_frame",
|
||||||
[](raw::MjsBody& self, raw::MjsFrame& frame, std::string& prefix,
|
[](raw::MjsBody& self, raw::MjsFrame& frame, std::string& prefix,
|
||||||
std::string& suffix) -> raw::MjsFrame* {
|
std::string& suffix) -> raw::MjsFrame* {
|
||||||
return mjs_attachFrame(&self, &frame, prefix.c_str(), suffix.c_str());
|
auto new_frame =
|
||||||
|
mjs_attachFrame(&self, &frame, prefix.c_str(), suffix.c_str());
|
||||||
|
if (!new_frame) {
|
||||||
|
throw pybind11::value_error(mjs_getError(mjs_getSpec(&self)));
|
||||||
|
}
|
||||||
|
return new_frame;
|
||||||
},
|
},
|
||||||
py::return_value_policy::reference_internal);
|
py::return_value_policy::reference_internal);
|
||||||
|
|
||||||
@@ -578,7 +583,13 @@ PYBIND11_MODULE(_specs, m) {
|
|||||||
"attach_body",
|
"attach_body",
|
||||||
[](raw::MjsFrame& self, raw::MjsBody& body, std::string& prefix,
|
[](raw::MjsFrame& self, raw::MjsBody& body, std::string& prefix,
|
||||||
std::string& suffix) -> raw::MjsBody* {
|
std::string& suffix) -> raw::MjsBody* {
|
||||||
return mjs_attachBody(&self, &body, prefix.c_str(), suffix.c_str());
|
auto new_body =
|
||||||
|
mjs_attachBody(&self, &body, prefix.c_str(), suffix.c_str());
|
||||||
|
if (!new_body) {
|
||||||
|
throw pybind11::value_error(
|
||||||
|
mjs_getError(mjs_getSpecFromFrame(&self)));
|
||||||
|
}
|
||||||
|
return new_body;
|
||||||
},
|
},
|
||||||
py::return_value_policy::reference_internal);
|
py::return_value_policy::reference_internal);
|
||||||
|
|
||||||
|
|||||||
@@ -846,5 +846,20 @@ class SpecsTest(absltest.TestCase):
|
|||||||
with self.assertRaises(IndexError):
|
with self.assertRaises(IndexError):
|
||||||
material.textures[-1] = 'x'
|
material.textures[-1] = 'x'
|
||||||
|
|
||||||
|
def test_attach_error(self):
|
||||||
|
child = mujoco.MjSpec()
|
||||||
|
parent = mujoco.MjSpec()
|
||||||
|
parent.degree = not child.degree
|
||||||
|
body = parent.worldbody.add_body()
|
||||||
|
frame = child.worldbody.add_frame()
|
||||||
|
with self.assertRaises(ValueError) as cm:
|
||||||
|
body.attach_frame(frame, '', '')
|
||||||
|
self.assertEqual(
|
||||||
|
str(cm.exception),
|
||||||
|
'Error: cannot attach mjSpecs with incompatible compiler/angle'
|
||||||
|
' attribute',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
absltest.main()
|
absltest.main()
|
||||||
|
|||||||
@@ -521,13 +521,20 @@ mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* p
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// get objects
|
// get spec from body
|
||||||
mjSpec* mjs_getSpec(mjsBody* body) {
|
mjSpec* mjs_getSpec(mjsBody* body) {
|
||||||
return &(static_cast<mjCBody*>(body->element)->model->spec);
|
return &(static_cast<mjCBody*>(body->element)->model->spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// get spec from frame
|
||||||
|
mjSpec* mjs_getSpecFromFrame(mjsFrame* frame) {
|
||||||
|
return &(static_cast<mjCFrame*>(frame->element)->model->spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// find spec (model asset) by name
|
// find spec (model asset) by name
|
||||||
mjSpec* mjs_findSpec(mjSpec* s, const char* name) {
|
mjSpec* mjs_findSpec(mjSpec* s, const char* name) {
|
||||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||||
|
|||||||
@@ -188,6 +188,9 @@ MJAPI mjsMaterial* mjs_addMaterial(mjSpec* s, mjsDefault* def);
|
|||||||
// Get spec from body.
|
// Get spec from body.
|
||||||
MJAPI mjSpec* mjs_getSpec(mjsBody* body);
|
MJAPI mjSpec* mjs_getSpec(mjsBody* body);
|
||||||
|
|
||||||
|
// Get spec from frame.
|
||||||
|
MJAPI mjSpec* mjs_getSpecFromFrame(mjsFrame* frame);
|
||||||
|
|
||||||
// Find spec (model asset) by name.
|
// Find spec (model asset) by name.
|
||||||
MJAPI mjSpec* mjs_findSpec(mjSpec* spec, const char* name);
|
MJAPI mjSpec* mjs_findSpec(mjSpec* spec, const char* name);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user