- now extracut option in the Geometry Object will recut as many points as many they are within the specified re-cut length

This commit is contained in:
Marius Stanciu 2019-12-10 05:28:02 +02:00 committed by Marius
parent cee8c223a8
commit 511ebc274f
12 changed files with 129 additions and 37 deletions

View File

@ -668,6 +668,7 @@ class App(QtCore.QObject):
"geometry_startz": None, "geometry_startz": None,
"geometry_feedrate_rapid": 1500, "geometry_feedrate_rapid": 1500,
"geometry_extracut": False, "geometry_extracut": False,
"geometry_extracut_length": 0.1,
"geometry_z_pdepth": -0.02, "geometry_z_pdepth": -0.02,
"geometry_f_plunge": False, "geometry_f_plunge": False,
"geometry_spindledir": 'CW', "geometry_spindledir": 'CW',
@ -1260,6 +1261,7 @@ class App(QtCore.QObject):
"geometry_startz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gstartz_entry, "geometry_startz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gstartz_entry,
"geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.cncfeedrate_rapid_entry, "geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.cncfeedrate_rapid_entry,
"geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb, "geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
"geometry_extracut_length": self.ui.geometry_defaults_form.geometry_adv_opt_group.e_cut_entry,
"geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry, "geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry,
"geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry, "geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry,
"geometry_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio, "geometry_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,

View File

