31 #include <Eigen/Geometry>
54 bool make_convex_meshes)
56 const tinyxml2::XMLElement* geometry = xml_element->FirstChildElement();
57 if (geometry ==
nullptr)
58 std::throw_with_nested(std::runtime_error(
"Geometry: Error missing 'geometry' element!"));
60 std::string geometry_type;
62 if (status != tinyxml2::XML_SUCCESS)
63 std::throw_with_nested(std::runtime_error(
"Geometry: Error parsing 'geometry' element, invalid geometry type!"));
75 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'sphere'!"));
90 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'box'!"));
105 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'cylinder'!"));
113 std::vector<tesseract_geometry::PolygonMesh::Ptr> meshes;
116 meshes =
parseMesh(geometry, locator, visual, make_convex_meshes);
120 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'mesh'!"));
123 if (meshes.size() > 1)
124 return std::make_shared<tesseract_geometry::CompoundMesh>(meshes);
126 return meshes.front();
139 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'cone'!"));
154 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'capsule'!"));
169 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'octomap'!"));
177 std::vector<tesseract_geometry::SDFMesh::Ptr> meshes;
184 std::throw_with_nested(std::runtime_error(
"Geometry: Failed parsing geometry type 'sdf_mesh'!"));
187 if (meshes.size() > 1)
188 return std::make_shared<tesseract_geometry::CompoundMesh>(meshes);
190 return meshes.front();
193 std::throw_with_nested(std::runtime_error(
"Geometry: Invalid geometry type '" + geometry_type +
"'!"));
196 tinyxml2::XMLElement*
writeGeometry(
const std::shared_ptr<const tesseract_geometry::Geometry>& geometry,
197 tinyxml2::XMLDocument& doc,
198 const std::string& package_path,
199 const std::string& filename)
201 if (geometry ==
nullptr)
202 std::throw_with_nested(std::runtime_error(
"Geometry is nullptr and cannot be converted to XML"));
211 tinyxml2::XMLElement* xml_sphere =
212 writeSphere(std::static_pointer_cast<const tesseract_geometry::Sphere>(geometry), doc);
213 xml_element->InsertEndChild(xml_sphere);
217 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as sphere!"));
224 tinyxml2::XMLElement* xml_cylinder =
225 writeCylinder(std::static_pointer_cast<const tesseract_geometry::Cylinder>(geometry), doc);
226 xml_element->InsertEndChild(xml_cylinder);
230 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as cylinder!"));
237 tinyxml2::XMLElement* xml_capsule =
238 writeCapsule(std::static_pointer_cast<const tesseract_geometry::Capsule>(geometry), doc);
239 xml_element->InsertEndChild(xml_capsule);
243 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as capsule!"));
250 tinyxml2::XMLElement* xml_cone =
251 writeCone(std::static_pointer_cast<const tesseract_geometry::Cone>(geometry), doc);
252 xml_element->InsertEndChild(xml_cone);
256 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as cone!"));
263 tinyxml2::XMLElement* xml_box =
writeBox(std::static_pointer_cast<const tesseract_geometry::Box>(geometry), doc);
264 xml_element->InsertEndChild(xml_box);
268 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as box!"));
273 std::throw_with_nested(std::runtime_error(
"Cannot write geometry of type PLANE to XML! Consider using box."));
279 tinyxml2::XMLElement* xml_mesh =
280 writeMesh(std::static_pointer_cast<const tesseract_geometry::PolygonMesh>(geometry),
284 xml_element->InsertEndChild(xml_mesh);
288 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as mesh!"));
296 std::static_pointer_cast<const tesseract_geometry::SDFMesh>(geometry), doc, package_path, filename +
".ply");
297 xml_element->InsertEndChild(xml_sdf_mesh);
301 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as SDF mesh!"));
309 std::static_pointer_cast<const tesseract_geometry::Octree>(geometry), doc, package_path, filename +
".bt");
310 xml_element->InsertEndChild(xml_octree);
314 std::throw_with_nested(std::runtime_error(
"Could not write geometry marked as octree!"));
319 std::throw_with_nested(std::runtime_error(
"Unknown geometry type, cannot write to XML!"));