diff --git a/src/Mod/CAM/Path/Op/Waterline.py b/src/Mod/CAM/Path/Op/Waterline.py index 88d915d2a2..1827206aad 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,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}) + ) (cmds, endVect) = self._wireToPath(obj, wire, startVect) commands.extend(cmds) commands.append(Path.Command("G0", {"Z": obj.SafeHeight.Value, "F": self.vertRapid})) @@ -2303,8 +2309,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