@ -505,7 +505,7 @@ class ToolsDB(QtWidgets.QWidget):
self.table_widget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.table_widget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
table_hlay.addWidget(self.table_widget) table_hlay.addWidget(self.table_widget)
self.table_widget.setColumnCount(26) self.table_widget.setColumnCount(27)
# self.table_widget.setColumnWidth(0, 20) # self.table_widget.setColumnWidth(0, 20)
self.table_widget.setHorizontalHeaderLabels( self.table_widget.setHorizontalHeaderLabels(
[ [
@ -530,6 +530,7 @@ class ToolsDB(QtWidgets.QWidget):
_("Dwelltime"), _("Dwelltime"),
_("Preprocessor"), _("Preprocessor"),
_("ExtraCut"), _("ExtraCut"),
_("E-Cut Length"),
_("Toolchange"), _("Toolchange"),
_("Toolchange XY"), _("Toolchange XY"),
_("Toolchange Z"), _("Toolchange Z"),
@ -620,23 +621,30 @@ class ToolsDB(QtWidgets.QWidget):
"such as that this point is covered by this extra cut to\n" "such as that this point is covered by this extra cut to\n"
"ensure a complete isolation.")) "ensure a complete isolation."))
self.table_widget.horizontalHeaderItem(21).setToolTip( self.table_widget.horizontalHeaderItem(21).setToolTip(
_("Extra Cut length.\n"
"If checked, after a isolation is finished an extra cut\n"
"will be added where the start and end of isolation meet\n"
"such as that this point is covered by this extra cut to\n"
"ensure a complete isolation. This is the length of\n"
"the extra cut."))
self.table_widget.horizontalHeaderItem(22).setToolTip(
_("Toolchange.\n" _("Toolchange.\n"
"It will create a toolchange event.\n" "It will create a toolchange event.\n"
"The kind of toolchange is determined by\n" "The kind of toolchange is determined by\n"
"the preprocessor file.")) "the preprocessor file."))
self.table_widget.horizontalHeaderItem(22).setToolTip( self.table_widget.horizontalHeaderItem(23).setToolTip(
_("Toolchange XY.\n" _("Toolchange XY.\n"
"A set of coordinates in the format (x, y).\n" "A set of coordinates in the format (x, y).\n"
"Will determine the cartesian position of the point\n" "Will determine the cartesian position of the point\n"
"where the tool change event take place.")) "where the tool change event take place."))
self.table_widget.horizontalHeaderItem(23).setToolTip( self.table_widget.horizontalHeaderItem(24).setToolTip(
_("Toolchange Z.\n" _("Toolchange Z.\n"
"The position on Z plane where the tool change event take place.")) "The position on Z plane where the tool change event take place."))
self.table_widget.horizontalHeaderItem(24).setToolTip( self.table_widget.horizontalHeaderItem(25).setToolTip(
_("Start Z.\n" _("Start Z.\n"
"If it's left empty it will not be used.\n" "If it's left empty it will not be used.\n"
"A position on Z plane to move immediately after job start.")) "A position on Z plane to move immediately after job start."))
self.table_widget.horizontalHeaderItem(25).setToolTip( self.table_widget.horizontalHeaderItem(26).setToolTip(
_("End Z.\n" _("End Z.\n"
"A position on Z plane to move immediately after job stop.")) "A position on Z plane to move immediately after job stop."))
@ -913,12 +921,18 @@ class ToolsDB(QtWidgets.QWidget):
ecut_item.set_value(data['extracut']) ecut_item.set_value(data['extracut'])
widget.setCellWidget(row, 20, ecut_item) widget.setCellWidget(row, 20, ecut_item)
ecut_length_item = FCDoubleSpinner()
ecut_length_item.set_precision(self.decimals)
ecut_length_item.set_range(0.0, 9999.9999)
ecut_length_item.set_value(data['extracut_length'])
widget.setCellWidget(row, 21, ecut_length_item)
toolchange_item = FCCheckBox() toolchange_item = FCCheckBox()
toolchange_item.set_value(data['toolchange']) toolchange_item.set_value(data['toolchange'])
widget.setCellWidget(row, 21, toolchange_item) widget.setCellWidget(row, 22, toolchange_item)
toolchangexy_item = QtWidgets.QTableWidgetItem(str(data['toolchangexy']) if data['toolchangexy'] else '') toolchangexy_item = QtWidgets.QTableWidgetItem(str(data['toolchangexy']) if data['toolchangexy'] else '')
widget.setItem(row, 22, toolchangexy_item) widget.setItem(row, 23, toolchangexy_item)
toolchangez_item = FCDoubleSpinner() toolchangez_item = FCDoubleSpinner()
toolchangez_item.set_precision(self.decimals) toolchangez_item.set_precision(self.decimals)
@ -929,10 +943,10 @@ class ToolsDB(QtWidgets.QWidget):
toolchangez_item.set_range(0.0000, 9999.9999) toolchangez_item.set_range(0.0000, 9999.9999)
toolchangez_item.set_value(float(data['toolchangez'])) toolchangez_item.set_value(float(data['toolchangez']))
widget.setCellWidget(row, 23, toolchangez_item) widget.setCellWidget(row, 24, toolchangez_item)
startz_item = QtWidgets.QTableWidgetItem(str(data['startz']) if data['startz'] else '') startz_item = QtWidgets.QTableWidgetItem(str(data['startz']) if data['startz'] else '')
widget.setItem(row, 24, startz_item) widget.setItem(row, 25, startz_item)
endz_item = FCDoubleSpinner() endz_item = FCDoubleSpinner()
endz_item.set_precision(self.decimals) endz_item.set_precision(self.decimals)
@ -943,7 +957,7 @@ class ToolsDB(QtWidgets.QWidget):
endz_item.set_range(0.0000, 9999.9999) endz_item.set_range(0.0000, 9999.9999)
endz_item.set_value(float(data['endz'])) endz_item.set_value(float(data['endz']))
widget.setCellWidget(row, 25, endz_item) widget.setCellWidget(row, 26, endz_item)
def on_tool_add(self): def on_tool_add(self):
""" """
@ -970,6 +984,7 @@ class ToolsDB(QtWidgets.QWidget):
"dwelltime": float(self.app.defaults["geometry_dwelltime"]), "dwelltime": float(self.app.defaults["geometry_dwelltime"]),
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangexy": self.app.defaults["geometry_toolchangexy"], "toolchangexy": self.app.defaults["geometry_toolchangexy"],
"toolchangez": float(self.app.defaults["geometry_toolchangez"]), "toolchangez": float(self.app.defaults["geometry_toolchangez"]),
@ -1267,6 +1282,8 @@ class ToolsDB(QtWidgets.QWidget):
default_data['ppname_g'] = self.table_widget.cellWidget(row, col).get_value() default_data['ppname_g'] = self.table_widget.cellWidget(row, col).get_value()
elif column_header_text == 'ExtraCut': elif column_header_text == 'ExtraCut':
default_data['extracut'] = self.table_widget.cellWidget(row, col).get_value() default_data['extracut'] = self.table_widget.cellWidget(row, col).get_value()
elif column_header_text == "E-Cut Length":
default_data['extracut_length'] = self.table_widget.cellWidget(row, col).get_value()
elif column_header_text == 'Toolchange': elif column_header_text == 'Toolchange':
default_data['toolchange'] = self.table_widget.cellWidget(row, col).get_value() default_data['toolchange'] = self.table_widget.cellWidget(row, col).get_value()
elif column_header_text == 'Toolchange XY': elif column_header_text == 'Toolchange XY':

View File

