diff --git a/src/ifcgeom/mapping/mapping.cpp b/src/ifcgeom/mapping/mapping.cpp index 2f4d977557..202d85e2f4 100644 --- a/src/ifcgeom/mapping/mapping.cpp +++ b/src/ifcgeom/mapping/mapping.cpp @@ -165,10 +165,8 @@ aggregate_of_instance::ptr mapping::find_openings(const IfcUtil::IfcBaseEntity* return openings; } - auto product = inst->as(); - - if (product->as() && !product->as()) { - const IfcSchema::IfcElement* element = product->as(); + if (inst->as() && !inst->as()) { + const IfcSchema::IfcElement* element = inst->as(); auto rels = element->HasOpenings(); for (auto& rel : *rels) { openings->push(rel->RelatedOpeningElement()); @@ -176,20 +174,22 @@ aggregate_of_instance::ptr mapping::find_openings(const IfcUtil::IfcBaseEntity* } // Is the IfcElement a decomposition of an IfcElement with any IfcOpeningElements? - const IfcSchema::IfcObjectDefinition* obdef = product->as(); - for (;;) { - auto decomposes = obdef->Decomposes()->generalize(); - if (decomposes->size() != 1) 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(); - for (auto& rel : *rels) { - openings->push(rel->RelatedOpeningElement()); + const IfcSchema::IfcObjectDefinition* obdef = inst->as(); + if (obdef != nullptr) { + for (;;) { + auto decomposes = obdef->Decomposes()->generalize(); + if (decomposes->size() != 1) 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(); + for (auto& rel : *rels) { + openings->push(rel->RelatedOpeningElement()); + } } - } - obdef = rel_obdef; + obdef = rel_obdef; + } } return openings;