From 103f37eee1366a3ea348db6d35a8868b5f356f9e Mon Sep 17 00:00:00 2001 From: pavltom Date: Mon, 11 Dec 2023 23:40:33 +0100 Subject: [PATCH] [TechDraw] Fix scrubEdges() OCC error with single input edge --- src/Mod/TechDraw/App/DrawProjectSplit.cpp | 36 ++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawProjectSplit.cpp b/src/Mod/TechDraw/App/DrawProjectSplit.cpp index ba806a0405..dddb0483b9 100644 --- a/src/Mod/TechDraw/App/DrawProjectSplit.cpp +++ b/src/Mod/TechDraw/App/DrawProjectSplit.cpp @@ -419,12 +419,26 @@ std::vector DrawProjectSplit::scrubEdges(std::vector& std::vector &closedEdges) { // Base::Console().Message("DPS::scrubEdges() - TopoDS_Edges in: %d\n", origEdges.size()); + std::vector openEdges; - if (origEdges.empty()) { - //how did this happen? if Scale is zero, all the edges will be zero length, - //but Scale property has constraint, so this shouldn't happen! -// Base::Console().Message("DPS::scrubEdges(2) - origEdges is empty\n"); //debug - return std::vector(); + // We must have at least 2 edges to perform the General Fuse operation + if (origEdges.size() < 2) { + if (origEdges.empty()) { + //how did this happen? if Scale is zero, all the edges will be zero length, + //but Scale property has constraint, so this shouldn't happen! + //Base::Console().Message("DPS::scrubEdges(2) - origEdges is empty\n"); + } + else { + TopoDS_Edge &edge = origEdges.front(); + if (BRep_Tool::IsClosed(edge)) { + closedEdges.push_back(edge); + } + else { + openEdges.push_back(edge); + } + } + + return openEdges; } TopTools_ListOfShape edgeList; @@ -461,14 +475,16 @@ std::vector DrawProjectSplit::scrubEdges(std::vector& Base::Console().Warning("DrawProjectSplit::scrubEdges - OCC fuse raised warning(s):\n%s\n", warnStr.c_str()); } - std::vector openEdges; const TopoDS_Shape &bopResult = bopBuilder.Shape(); if (!bopResult.IsNull()) { - TopExp_Explorer explorer(bopResult, TopAbs_EDGE); - while (explorer.More()) { + for (TopExp_Explorer explorer(bopResult, TopAbs_EDGE); explorer.More(); explorer.Next()) { const TopoDS_Edge &edge = TopoDS::Edge(explorer.Current()); - (BRep_Tool::IsClosed(edge) ? closedEdges : openEdges).push_back(edge); - explorer.Next(); + if (BRep_Tool::IsClosed(edge)) { + closedEdges.push_back(edge); + } + else { + openEdges.push_back(edge); + } } }