From ab0e47c55fb759cc161d4aede0e4dd416a01919e Mon Sep 17 00:00:00 2001 From: Balleux Benjamin Date: Wed, 19 Apr 2017 12:07:03 +0200 Subject: [PATCH] Options added : --use-element-types and --use-element-hierarchy --- src/ifcconvert/ColladaSerializer.cpp | 22 ++++++++++++++-------- src/ifcconvert/GeometrySerializer.h | 8 +++++++- src/ifcconvert/IfcConvert.cpp | 10 ++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/ifcconvert/ColladaSerializer.cpp b/src/ifcconvert/ColladaSerializer.cpp index fb72473d63..124ecb9777 100644 --- a/src/ifcconvert/ColladaSerializer.cpp +++ b/src/ifcconvert/ColladaSerializer.cpp @@ -235,7 +235,7 @@ void ColladaSerializer::ColladaExporter::ColladaScene::addParent(const std::stri } void ColladaSerializer::ColladaExporter::ColladaScene::closeParent(){ - current_node->end(); + if (current_node != NULL) { current_node->end(); } } void ColladaSerializer::ColladaExporter::ColladaScene::write() { @@ -323,7 +323,8 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme { const IfcGeom::Representation::Triangulation& mesh = o->geometry(); const std::string name = serializer->settings().get(SerializerSettings::USE_ELEMENT_GUIDS) ? - o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? o->name() : (o->type() + o->unique_id())); + o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? + o->name() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_TYPES) ? o->type() + "_" + o->name() : o->unique_id())); const std::string representation_id = "representation-" + boost::lexical_cast(o->geometry().id()); std::vector material_references; foreach(const IfcGeom::Material& material, mesh.materials()) { @@ -346,7 +347,8 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme { const IfcGeom::Representation::Triangulation& mesh = o->geometry(); const std::string name = serializer->settings().get(SerializerSettings::USE_ELEMENT_GUIDS) ? - o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? o->name() : (o->type() + o->unique_id())); + o->guid() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_NAMES) ? + o->name() : (serializer->settings().get(SerializerSettings::USE_ELEMENT_TYPES) ? o->type() + "_" + o->name() : o->unique_id())); const std::string representation_id = "representation-" + boost::lexical_cast(o->geometry().id()); std::vector material_references; foreach(const IfcGeom::Material& material, mesh.materials()) { @@ -359,9 +361,11 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme material_references.push_back(material_name); } + const std::string parent_name = (serializer->settings().get(SerializerSettings::USE_ELEMENT_HIERARCHY) ? + parent->name() : ""); deferreds.push_back( DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(), - mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs(), parent->name()) + mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs(), parent_name) ); } @@ -379,13 +383,15 @@ 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; + 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){ + + if (parent_name != it->parent) + { + if (!is_parent_empty) + { scene.closeParent(); } parent_name = it->parent; diff --git a/src/ifcconvert/GeometrySerializer.h b/src/ifcconvert/GeometrySerializer.h index 8a15b8bce3..33345b4ad1 100644 --- a/src/ifcconvert/GeometrySerializer.h +++ b/src/ifcconvert/GeometrySerializer.h @@ -43,8 +43,14 @@ public: /// Use material names instead of unique IDs for naming materials. /// Applicable for OBJ and DAE output. USE_MATERIAL_NAMES = 1 << (IfcGeom::IteratorSettings::NUM_SETTINGS + 3), + /// Use element types and names instead of unique IDs for naming elements. + /// Applicable for DAE output. + USE_ELEMENT_TYPES = 1 << (IfcGeom::IteratorSettings::NUM_SETTINGS + 4), + /// Order the elements using their IfcBuildingStorey parent + /// Applicable for DAE output + USE_ELEMENT_HIERARCHY = 1 << (IfcGeom::IteratorSettings::NUM_SETTINGS + 5), /// Number of different setting flags. - NUM_SETTINGS = 3 + NUM_SETTINGS = 5 }; SerializerSettings() diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index cbe8caa896..43b20e4315 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -267,6 +267,12 @@ int main(int argc, char** argv) ("use-material-names", "Use material names instead of unique IDs for naming materials upon serialization. " "Applicable for OBJ and DAE output.") + ("use-element-types", + "Use element types and names instead of unique IDs for naming elements upon serialization. " + "Applicable for DAE output.") + ("use-element-hierarchy", + "Order the elements using their IfcBuildingStorey parent. " + "Applicable for DAE output.") ("center-model", "Centers the elements upon serialization by applying the center point of " "all placements as an offset. Applicable for OBJ and DAE output.") @@ -335,6 +341,8 @@ int main(int argc, char** argv) const bool use_element_names = vmap.count("use-element-names") != 0; const bool use_element_guids = vmap.count("use-element-guids") != 0 ; const bool use_material_names = vmap.count("use-material-names") != 0; + const bool use_element_types = vmap.count("use-element-types") != 0; + const bool use_element_hierarchy = vmap.count("use-element-hierarchy") != 0; const bool no_normals = vmap.count("no-normals") != 0 ; const bool center_model = vmap.count("center-model") != 0 ; const bool model_offset = vmap.count("model-offset") != 0 ; @@ -463,6 +471,8 @@ int main(int argc, char** argv) settings.set(SerializerSettings::USE_ELEMENT_NAMES, use_element_names); settings.set(SerializerSettings::USE_ELEMENT_GUIDS, use_element_guids); settings.set(SerializerSettings::USE_MATERIAL_NAMES, use_material_names); + settings.set(SerializerSettings::USE_ELEMENT_TYPES, use_element_types); + settings.set(SerializerSettings::USE_ELEMENT_HIERARCHY, use_element_hierarchy); settings.set_deflection_tolerance(deflection_tolerance); settings.precision = precision;