Ensure we set up a valid sketch even with invalid external references

This commit is contained in:
bgbsww
2024-04-21 16:04:39 -04:00
committed by Yorik van Havre
parent 4ea1ad58c8
commit d7ade12dc3
2 changed files with 66 additions and 1 deletions

View File

@@ -7434,6 +7434,7 @@ void SketchObject::validateExternalLinks()
const std::string SubElement = SubElements[i];
TopoDS_Shape refSubShape;
bool removeBadLink = false;
try {
if (Obj->isDerivedFrom<Part::Datum>()) {
const Part::Datum* datum = static_cast<const Part::Datum*>(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<std::string,std::string> 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<std::string, std::string> ret;
if(!name) return ret;

View File

@@ -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?