@ -1242,6 +1242,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
"ppname_g": self.app.defaults['geometry_ppname_g'], "ppname_g": self.app.defaults['geometry_ppname_g'],
"depthperpass": self.app.defaults['geometry_depthperpass'], "depthperpass": self.app.defaults['geometry_depthperpass'],
"extracut": self.app.defaults['geometry_extracut'], "extracut": self.app.defaults['geometry_extracut'],
"extracut_length": self.app.defaults['geometry_extracut_length'],
"toolchange": self.app.defaults['geometry_toolchange'], "toolchange": self.app.defaults['geometry_toolchange'],
"toolchangez": self.app.defaults['geometry_toolchangez'], "toolchangez": self.app.defaults['geometry_toolchangez'],
"endz": self.app.defaults['geometry_endz'], "endz": self.app.defaults['geometry_endz'],
@ -3445,6 +3446,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
"multidepth": False, "multidepth": False,
"depthperpass": 0.002, "depthperpass": 0.002,
"extracut": False, "extracut": False,
"extracut_length": 0.1,
"endz": 2.0, "endz": 2.0,
"startz": None, "startz": None,
"toolchange": False, "toolchange": False,
@ -3684,6 +3686,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
"feedrate_probe": self.ui.feedrate_probe_entry, "feedrate_probe": self.ui.feedrate_probe_entry,
"depthperpass": self.ui.maxdepth_entry, "depthperpass": self.ui.maxdepth_entry,
"extracut": self.ui.extracut_cb, "extracut": self.ui.extracut_cb,
"extracut_length": self.ui.e_cut_entry,
"toolchange": self.ui.toolchangeg_cb, "toolchange": self.ui.toolchangeg_cb,
"toolchangez": self.ui.toolchangez_entry, "toolchangez": self.ui.toolchangez_entry,
"endz": self.ui.gendz_entry, "endz": self.ui.gendz_entry,
@ -3722,6 +3725,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
"ppname_g": None, "ppname_g": None,
"depthperpass": None, "depthperpass": None,
"extracut": None, "extracut": None,
"extracut_length": None,
"toolchange": None, "toolchange": None,
"toolchangez": None, "toolchangez": None,
"endz": None, "endz": None,
@ -3814,6 +3818,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
self.ui.fr_rapidlabel.hide() self.ui.fr_rapidlabel.hide()
self.ui.cncfeedrate_rapid_entry.hide() self.ui.cncfeedrate_rapid_entry.hide()
self.ui.extracut_cb.hide() self.ui.extracut_cb.hide()
self.ui.e_cut_entry.hide()
self.ui.pdepth_label.hide() self.ui.pdepth_label.hide()
self.ui.pdepth_entry.hide() self.ui.pdepth_entry.hide()
self.ui.feedrate_probe_label.hide() self.ui.feedrate_probe_label.hide()
@ -3821,6 +3826,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
else: else:
self.ui.level.setText('<span style="color:red;"><b>%s</b></span>' % _('Advanced')) self.ui.level.setText('<span style="color:red;"><b>%s</b></span>' % _('Advanced'))
self.ui.e_cut_entry.setDisabled(True)
self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click)
self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click) self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click)
self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=False)) self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=False))
@ -4975,6 +4982,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"] feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"]
multidepth = tools_dict[tooluid_key]['data']["multidepth"] multidepth = tools_dict[tooluid_key]['data']["multidepth"]
extracut = tools_dict[tooluid_key]['data']["extracut"] extracut = tools_dict[tooluid_key]['data']["extracut"]
extracut_length = tools_dict[tooluid_key]['data']["extracut_length"]
depthpercut = tools_dict[tooluid_key]['data']["depthperpass"] depthpercut = tools_dict[tooluid_key]['data']["depthperpass"]
toolchange = tools_dict[tooluid_key]['data']["toolchange"] toolchange = tools_dict[tooluid_key]['data']["toolchange"]
toolchangez = tools_dict[tooluid_key]['data']["toolchangez"] toolchangez = tools_dict[tooluid_key]['data']["toolchangez"]
@ -5006,7 +5014,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid, feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid,
spindlespeed=spindlespeed, spindledir=spindledir, dwell=dwell, dwelltime=dwelltime, spindlespeed=spindlespeed, spindledir=spindledir, dwell=dwell, dwelltime=dwelltime,
multidepth=multidepth, depthpercut=depthpercut, multidepth=multidepth, depthpercut=depthpercut,
extracut=extracut, startz=startz, endz=endz, extracut=extracut, extracut_length=extracut_length, startz=startz, endz=endz,
toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy, toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy,
pp_geometry_name=pp_geometry_name, pp_geometry_name=pp_geometry_name,
tool_no=tool_cnt) tool_no=tool_cnt)
@ -5127,6 +5135,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"] feedrate_rapid = tools_dict[tooluid_key]['data']["feedrate_rapid"]
multidepth = tools_dict[tooluid_key]['data']["multidepth"] multidepth = tools_dict[tooluid_key]['data']["multidepth"]
extracut = tools_dict[tooluid_key]['data']["extracut"] extracut = tools_dict[tooluid_key]['data']["extracut"]
extracut_length = tools_dict[tooluid_key]['data']["extracut_length"]
depthpercut = tools_dict[tooluid_key]['data']["depthperpass"] depthpercut = tools_dict[tooluid_key]['data']["depthperpass"]
toolchange = tools_dict[tooluid_key]['data']["toolchange"] toolchange = tools_dict[tooluid_key]['data']["toolchange"]
toolchangez = tools_dict[tooluid_key]['data']["toolchangez"] toolchangez = tools_dict[tooluid_key]['data']["toolchangez"]
@ -5158,7 +5167,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid, feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid,
spindlespeed=spindlespeed, spindledir=spindledir, dwell=dwell, dwelltime=dwelltime, spindlespeed=spindlespeed, spindledir=spindledir, dwell=dwell, dwelltime=dwelltime,
multidepth=multidepth, depthpercut=depthpercut, multidepth=multidepth, depthpercut=depthpercut,
extracut=extracut, startz=startz, endz=endz, extracut=extracut, extracut_length=extracut_length, startz=startz, endz=endz,
toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy, toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy,
pp_geometry_name=pp_geometry_name, pp_geometry_name=pp_geometry_name,
tool_no=tool_cnt) tool_no=tool_cnt)
@ -5226,7 +5235,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
spindlespeed=None, dwell=None, dwelltime=None, spindlespeed=None, dwell=None, dwelltime=None,
multidepth=None, depthperpass=None, multidepth=None, depthperpass=None,
toolchange=None, toolchangez=None, toolchangexy=None, toolchange=None, toolchangez=None, toolchangexy=None,
extracut=None, startz=None, endz=None, extracut=None, extracut_length=None, startz=None, endz=None,
pp=None, pp=None,
segx=None, segy=None, segx=None, segy=None,
use_thread=True, use_thread=True,
@ -5266,6 +5275,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
segy = segy if segy is not None else float(self.app.defaults['geometry_segy']) segy = segy if segy is not None else float(self.app.defaults['geometry_segy'])
extracut = extracut if extracut is not None else float(self.options["extracut"]) extracut = extracut if extracut is not None else float(self.options["extracut"])
extracut_length = extracut_length if extracut_length is not None else float(self.options["extracut_length"])
startz = startz if startz is not None else self.options["startz"] startz = startz if startz is not None else self.options["startz"]
endz = endz if endz is not None else float(self.options["endz"]) endz = endz if endz is not None else float(self.options["endz"])
@ -5320,7 +5331,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
spindlespeed=spindlespeed, dwell=dwell, dwelltime=dwelltime, spindlespeed=spindlespeed, dwell=dwell, dwelltime=dwelltime,
multidepth=multidepth, depthpercut=depthperpass, multidepth=multidepth, depthpercut=depthperpass,
toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy, toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy,
extracut=extracut, startz=startz, endz=endz, extracut=extracut, extracut_length=extracut_length, startz=startz, endz=endz,
pp_geometry_name=ppname_g pp_geometry_name=ppname_g
) )

