Add body.find_all() to Python bindings.

This enables to generate a list of all body children of a given type.

Also, add recursive option to mjs_firstChild and mjs_nextChild. Fixes #2112.

PiperOrigin-RevId: 681039348
Change-Id: Iebbb26fd5ec314150206edfdddd88633baa0bec6
This commit is contained in:
Alessio Quaglino
2024-10-01 08:56:03 -07:00
committed by Copybara-Service
parent 8a825e6050
commit 89aea5e217
11 changed files with 150 additions and 46 deletions
+16 -11
View File
@@ -88,20 +88,25 @@ TEST_F(MujocoTest, TreeTraversal) {
mjs_setString(geom3->name, "geom3");
mjs_setString(site4->name, "site4");
bool recursive = false;
mjsElement* b_el0 = mjs_firstElement(spec, mjOBJ_BODY);
mjsElement* b_el1 = mjs_nextElement(spec, b_el0);
mjsElement* a_el0 = mjs_firstElement(spec, mjOBJ_ACTUATOR);
mjsElement* l_el0 = mjs_firstElement(spec, mjOBJ_LIGHT);
mjsElement* c_el0 = mjs_firstChild(body, mjOBJ_CAMERA);
mjsElement* t_el0 = mjs_firstChild(body, mjOBJ_TENDON);
mjsElement* s_el1 = mjs_firstChild(body, mjOBJ_SITE);
mjsElement* s_el2 = mjs_nextChild(body, s_el1);
mjsElement* s_el3 = mjs_nextChild(body, s_el2);
mjsElement* s_el0 = mjs_nextChild(body, s_el3);
mjsElement* s_el4 = mjs_firstChild(body1, mjOBJ_SITE);
mjsElement* g_el1 = mjs_firstChild(body, mjOBJ_GEOM);
mjsElement* g_el2 = mjs_nextChild(body, g_el1);
mjsElement* g_el3 = mjs_nextChild(body, g_el2);
mjsElement* g_el0 = mjs_nextChild(body, g_el3);
mjsElement* c_el0 = mjs_firstChild(body, mjOBJ_CAMERA, recursive);
mjsElement* t_el0 = mjs_firstChild(body, mjOBJ_TENDON, recursive);
mjsElement* s_el1 = mjs_firstChild(body, mjOBJ_SITE, recursive);
mjsElement* s_el2 = mjs_nextChild(body, s_el1, recursive);
mjsElement* s_el3 = mjs_nextChild(body, s_el2, recursive);
mjsElement* s_el0 = mjs_nextChild(body, s_el3, recursive);
mjsElement* s_el4 = mjs_firstChild(body1, mjOBJ_SITE, recursive);
mjsElement* g_el1 = mjs_firstChild(body, mjOBJ_GEOM, recursive);
mjsElement* g_el2 = mjs_nextChild(body, g_el1, recursive);
mjsElement* g_el3 = mjs_nextChild(body, g_el2, recursive);
mjsElement* g_el0 = mjs_nextChild(body, g_el3, recursive);
EXPECT_EQ(b_el0, world->element);
EXPECT_EQ(b_el1, body->element);
EXPECT_EQ(a_el0, nullptr);
EXPECT_EQ(l_el0, nullptr);
EXPECT_EQ(c_el0, nullptr);