From b604e5cf99dcb298c29152b5841901d451a89184 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 2 Jul 2017 19:57:10 +0200 Subject: [PATCH] Fix #204 --- src/ifcconvert/XmlSerializer.cpp | 43 +++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/ifcconvert/XmlSerializer.cpp b/src/ifcconvert/XmlSerializer.cpp index b0173273f6..a5082d23ff 100644 --- a/src/ifcconvert/XmlSerializer.cpp +++ b/src/ifcconvert/XmlSerializer.cpp @@ -173,6 +173,10 @@ ptree& format_entity_instance(IfcUtil::IfcBaseEntity* instance, ptree& tree, boo return format_entity_instance(instance, child, tree, as_link); } +std::string qualify_unrooted_instance(IfcUtil::IfcBaseClass* inst) { + return IfcSchema::Type::ToString(inst->type()) + "_" + boost::lexical_cast(inst->entity->id()); +} + // A function to be called recursively. Template specialization is used // to descend into decomposition, containment and property relationships. template @@ -280,6 +284,16 @@ ptree& descend(IfcObjectDefinition* product, ptree& tree) { node.put(".xlink:href", "#" + it->first); format_entity_instance(it->second, node, child, true); } + + IfcRelAssociates::list::ptr associations = product->HasAssociations(); + for (IfcRelAssociates::list::it it = associations->begin(); it != associations->end(); ++it) { + if ((*it)->as()) { + IfcMaterialSelect* mat = (*it)->as()->RelatingMaterial(); + ptree node; + node.put(".xlink:href", "#" + qualify_unrooted_instance(mat)); + format_entity_instance((IfcUtil::IfcBaseEntity*) mat, node, child, true); + } + } } return child; @@ -310,7 +324,7 @@ void XmlSerializer::finalize() { } IfcProject* project = *projects->begin(); - ptree root, header, units, decomposition, properties, types, layers; + ptree root, header, units, decomposition, properties, types, layers, materials; // Write the SPF header as XML nodes. foreach(const std::string& s, file->header().file_description().description()) { @@ -388,11 +402,38 @@ void XmlSerializer::finalize() { } } + IfcRelAssociatesMaterial::list::ptr materal_associations = file->entitiesByType(); + std::set emitted_materials; + for (IfcRelAssociatesMaterial::list::it it = materal_associations->begin(); it != materal_associations->end(); ++it) { + IfcMaterialSelect* mat = (**it).RelatingMaterial(); + if (emitted_materials.find(mat) == emitted_materials.end()) { + emitted_materials.insert(mat); + ptree node; + node.put(".id", qualify_unrooted_instance(mat)); + if (mat->as()) { + IfcMaterialLayerSet* layerset = mat->as()->ForLayerSet(); + if (layerset->hasLayerSetName()) { + node.put(".LayerSetName", layerset->LayerSetName()); + } + IfcMaterialLayer::list::ptr ls = layerset->MaterialLayers(); + for (IfcMaterialLayer::list::it jt = ls->begin(); jt != ls->end(); ++jt) { + ptree subnode; + if ((*jt)->hasMaterial()) { + subnode.put(".Name", (*jt)->Material()->Name()); + } + format_entity_instance(*jt, subnode, node); + } + } + format_entity_instance((IfcUtil::IfcBaseEntity*) mat, node, materials); + } + } + root.add_child("ifc.header", header); root.add_child("ifc.units", units); root.add_child("ifc.properties", properties); root.add_child("ifc.types", types); root.add_child("ifc.layers", layers); + root.add_child("ifc.materials", materials); root.add_child("ifc.decomposition", decomposition); root.put("ifc..xmlns:xlink", "http://www.w3.org/1999/xlink");