View File

@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing.
10.12.2019 10.12.2019
- small changes in the Geometry UI - small changes in the Geometry UI
- now extracut option in the Geometry Object will recut as many points as many they are within the specified re-cut length
9.12.2019 9.12.2019

View File

@ -2962,7 +2962,7 @@ class CNCjob(Geometry):
feedrate=2.0, feedrate_z=2.0, feedrate_rapid=30, feedrate=2.0, feedrate_z=2.0, feedrate_rapid=30,
spindlespeed=None, spindledir='CW', dwell=False, dwelltime=1.0, spindlespeed=None, spindledir='CW', dwell=False, dwelltime=1.0,
multidepth=False, depthpercut=None, multidepth=False, depthpercut=None,
toolchange=False, toolchangez=1.0, toolchangexy="0.0, 0.0", extracut=False, toolchange=False, toolchangez=1.0, toolchangexy="0.0, 0.0", extracut=False, extracut_length=0.2,
startz=None, endz=2.0, pp_geometry_name=None, tool_no=1): startz=None, endz=2.0, pp_geometry_name=None, tool_no=1):
""" """
Algorithm to generate from multitool Geometry. Algorithm to generate from multitool Geometry.
@ -2992,6 +2992,7 @@ class CNCjob(Geometry):
:param toolchangexy: :param toolchangexy:
:param extracut: Adds (or not) an extra cut at the end of each path overlapping the :param extracut: Adds (or not) an extra cut at the end of each path overlapping the
first point in path to ensure complete copper removal first point in path to ensure complete copper removal
:param extracut_length: Extra cut legth at the end of the path
:param startz: :param startz:
:param endz: :param endz:
:param pp_geometry_name: :param pp_geometry_name:
@ -3213,7 +3214,8 @@ class CNCjob(Geometry):
# calculate the cut distance # calculate the cut distance
total_cut = total_cut + geo.length total_cut = total_cut + geo.length
self.gcode += self.create_gcode_single_pass(geo, extracut, tolerance, old_point=current_pt) self.gcode += self.create_gcode_single_pass(geo, extracut, extracut_length, tolerance,
old_point=current_pt)
# --------- Multi-pass --------- # --------- Multi-pass ---------
else: else:
@ -3227,7 +3229,7 @@ class CNCjob(Geometry):
total_cut += (geo.length * nr_cuts) total_cut += (geo.length * nr_cuts)
self.gcode += self.create_gcode_multi_pass(geo, extracut, tolerance, self.gcode += self.create_gcode_multi_pass(geo, extracut, extracut_length, tolerance,
postproc=p, old_point=current_pt) postproc=p, old_point=current_pt)
# calculate the total distance # calculate the total distance
@ -3270,7 +3272,7 @@ class CNCjob(Geometry):
spindlespeed=None, spindledir='CW', dwell=False, dwelltime=1.0, spindlespeed=None, spindledir='CW', dwell=False, dwelltime=1.0,
multidepth=False, depthpercut=None, multidepth=False, depthpercut=None,
toolchange=False, toolchangez=1.0, toolchangexy="0.0, 0.0", toolchange=False, toolchangez=1.0, toolchangexy="0.0, 0.0",
extracut=False, startz=None, endz=2.0, extracut=False, extracut_length=0.1, startz=None, endz=2.0,
pp_geometry_name=None, tool_no=1): pp_geometry_name=None, tool_no=1):
""" """
Second algorithm to generate from Geometry. Second algorithm to generate from Geometry.
@ -3288,6 +3290,7 @@ class CNCjob(Geometry):
:param depthpercut: Maximum depth in each pass. :param depthpercut: Maximum depth in each pass.
:param extracut: Adds (or not) an extra cut at the end of each path :param extracut: Adds (or not) an extra cut at the end of each path
overlapping the first point in path to ensure complete copper removal overlapping the first point in path to ensure complete copper removal
:param extracut_length: The extra cut length
:return: None :return: None
""" """
@ -3559,7 +3562,8 @@ class CNCjob(Geometry):
if not multidepth: if not multidepth:
# calculate the cut distance # calculate the cut distance
total_cut += geo.length total_cut += geo.length
self.gcode += self.create_gcode_single_pass(geo, extracut, tolerance, old_point=current_pt) self.gcode += self.create_gcode_single_pass(geo, extracut, extracut_length, tolerance,
old_point=current_pt)
# --------- Multi-pass --------- # --------- Multi-pass ---------
else: else:
@ -3573,7 +3577,7 @@ class CNCjob(Geometry):
total_cut += (geo.length * nr_cuts) total_cut += (geo.length * nr_cuts)
self.gcode += self.create_gcode_multi_pass(geo, extracut, tolerance, self.gcode += self.create_gcode_multi_pass(geo, extracut, extracut_length, tolerance,
postproc=p, old_point=current_pt) postproc=p, old_point=current_pt)
# calculate the travel distance # calculate the travel distance
@ -3798,7 +3802,7 @@ class CNCjob(Geometry):
gcode += self.doformat(p.lift_code) gcode += self.doformat(p.lift_code)
return gcode return gcode
def create_gcode_single_pass(self, geometry, extracut, tolerance, old_point=(0, 0)): def create_gcode_single_pass(self, geometry, extracut, extracut_length, tolerance, old_point=(0, 0)):
# G-code. Note: self.linear2gcode() and self.point2gcode() will lower and raise the tool every time. # G-code. Note: self.linear2gcode() and self.point2gcode() will lower and raise the tool every time.
gcode_single_pass = '' gcode_single_pass = ''
@ -3807,7 +3811,8 @@ class CNCjob(Geometry):
gcode_single_pass = self.linear2gcode(geometry, tolerance=tolerance, old_point=old_point) gcode_single_pass = self.linear2gcode(geometry, tolerance=tolerance, old_point=old_point)
else: else:
if geometry.is_ring: if geometry.is_ring:
gcode_single_pass = self.linear2gcode_extra(geometry, tolerance=tolerance, old_point=old_point) gcode_single_pass = self.linear2gcode_extra(geometry, extracut_length, tolerance=tolerance,
old_point=old_point)
else: else:
gcode_single_pass = self.linear2gcode(geometry, tolerance=tolerance, old_point=old_point) gcode_single_pass = self.linear2gcode(geometry, tolerance=tolerance, old_point=old_point)
elif type(geometry) == Point: elif type(geometry) == Point:
@ -3818,7 +3823,7 @@ class CNCjob(Geometry):
return gcode_single_pass return gcode_single_pass
def create_gcode_multi_pass(self, geometry, extracut, tolerance, postproc, old_point=(0, 0)): def create_gcode_multi_pass(self, geometry, extracut, extracut_length, tolerance, postproc, old_point=(0, 0)):
gcode_multi_pass = '' gcode_multi_pass = ''
@ -3851,8 +3856,8 @@ class CNCjob(Geometry):
old_point=old_point) old_point=old_point)
else: else:
if geometry.is_ring: if geometry.is_ring:
gcode_multi_pass += self.linear2gcode_extra(geometry, tolerance=tolerance, z_cut=depth, gcode_multi_pass += self.linear2gcode_extra(geometry, extracut_length, tolerance=tolerance,
up=False, old_point=old_point) z_cut=depth, up=False, old_point=old_point)
else: else:
gcode_multi_pass += self.linear2gcode(geometry, tolerance=tolerance, z_cut=depth, up=False, gcode_multi_pass += self.linear2gcode(geometry, tolerance=tolerance, z_cut=depth, up=False,
old_point=old_point) old_point=old_point)
@ -4513,13 +4518,14 @@ class CNCjob(Geometry):
gcode += self.doformat(p.lift_code, x=prev_x, y=prev_y, z_move=z_move) # Stop cutting gcode += self.doformat(p.lift_code, x=prev_x, y=prev_y, z_move=z_move) # Stop cutting
return gcode return gcode
def linear2gcode_extra(self, linear, tolerance=0, down=True, up=True, def linear2gcode_extra(self, linear, extracut_length, tolerance=0, down=True, up=True,
z_cut=None, z_move=None, zdownrate=None, z_cut=None, z_move=None, zdownrate=None,
feedrate=None, feedrate_z=None, feedrate_rapid=None, cont=False, old_point=(0, 0)): feedrate=None, feedrate_z=None, feedrate_rapid=None, cont=False, old_point=(0, 0)):
""" """
Generates G-code to cut along the linear feature. Generates G-code to cut along the linear feature.
:param linear: The path to cut along. :param linear: The path to cut along.
:param extracut_length: how much to cut extra over the first point at the end of the path
:type: Shapely.LinearRing or Shapely.Linear String :type: Shapely.LinearRing or Shapely.Linear String
:param tolerance: All points in the simplified object will be within the :param tolerance: All points in the simplified object will be within the
tolerance distance of the original geometry. tolerance distance of the original geometry.
@ -4613,19 +4619,36 @@ class CNCjob(Geometry):
# this line is added to create an extra cut over the first point in patch # this line is added to create an extra cut over the first point in patch
# to make sure that we remove the copper leftovers # to make sure that we remove the copper leftovers
# Linear motion to the 1st point in the cut path # Linear motion to the 1st point in the cut path
if self.coordinates_type == "G90": # if self.coordinates_type == "G90":
# For Absolute coordinates type G90 # # For Absolute coordinates type G90
last_x = path[1][0] # last_x = path[1][0]
last_y = path[1][1] # last_y = path[1][1]
# else:
# # For Incremental coordinates type G91
# last_x = path[1][0] - first_x
# last_y = path[1][1] - first_y
# gcode += self.doformat(p.linear_code, x=last_x, y=last_y)
# the first point for extracut is always mandatory if the extracut is enabled. But if the length of distance
# between point 0 and point 1 is more than the distance we set for the extra cut then make an interpolation
# along the path and find the point at the distance extracut_length
if abs(distance(path[1], path[0])) > extracut_length:
i_point = LineString([path[0], path[1]]).interpolate(extracut_length)
gcode += self.doformat(p.linear_code, x=i_point.x, y=i_point.y)
else: else:
# For Incremental coordinates type G91 last_pt = path[0]
last_x = path[1][0] - first_x for pt in path[1:]:
last_y = path[1][1] - first_y extracut_distance = abs(distance(pt, last_pt))
gcode += self.doformat(p.linear_code, x=last_x, y=last_y) if extracut_distance <= extracut_length:
gcode += self.doformat(p.linear_code, x=pt[0], y=pt[1])
last_pt = pt
else:
break
# Up to travelling height. # Up to travelling height.
if up: if up:
gcode += self.doformat(p.lift_code, x=last_x, y=last_y, z_move=z_move) # Stop cutting gcode += self.doformat(p.lift_code, x=pt[0], y=pt[1], z_move=z_move) # Stop cutting
return gcode return gcode

