31 #include <Eigen/Geometry>
49 std::unordered_map<std::string, tesseract_scene_graph::Material::Ptr>& available_materials)
55 Eigen::Isometry3d visual_origin = Eigen::Isometry3d::Identity();
56 const tinyxml2::XMLElement* origin = xml_element->FirstChildElement(
"origin");
57 if (origin !=
nullptr)
65 std::throw_with_nested(std::runtime_error(
"Visual: Error parsing 'origin' element!"));
71 const tinyxml2::XMLElement* material = xml_element->FirstChildElement(
"material");
72 if (material !=
nullptr)
76 visual_material =
parseMaterial(material, available_materials,
true);
80 std::throw_with_nested(std::runtime_error(
"Visual: Error parsing 'material' element!"));
85 const tinyxml2::XMLElement* geometry = xml_element->FirstChildElement(
"geometry");
86 if (geometry ==
nullptr)
87 std::throw_with_nested(std::runtime_error(
"Visual: Error missing 'geometry' element!"));
98 std::throw_with_nested(std::runtime_error(
"Visual: Error parsing 'geometry' element!"));
101 auto visual = std::make_shared<tesseract_scene_graph::Visual>();
102 visual->name = visual_name;
103 visual->origin = visual_origin;
104 visual->geometry = geom;
105 visual->material = visual_material;
110 tinyxml2::XMLElement*
writeVisual(
const std::shared_ptr<const tesseract_scene_graph::Visual>& visual,
111 tinyxml2::XMLDocument& doc,
112 const std::string& package_path,
113 const std::string& link_name,
116 if (visual ==
nullptr)
117 std::throw_with_nested(std::runtime_error(
"Visual is nullptr and cannot be converted to XML"));
121 if (!visual->name.empty())
122 xml_element->SetAttribute(
"name", visual->name.c_str());
124 if (!visual->origin.matrix().isIdentity(std::numeric_limits<double>::epsilon()))
126 tinyxml2::XMLElement* xml_origin =
writeOrigin(visual->origin, doc);
127 xml_element->InsertEndChild(xml_origin);
130 if (visual->material !=
nullptr)
132 tinyxml2::XMLElement* xml_material =
writeMaterial(visual->material, doc);
133 xml_element->InsertEndChild(xml_material);
137 std::string filename = link_name;
138 if (!visual->name.empty())
139 filename = filename +
"_" + visual->name;
141 filename = filename +
"_visual";
144 if (!package_path.empty())
145 filename =
"visual/" + filename;
149 filename = filename +
"_" + std::to_string(
id);
153 std::string filename =
"visual/" + link_name +
"_visual";
155 filename +=
"_" + std::to_string(
id);
156 tinyxml2::XMLElement* xml_geometry =
writeGeometry(visual->geometry, doc, package_path, filename);
157 xml_element->InsertEndChild(xml_geometry);
161 std::throw_with_nested(std::runtime_error(
"Could not write geometry for visual '" + visual->name +
"'!"));