diff --git a/src/Mod/Path/Generators/drill_generator.py b/src/Mod/Path/Generators/drill_generator.py index 550b678a67..ac9b6b1e63 100644 --- a/src/Mod/Path/Generators/drill_generator.py +++ b/src/Mod/Path/Generators/drill_generator.py @@ -38,7 +38,7 @@ else: PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -def generate(edge, dwelltime=0.0, peckdepth=0.0, repeat=1): +def generate(edge, dwelltime=0.0, peckdepth=0.0, repeat=1, retractheight=None): startPoint = edge.Vertexes[0].Point endPoint = edge.Vertexes[1].Point @@ -61,6 +61,9 @@ def generate(edge, dwelltime=0.0, peckdepth=0.0, repeat=1): if not type(dwelltime) is float: raise ValueError("dwelltime must be a float") + if retractheight is not None and not type(retractheight) is float: + raise ValueError("retractheight must be a float") + if not ( numpy.isclose(startPoint.sub(endPoint).x, 0, rtol=1e-05, atol=1e-06) and (numpy.isclose(startPoint.sub(endPoint).y, 0, rtol=1e-05, atol=1e-06)) @@ -74,7 +77,7 @@ def generate(edge, dwelltime=0.0, peckdepth=0.0, repeat=1): cmdParams["X"] = startPoint.x cmdParams["Y"] = startPoint.y cmdParams["Z"] = endPoint.z - cmdParams["R"] = startPoint.z + cmdParams["R"] = retractheight if retractheight is not None else startPoint.z if repeat > 1: cmdParams["L"] = repeat diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index b53bfd0ec6..fcb894c9ec 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -233,7 +233,9 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp): repeat = 1 # technical debt: Add a repeat property for user control try: - drillcommands = generator.generate(edge, dwelltime, peckdepth, repeat) + drillcommands = generator.generate( + edge, dwelltime, peckdepth, repeat, obj.RetractHeight.Value + ) except ValueError as e: # any targets that fail the generator are ignored PathLog.info(e) diff --git a/src/Mod/Path/PathTests/TestPathDrillGenerator.py b/src/Mod/Path/PathTests/TestPathDrillGenerator.py index 78837b1965..ef8d814304 100644 --- a/src/Mod/Path/PathTests/TestPathDrillGenerator.py +++ b/src/Mod/Path/PathTests/TestPathDrillGenerator.py @@ -114,3 +114,41 @@ class TestPathDrillGenerator(PathTestUtils.PathTestBase): # dwelltime should be a float args = {"edge": e, "dwelltime": 1} self.assertRaises(ValueError, generator.generate, **args) + + def test40(self): + """Specifying retract height should set R parameter to specified value""" + v1 = FreeCAD.Vector(0, 0, 10) + v2 = FreeCAD.Vector(0, 0, 0) + + e = Part.makeLine(v1, v2) + + result = generator.generate(e, retractheight=20.0) + + command = result[0] + + self.assertTrue(command.Parameters["R"] == 20.0) + + def test41(self): + """Not specifying retract height should set R parameter to Z position of start point""" + v1 = FreeCAD.Vector(0, 0, 10) + v2 = FreeCAD.Vector(0, 0, 0) + + e = Part.makeLine(v1, v2) + + result = generator.generate(e) + + command = result[0] + + self.assertTrue(command.Parameters["R"] == 10.0) + + def test42(self): + """Non-float retract height should raise ValueError""" + v1 = FreeCAD.Vector(0, 0, 10) + v2 = FreeCAD.Vector(0, 0, 0) + + e = Part.makeLine(v1, v2) + + args = {"edge": e, "retractheight": 1} + self.assertRaises(ValueError, generator.generate, **args) + args = {"edge": e, "retractheight": "1"} + self.assertRaises(ValueError, generator.generate, **args)