View File

@ -1520,14 +1520,29 @@ class GeometryObjectUI(ObjectUI):
self.cncfeedrate_rapid_entry.hide() self.cncfeedrate_rapid_entry.hide()
# Cut over 1st point in path # Cut over 1st point in path
self.extracut_cb = FCCheckBox('%s' % _('Re-cut 1st pt.')) self.extracut_cb = FCCheckBox('%s' % _('Re-cut'))
self.extracut_cb.setToolTip( self.extracut_cb.setToolTip(
_("In order to remove possible\n" _("In order to remove possible\n"
"copper leftovers where first cut\n" "copper leftovers where first cut\n"
"meet with last cut, we generate an\n" "meet with last cut, we generate an\n"
"extended cut over the first cut section.") "extended cut over the first cut section.")
) )
self.e_cut_entry = FCDoubleSpinner()
self.e_cut_entry.set_range(0, 99999)
self.e_cut_entry.set_precision(self.decimals)
self.e_cut_entry.setSingleStep(0.1)
self.e_cut_entry.setWrapping(True)
self.e_cut_entry.setToolTip(
_("In order to remove possible\n"
"copper leftovers where first cut\n"
"meet with last cut, we generate an\n"
"extended cut over the first cut section.")
)
self.grid3.addWidget(self.extracut_cb, 13, 0) self.grid3.addWidget(self.extracut_cb, 13, 0)
self.grid3.addWidget(self.e_cut_entry, 13, 1)
self.ois_e_cut = OptionalInputSection(self.extracut_cb, [self.e_cut_entry])
# Spindlespeed # Spindlespeed
spdlabel = QtWidgets.QLabel('%s:' % _('Spindle speed')) spdlabel = QtWidgets.QLabel('%s:' % _('Spindle speed'))

