From 79e1e0ec040d7c621e18a8e75bc1dab0a0e9bfd2 Mon Sep 17 00:00:00 2001 From: Tristan Zimpfer Date: Thu, 13 Apr 2017 16:39:36 +0200 Subject: [PATCH] Hierarchy v1 --- src/ifcconvert/ColladaSerializer.cpp | 31 ++++++++++++++++++++++++++++ src/ifcconvert/ColladaSerializer.h | 4 ++++ 2 files changed, 35 insertions(+) diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index d67bc04044..fb72473d63 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -220,6 +220,24 @@ void ColladaSerializer::ColladaExporter::ColladaScene::add( node.end(); } +void ColladaSerializer::ColladaExporter::ColladaScene::addParent(const std::string& node_name){ + + if (!scene_opened) { + openVisualScene(scene_id); + scene_opened = true; + } + + current_node = new COLLADASW::Node(mSW); + current_node->setNodeId(node_name); + current_node->setNodeName(node_name); + current_node->setType(COLLADASW::Node::NODE); + current_node->start(); +} + +void ColladaSerializer::ColladaExporter::ColladaScene::closeParent(){ + current_node->end(); +} + void ColladaSerializer::ColladaExporter::ColladaScene::write() { if (scene_opened) { closeVisualScene(); @@ -361,12 +379,25 @@ void ColladaSerializer::ColladaExporter::endDocument() { geometries.write(it->representation_id, it->type, it->vertices, it->normals, it->faces, it->edges, it->material_ids, it->materials, it->uvs); } geometries.close(); + std::string parent_name; + bool is_parent_empty = true; for (std::vector::const_iterator it = deferreds.begin(); it != deferreds.end(); ++it) { const std::string object_name = it->unique_id; + if (parent_name != it->parent){ + if (!is_parent_empty){ + scene.closeParent(); + } + parent_name = it->parent; + scene.addParent(parent_name); + is_parent_empty = false; + } + /// @todo redundant information using ID as both ID and Name, maybe omit Name or allow specifying what would be used as the name scene.add(object_name, object_name, it->representation_id, it->material_references, it->matrix); } + + scene.closeParent(); scene.write(); stream.endDocument(); } diff --git a/src/ifcconvert/ColladaSerializer.h b/src/ifcconvert/ColladaSerializer.h index 9ef049ed79..716575b632 100644 --- a/src/ifcconvert/ColladaSerializer.h +++ b/src/ifcconvert/ColladaSerializer.h @@ -30,6 +30,7 @@ #pragma GCC diagnostic ignored "-Wignored-qualifiers" #endif #include +#include #include #include #include @@ -78,6 +79,7 @@ private: const std::string scene_id; bool scene_opened; + COLLADASW::Node *current_node; public: ColladaScene(const std::string& scene_id, COLLADASW::StreamWriter& stream, ColladaSerializer *_serializer) : COLLADASW::LibraryVisualScenes(&stream) @@ -87,6 +89,8 @@ private: {} void add(const std::string& node_id, const std::string& node_name, const std::string& geom_name, const std::vector& material_ids, const std::vector& matrix); + void addParent(const std::string& node_name); + void closeParent(); void write(); ColladaSerializer *serializer; };