From cbeb67b509ed2fd86f3e8b67640dc86c1c1237ca Mon Sep 17 00:00:00 2001 From: Billy Huddleston Date: Mon, 22 Sep 2025 16:28:45 -0400 Subject: [PATCH] CAM: Convert tapping operation to experimental feature, Add tap pitch support, improve tapping logic, and update toolbit schema and legacy linuxcnc post CAM/App/PathSegmentWalker.cpp - Add G74 to drill/tap/bore G-code recognition for tapping cycles CAM/InitGui.py - Move CAM_Tapping command behind experimental feature flag - Only group drilling/tapping commands if both are enabled CAM/Path/Base/Generator/tapping.py - Add pitch and spindle_speed parameters to tapping.generate - Output S (spindle speed) and F (pitch) in generated G-code CAM/Path/Op/Tapping.py - Require Pitch property for tap tools and SpindleSpeed for tool controllers - Pass pitch and spindle speed to tapping.generate - Use SpindleDirection to determine right/left hand tap CAM/Path/Post/scripts/linuxcnc_post.py - Handle G84/G74 tapping cycles: convert pitch and spindle speed to feed rate - Remove F and S from output and recalculate F as needed CAM/Path/Tool/shape/models/tap.py - Add Pitch property to ToolBitShapeTap schema - CAM/Path/Tool/toolbit/models/tap.py - Show pitch and rotation in tap tool summary - Use is_imperial_pitch to format pitch as TPI or mm CAM/Path/Tool/toolbit/util.py - Add is_imperial_pitch utility to classify pitch as imperial or metric CAM/Tools/Bit/375-16_Tap.fctb - Remove unused parameters (Coating, Rotation, TPI, Type) - Keep only relevant tap parameters for new schema --- src/Mod/CAM/App/PathSegmentWalker.cpp | 5 ++- src/Mod/CAM/InitGui.py | 25 +++++++---- src/Mod/CAM/Path/Base/Generator/tapping.py | 12 +++++- src/Mod/CAM/Path/Op/Tapping.py | 40 +++++++++++++++--- .../CAM/Path/Post/scripts/linuxcnc_post.py | 33 ++++++++++++--- src/Mod/CAM/Path/Tool/shape/models/tap.py | 4 ++ src/Mod/CAM/Path/Tool/toolbit/models/tap.py | 30 ++++++++++++- src/Mod/CAM/Path/Tool/toolbit/util.py | 30 +++++++++++++ src/Mod/CAM/Tools/Bit/375-16_Tap.fctb | 6 +-- src/Mod/CAM/Tools/Shape/tap.fcstd | Bin 15404 -> 29456 bytes 10 files changed, 155 insertions(+), 30 deletions(-) diff --git a/src/Mod/CAM/App/PathSegmentWalker.cpp b/src/Mod/CAM/App/PathSegmentWalker.cpp index 4274d3281c..e966f6a374 100644 --- a/src/Mod/CAM/App/PathSegmentWalker.cpp +++ b/src/Mod/CAM/App/PathSegmentWalker.cpp @@ -313,8 +313,9 @@ void PathSegmentWalker::walk(PathSegmentVisitor& cb, const Base::Vector3d& start // relative mode absolutecenter = false; } - else if ((name == "G73") || (name == "G81") || (name == "G82") || (name == "G83") - || (name == "G84") || (name == "G85") || (name == "G86") || (name == "G89")) { + else if ((name == "G73") || (name == "G74") || (name == "G81") || (name == "G82") + || (name == "G83") || (name == "G84") || (name == "G85") || (name == "G86") + || (name == "G89")) { // drill,tap,bore double r = 0; if (cmd.has("R")) { diff --git a/src/Mod/CAM/InitGui.py b/src/Mod/CAM/InitGui.py index ec2ef11ebc..b34fc8408d 100644 --- a/src/Mod/CAM/InitGui.py +++ b/src/Mod/CAM/InitGui.py @@ -148,7 +148,7 @@ class CAMWorkbench(Workbench): ] threedopcmdlist = ["CAM_Pocket3D"] engravecmdlist = ["CAM_Engrave", "CAM_Deburr", "CAM_Vcarve"] - drillingcmdlist = ["CAM_Drilling", "CAM_Tapping"] + drillingcmdlist = ["CAM_Drilling"] modcmdlist = ["CAM_OperationCopy", "CAM_Array", "CAM_SimpleCopy"] dressupcmdlist = [ "CAM_DressupArray", @@ -175,14 +175,21 @@ class CAMWorkbench(Workbench): QT_TRANSLATE_NOOP("CAM_EngraveTools", "Engraving Operations"), ), ) - drillingcmdgroup = ["CAM_DrillingTools"] - FreeCADGui.addCommand( - "CAM_DrillingTools", - PathCommandGroup( - drillingcmdlist, - QT_TRANSLATE_NOOP("CAM_DrillingTools", "Drilling Operations"), - ), - ) + if Path.Preferences.experimentalFeaturesEnabled(): + drillingcmdlist.append("CAM_Tapping") + + if set(["CAM_Drilling", "CAM_Tapping"]).issubset(drillingcmdlist): + drillingcmdgroup = ["CAM_DrillingTools"] + FreeCADGui.addCommand( + "CAM_DrillingTools", + PathCommandGroup( + drillingcmdlist, + QT_TRANSLATE_NOOP("CAM_DrillingTools", "Drilling Operations"), + ), + ) + else: + drillingcmdgroup = drillingcmdlist + dressupcmdgroup = ["CAM_DressupTools"] FreeCADGui.addCommand( "CAM_DressupTools", diff --git a/src/Mod/CAM/Path/Base/Generator/tapping.py b/src/Mod/CAM/Path/Base/Generator/tapping.py index 08a0216b00..a7bf5a0cac 100644 --- a/src/Mod/CAM/Path/Base/Generator/tapping.py +++ b/src/Mod/CAM/Path/Base/Generator/tapping.py @@ -38,7 +38,15 @@ else: Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) -def generate(edge, dwelltime=0.0, repeat=1, retractheight=None, righthand=True): +def generate( + edge, + dwelltime=0.0, + repeat=1, + retractheight=None, + righthand=True, + pitch=None, + spindle_speed=None, +): """ Generates Gcode for tapping a single hole. @@ -90,6 +98,8 @@ def generate(edge, dwelltime=0.0, repeat=1, retractheight=None, righthand=True): cmdParams["Y"] = startPoint.y cmdParams["Z"] = endPoint.z cmdParams["R"] = retractheight if retractheight is not None else startPoint.z + cmdParams["S"] = spindle_speed if spindle_speed is not None else 1.0 # Sanity default + cmdParams["F"] = float(pitch) if pitch is not None else 100.0 # Sanity default if repeat < 1: raise ValueError("repeat must be 1 or greater") diff --git a/src/Mod/CAM/Path/Op/Tapping.py b/src/Mod/CAM/Path/Op/Tapping.py index e0b888368c..8f38a6f2fa 100644 --- a/src/Mod/CAM/Path/Op/Tapping.py +++ b/src/Mod/CAM/Path/Op/Tapping.py @@ -147,13 +147,11 @@ class ObjectTapping(PathCircularHoleBase.ObjectOp): Path.Log.track() machine = PathMachineState.MachineState() - if not hasattr(obj.ToolController.Tool, "Pitch") or not hasattr( - obj.ToolController.Tool, "TPI" - ): + if not hasattr(obj.ToolController.Tool, "Pitch"): Path.Log.error( translate( "Path_Tapping", - "Tapping Operation requires a Tap tool with Pitch or TPI", + "Tapping Operation requires a Tap tool with Pitch", ) ) return @@ -192,7 +190,6 @@ class ObjectTapping(PathCircularHoleBase.ObjectOp): # iterate the edgelist and generate gcode for edge in edgelist: - Path.Log.debug(edge) # move to hole location @@ -222,11 +219,40 @@ class ObjectTapping(PathCircularHoleBase.ObjectOp): repeat = 1 # technical debt: Add a repeat property for user control # Get attribute from obj.tool, assign default and set to bool for passing to generate - isRightHand = getattr(obj.ToolController.Tool, "Rotation", "Right Hand") == "Right Hand" + isRightHand = ( + getattr(obj.ToolController.Tool, "SpindleDirection", "Forward") == "Forward" + ) + + # Get pitch in mm as a float (no unit string) + pitch = getattr(obj.ToolController.Tool, "Pitch", None) + if pitch is None or pitch == 0: + Path.Log.error( + translate( + "Path_Tapping", + "Tapping Operation requires a Tap tool with non-zero Pitch", + ) + ) + continue + + spindle_speed = getattr(obj.ToolController, "SpindleSpeed", None) + if spindle_speed is None or spindle_speed == 0: + Path.Log.error( + translate( + "Path_Tapping", + "Tapping Operation requires a ToolController with non-zero SpindleSpeed", + ) + ) + continue try: tappingcommands = tapping.generate( - edge, dwelltime, repeat, obj.RetractHeight.Value, isRightHand + edge, + dwelltime, + repeat, + obj.RetractHeight.Value, + isRightHand, + pitch, + spindle_speed, ) except ValueError as e: # any targets that fail the generator are ignored diff --git a/src/Mod/CAM/Path/Post/scripts/linuxcnc_post.py b/src/Mod/CAM/Path/Post/scripts/linuxcnc_post.py index 94adc56c76..d13d3848bd 100644 --- a/src/Mod/CAM/Path/Post/scripts/linuxcnc_post.py +++ b/src/Mod/CAM/Path/Post/scripts/linuxcnc_post.py @@ -202,7 +202,6 @@ def export(objectslist, filename, argstring): gcode += linenumber() + UNITS + "\n" for obj in objectslist: - # Skip inactive operations if not PathUtil.activeForOp(obj): continue @@ -321,7 +320,6 @@ def parse(pathobj): out += parse(p) return out else: # parsing simple path - # groups might contain non-path things like stock. if not hasattr(pathobj, "Path"): return out @@ -337,7 +335,6 @@ def parse(pathobj): # # for c in PathUtils.getPathWithPlacement(pathobj).Commands: for c in pathobj.Path.Commands: - outstring = [] command = c.Name outstring.append(command) @@ -350,6 +347,34 @@ def parse(pathobj): if c.Name.startswith("(") and not OUTPUT_COMMENTS: # command is a comment continue + # Handle G84/G74 tapping cycles + if command in ("G84", "G74") and "F" in c.Parameters: + pitch_mm = float(c.Parameters["F"]) + c.Parameters.pop("F") # Remove F from output, we'll handle it + + # Get spindle speed (from S param or last known value) + spindle_speed = None + if "S" in c.Parameters: + spindle_speed = float(c.Parameters["S"]) + c.Parameters.pop("S") + + # Convert pitch to inches if needed + if UNITS == "G20": # imperial + pitch = pitch_mm / 25.4 + else: + pitch = pitch_mm + + # Calculate feed rate + if spindle_speed is not None: + feed_rate = pitch * spindle_speed + speed = Units.Quantity(feed_rate, UNIT_SPEED_FORMAT) + outstring.append( + "F" + format(float(speed.getValueAs(UNIT_SPEED_FORMAT)), precision_string) + ) + else: + # No spindle speed found, output pitch as F + outstring.append("F" + format(pitch, precision_string)) + # Now add the remaining parameters in order for param in params: if param in c.Parameters: @@ -428,8 +453,6 @@ def parse(pathobj): # append the line to the final output for w in outstring: out += w + COMMAND_SPACE - # Note: Do *not* strip `out`, since that forces the allocation - # of a contiguous string & thus quadratic complexity. out += "\n" return out diff --git a/src/Mod/CAM/Path/Tool/shape/models/tap.py b/src/Mod/CAM/Path/Tool/shape/models/tap.py index 494d0f3164..1d4f5a18a9 100644 --- a/src/Mod/CAM/Path/Tool/shape/models/tap.py +++ b/src/Mod/CAM/Path/Tool/shape/models/tap.py @@ -56,6 +56,10 @@ class ToolBitShapeTap(ToolBitShape): FreeCAD.Qt.translate("ToolBitShape", "Tip angle"), "App::PropertyAngle", ), + "Pitch": ( + FreeCAD.Qt.translate("ToolBitShape", "Thread pitch"), + "App::PropertyLength", + ), } @property diff --git a/src/Mod/CAM/Path/Tool/toolbit/models/tap.py b/src/Mod/CAM/Path/Tool/toolbit/models/tap.py index 4a83a59822..8e605b07cb 100644 --- a/src/Mod/CAM/Path/Tool/toolbit/models/tap.py +++ b/src/Mod/CAM/Path/Tool/toolbit/models/tap.py @@ -24,6 +24,7 @@ import Path from ...shape import ToolBitShapeTap from ..mixins import RotaryToolBitMixin, CuttingToolMixin from .base import ToolBit +from ..util import is_imperial_pitch class ToolBitTap(ToolBit, CuttingToolMixin, RotaryToolBitMixin): @@ -39,7 +40,34 @@ class ToolBitTap(ToolBit, CuttingToolMixin, RotaryToolBitMixin): diameter = self.get_property_str("Diameter", "?", precision=3) flutes = self.get_property("Flutes") cutting_edge_length = self.get_property_str("CuttingEdgeLength", "?", precision=3) + pitch_raw = self.get_property("Pitch") + + spindle_direction = self.get_property_str("SpindleDirection", "Forward") + if spindle_direction == "Forward": + rotation = "Right Hand" + elif spindle_direction == "Reverse": + rotation = "Left Hand" + else: + rotation = spindle_direction + + if isinstance(pitch_raw, FreeCAD.Units.Quantity): + pitch_mm = pitch_raw.getValueAs("mm") + else: + pitch_mm = FreeCAD.Units.Quantity(str(pitch_raw)).getValueAs("mm") + + if pitch_raw: + try: + if is_imperial_pitch(pitch_raw): + tpi = round(25.4 / pitch_mm, 2) + pitch = f"{int(tpi) if tpi == int(tpi) else tpi} TPI" + else: + pitch = f"{pitch_mm} mm" + except Exception: + pitch = str(pitch_raw) + else: + pitch = "?" return FreeCAD.Qt.translate( - "CAM", f"{diameter} tap, {flutes}-flute, {cutting_edge_length} cutting edge" + "CAM", + f"{diameter} {pitch} {rotation} tap, {flutes}-flute, {cutting_edge_length} cutting edge", ) diff --git a/src/Mod/CAM/Path/Tool/toolbit/util.py b/src/Mod/CAM/Path/Tool/toolbit/util.py index bc21722814..87ed862ad2 100644 --- a/src/Mod/CAM/Path/Tool/toolbit/util.py +++ b/src/Mod/CAM/Path/Tool/toolbit/util.py @@ -47,3 +47,33 @@ def format_value(value: FreeCAD.Units.Quantity | int | float | None, precision: return value.getUserPreferred()[0] return value.UserString return str(value) + + +def is_imperial_pitch(pitch_mm, tol=1e-6): + """ + Classify a pitch in mm as imperial vs metric. + Rule: + - If pitch_mm is ~2 decimal places clean -> metric, + unless it corresponds to an exact whole-number TPI. + - Otherwise, treat as imperial. + """ + import math + + try: + mm = float(pitch_mm) + except Exception: + return False + if mm <= 0: + return False + + # Check if it's "two-decimal clean" + two_dec_clean = abs(mm - round(mm, 2)) <= tol + + # Compute TPI + tpi = 25.4 / mm + whole_tpi = round(tpi) + is_whole_tpi = math.isclose(tpi, whole_tpi, abs_tol=1e-6) + + if two_dec_clean and not is_whole_tpi: + return False # metric + return True # imperial diff --git a/src/Mod/CAM/Tools/Bit/375-16_Tap.fctb b/src/Mod/CAM/Tools/Bit/375-16_Tap.fctb index 2688479c5e..4329193cb8 100644 --- a/src/Mod/CAM/Tools/Bit/375-16_Tap.fctb +++ b/src/Mod/CAM/Tools/Bit/375-16_Tap.fctb @@ -4,17 +4,13 @@ "shape": "tap.fcstd", "shape-type": "tap", "parameter": { - "Coating": "None", "CuttingEdgeLength": "1.063 \"", "Diameter": "0.375 \"", "Flutes": "3", "Length": "2.500 \"", "Pitch": "0.000 in", - "Rotation": "Right Hand", "ShankDiameter": "0.250 \"", - "TPI": "16", - "TipAngle": "90.000 \u00b0", - "Type": "HSS" + "TipAngle": "90.000 \u00b0" }, "attribute": {} } diff --git a/src/Mod/CAM/Tools/Shape/tap.fcstd b/src/Mod/CAM/Tools/Shape/tap.fcstd index 2ee6cbcda3c4d7a3850d9357c1766bf359ed89ed..a8febea77bfb8017ec435bc5da0bf6799a305430 100644 GIT binary patch literal 29456 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 KA-q3A-v0+0QJNqC