diff --git a/CHANGELOG.md b/CHANGELOG.md index f90dd1c7..3fb06e37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ CHANGELOG for FlatCAM beta 30.10.2021 - small changes in the VisPyVisuals that should improve a bit the performance - +- in Isolation Plugin: if using a V-shape tool, restored the ability to change the tool diameter as a function of tip diameter, tip angle and the depth of cut 28.10.2021 diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index 16ab2e99..8f26960f 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -286,6 +286,10 @@ class PreferencesUIManager: "tools_iso_newdia": self.ui.plugin_eng_pref_form.tools_iso_group.newdia_entry, "tools_iso_tool_shape": self.ui.plugin_eng_pref_form.tools_iso_group.tool_shape_combo, # "C1" + "tools_iso_cutz": self.ui.plugin_eng_pref_form.tools_iso_group.cutz_entry, + "tools_iso_vtipdia": self.ui.plugin_eng_pref_form.tools_iso_group.tipdia_entry, + "tools_iso_vtipangle": self.ui.plugin_eng_pref_form.tools_iso_group.tipangle_entry, + "tools_iso_passes": self.ui.plugin_eng_pref_form.tools_iso_group.passes_entry, "tools_iso_pad_passes": self.ui.plugin_eng_pref_form.tools_iso_group.pad_passes_entry, "tools_iso_overlap": self.ui.plugin_eng_pref_form.tools_iso_group.overlap_entry, diff --git a/appPlugins/ToolIsolation.py b/appPlugins/ToolIsolation.py index 75a90185..4470e30d 100644 --- a/appPlugins/ToolIsolation.py +++ b/appPlugins/ToolIsolation.py @@ -15,6 +15,7 @@ from appParsers.ParseGerber import Gerber from camlib import grace from copy import deepcopy +import math import numpy as np import simplejson as json @@ -116,7 +117,10 @@ class ToolIsolation(AppTool, Gerber): self.poly_sel_disconnect_flag = False self.form_fields = { - "tools_mill_tool_shape": self.ui.tool_shape_combo, + "tools_mill_tool_shape": self.ui.tool_shape_combo, + "tools_mill_cutz": self.ui.cutz_entry, + "tools_mill_vtipdia": self.ui.tipdia_entry, + "tools_mill_vtipangle": self.ui.tipangle_entry, "tools_iso_passes": self.ui.passes_entry, "tools_iso_pad_passes": self.ui.pad_passes_entry, "tools_iso_overlap": self.ui.iso_overlap_entry, @@ -127,6 +131,9 @@ class ToolIsolation(AppTool, Gerber): self.name2option = { "i_tool_shape": "tools_mill_tool_shape", + "i_cutz": "tools_mill_cutz", + "i_tipdia": "tools_mill_vtipdia", + "i_tipangle": "tools_mill_vtipangle", "i_passes": "tools_iso_passes", "i_pad_passes": "tools_iso_pad_passes", "i_overlap": "tools_iso_overlap", @@ -279,6 +286,9 @@ class ToolIsolation(AppTool, Gerber): self.form_fields = { "tools_mill_tool_shape": self.ui.tool_shape_combo, + "tools_mill_cutz": self.ui.cutz_entry, + "tools_mill_vtipdia": self.ui.tipdia_entry, + "tools_mill_vtipangle": self.ui.tipangle_entry, "tools_iso_passes": self.ui.passes_entry, "tools_iso_pad_passes": self.ui.pad_passes_entry, "tools_iso_overlap": self.ui.iso_overlap_entry, @@ -326,6 +336,11 @@ class ToolIsolation(AppTool, Gerber): self.ui.iso_order_combo.set_value(self.app.defaults["tools_iso_order"]) self.ui.tool_shape_combo.set_value(self.app.defaults["tools_iso_tool_shape"]) + + self.ui.tipdia_entry.set_value(self.app.defaults["tools_iso_vtipdia"]) + self.ui.tipangle_entry.set_value(self.app.defaults["tools_iso_vtipangle"]) + self.ui.cutz_entry.set_value(self.app.defaults["tools_iso_cutz"]) + self.ui.passes_entry.set_value(self.app.defaults["tools_iso_passes"]) self.ui.pad_passes_entry.set_value(self.app.defaults["tools_iso_pad_passes"]) self.ui.iso_overlap_entry.set_value(self.app.defaults["tools_iso_overlap"]) @@ -355,6 +370,11 @@ class ToolIsolation(AppTool, Gerber): if option.find('tools_') == 0: self.default_data[option] = self.app.options[option] + # transfer some Isolation Plugin values to the Milling Plugin; that works only for adding a default tool + self.default_data['tools_mill_cutz'] = deepcopy(self.default_data['tools_iso_cutz']) + self.default_data['tools_mill_vtipdia'] = deepcopy(self.default_data['tools_iso_vtipdia']) + self.default_data['tools_mill_vtipangle'] = deepcopy(self.default_data['tools_iso_vtipangle']) + # self.default_data.update({ # "name": outname + '_iso', # "plot": self.app.defaults["geometry_plot"], @@ -644,8 +664,15 @@ class ToolIsolation(AppTool, Gerber): ) def ui_connect(self): + self.ui.tool_shape_combo.currentIndexChanged.connect(self.on_tt_change) + self.ui.tools_table.itemChanged.connect(self.on_tool_edit) + # V-shape tool parameters changes + self.ui.cutz_entry.editingFinished.connect(self.on_update_tool_dia) + self.ui.tipdia_entry.editingFinished.connect(self.on_update_tool_dia) + self.ui.tipangle_entry.editingFinished.connect(self.on_update_tool_dia) + # rows selected self.ui.tools_table.clicked.connect(self.on_row_selection_change) self.ui.tools_table.horizontalHeader().sectionClicked.connect(self.on_toggle_all_rows) @@ -667,12 +694,31 @@ class ToolIsolation(AppTool, Gerber): def ui_disconnect(self): + try: + self.ui.tool_shape_combo.currentIndexChanged.disconnect() + except (TypeError, AttributeError): + pass + try: # if connected, disconnect the signal from the slot on item_changed as it creates issues self.ui.tools_table.itemChanged.disconnect() except (TypeError, AttributeError): pass + # V-shape tool parameters changes + try: + self.ui.cutz_entry.editingFinished.disconnect() + except (TypeError, AttributeError): + pass + try: + self.ui.tipdia_entry.editingFinished.disconnect() + except (TypeError, AttributeError): + pass + try: + self.ui.tipangle_entry.editingFinished.disconnect() + except (TypeError, AttributeError): + pass + # rows selected try: self.ui.tools_table.clicked.disconnect() @@ -737,6 +783,60 @@ class ToolIsolation(AppTool, Gerber): new_toolid += 1 self.iso_tools[new_toolid] = tool[1] + def on_tt_change(self): + tool_type = self.ui.tool_shape_combo.get_value() + self.ui_update_v_shape(tool_type) + self.form_to_storage() + + def ui_update_v_shape(self, tool_type_txt): + if tool_type_txt == 5: # 'V' + self.ui.v_frame.show() + self.on_update_tool_dia() + return + self.ui.v_frame.hide() + + def on_update_tool_dia(self): + if not self.ui.v_frame.isVisible(): + return + + self.ui_disconnect() + + vdia = float(self.ui.tipdia_entry.get_value()) + half_vangle = float(self.ui.tipangle_entry.get_value()) / 2 + cut_z = self.ui.cutz_entry.get_value() + cut_z = -cut_z if cut_z < 0 else cut_z # cut_z param has to have a positive value here + + row = self.ui.tools_table.currentRow() + tool_uid_item = self.ui.tools_table.item(row, 3) + if tool_uid_item is None: + return + tool_uid = int(tool_uid_item.text()) + + tool_dia_item = self.ui.tools_table.item(row, 1) + if tool_dia_item is None: + return + + try: + new_tooldia = vdia + (2 * cut_z * math.tan(math.radians(half_vangle))) + except ZeroDivisionError: + self.ui_connect() + return + + f_new_tool_dia = self.app.dec_format(new_tooldia, self.decimals) + + tool_dias = [ + self.app.dec_format(v['tooldia'], self.decimals) for v in self.iso_tools.values() if 'tooldia' in v] + if f_new_tool_dia in tool_dias: + # if the new diameter is already in the current tools abort: we don't want duplicates + self.ui_connect() + return + + self.iso_tools[tool_uid]['tooldia'] = deepcopy(f_new_tool_dia) + self.iso_tools[tool_uid]['data']['tools_iso_tooldia'] = deepcopy(f_new_tool_dia) + self.ui.tools_table.item(row, 1).setText(str(f_new_tool_dia)) + + self.ui_connect() + def on_toggle_all_rows(self): """ will toggle the selection of all rows in Tools table @@ -1386,14 +1486,6 @@ class ToolIsolation(AppTool, Gerber): tool_dias.append(self.app.dec_format(v[tool_v], self.decimals)) truncated_tooldia = self.app.dec_format(tool_dia, self.decimals) - # if truncated_tooldia in tool_dias: - # if muted is None: - # self.app.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled. Tool already in Tool Table.")) - # # self.ui.tools_table.itemChanged.connect(self.on_tool_edit) - # self.blockSignals(False) - # return - - # print("before", self.iso_tools) self.iso_tools.update({ int(self.tooluid): { 'tooldia': truncated_tooldia, @@ -3437,6 +3529,72 @@ class IsoUI: tool_param_grid.addWidget(self.tool_shape_label, 0, 0) tool_param_grid.addWidget(self.tool_shape_combo, 0, 1) + # V-Shape Frame + self.v_frame = QtWidgets.QFrame() + self.v_frame.setContentsMargins(0, 0, 0, 0) + tool_param_grid.addWidget(self.v_frame, 2, 0, 1, 2) + + v_grid = FCGridLayout(v_spacing=5, h_spacing=3) + v_grid.setContentsMargins(0, 0, 0, 0) + self.v_frame.setLayout(v_grid) + + # Tip Dia + self.tipdialabel = FCLabel('%s:' % _('V-Tip Dia')) + self.tipdialabel.setToolTip( + _( + "The tip diameter for V-Shape Tool" + ) + ) + self.tipdia_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.tipdia_entry.set_precision(self.decimals) + self.tipdia_entry.set_range(0.00001, 10000.0000) + self.tipdia_entry.setSingleStep(0.1) + self.tipdia_entry.setObjectName("i_tipdia") + + v_grid.addWidget(self.tipdialabel, 0, 0) + v_grid.addWidget(self.tipdia_entry, 0, 1) + + # Tip Angle + self.tipanglelabel = FCLabel('%s:' % _('V-Tip Angle')) + self.tipanglelabel.setToolTip( + _( + "The tip angle for V-Shape Tool.\n" + "In degree." + ) + ) + self.tipangle_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.tipangle_entry.set_precision(self.decimals) + self.tipangle_entry.set_range(1.0, 180.0) + self.tipangle_entry.setSingleStep(1) + self.tipangle_entry.setObjectName("i_tipangle") + + v_grid.addWidget(self.tipanglelabel, 2, 0) + v_grid.addWidget(self.tipangle_entry, 2, 1) + + # Cut Z + self.cutzlabel = FCLabel('%s:' % _('Cut Z')) + self.cutzlabel.setToolTip( + _("Cutting depth (negative)\n" + "below the copper surface.")) + + self.cutz_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.cutz_entry.set_precision(self.decimals) + + self.cutz_entry.set_range(-10000.0000, 10000.0000) + + self.cutz_entry.setSingleStep(0.1) + self.cutz_entry.setObjectName("i_cutz") + + v_grid.addWidget(self.cutzlabel, 4, 0) + v_grid.addWidget(self.cutz_entry, 4, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + v_grid.addWidget(separator_line, 6, 0, 1, 2) + + self.v_frame.hide() + # Passes passlabel = FCLabel('%s:' % _('Passes')) passlabel.setToolTip( @@ -3447,8 +3605,8 @@ class IsoUI: self.passes_entry.set_range(1, 999) self.passes_entry.setObjectName("i_passes") - tool_param_grid.addWidget(passlabel, 2, 0) - tool_param_grid.addWidget(self.passes_entry, 2, 1) + tool_param_grid.addWidget(passlabel, 6, 0) + tool_param_grid.addWidget(self.passes_entry, 6, 1) # Pad Passes padpasslabel = FCLabel('%s:' % _('Pad Passes')) @@ -3460,8 +3618,8 @@ class IsoUI: self.pad_passes_entry.set_range(0, 999) self.pad_passes_entry.setObjectName("i_pad_passes") - tool_param_grid.addWidget(padpasslabel, 4, 0) - tool_param_grid.addWidget(self.pad_passes_entry, 4, 1) + tool_param_grid.addWidget(padpasslabel, 8, 0) + tool_param_grid.addWidget(self.pad_passes_entry, 8, 1) # Overlap Entry overlabel = FCLabel('%s:' % _('Overlap')) @@ -3475,8 +3633,8 @@ class IsoUI: self.iso_overlap_entry.setSingleStep(0.1) self.iso_overlap_entry.setObjectName("i_overlap") - tool_param_grid.addWidget(overlabel, 6, 0) - tool_param_grid.addWidget(self.iso_overlap_entry, 6, 1) + tool_param_grid.addWidget(overlabel, 10, 0) + tool_param_grid.addWidget(self.iso_overlap_entry, 10, 1) # Milling Type Radio Button self.milling_type_label = FCLabel('%s:' % _('Milling Type')) @@ -3495,8 +3653,8 @@ class IsoUI: ) self.milling_type_radio.setObjectName("i_milling_type") - tool_param_grid.addWidget(self.milling_type_label, 8, 0) - tool_param_grid.addWidget(self.milling_type_radio, 8, 1) + tool_param_grid.addWidget(self.milling_type_label, 12, 0) + tool_param_grid.addWidget(self.milling_type_radio, 12, 1) # Isolation Type self.iso_type_label = FCLabel('%s:' % _('Isolation Type')) @@ -3515,8 +3673,8 @@ class IsoUI: {'label': _('Int'), 'value': 'int'}]) self.iso_type_radio.setObjectName("i_iso_type") - tool_param_grid.addWidget(self.iso_type_label, 10, 0) - tool_param_grid.addWidget(self.iso_type_radio, 10, 1) + tool_param_grid.addWidget(self.iso_type_label, 14, 0) + tool_param_grid.addWidget(self.iso_type_radio, 14, 1) # ############################################################################################################## # Apply to All Parameters Button @@ -3713,7 +3871,7 @@ class IsoUI: self.area_shape_label.hide() self.area_shape_radio.hide() - FCGridLayout.set_common_column_size([tool_grid, new_tool_grid, tool_param_grid, gen_grid], 0) + FCGridLayout.set_common_column_size([tool_grid, new_tool_grid, tool_param_grid, v_grid, gen_grid], 0) # ############################################################################################################# # Generate Geometry object diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index e4884eba..8853bafe 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -1915,7 +1915,7 @@ class ToolMilling(AppTool, Excellon): try: new_cutz = (tooldia - vdia) / (2 * math.tan(math.radians(half_vangle))) except ZeroDivisionError: - new_cutz = self.old_cutz + new_cutz = 0.0 new_cutz = self.app.dec_format(new_cutz, self.decimals) * -1.0 # this value has to be negative @@ -3996,7 +3996,7 @@ class MillingUI: self.offset_separator_line = QtWidgets.QFrame() self.offset_separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) self.offset_separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - param_grid.addWidget(self.offset_separator_line, 7, 0, 1, 2) + param_grid.addWidget(self.offset_separator_line, 8, 0, 1, 2) # Tool Type self.tool_shape_label = FCLabel('%s:' % _('Shape')) @@ -4019,8 +4019,13 @@ class MillingUI: else: self.tool_shape_combo.setCurrentIndex(idx) - param_grid.addWidget(self.tool_shape_label, 8, 0) - param_grid.addWidget(self.tool_shape_combo, 8, 1) + param_grid.addWidget(self.tool_shape_label, 10, 0) + param_grid.addWidget(self.tool_shape_combo, 10, 1) + + # separator_line = QtWidgets.QFrame() + # separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + # separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + # param_grid.addWidget(separator_line, 12, 0, 1, 2) # Job Type self.job_type_lbl = FCLabel('%s:' % _('Job')) @@ -4039,8 +4044,8 @@ class MillingUI: ) self.job_type_combo.setObjectName('mill_job_type') - param_grid.addWidget(self.job_type_lbl, 10, 0) - param_grid.addWidget(self.job_type_combo, 10, 1) + param_grid.addWidget(self.job_type_lbl, 14, 0) + param_grid.addWidget(self.job_type_combo, 14, 1) # Polish Margin self.polish_margin_lbl = FCLabel('%s:' % _('Margin')) @@ -4052,8 +4057,8 @@ class MillingUI: self.polish_margin_entry.set_range(-10000.0000, 10000.0000) self.polish_margin_entry.setObjectName("mill_polish_margin") - param_grid.addWidget(self.polish_margin_lbl, 12, 0) - param_grid.addWidget(self.polish_margin_entry, 12, 1) + param_grid.addWidget(self.polish_margin_lbl, 16, 0) + param_grid.addWidget(self.polish_margin_entry, 16, 1) # Polish Overlap self.polish_over_lbl = FCLabel('%s:' % _('Overlap')) @@ -4067,8 +4072,8 @@ class MillingUI: self.polish_over_entry.setSingleStep(0.1) self.polish_over_entry.setObjectName("mill_polish_overlap") - param_grid.addWidget(self.polish_over_lbl, 14, 0) - param_grid.addWidget(self.polish_over_entry, 14, 1) + param_grid.addWidget(self.polish_over_lbl, 18, 0) + param_grid.addWidget(self.polish_over_entry, 18, 1) # Polish Method self.polish_method_lbl = FCLabel('%s:' % _('Method')) @@ -4085,8 +4090,8 @@ class MillingUI: ) self.polish_method_combo.setObjectName('mill_polish_method') - param_grid.addWidget(self.polish_method_lbl, 16, 0) - param_grid.addWidget(self.polish_method_combo, 16, 1) + param_grid.addWidget(self.polish_method_lbl, 20, 0) + param_grid.addWidget(self.polish_method_combo, 20, 1) self.polish_margin_lbl.hide() self.polish_margin_entry.hide() @@ -4098,7 +4103,7 @@ class MillingUI: self.job_separator_line = QtWidgets.QFrame() self.job_separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) self.job_separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - param_grid.addWidget(self.job_separator_line, 18, 0, 1, 2) + param_grid.addWidget(self.job_separator_line, 22, 0, 1, 2) # Tip Dia self.tipdialabel = FCLabel('%s:' % _('V-Tip Dia')) @@ -4113,8 +4118,8 @@ class MillingUI: self.tipdia_entry.setSingleStep(0.1) self.tipdia_entry.setObjectName("mill_tipdia") - param_grid.addWidget(self.tipdialabel, 20, 0) - param_grid.addWidget(self.tipdia_entry, 20, 1) + param_grid.addWidget(self.tipdialabel, 24, 0) + param_grid.addWidget(self.tipdia_entry, 24, 1) # Tip Angle self.tipanglelabel = FCLabel('%s:' % _('V-Tip Angle')) @@ -4130,8 +4135,8 @@ class MillingUI: self.tipangle_entry.setSingleStep(1) self.tipangle_entry.setObjectName("mill_tipangle") - param_grid.addWidget(self.tipanglelabel, 22, 0) - param_grid.addWidget(self.tipangle_entry, 22, 1) + param_grid.addWidget(self.tipanglelabel, 26, 0) + param_grid.addWidget(self.tipangle_entry, 26, 1) self.tipdialabel.hide() self.tipdia_entry.hide() @@ -4141,9 +4146,8 @@ class MillingUI: # Cut Z self.cutzlabel = FCLabel('%s:' % _('Cut Z')) self.cutzlabel.setToolTip( - _("Drill depth (negative)\n" - "below the copper surface.") - ) + _("Cutting depth (negative)\n" + "below the copper surface.")) self.cutz_entry = FCDoubleSpinner(callback=self.confirmation_message) self.cutz_entry.set_precision(self.decimals) @@ -4153,8 +4157,8 @@ class MillingUI: self.cutz_entry.setSingleStep(0.1) self.cutz_entry.setObjectName("mill_cutz") - param_grid.addWidget(self.cutzlabel, 24, 0) - param_grid.addWidget(self.cutz_entry, 24, 1) + param_grid.addWidget(self.cutzlabel, 28, 0) + param_grid.addWidget(self.cutz_entry, 28, 1) # Multi-Depth self.mpass_cb = FCCheckBox('%s:' % _("Multi-Depth")) @@ -4178,8 +4182,8 @@ class MillingUI: self.mis_mpass_geo = OptionalInputSection(self.mpass_cb, [self.maxdepth_entry]) - param_grid.addWidget(self.mpass_cb, 26, 0) - param_grid.addWidget(self.maxdepth_entry, 26, 1) + param_grid.addWidget(self.mpass_cb, 30, 0) + param_grid.addWidget(self.maxdepth_entry, 30, 1) # Travel Z (z_move) self.travelzlabel = FCLabel('%s:' % _('Travel Z')) @@ -4196,8 +4200,8 @@ class MillingUI: self.travelz_entry.setSingleStep(0.1) self.travelz_entry.setObjectName("mill_travelz") - param_grid.addWidget(self.travelzlabel, 28, 0) - param_grid.addWidget(self.travelz_entry, 28, 1) + param_grid.addWidget(self.travelzlabel, 32, 0) + param_grid.addWidget(self.travelz_entry, 32, 1) # Feedrate X-Y self.frxylabel = FCLabel('%s:' % _('Feedrate X-Y')) @@ -4211,8 +4215,8 @@ class MillingUI: self.xyfeedrate_entry.setSingleStep(0.1) self.xyfeedrate_entry.setObjectName("mill_feedratexy") - param_grid.addWidget(self.frxylabel, 30, 0) - param_grid.addWidget(self.xyfeedrate_entry, 30, 1) + param_grid.addWidget(self.frxylabel, 34, 0) + param_grid.addWidget(self.xyfeedrate_entry, 34, 1) self.frxylabel.hide() self.xyfeedrate_entry.hide() @@ -4231,8 +4235,8 @@ class MillingUI: self.feedrate_z_entry.setSingleStep(0.1) self.feedrate_z_entry.setObjectName("mill_feedratez") - param_grid.addWidget(self.frzlabel, 32, 0) - param_grid.addWidget(self.feedrate_z_entry, 32, 1) + param_grid.addWidget(self.frzlabel, 36, 0) + param_grid.addWidget(self.feedrate_z_entry, 36, 1) # Rapid Feedrate self.feedrate_rapid_label = FCLabel('%s:' % _('Feedrate Rapids')) @@ -4249,8 +4253,8 @@ class MillingUI: self.feedrate_rapid_entry.setSingleStep(0.1) self.feedrate_rapid_entry.setObjectName("mill_fr_rapid") - param_grid.addWidget(self.feedrate_rapid_label, 34, 0) - param_grid.addWidget(self.feedrate_rapid_entry, 34, 1) + param_grid.addWidget(self.feedrate_rapid_label, 38, 0) + param_grid.addWidget(self.feedrate_rapid_entry, 38, 1) # default values is to hide self.feedrate_rapid_label.hide() @@ -4284,8 +4288,8 @@ class MillingUI: self.extracut_cb.hide() self.e_cut_entry.hide() - param_grid.addWidget(self.extracut_cb, 36, 0) - param_grid.addWidget(self.e_cut_entry, 36, 1) + param_grid.addWidget(self.extracut_cb, 40, 0) + param_grid.addWidget(self.e_cut_entry, 40, 1) # Spindlespeed self.spindle_label = FCLabel('%s:' % _('Spindle speed')) @@ -4299,8 +4303,8 @@ class MillingUI: self.spindlespeed_entry.set_step(100) self.spindlespeed_entry.setObjectName("mill_spindlespeed") - param_grid.addWidget(self.spindle_label, 38, 0) - param_grid.addWidget(self.spindlespeed_entry, 38, 1) + param_grid.addWidget(self.spindle_label, 42, 0) + param_grid.addWidget(self.spindlespeed_entry, 42, 1) # Dwell self.dwell_cb = FCCheckBox('%s:' % _('Dwell')) @@ -4320,8 +4324,8 @@ class MillingUI: ) self.dwelltime_entry.setObjectName("mill_dwelltime") - param_grid.addWidget(self.dwell_cb, 40, 0) - param_grid.addWidget(self.dwelltime_entry, 40, 1) + param_grid.addWidget(self.dwell_cb, 44, 0) + param_grid.addWidget(self.dwelltime_entry, 44, 1) self.ois_dwell = OptionalInputSection(self.dwell_cb, [self.dwelltime_entry]) diff --git a/defaults.py b/defaults.py index 30a1927d..9f4094b3 100644 --- a/defaults.py +++ b/defaults.py @@ -358,6 +358,10 @@ class FlatCAMDefaults: "tools_iso_newdia": 0.1, "tools_iso_tool_shape": 0, # "C1" + "tools_iso_cutz": -0.07, + "tools_iso_vtipdia": 0.1, + "tools_iso_vtipangle": 30, + "tools_iso_passes": 1, "tools_iso_pad_passes": 0, "tools_iso_overlap": 10,