Remove mjCPlugin from xml_native_reader.

PiperOrigin-RevId: 608546883
Change-Id: Ib529c2756102e4e2185d1d8e9585187c30049011
This commit is contained in:
Alessio Quaglino
2024-02-20 03:45:42 -08:00
committed by Copybara-Service
parent b56d4bf8a5
commit 78dc5aee9f
13 changed files with 93 additions and 80 deletions
+13 -25
View File
@@ -40,7 +40,6 @@
#include "user/user_composite.h"
#include "user/user_flexcomp.h"
#include "user/user_model.h"
#include "user/user_objects.h"
#include "user/user_util.h"
#include "xml/xml_base.h"
#include "xml/xml_util.h"
@@ -50,7 +49,7 @@ using std::string;
using std::vector;
using tinyxml2::XMLElement;
void ReadPluginConfigs(tinyxml2::XMLElement* elem, mjCPlugin* pp) {
void ReadPluginConfigs(tinyxml2::XMLElement* elem, mjmPlugin* p) {
std::map<std::string, std::string, std::less<>> config_attribs;
XMLElement* child = FirstChildElement(elem);
while (child) {
@@ -68,12 +67,12 @@ void ReadPluginConfigs(tinyxml2::XMLElement* elem, mjCPlugin* pp) {
child = NextSiblingElement(child);
}
if (!pp && !config_attribs.empty()) {
if (!p && !config_attribs.empty()) {
throw mjXError(elem,
"plugin configuration attributes cannot be used in an "
"element that references a predefined plugin instance");
} else if (pp) {
pp->config_attribs = std::move(config_attribs);
} else if (p) {
mjm_setPluginAttributes(p, &config_attribs);
}
}
} // namespace
@@ -2276,10 +2275,6 @@ void mjXReader::OneComposite(XMLElement* elem, mjmBody* pbody, mjmDefault* def)
XMLElement* eplugin = FirstChildElement(elem, "plugin");
if (eplugin) {
OnePlugin(eplugin, &comp.plugin);
if (comp.plugin_instance_name.empty()) {
comp.plugin_instance_name = "composite" + comp.prefix;
((mjCPlugin*)comp.plugin.instance)->name = comp.plugin_instance_name;
}
}
// cable
@@ -2602,10 +2597,6 @@ void mjXReader::OneFlexcomp(XMLElement* elem, mjmBody* pbody) {
XMLElement* eplugin = FirstChildElement(elem, "plugin");
if (eplugin) {
OnePlugin(eplugin, &fcomp.plugin);
if (fcomp.plugin_instance_name.empty()) {
fcomp.plugin_instance_name = "flexcomp_" + fcomp.name;
((mjCPlugin*)fcomp.plugin.instance)->name = fcomp.plugin_instance_name;
}
}
// make flexcomp
@@ -2631,7 +2622,7 @@ void mjXReader::OnePlugin(XMLElement* elem, mjmPlugin* plugin) {
mjm_setString(plugin->instance_name, instance_name.c_str());
if (instance_name.empty()) {
plugin->instance = mjm_addPlugin(&model->spec)->instance;
ReadPluginConfigs(elem, (mjCPlugin*)plugin->instance);
ReadPluginConfigs(elem, plugin);
} else {
model->hasImplicitPluginElem = true;
}
@@ -2789,15 +2780,16 @@ void mjXReader::Extension(XMLElement* section) {
throw mjXError(
child, "explicit plugin instance must appear before implicit plugin elements");
}
mjCPlugin* pp = (mjCPlugin*)mjm_addPlugin(&model->spec)->instance;
GetXMLPos(child, pp);
ReadAttrTxt(child, "name", pp->name, /* required = */ true);
if (pp->name.empty()) {
string name;
mjmPlugin* p = mjm_addPlugin(&model->spec);
mjm_setString(p->info, ("line = " + std::to_string(elem->GetLineNum())).c_str());
ReadAttrTxt(child, "name", name, /* required = */ true);
mjm_setString(p->name, name.c_str());
if (!p->name) {
throw mjXError(child, "plugin instance must have a name");
}
ReadPluginConfigs(child, pp);
pp->plugin_slot = plugin_slot;
pp->nstate = -1; // actual value to be filled in by the plugin later
ReadPluginConfigs(child, p);
p->plugin_slot = plugin_slot;
}
child = NextSiblingElement(child);
}
@@ -4034,10 +4026,6 @@ mjmDefault* mjXReader::GetClass(XMLElement* section) {
// get xml position
void mjXReader::GetXMLPos(XMLElement* elem, mjCBase* obj) {
obj->info = "line = " + std::to_string(elem->GetLineNum());
}
// return true if c is a directory path separator (i.e. '/' or '\' on windows)
static bool IsSeperator(char c) {
-2
View File
@@ -23,7 +23,6 @@
#include <mujoco/mujoco.h>
#include "user/user_api.h"
#include "user/user_model.h"
#include "user/user_objects.h"
#include "xml/xml_base.h"
#include "xml/xml_util.h"
@@ -86,7 +85,6 @@ class mjXReader : public mjXBase {
mjXSchema schema; // schema used for validation
mjmDefault* GetClass(tinyxml2::XMLElement* section); // get default class name
static void GetXMLPos(tinyxml2::XMLElement* elem, mjCBase* obj); // get xml position
bool readingdefaults; // true while reading defaults
+14 -14
View File
@@ -412,7 +412,7 @@ void mjXWriter::OneGeom(XMLElement* elem, mjCGeom* pgeom, mjCDef* def) {
// write plugin
if (pgeom->plugin.active) {
OnePlugin(InsertEnd(elem, "plugin"), pgeom);
OnePlugin(InsertEnd(elem, "plugin"), &pgeom->plugin);
}
}
@@ -702,7 +702,7 @@ void mjXWriter::OneActuator(XMLElement* elem, mjCActuator* pact, mjCDef* def) {
// plugins: write config attributes
if (pact->plugin.active) {
OnePlugin(elem, pact);
OnePlugin(elem, &pact->plugin);
}
// non-plugins: write actuator parameters
@@ -731,21 +731,21 @@ void mjXWriter::OneActuator(XMLElement* elem, mjCActuator* pact, mjCDef* def) {
// write plugin
void mjXWriter::OnePlugin(XMLElement* elem, mjCBase* object) {
const std::string instance_name = std::string(mjm_getString(object->plugin.instance_name));
const std::string plugin_name = std::string(mjm_getString(object->plugin.name));
void mjXWriter::OnePlugin(XMLElement* elem, mjmPlugin* plugin) {
const std::string instance_name = std::string(mjm_getString(plugin->instance_name));
const std::string plugin_name = std::string(mjm_getString(plugin->name));
if (!instance_name.empty()) {
WriteAttrTxt(elem, "instance", instance_name);
} else {
WriteAttrTxt(elem, "plugin", plugin_name);
const mjpPlugin* plugin = mjp_getPluginAtSlot(
((mjCPlugin*)object->plugin.instance)->plugin_slot);
const char* c = &((mjCPlugin*)object->plugin.instance)->flattened_attributes[0];
for (int i = 0; i < plugin->nattribute; ++i) {
const mjpPlugin* pplugin = mjp_getPluginAtSlot(
((mjCPlugin*)plugin->instance)->spec.plugin_slot);
const char* c = &((mjCPlugin*)plugin->instance)->flattened_attributes[0];
for (int i = 0; i < pplugin->nattribute; ++i) {
std::string value(c);
if (!value.empty()) {
XMLElement* config_elem = InsertEnd(elem, "config");
WriteAttrTxt(config_elem, "key", plugin->attributes[i]);
WriteAttrTxt(config_elem, "key", pplugin->attributes[i]);
WriteAttrTxt(config_elem, "value", value);
c += value.size();
}
@@ -1229,7 +1229,7 @@ void mjXWriter::Extension(XMLElement* root) {
}
// check if we need to open a new <plugin> section
const mjpPlugin* plugin = mjp_getPluginAtSlot(pp->plugin_slot);
const mjpPlugin* plugin = mjp_getPluginAtSlot(pp->spec.plugin_slot);
if (plugin != last_plugin) {
plugin_elem = InsertEnd(section, "plugin");
WriteAttrTxt(plugin_elem, "plugin", plugin->name);
@@ -1406,7 +1406,7 @@ void mjXWriter::Asset(XMLElement* root) {
if (pmesh->plugin.active) {
elem = InsertEnd(section, "mesh");
WriteAttrTxt(elem, "name", pmesh->name);
OnePlugin(InsertEnd(elem, "plugin"), pmesh);
OnePlugin(InsertEnd(elem, "plugin"), &pmesh->plugin);
} else{
elem = InsertEnd(section, "mesh");
OneMesh(elem, pmesh, pmesh->def);
@@ -1506,7 +1506,7 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body) {
// write plugin
if (body->plugin.active) {
OnePlugin(InsertEnd(elem, "plugin"), body);
OnePlugin(InsertEnd(elem, "plugin"), &body->plugin);
}
// write child bodies recursively
@@ -1904,7 +1904,7 @@ void mjXWriter::Sensor(XMLElement* root) {
WriteAttrTxt(elem, "objtype", mju_type2Str(psen->objtype));
WriteAttrTxt(elem, "objname", psen->get_objname());
}
OnePlugin(elem, psen);
OnePlugin(elem, &psen->plugin);
break;
// user-defined sensor
+1 -1
View File
@@ -66,7 +66,7 @@ class mjXWriter : public mjXBase {
void OneEquality(tinyxml2::XMLElement* elem, mjCEquality* pequality, mjCDef* def);
void OneTendon(tinyxml2::XMLElement* elem, mjCTendon* ptendon, mjCDef* def);
void OneActuator(tinyxml2::XMLElement* elem, mjCActuator* pactuator, mjCDef* def);
void OnePlugin(tinyxml2::XMLElement* elem, mjCBase* object);
void OnePlugin(tinyxml2::XMLElement* elem, mjmPlugin* plugin);
bool writingdefaults; // true during defaults write
};