View File

@ -3440,14 +3440,27 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1) grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1)
# End move extra cut # End move extra cut
self.extracut_cb = FCCheckBox(label='%s' % _('Re-cut 1st pt.')) self.extracut_cb = FCCheckBox('%s' % _('Re-cut'))
self.extracut_cb.setToolTip( self.extracut_cb.setToolTip(
_("In order to remove possible\n" _("In order to remove possible\n"
"copper leftovers where first cut\n" "copper leftovers where first cut\n"
"meet with last cut, we generate an\n" "meet with last cut, we generate an\n"
"extended cut over the first cut section.") "extended cut over the first cut section.")
) )
self.e_cut_entry = FCDoubleSpinner()
self.e_cut_entry.set_range(0, 99999)
self.e_cut_entry.set_precision(self.decimals)
self.e_cut_entry.setSingleStep(0.1)
self.e_cut_entry.setWrapping(True)
self.e_cut_entry.setToolTip(
_("In order to remove possible\n"
"copper leftovers where first cut\n"
"meet with last cut, we generate an\n"
"extended cut over the first cut section.")
)
grid1.addWidget(self.extracut_cb, 5, 0) grid1.addWidget(self.extracut_cb, 5, 0)
grid1.addWidget(self.e_cut_entry, 5, 1)
# Probe depth # Probe depth
self.pdepth_label = QtWidgets.QLabel('%s:' % _("Probe Z depth")) self.pdepth_label = QtWidgets.QLabel('%s:' % _("Probe Z depth"))

