diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp index b87a6074e962bc055439abfa05f9acbec8956d96..f768718881714d5a8bbeca3137681d823600e246 100644 --- a/VirtualRobot/XML/BaseIO.cpp +++ b/VirtualRobot/XML/BaseIO.cpp @@ -840,10 +840,10 @@ namespace VirtualRobot std::string visuCoordType = ""; useAsColModel = false; std::string visuFileType = ""; - std::string visuFile = ""; rapidxml::xml_attribute<>* attr; std::vector<Primitive::PrimitivePtr> primitives; VisualizationNodePtr visualizationNode; + std::vector<VisualizationNodePtr> visualizationNodes; if (!visuXMLNode) { @@ -866,51 +866,16 @@ namespace VirtualRobot if (enableVisu) { - rapidxml::xml_node<>* visuFileXMLNode = visuXMLNode->first_node("file", 0, false); - - if (visuFileXMLNode) - { - attr = visuFileXMLNode->first_attribute("type", 0, false); - - //THROW_VR_EXCEPTION_IF(!attr, "Missing 'type' attribute in <Visualization> tag of node " << tagName << "." << endl) - if (!attr) - { - if (VisualizationFactory::first(NULL)) - { - visuFileType = VisualizationFactory::first(NULL)->getDescription(); - } - else - { - VR_WARNING << "No visualization present..." << endl; - } - } - else - { - visuFileType = attr->value(); - } - - getLowerCase(visuFileType); - visuFile = processFileNode(visuFileXMLNode, basePath); - //visuFile = visuFileXMLNode->value(); - //makeAbsolutePath(basePath,visuFile); - } - + visualizationNodes = processVisuFiles(visuXMLNode, basePath, visuFileType); primitives = processPrimitives(visuXMLNode); - THROW_VR_EXCEPTION_IF(primitives.size() != 0 && visuFileXMLNode, "Multiple visualization sources defined (file and primitives)" << endl); + THROW_VR_EXCEPTION_IF(primitives.size() != 0 && visualizationNodes.size() != 0, "Multiple visualization sources defined (file and primitives)" << endl); - if (visuFile != "") + if (visualizationNodes.size() != 0) { - VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(visuFileType, NULL); - - if (visualizationFactory) - { - visualizationNode = visualizationFactory->getVisualizationFromFile(visuFile); - } - else - { - VR_WARNING << "VisualizationFactory of type '" << visuFileType << "' not present. Ignoring Visualization data in Node <" << tagName << ">" << endl; - } + VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL); + visualizationNode = visualizationFactory->createUnitedVisualization(visualizationNodes); } + else if (primitives.size() != 0) { VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL); @@ -1101,6 +1066,61 @@ namespace VirtualRobot return collisionModel; } + std::vector<VisualizationNodePtr> BaseIO::processVisuFiles(rapidxml::xml_node<char>* visualizationXMLNode, const std::string& basePath, std::string& fileType) + { + rapidxml::xml_node<>* node = visualizationXMLNode; + std::vector<VisualizationNodePtr> result; + + if (!node) + { + return result; + } + + rapidxml::xml_node<>* visuFileXMLNode = node->first_node("file", 0, false); + + while (visuFileXMLNode) + { + std::string visuFile = ""; + + rapidxml::xml_attribute<>* attr = visuFileXMLNode->first_attribute("type", 0, false); + if (!attr) + { + if (VisualizationFactory::first(NULL)) + { + fileType = VisualizationFactory::first(NULL)->getDescription(); + } + else + { + VR_WARNING << "No visualization present..." << endl; + } + } + else + { + fileType = attr->value(); + } + + getLowerCase(fileType); + visuFile = processFileNode(visuFileXMLNode, basePath); + + if (visuFile != "") { + VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(fileType, NULL); + + if (visualizationFactory) + { + result.push_back(visualizationFactory->getVisualizationFromFile(visuFile)); + } + else + { + VR_WARNING << "VisualizationFactory of type '" << fileType << "' not present. Ignoring Visualization data from " << visuFileXMLNode->value() << endl; + } + } + + visuFileXMLNode = visuFileXMLNode->next_sibling("file", 0, false); + } + + return result; + } + std::vector<Primitive::PrimitivePtr> BaseIO::processPrimitives(rapidxml::xml_node<char>* primitivesXMLNode) { std::vector<Primitive::PrimitivePtr> result; diff --git a/VirtualRobot/XML/BaseIO.h b/VirtualRobot/XML/BaseIO.h index 9282f8c3812dabef83e281c6d5428c2598992678..5a179d5ff57bf515af88bf59317fd70a9f6b1731 100644 --- a/VirtualRobot/XML/BaseIO.h +++ b/VirtualRobot/XML/BaseIO.h @@ -102,6 +102,7 @@ namespace VirtualRobot static std::string toXML(const Eigen::Matrix4f& m, std::string ident = "\t"); + static std::vector<VisualizationNodePtr> processVisuFiles(rapidxml::xml_node<char> *visualizationXMLNode, const std::string &basePath, std::string &fileType); protected: // instantiation not allowed BaseIO();