From ef7a1ab421a362e62f971c3c5752f2d7104301d1 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 13 May 2018 09:15:06 +0200 Subject: [PATCH] Limit boolean fuzz to edge length --- src/ifcgeom/IfcGeomFunctions.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/ifcgeom/IfcGeomFunctions.cpp b/src/ifcgeom/IfcGeomFunctions.cpp index f0401ad7fd..c9dcc1577e 100644 --- a/src/ifcgeom/IfcGeomFunctions.cpp +++ b/src/ifcgeom/IfcGeomFunctions.cpp @@ -3086,9 +3086,22 @@ bool IfcGeom::Kernel::boolean_operation(const TopoDS_Shape& a, const TopTools_Li if (fuzziness < 0.) { fuzziness = getValue(GV_PRECISION); } + + double min_edge_len = std::numeric_limits::infinity(); + // ... to be sure to get consecutive edges + TopExp_Explorer exp(a, TopAbs_EDGE); + for (; exp.More(); exp.Next()) { + GProp_GProps prop; + BRepGProp::LinearProperties(exp.Current(), prop); + double l = prop.Mass(); + if (l < min_edge_len) { + min_edge_len = l; + } + } + TopTools_ListOfShape s1s; s1s.Append(copy_operand(a)); - builder->SetFuzzyValue(fuzziness); + builder->SetFuzzyValue((std::min)(min_edge_len / 3., fuzziness)); builder->SetArguments(s1s); builder->SetTools(copy_operand(b)); builder->Build(); @@ -3112,7 +3125,7 @@ bool IfcGeom::Kernel::boolean_operation(const TopoDS_Shape& a, const TopTools_Li delete builder; if (!success) { const double new_fuzziness = fuzziness * 10.; - if (new_fuzziness + 1e-15 <= getValue(GV_PRECISION) * 1000.) { + if (new_fuzziness + 1e-15 <= getValue(GV_PRECISION) * 1000. && new_fuzziness < min_edge_len) { return boolean_operation(a, b, op, result, new_fuzziness); } }