diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index ec6d94926e..171c3831cd 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -3614,7 +3614,9 @@ void TopoShape::setFaces(const std::vector &Points, Edges[key2] = edge; } else { - Edges[key2] = BRepBuilderAPI_MakeEdge(Vertexes[p1], Vertexes[p2]); + BRepBuilderAPI_MakeEdge mkEdge(Vertexes[p1], Vertexes[p2]); + if (mkEdge.IsDone()) + Edges[key2] = mkEdge.Edge(); } }; auto GetEdge = [&Edges](uint32_t p1, uint32_t p2) { @@ -3638,10 +3640,14 @@ void TopoShape::setFaces(const std::vector &Points, p2.SetCoord(x2,y2,z2); p3.SetCoord(x3,y3,z3); - if ((!(p1.IsEqual(p2,0.0))) && (!(p1.IsEqual(p3,0.0)))) { + // Avoid very tiny edges as this may result into broken faces. The tolerance is Approximation + // because Confusion might be too tight. + if ((!(p1.IsEqual(p2, Precision::Approximation()))) && (!(p1.IsEqual(p3, Precision::Approximation())))) { const TopoDS_Edge& e1 = GetEdge(it->I1, it->I2); const TopoDS_Edge& e2 = GetEdge(it->I2, it->I3); const TopoDS_Edge& e3 = GetEdge(it->I3, it->I1); + if (e1.IsNull() || e2.IsNull() || e3.IsNull()) + continue; newWire = BRepBuilderAPI_MakeWire(e1, e2, e3); if (!newWire.IsNull()) {