From 301cdf65046fd8d357b859e9daa163d3eea755b8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 18 Jun 2024 13:51:03 +0500 Subject: [PATCH] Fix creating representation with inherited materials It should be considered as inherited material can also have a style. Though occurrence's material is still prioritized. --- src/ifcgeom/Converter.cpp | 7 +++++++ src/ifcgeom/abstract_mapping.h | 1 + src/ifcgeom/mapping/mapping.cpp | 17 ++++++++++++++++- src/ifcgeom/mapping/mapping.h | 3 ++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/Converter.cpp b/src/ifcgeom/Converter.cpp index 38ca41da1f..a563016d20 100644 --- a/src/ifcgeom/Converter.cpp +++ b/src/ifcgeom/Converter.cpp @@ -107,6 +107,13 @@ IfcGeom::BRepElement* ifcopenshell::geometry::Converter::create_brep_for_represe bool material_style_applied = false; auto single_material = mapping_->get_single_material_association(product); + if (!single_material) { + auto type_product = mapping_->get_product_type(product); + if (type_product) { + single_material = mapping_->get_single_material_association(type_product); + } + } + if (single_material) { auto s = taxonomy::cast(mapping_->map(single_material)); for (auto it = shapes.begin(); it != shapes.end(); ++it) { diff --git a/src/ifcgeom/abstract_mapping.h b/src/ifcgeom/abstract_mapping.h index aeda275dd3..bb7904233d 100644 --- a/src/ifcgeom/abstract_mapping.h +++ b/src/ifcgeom/abstract_mapping.h @@ -41,6 +41,7 @@ namespace geometry { virtual void initialize_settings() = 0; virtual bool get_layerset_information(const IfcUtil::IfcBaseInterface*, layerset_information&, int&) = 0; virtual bool get_wall_neighbours(const IfcUtil::IfcBaseInterface*, std::vector&) = 0; + virtual const IfcUtil::IfcBaseEntity* get_product_type(const IfcUtil::IfcBaseEntity*) = 0; virtual const IfcUtil::IfcBaseEntity* get_single_material_association(const IfcUtil::IfcBaseEntity*) = 0; virtual double get_length_unit() const = 0; virtual IfcUtil::IfcBaseEntity* representation_of(const IfcUtil::IfcBaseEntity* product) = 0; diff --git a/src/ifcgeom/mapping/mapping.cpp b/src/ifcgeom/mapping/mapping.cpp index f92d7ca7e2..53926f2aef 100644 --- a/src/ifcgeom/mapping/mapping.cpp +++ b/src/ifcgeom/mapping/mapping.cpp @@ -256,8 +256,23 @@ void mapping::get_representations(std::vector& tasks, } } -const IfcUtil::IfcBaseEntity* mapping::get_single_material_association(const IfcUtil::IfcBaseEntity* product_) { +const IfcUtil::IfcBaseEntity* mapping::get_product_type(const IfcUtil::IfcBaseEntity* product_) { auto product = product_->as(); + auto rels = product->IsTypedBy(); + for (auto it = rels->begin(); it != rels->end(); ++it) { + auto rel = *it; + // Avoid segfault if RelatingType is unset. + if (rel->get("RelatingType")->isNull()){ + break; + return nullptr; + } + return rel->RelatingType(); + } + return nullptr; +} + +const IfcUtil::IfcBaseEntity* mapping::get_single_material_association(const IfcUtil::IfcBaseEntity* product_) { + auto product = product_->as(); IfcSchema::IfcMaterial* single_material = 0; IfcSchema::IfcRelAssociatesMaterial::list::ptr associated_materials = product->HasAssociations()->as(); if (associated_materials->size() == 1) { diff --git a/src/ifcgeom/mapping/mapping.h b/src/ifcgeom/mapping/mapping.h index f030731748..798d173017 100644 --- a/src/ifcgeom/mapping/mapping.h +++ b/src/ifcgeom/mapping/mapping.h @@ -42,7 +42,8 @@ namespace geometry { virtual double get_length_unit() const { return length_unit_; } virtual aggregate_of_instance::ptr find_openings(const IfcUtil::IfcBaseEntity*); virtual IfcUtil::IfcBaseEntity* representation_of(const IfcUtil::IfcBaseEntity* product); - + + virtual const IfcUtil::IfcBaseEntity* get_product_type(const IfcUtil::IfcBaseEntity* product_); virtual const IfcUtil::IfcBaseEntity* get_single_material_association(const IfcUtil::IfcBaseEntity* product); IfcSchema::IfcRepresentation* representation_mapped_to(const IfcSchema::IfcRepresentation* representation); IfcSchema::IfcProduct::list::ptr products_represented_by(const IfcSchema::IfcRepresentation* representation, bool only_direct=false);