View File

@ -681,6 +681,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"depthperpass": self.app.defaults["geometry_depthperpass"], "depthperpass": self.app.defaults["geometry_depthperpass"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangez": self.app.defaults["geometry_toolchangez"], "toolchangez": self.app.defaults["geometry_toolchangez"],
"endz": self.app.defaults["geometry_endz"], "endz": self.app.defaults["geometry_endz"],

View File

@ -440,6 +440,7 @@ class ToolPaint(FlatCAMTool, Gerber):
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"depthperpass": self.app.defaults["geometry_depthperpass"], "depthperpass": self.app.defaults["geometry_depthperpass"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangez": self.app.defaults["geometry_toolchangez"], "toolchangez": self.app.defaults["geometry_toolchangez"],
"endz": self.app.defaults["geometry_endz"], "endz": self.app.defaults["geometry_endz"],
@ -633,6 +634,7 @@ class ToolPaint(FlatCAMTool, Gerber):
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"depthperpass": float(self.app.defaults["geometry_depthperpass"]), "depthperpass": float(self.app.defaults["geometry_depthperpass"]),
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangez": float(self.app.defaults["geometry_toolchangez"]), "toolchangez": float(self.app.defaults["geometry_toolchangez"]),
"endz": float(self.app.defaults["geometry_endz"]), "endz": float(self.app.defaults["geometry_endz"]),

View File

@ -35,6 +35,7 @@ class TclCommandCncjob(TclCommandSignaled):
('feedrate_rapid', float), ('feedrate_rapid', float),
('multidepth', bool), ('multidepth', bool),
('extracut', bool), ('extracut', bool),
('extracut_length', float),
('depthperpass', float), ('depthperpass', float),
('toolchange', int), ('toolchange', int),
('toolchangez', float), ('toolchangez', float),
@ -65,6 +66,7 @@ class TclCommandCncjob(TclCommandSignaled):
('feedrate_rapid', 'Rapid moving at speed when cutting.'), ('feedrate_rapid', 'Rapid moving at speed when cutting.'),
('multidepth', 'Use or not multidepth cnc cut. (True or False)'), ('multidepth', 'Use or not multidepth cnc cut. (True or False)'),
('extracut', 'Use or not an extra cnccut over the first point in path,in the job end (example: True)'), ('extracut', 'Use or not an extra cnccut over the first point in path,in the job end (example: True)'),
('extracut', 'The value for extra cnccut over the first point in path,in the job end; float'),
('depthperpass', 'Height of one layer for multidepth.'), ('depthperpass', 'Height of one layer for multidepth.'),
('toolchange', 'Enable tool changes (example: True).'), ('toolchange', 'Enable tool changes (example: True).'),
('toolchangez', 'Z distance for toolchange (example: 30.0).'), ('toolchangez', 'Z distance for toolchange (example: 30.0).'),
@ -136,6 +138,8 @@ class TclCommandCncjob(TclCommandSignaled):
args["multidepth"] = bool(args["multidepth"]) if "multidepth" in args else obj.options["multidepth"] args["multidepth"] = bool(args["multidepth"]) if "multidepth" in args else obj.options["multidepth"]
args["extracut"] = bool(args["extracut"]) if "extracut" in args else obj.options["extracut"] args["extracut"] = bool(args["extracut"]) if "extracut" in args else obj.options["extracut"]
args["extracut_length"] = float(args["extracut_length"]) if "extracut_length" in args else \
obj.options["extracut_length"]
args["depthperpass"] = args["depthperpass"] if "depthperpass" in args and args["depthperpass"] else \ args["depthperpass"] = args["depthperpass"] if "depthperpass" in args and args["depthperpass"] else \
obj.options["depthperpass"] obj.options["depthperpass"]
@ -189,6 +193,7 @@ class TclCommandCncjob(TclCommandSignaled):
local_tools_dict[tool_uid]['data']['feedrate_rapid'] = args["feedrate_rapid"] local_tools_dict[tool_uid]['data']['feedrate_rapid'] = args["feedrate_rapid"]
local_tools_dict[tool_uid]['data']['multidepth'] = args["multidepth"] local_tools_dict[tool_uid]['data']['multidepth'] = args["multidepth"]
local_tools_dict[tool_uid]['data']['extracut'] = args["extracut"] local_tools_dict[tool_uid]['data']['extracut'] = args["extracut"]
local_tools_dict[tool_uid]['data']['extracut_length'] = args["extracut_length"]
local_tools_dict[tool_uid]['data']['depthperpass'] = args["depthperpass"] local_tools_dict[tool_uid]['data']['depthperpass'] = args["depthperpass"]
local_tools_dict[tool_uid]['data']['toolchange'] = args["toolchange"] local_tools_dict[tool_uid]['data']['toolchange'] = args["toolchange"]
local_tools_dict[tool_uid]['data']['toolchangez'] = args["toolchangez"] local_tools_dict[tool_uid]['data']['toolchangez'] = args["toolchangez"]

View File

@ -170,6 +170,7 @@ class TclCommandCopperClear(TclCommand):
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"depthperpass": self.app.defaults["geometry_depthperpass"], "depthperpass": self.app.defaults["geometry_depthperpass"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangez": self.app.defaults["geometry_toolchangez"], "toolchangez": self.app.defaults["geometry_toolchangez"],
"endz": self.app.defaults["geometry_endz"], "endz": self.app.defaults["geometry_endz"],

View File

@ -159,6 +159,7 @@ class TclCommandPaint(TclCommand):
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"depthperpass": self.app.defaults["geometry_depthperpass"], "depthperpass": self.app.defaults["geometry_depthperpass"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": self.app.defaults["geometry_extracut_length"],
"toolchange": self.app.defaults["geometry_toolchange"], "toolchange": self.app.defaults["geometry_toolchange"],
"toolchangez": self.app.defaults["geometry_toolchangez"], "toolchangez": self.app.defaults["geometry_toolchangez"],
"endz": self.app.defaults["geometry_endz"], "endz": self.app.defaults["geometry_endz"],