From 1207338fa90a40bf6ea2baee917ac6dc7e7b4d3e Mon Sep 17 00:00:00 2001 From: Petru Conduraru Date: Sun, 30 Aug 2026 14:16:30 +0300 Subject: [PATCH] ifcgeom: keep one copy of repeated faces in faceset helper duplicate removal Port of #8772 to v0.9.0 (open_cascade_kernel::faceset_helper is the renamed class, same logic). When an IfcConnectedFaceSet repeats the same IfcFace, wires() still dropped every occurrence via duplicates_, leaving a hole in the shell; this counts the redundant occurrences and skips only those, keeping one copy of each repeated face. --- src/ifcgeom/kernels/opencascade/faceset_helper.cpp | 7 ++++++- src/ifcgeom/kernels/opencascade/opencascade_kernel.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ifcgeom/kernels/opencascade/faceset_helper.cpp b/src/ifcgeom/kernels/opencascade/faceset_helper.cpp index 2b9dfb1e7f..b139c521c8 100644 --- a/src/ifcgeom/kernels/opencascade/faceset_helper.cpp +++ b/src/ifcgeom/kernels/opencascade/faceset_helper.cpp @@ -108,6 +108,7 @@ ifcopenshell::geom::open_cascade_kernel::faceset_helper::faceset_helper( vertex_mapping_.clear(); duplicates_.clear(); + duplicate_skips_remaining_.clear(); edge_use.clear(); @@ -175,6 +176,7 @@ ifcopenshell::geom::open_cascade_kernel::faceset_helper::faceset_helper( if (edge_sets.find(edge_set_key) != edge_sets.end()) { duplicate_faces++; duplicates_.insert(loop->identity()); + duplicate_skips_remaining_[loop->identity()]++; continue; } edge_sets.insert(edge_set_key); @@ -251,7 +253,10 @@ bool ifcopenshell::geom::open_cascade_kernel::faceset_helper::wire(const ifcopen } bool ifcopenshell::geom::open_cascade_kernel::faceset_helper::wires(const ifcopenshell::geom::taxonomy::loop::ptr loop, NCollection_List& wires) { - if (duplicates_.find(loop->identity()) != duplicates_.end()) { + // Skip only the redundant occurrences, keep one copy of the face. + auto it = duplicate_skips_remaining_.find(loop->identity()); + if (it != duplicate_skips_remaining_.end() && it->second > 0) { + --it->second; return false; } TopoDS_Wire wire; diff --git a/src/ifcgeom/kernels/opencascade/opencascade_kernel.h b/src/ifcgeom/kernels/opencascade/opencascade_kernel.h index 858c9830ce..6350f92b22 100644 --- a/src/ifcgeom/kernels/opencascade/opencascade_kernel.h +++ b/src/ifcgeom/kernels/opencascade/opencascade_kernel.h @@ -86,6 +86,7 @@ private: private: open_cascade_kernel* kernel_; std::set duplicates_; + std::map duplicate_skips_remaining_; std::map vertex_mapping_; std::map, TopoDS_Edge> edges_; double eps_;