From 8500daf1cc2f028b5f20b6dadf346b59ad949b14 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sat, 11 Jul 2020 11:40:27 +0200 Subject: [PATCH] #915 --- src/ifcgeom/IfcGeom.h | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/ifcgeom/IfcGeom.h b/src/ifcgeom/IfcGeom.h index 483982eb4b..30fd6b0627 100644 --- a/src/ifcgeom/IfcGeom.h +++ b/src/ifcgeom/IfcGeom.h @@ -385,29 +385,52 @@ public: const SurfaceStyle* get_style(const IfcSchema::IfcMaterial*); template std::pair _get_surface_style(const IfcSchema::IfcStyledItem* si) { + std::vector prs_styles; + #ifdef SCHEMA_HAS_IfcStyleAssignmentSelect IfcEntityList::ptr style_assignments = si->Styles(); for (IfcEntityList::it kt = style_assignments->begin(); kt != style_assignments->end(); ++kt) { + + // Using IfcPresentationStyleAssignment is deprecated, use the direct assignment of a subtype of IfcPresentationStyle instead. + auto style_k = (*kt)->as(); + if (style_k) { + prs_styles.push_back(style_k); + continue; + } + if (!(*kt)->declaration().is(IfcSchema::IfcPresentationStyleAssignment::Class())) { continue; } + IfcSchema::IfcPresentationStyleAssignment* style_assignment = (IfcSchema::IfcPresentationStyleAssignment*) *kt; + + Logger::Warning("Deprecated usage of", style_assignment); #else IfcSchema::IfcPresentationStyleAssignment::list::ptr style_assignments = si->Styles(); for (IfcSchema::IfcPresentationStyleAssignment::list::it kt = style_assignments->begin(); kt != style_assignments->end(); ++kt) { IfcSchema::IfcPresentationStyleAssignment* style_assignment = *kt; #endif + + // Only in case of 2x3 or old style IfcPresentationStyleAssignment + IfcEntityList::ptr styles = style_assignment->Styles(); + for (IfcEntityList::it lt = styles->begin(); lt != styles->end(); ++lt) { - IfcUtil::IfcBaseClass* style = *lt; - if (style->declaration().is(IfcSchema::IfcSurfaceStyle::Class())) { - IfcSchema::IfcSurfaceStyle* surface_style = (IfcSchema::IfcSurfaceStyle*) style; - if (surface_style->Side() != IfcSchema::IfcSurfaceSide::IfcSurfaceSide_NEGATIVE) { - IfcEntityList::ptr styles_elements = surface_style->Styles(); - for (IfcEntityList::it mt = styles_elements->begin(); mt != styles_elements->end(); ++mt) { - if ((*mt)->declaration().is(T::Class())) { - return std::make_pair(surface_style, (T*) *mt); - } + auto style_l = (*lt)->as(); + if (style_l) { + prs_styles.push_back(style_l); + } + } + } + + for (auto& style : prs_styles) { + if (style->declaration().is(IfcSchema::IfcSurfaceStyle::Class())) { + IfcSchema::IfcSurfaceStyle* surface_style = (IfcSchema::IfcSurfaceStyle*) style; + if (surface_style->Side() != IfcSchema::IfcSurfaceSide::IfcSurfaceSide_NEGATIVE) { + IfcEntityList::ptr styles_elements = surface_style->Styles(); + for (IfcEntityList::it mt = styles_elements->begin(); mt != styles_elements->end(); ++mt) { + if ((*mt)->declaration().is(T::Class())) { + return std::make_pair(surface_style, (T*) *mt); } } }