diff --git a/src/ifcgeom/mapping/mapping.cpp b/src/ifcgeom/mapping/mapping.cpp index 0abdd361e4..e295f6da60 100644 --- a/src/ifcgeom/mapping/mapping.cpp +++ b/src/ifcgeom/mapping/mapping.cpp @@ -178,13 +178,17 @@ aggregate_of_instance::ptr mapping::find_openings(const IfcUtil::IfcBaseEntity* if (obdef != nullptr) { for (;;) { auto decomposes = obdef->Decomposes()->generalize(); - if (decomposes->size() != 1) break; - IfcSchema::IfcObjectDefinition* rel_obdef; -#ifdef SCHEMA_IfcRelDecomposes_HAS_RelatingObject - rel_obdef = (*decomposes->begin())->as()->RelatingObject(); -#else // IFC4+ - rel_obdef = (*decomposes->begin())->as()->RelatingObject(); -#endif + if (decomposes->size() != 1) { + // If we have multiple decompositions, not allowed by schema, + // openings associated to relating decompositions are not + // considered; + break; + } + if ((*decomposes->begin())->as() == nullptr) { + // Only aggregation, not nesting is considered. + break; + } + IfcSchema::IfcObjectDefinition* rel_obdef = (*decomposes->begin())->as()->RelatingObject(); if (rel_obdef->as() && !rel_obdef->as()) { IfcSchema::IfcElement* element = rel_obdef->as(); auto rels = element->HasOpenings();