@@ -54,31 +54,6 @@ namespace gz
5454 return _s;
5555 }
5656
57- // / \brief Splits a string into tokens. This was copied from Gazebo
58- // / common, gz-common/Util.hh, to avoid adding another dependency.
59- // / Remove this function if gz-common every becomes a dependency.
60- // / \param[in] _str Input string.
61- // / \param[in] _delim Token delimiter.
62- // / \return Vector of tokens.
63- std::vector<std::string> split (const std::string &_str,
64- const std::string &_delim)
65- {
66- std::vector<std::string> tokens;
67- char *saveptr;
68- char *str = strdup (_str.c_str ());
69-
70- auto token = ignstrtok (str, _delim.c_str (), &saveptr);
71-
72- while (token)
73- {
74- tokens.push_back (token);
75- token = ignstrtok (NULL , _delim.c_str (), &saveptr);
76- }
77-
78- free (str);
79- return tokens;
80- }
81-
8257 // ///////////////////////////////////////////
8358 gz::math::Vector3d Convert (const msgs::Vector3d &_v)
8459 {
@@ -978,10 +953,12 @@ namespace gz
978953 case msgs::PointCloudPacked::Field::FLOAT64:
979954 offset += 8 ;
980955 break ;
956+ // LCOV_EXCL_START
981957 default :
982958 std::cerr << " PointCloudPacked field datatype of ["
983959 << _type << " ] is invalid.\n " ;
984960 break ;
961+ // LCOV_EXCL_STOP
985962 }
986963 };
987964
@@ -1185,31 +1162,46 @@ namespace gz
11851162 return false ;
11861163 }
11871164
1188- // Get the top level <model> element.
1189- tinyxml2::XMLElement *modelElement = modelConfigDoc.FirstChildElement (
1165+ // Get the top level <model> or <world> element.
1166+ tinyxml2::XMLElement *topElement = modelConfigDoc.FirstChildElement (
11901167 " model" );
1191- if (!modelElement)
1168+ bool isModel = true ;
1169+ if (!topElement)
11921170 {
1193- std::cerr << " Model config string does not contain a <model> element\n " ;
1194- return false ;
1171+ topElement = modelConfigDoc.FirstChildElement (" world" );
1172+ if (!topElement)
1173+ {
1174+ std::cerr << " Model config string does not contain a "
1175+ << " <model> or <world> element\n " ;
1176+ return false ;
1177+ }
1178+ isModel = false ;
11951179 }
11961180
11971181 // Read the name, which is a mandatory element.
1198- tinyxml2::XMLElement *elem = modelElement ->FirstChildElement (" name" );
1182+ tinyxml2::XMLElement *elem = topElement ->FirstChildElement (" name" );
11991183 if (!elem || !elem->GetText ())
12001184 {
12011185 std::cerr << " Model config string does not contain a <name> element\n " ;
12021186 return false ;
12031187 }
12041188 meta.set_name (trimmed (elem->GetText ()));
12051189
1190+ // Read the version, if present.
1191+ elem = topElement->FirstChildElement (" version" );
1192+ if (elem && elem->GetText ())
1193+ {
1194+ auto version = std::stoi (trimmed (elem->GetText ()));
1195+ meta.set_version (version);
1196+ }
1197+
12061198 // Read the description, if present.
1207- elem = modelElement ->FirstChildElement (" description" );
1199+ elem = topElement ->FirstChildElement (" description" );
12081200 if (elem && elem->GetText ())
12091201 meta.set_description (trimmed (elem->GetText ()));
12101202
12111203 // Read the dependencies, if any.
1212- elem = modelElement ->FirstChildElement (" depend" );
1204+ elem = topElement ->FirstChildElement (" depend" );
12131205 while (elem)
12141206 {
12151207 auto modelElem = elem->FirstChildElement (" model" );
@@ -1226,7 +1218,7 @@ namespace gz
12261218 }
12271219
12281220 // Read the authors, if any.
1229- elem = modelElement ->FirstChildElement (" author" );
1221+ elem = topElement ->FirstChildElement (" author" );
12301222 while (elem)
12311223 {
12321224 gz::msgs::FuelMetadata::Contact *author = meta.add_authors ();
@@ -1247,7 +1239,7 @@ namespace gz
12471239 }
12481240
12491241 // Get the most recent SDF file
1250- elem = modelElement ->FirstChildElement (" sdf" );
1242+ elem = topElement ->FirstChildElement (" sdf" );
12511243 math::SemanticVersion maxVer;
12521244 while (elem)
12531245 {
@@ -1257,23 +1249,34 @@ namespace gz
12571249 math::SemanticVersion ver (trimmed (verStr));
12581250 if (ver > maxVer)
12591251 {
1260- meta.mutable_model ()->mutable_file_format ()->set_name (" sdf" );
1261- gz::msgs::Version *verMsg =
1262- meta.mutable_model ()->mutable_file_format ()->mutable_version ();
1252+ gz::msgs::Version *verMsg;
1253+
1254+ if (isModel)
1255+ {
1256+ meta.mutable_model ()->mutable_file_format ()->set_name (" sdf" );
1257+ verMsg =
1258+ meta.mutable_model ()->mutable_file_format ()->mutable_version ();
1259+ meta.mutable_model ()->set_file (trimmed (elem->GetText ()));
1260+ }
1261+ else
1262+ {
1263+ meta.mutable_world ()->mutable_file_format ()->set_name (" sdf" );
1264+ verMsg =
1265+ meta.mutable_world ()->mutable_file_format ()->mutable_version ();
1266+ meta.mutable_world ()->set_file (trimmed (elem->GetText ()));
1267+ }
12631268
12641269 verMsg->set_major (ver.Major ());
12651270 verMsg->set_minor (ver.Minor ());
12661271 verMsg->set_patch (ver.Patch ());
12671272 verMsg->set_prerelease (ver.Prerelease ());
12681273 verMsg->set_build (ver.Build ());
1269-
1270- meta.mutable_model ()->set_file (trimmed (elem->GetText ()));
12711274 }
12721275 }
12731276
12741277 elem = elem->NextSiblingElement (" sdf" );
12751278 }
1276- if (meta.model ().file ().empty ())
1279+ if (meta.model ().file ().empty () && meta. world (). file (). empty () )
12771280 {
12781281 std::cerr << " Model config string does not contain an <sdf> element\n " ;
12791282 return false ;
@@ -1299,7 +1302,11 @@ namespace gz
12991302 }
13001303
13011304 out << " <?xml version='1.0'?>\n "
1302- << " <model>\n " ;
1305+ << " <model>\n "
1306+ << " <sdf version='"
1307+ << _meta.model ().file_format ().version ().major ()
1308+ << " ." << _meta.model ().file_format ().version ().minor () << " '>"
1309+ << _meta.model ().file () << " </sdf>\n " ;
13031310 }
13041311 else
13051312 {
@@ -1310,15 +1317,16 @@ namespace gz
13101317 }
13111318
13121319 out << " <?xml version='1.0'?>\n "
1313- << " <world>\n " ;
1320+ << " <world>\n "
1321+ << " <sdf version='"
1322+ << _meta.world ().file_format ().version ().major ()
1323+ << " ." << _meta.world ().file_format ().version ().minor () << " '>"
1324+ << _meta.world ().file () << " </sdf>\n " ;
13141325 }
13151326
13161327 out << " <name>" << _meta.name () << " </name>\n "
1317- << " <version>" << _meta.version () << " </version>\n "
1318- << " <sdf version='" << _meta.model ().file_format ().version ().major ()
1319- << " ." << _meta.model ().file_format ().version ().minor () << " '>"
1320- << _meta.model ().file () << " </sdf>\n "
1321- << " <description>" << _meta.description () << " </description>\n " ;
1328+ << " <version>" << _meta.version () << " </version>\n "
1329+ << " <description>" << _meta.description () << " </description>\n " ;
13221330
13231331 // Output author information.
13241332 for (int i = 0 ; i < _meta.authors_size (); ++i)
@@ -1333,9 +1341,9 @@ namespace gz
13331341 for (int i = 0 ; i < _meta.dependencies_size (); ++i)
13341342 {
13351343 out << " <depend>\n "
1336- << " <model>"
1344+ << " <model>\n "
13371345 << " <uri>" << _meta.dependencies (i).uri () << " </uri>\n "
1338- << " </model>"
1346+ << " </model>\n "
13391347 << " </depend>\n " ;
13401348 }
13411349
0 commit comments