Add mj_parseXML and mj_saveXML to xml_api.
PiperOrigin-RevId: 640099466 Change-Id: I75f763523c5bc8f6f7c2f2de6806d82ba37ebd4e
This commit is contained in:
committed by
Saran Tunyasuvunakool
parent
1bf90af0e0
commit
b35ae973e1
+3
-3
@@ -100,7 +100,7 @@ class LocaleOverride {
|
||||
} // namespace
|
||||
|
||||
// Main writer function - calls mjXWrite
|
||||
std::string mjWriteXML(mjSpec* spec, char* error, int error_sz) {
|
||||
std::string mjWriteXML(const mjSpec* spec, char* error, int error_sz) {
|
||||
LocaleOverride locale_override;
|
||||
|
||||
// check for empty model
|
||||
@@ -424,9 +424,9 @@ static void RegisterResourceProvider() {
|
||||
|
||||
|
||||
mjSpec* ParseSpecFromString(std::string_view xml, char* error,
|
||||
int error_size, mjVFS* vfs) {
|
||||
int error_size) {
|
||||
RegisterResourceProvider();
|
||||
std::string xml2 = {xml.begin(), xml.end()};
|
||||
std::string str = "LoadModelFromString:" + xml2;
|
||||
return mjParseXML(str.c_str(), vfs, error, error_size);
|
||||
return mjParseXML(str.c_str(), nullptr, error, error_size);
|
||||
}
|
||||
|
||||
+3
-4
@@ -24,15 +24,14 @@
|
||||
// Top level API
|
||||
|
||||
// Main writer function
|
||||
std::string mjWriteXML(mjSpec* spec, char* error, int error_sz);
|
||||
std::string mjWriteXML(const mjSpec* spec, char* error, int error_sz);
|
||||
|
||||
// Main parser function
|
||||
MJAPI mjSpec* mjParseXML(const char* filename, const mjVFS* vfs, char* error, int error_sz);
|
||||
mjSpec* mjParseXML(const char* filename, const mjVFS* vfs, char* error, int error_sz);
|
||||
|
||||
// Returns a newly-allocated mjSpec, loaded from the contents of xml.
|
||||
// On failure returns nullptr and populates the error array if present.
|
||||
MJAPI mjSpec* ParseSpecFromString(std::string_view xml, char* error = nullptr,
|
||||
int error_size = 0, mjVFS* vfs = nullptr);
|
||||
mjSpec* ParseSpecFromString(std::string_view xml, char* error = nullptr, int error_size = 0);
|
||||
|
||||
|
||||
#endif // MUJOCO_SRC_XML_XML_H_
|
||||
|
||||
@@ -209,3 +209,53 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// parse spec from file
|
||||
mjSpec* mj_parseXML(const char* filename, const mjVFS* vfs, char* error, int error_sz) {
|
||||
return mjParseXML(filename, vfs, error, error_sz);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// parse spec from string
|
||||
mjSpec* mj_parseXMLString(const char* xml, const mjVFS* vfs, char* error, int error_sz) {
|
||||
return ParseSpecFromString(xml, error, error_sz);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// save spec to XML file, return 1 on success, 0 otherwise
|
||||
int mj_saveXML(const mjSpec* s, const char* filename, char* error, int error_sz) {
|
||||
std::string result = mjWriteXML(s, error, error_sz);
|
||||
if (result.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::ofstream file;
|
||||
file.open(filename);
|
||||
file << result;
|
||||
file.close();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// save spec to string, return 1 on success, 0 otherwise
|
||||
int mj_saveXMLString(const mjSpec* s, char* xml, int xml_sz, char* error, int error_sz) {
|
||||
std::string result = mjWriteXML(s, error, error_sz);
|
||||
if (result.size() >= xml_sz) {
|
||||
std::string error_msg = "Output string too short, should be at least " +
|
||||
std::to_string(result.size()+1);
|
||||
mjCopyError(error, error_msg.c_str(), error_sz);
|
||||
return 0;
|
||||
}
|
||||
if (result.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
result.copy(xml, xml_sz);
|
||||
xml[result.size()] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include <mujoco/mjexport.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include "user/user_api.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -43,6 +44,14 @@ MJAPI int mj_printSchema(const char* filename, char* buffer, int buffer_sz,
|
||||
// if vfs is not NULL, look up file in vfs before reading from disk
|
||||
MJAPI mjModel* mj_loadModel(const char* filename, const mjVFS* vfs);
|
||||
|
||||
// parse spec from file or XML string.
|
||||
MJAPI mjSpec* mj_parseXML(const char* filename, const mjVFS* vfs, char* error, int error_sz);
|
||||
MJAPI mjSpec* mj_parseXMLString(const char* xml, const mjVFS* vfs, char* error, int error_sz);
|
||||
|
||||
// Save spec to XML file and/or string, return 1 on success, 0 otherwise.
|
||||
MJAPI int mj_saveXML(const mjSpec* s, const char* filename, char* error, int error_sz);
|
||||
MJAPI int mj_saveXMLString(const mjSpec* s, char* xml, int xml_sz, char* error, int error_sz);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -45,8 +45,8 @@ mjXBase::mjXBase() {
|
||||
|
||||
|
||||
// set model field
|
||||
void mjXBase::SetModel(mjSpec* _model) {
|
||||
model = _model;
|
||||
void mjXBase::SetModel(const mjSpec* _model) {
|
||||
model = (mjSpec*)_model;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ class mjXBase : public mjXUtil {
|
||||
};
|
||||
|
||||
// set the model allocated externally
|
||||
virtual void SetModel(mjSpec*);
|
||||
virtual void SetModel(const mjSpec*);
|
||||
|
||||
// read alternative orientation specification
|
||||
static int ReadAlternative(tinyxml2::XMLElement* elem, mjsOrientation& alt);
|
||||
|
||||
@@ -769,7 +769,7 @@ mjXWriter::mjXWriter(void) {
|
||||
|
||||
|
||||
// cast model
|
||||
void mjXWriter::SetModel(mjSpec* spec) {
|
||||
void mjXWriter::SetModel(const mjSpec* spec) {
|
||||
if (spec) {
|
||||
model = (mjCModel*)spec->element;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ class mjXWriter : public mjXBase {
|
||||
public:
|
||||
mjXWriter(); // constructor
|
||||
virtual ~mjXWriter() = default; // destructor
|
||||
void SetModel(mjSpec* spec);
|
||||
void SetModel(const mjSpec* spec);
|
||||
|
||||
// write XML document to string
|
||||
std::string Write(char *error, std::size_t error_sz);
|
||||
|
||||
Reference in New Issue
Block a user