From 29163b01577325f0a6142468c11613ed6c59a731 Mon Sep 17 00:00:00 2001 From: Dimitris75 <30848292+Dimitris75@users.noreply.github.com> Date: Mon, 5 Jan 2026 02:26:56 +0200 Subject: [PATCH 1/2] CAM - Experimental Waterline Minor Fix - Offset and None cut Pattern error - Ensure the tool is directly above the entry point before plunging, - Retract to SafeHeight instead of ClearanceHeight between transitions --- src/Mod/CAM/Path/Op/Waterline.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Mod/CAM/Path/Op/Waterline.py b/src/Mod/CAM/Path/Op/Waterline.py index 88d915d2a2..b16266834d 100644 --- a/src/Mod/CAM/Path/Op/Waterline.py +++ b/src/Mod/CAM/Path/Op/Waterline.py @@ -1897,7 +1897,7 @@ class ObjectWaterline(PathOp.ObjectOp): if cont: # Identify solid areas in the offset data if obj.CutPattern == "Offset" or obj.CutPattern == "None": - ofstSolidFacesList = self._getSolidAreasFromPlanarFaces(ofstArea) + ofstSolidFacesList = self._getSolidAreasFromPlanarFaces(ofstArea.Faces) if ofstSolidFacesList: clearArea = Part.makeCompound(ofstSolidFacesList) self.showDebugObject(clearArea, "ClearArea_{}".format(caCnt)) @@ -2014,6 +2014,10 @@ class ObjectWaterline(PathOp.ObjectOp): startVect = FreeCAD.Vector(V[0].X, V[0].Y, V[0].Z) commands.append(Path.Command("N (Wire {}.)".format(w))) + + # This ensures the tool is directly above the entry point before plunging, + # preventing diagonal moves through the material. + commands.append(Path.Command("G0", {"X": startVect.x, "Y": startVect.y, "F": self.horizRapid})) (cmds, endVect) = self._wireToPath(obj, wire, startVect) commands.extend(cmds) commands.append(Path.Command("G0", {"Z": obj.SafeHeight.Value, "F": self.vertRapid})) @@ -2303,8 +2307,7 @@ class ObjectWaterline(PathOp.ObjectOp): pathParams["feedrate"] = self.horizFeed pathParams["feedrate_v"] = self.vertFeed pathParams["verbose"] = True - pathParams["resume_height"] = obj.SafeHeight.Value - pathParams["retraction"] = obj.ClearanceHeight.Value + pathParams["retraction"] = obj.SafeHeight.Value pathParams["return_end"] = True # Note that emitting preambles between moves breaks some dressups and prevents path optimization on some controllers pathParams["preamble"] = False From 784e52d25efd00fc47fea19e9ee6e927ce65eee1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 00:46:21 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/Mod/CAM/Path/Op/Waterline.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Mod/CAM/Path/Op/Waterline.py b/src/Mod/CAM/Path/Op/Waterline.py index b16266834d..1827206aad 100644 --- a/src/Mod/CAM/Path/Op/Waterline.py +++ b/src/Mod/CAM/Path/Op/Waterline.py @@ -2014,10 +2014,12 @@ class ObjectWaterline(PathOp.ObjectOp): startVect = FreeCAD.Vector(V[0].X, V[0].Y, V[0].Z) commands.append(Path.Command("N (Wire {}.)".format(w))) - + # This ensures the tool is directly above the entry point before plunging, # preventing diagonal moves through the material. - commands.append(Path.Command("G0", {"X": startVect.x, "Y": startVect.y, "F": self.horizRapid})) + commands.append( + Path.Command("G0", {"X": startVect.x, "Y": startVect.y, "F": self.horizRapid}) + ) (cmds, endVect) = self._wireToPath(obj, wire, startVect) commands.extend(cmds) commands.append(Path.Command("G0", {"Z": obj.SafeHeight.Value, "F": self.vertRapid}))