From d7ade12dc320ff599e2cb57bece3db8eaa83cfe9 Mon Sep 17 00:00:00 2001 From: bgbsww Date: Sun, 21 Apr 2024 16:04:39 -0400 Subject: [PATCH] Ensure we set up a valid sketch even with invalid external references --- src/Mod/Sketcher/App/SketchObject.cpp | 11 +++- .../SketcherTests/TestSketcherSolver.py | 56 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 17b3472772..2e6395b906 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -7434,6 +7434,7 @@ void SketchObject::validateExternalLinks() const std::string SubElement = SubElements[i]; TopoDS_Shape refSubShape; + bool removeBadLink = false; try { if (Obj->isDerivedFrom()) { const Part::Datum* datum = static_cast(Obj); @@ -7445,7 +7446,15 @@ void SketchObject::validateExternalLinks() refSubShape = refShape.getSubShape(SubElement.c_str()); } } + catch ( Base::IndexError& indexError) { + removeBadLink = true; + Base::Console().Warning( + this->getFullLabel(), (indexError.getMessage() + "\n").c_str()); + } catch (Standard_Failure&) { + removeBadLink = true; + } + if ( removeBadLink ) { rebuild = true; Objects.erase(Objects.begin() + i); SubElements.erase(SubElements.begin() + i); @@ -9548,7 +9557,7 @@ std::pair SketchObject::getElementName( // Todo: Toponaming Project March 2024: This method override breaks the sketcher - selection and deletion // of constraints ceases to work. See #13169. We need to prove that this works before // enabling it. For now, bypass it. - return Part2DObject::getElementName(name,type); +// return Part2DObject::getElementName(name,type); std::pair ret; if(!name) return ret; diff --git a/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py b/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py index d35010321c..15d98a033f 100644 --- a/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py +++ b/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py @@ -480,6 +480,62 @@ class TestSketcherSolver(unittest.TestCase): msg="Reference constraint did not return the expected distance.", ) + def testRemovedExternalGeometryReference(self): + body = self.Doc.addObject("PartDesign::Body", "Body") + sketch = self.Doc.addObject("Sketcher::SketchObject", "Sketch") + CreateRectangleSketch(sketch, (0, 0), (30, 30)) + pad = self.Doc.addObject("PartDesign::Pad", "Pad") + pad.Profile = sketch + sketch1 = self.Doc.addObject("Sketcher::SketchObject", "Sketch1") + CreateCircleSketch(sketch1, (15, 15), 0.25) + body.addObject(sketch) + body.addObject(pad) + body.addObject(sketch1) + self.Doc.recompute() + hole = self.Doc.addObject("PartDesign::Hole", "Hole") + body.addObject(hole) + hole.Profile = sketch1 + hole.Diameter = 0.250000 + hole.Depth = 10.000000 + hole.DrillPointAngle = 118.000000 + hole.TaperedAngle = 90.000000 + hole.Diameter = 6.000000 + hole.Depth = 8.000000 + hole.DrillPointAngle = 118.000000 + hole.TaperedAngle = 90.000000 + hole.Tapered = 0 + hole.Depth = 8.000000 + hole.DrillPointAngle = 118.000000 + hole.Threaded = 1 + hole.ModelThread = 0 + hole.ThreadDepthType = 0 + hole.ThreadType = 1 + hole.ThreadSize = 16 + hole.ThreadClass = 0 + hole.ThreadDirection = 0 + hole.HoleCutType = 0 + hole.DepthType = 0 + hole.DrillPoint = 1 + hole.DrillForDepth = 0 + hole.Tapered = 0 + self.Doc.recompute() + self.assertEqual(len(hole.Shape.Edges), 13) + hole.Threaded = True + hole.ModelThread = True + body.addObject(hole) + # + sketch2 = self.Doc.addObject("Sketcher::SketchObject", "Sketch2") + CreateRectangleSketch(sketch2, (0, 0), (3, 3)) + body.addObject(sketch2) + self.Doc.recompute() + sketch2.addExternal("Hole", "Edge35") # Edge35 will disappear when we stop modeling threads + self.assertEqual(len(hole.Shape.Edges), 38) + hole.ModelThread = False + hole.Refine = True + self.Doc.recompute() + self.assertEqual(len(hole.Shape.Edges), 32) + self.assertEqual(len(sketch2.ExternalGeometry), 1) + def assertSuccessfulSolve(self, sketch, msg=None): status = sketch.solve() # TODO: can we get the solver's messages somehow to improve the message?