CAM/Drilling: Add feed retract option to drilling op settings

Adds a checkbox to output a G85 cycle used for reaming or boring. The
cycle is like a normal drilling op, but feeds back out of the hole
instead of performing a rapid move.

G85 does not support peck or dwell, so those other options are disabled
when the "Feed retract" option is enabled in the UI.
This commit is contained in:
James Waples
2024-04-01 11:45:19 +01:00
parent 4ef99a1f4a
commit dc1db06b10
4 changed files with 52 additions and 2 deletions

View File

@@ -170,6 +170,13 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="feedRetractEnabled">
<property name="text">
<string>Feed retract</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
@@ -197,6 +204,7 @@
<tabstops>
<tabstop>toolController</tabstop>
<tabstop>peckEnabled</tabstop>
<tabstop>feedRetractEnabled</tabstop>
<tabstop>dwellEnabled</tabstop>
</tabstops>
<resources/>

View File

@@ -38,7 +38,7 @@ else:
def generate(
edge, dwelltime=0.0, peckdepth=0.0, repeat=1, retractheight=None, chipBreak=False
edge, dwelltime=0.0, peckdepth=0.0, repeat=1, retractheight=None, chipBreak=False, feedRetract=False
):
"""
Generates Gcode for drilling a single hole.
@@ -59,6 +59,11 @@ def generate(
full retracts to clear chips from the hole.
http://linuxcnc.org/docs/html/gcode/g-code.html#gcode:g73
If feedRetract is True, the generator will produce G85 cycles which retract
the tool at the specified feed rate instead of performing a rapid move.
This is useful for boring or reaming operations.
http://linuxcnc.org/docs/html/gcode/g-code.html#gcode:g85
"""
startPoint = edge.Vertexes[0].Point
endPoint = edge.Vertexes[1].Point
@@ -112,7 +117,9 @@ def generate(
if repeat > 1:
cmdParams["L"] = repeat
if peckdepth == 0.0:
if feedRetract:
cmd = "G85"
elif peckdepth == 0.0:
if dwelltime > 0.0:
cmd = "G82"
cmdParams["P"] = dwelltime

View File

@@ -105,6 +105,14 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp):
QT_TRANSLATE_NOOP("App::Property", "Use chipbreaking"),
)
if not hasattr(obj, "feedRetractEnabled"):
obj.addProperty(
"App::PropertyBool", "feedRetractEnabled", "Drill",
QT_TRANSLATE_NOOP(
"App::Property",
"Use G85 boring cycle with feed out")
)
def initCircularHoleOperation(self, obj):
"""initCircularHoleOperation(obj) ... add drilling specific properties to obj."""
obj.addProperty(
@@ -178,6 +186,12 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp):
"App::Property",
"Apply G99 retraction: only retract to RetractHeight between holes in this operation")
)
obj.addProperty(
"App::PropertyBool", "feedRetractEnabled", "Drill",
QT_TRANSLATE_NOOP(
"App::Property",
"Use G85 boring cycle with feed out")
)
for n in self.propertyEnumerations():
setattr(obj, n[0], n[1])
@@ -276,6 +290,7 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp):
repeat,
obj.RetractHeight.Value,
chipBreak=chipBreak,
feedRetract=obj.feedRetractEnabled
)
except ValueError as e: # any targets that fail the generator are ignored

View File

@@ -62,11 +62,20 @@ class TaskPanelOpPage(PathCircularHoleBaseGui.TaskPanelOpPage):
def registerSignalHandlers(self, obj):
self.form.peckEnabled.toggled.connect(self.form.peckDepth.setEnabled)
self.form.peckEnabled.toggled.connect(self.form.dwellEnabled.setDisabled)
self.form.peckEnabled.toggled.connect(self.form.feedRetractEnabled.setDisabled)
self.form.peckEnabled.toggled.connect(self.setChipBreakControl)
self.form.feedRetractEnabled.toggled.connect(self.form.peckDepth.setDisabled)
self.form.feedRetractEnabled.toggled.connect(self.form.peckEnabled.setDisabled)
self.form.feedRetractEnabled.toggled.connect(self.form.dwellEnabled.setDisabled)
self.form.feedRetractEnabled.toggled.connect(self.form.chipBreakEnabled.setDisabled)
self.form.feedRetractEnabled.toggled.connect(self.form.peckEnabled.setDisabled)
self.form.feedRetractEnabled.toggled.connect(self.setChipBreakControl)
self.form.dwellEnabled.toggled.connect(self.form.dwellTime.setEnabled)
self.form.dwellEnabled.toggled.connect(self.form.dwellTimelabel.setEnabled)
self.form.dwellEnabled.toggled.connect(self.form.peckEnabled.setDisabled)
self.form.dwellEnabled.toggled.connect(self.form.feedRetractEnabled.setDisabled)
self.form.dwellEnabled.toggled.connect(self.setChipBreakControl)
self.form.peckRetractHeight.setEnabled(True)
@@ -74,15 +83,18 @@ class TaskPanelOpPage(PathCircularHoleBaseGui.TaskPanelOpPage):
if self.form.peckEnabled.isChecked():
self.form.dwellEnabled.setEnabled(False)
self.form.feedRetractEnabled.setEnabled(False)
self.form.peckDepth.setEnabled(True)
self.form.peckDepthLabel.setEnabled(True)
self.form.chipBreakEnabled.setEnabled(True)
elif self.form.dwellEnabled.isChecked():
self.form.feedRetractEnabled.setEnabled(False)
self.form.peckEnabled.setEnabled(False)
self.form.dwellTime.setEnabled(True)
self.form.dwellTimelabel.setEnabled(True)
self.form.chipBreakEnabled.setEnabled(False)
else:
self.form.feedRetractEnabled.setEnabled(True)
self.form.chipBreakEnabled.setEnabled(False)
def setChipBreakControl(self):
@@ -116,6 +128,8 @@ class TaskPanelOpPage(PathCircularHoleBaseGui.TaskPanelOpPage):
obj.DwellEnabled = self.form.dwellEnabled.isChecked()
if obj.PeckEnabled != self.form.peckEnabled.isChecked():
obj.PeckEnabled = self.form.peckEnabled.isChecked()
if obj.feedRetractEnabled != self.form.feedRetractEnabled.isChecked():
obj.feedRetractEnabled = self.form.feedRetractEnabled.isChecked()
if obj.chipBreakEnabled != self.form.chipBreakEnabled.isChecked():
obj.chipBreakEnabled = self.form.chipBreakEnabled.isChecked()
if obj.ExtraOffset != str(self.form.ExtraOffset.currentData()):
@@ -154,6 +168,11 @@ class TaskPanelOpPage(PathCircularHoleBaseGui.TaskPanelOpPage):
else:
self.form.chipBreakEnabled.setCheckState(QtCore.Qt.Unchecked)
if obj.feedRetractEnabled:
self.form.feedRetractEnabled.setCheckState(QtCore.Qt.Checked)
else:
self.form.feedRetractEnabled.setCheckState(QtCore.Qt.Unchecked)
self.selectInComboBox(obj.ExtraOffset, self.form.ExtraOffset)
self.setupToolController(obj, self.form.toolController)
@@ -173,6 +192,7 @@ class TaskPanelOpPage(PathCircularHoleBaseGui.TaskPanelOpPage):
signals.append(self.form.coolantController.currentIndexChanged)
signals.append(self.form.ExtraOffset.currentIndexChanged)
signals.append(self.form.KeepToolDownEnabled.stateChanged)
signals.append(self.form.feedRetractEnabled.stateChanged)
return signals