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:
@@ -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/>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user