diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 82f5a913..5fd18e02 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -288,6 +288,7 @@ class App(QtCore.QObject): self.excellon_defaults_form = ExcellonPreferencesUI() self.geometry_defaults_form = GeometryPreferencesUI() self.cncjob_defaults_form = CNCJobPreferencesUI() + self.tools_defaults_form = ToolsPreferencesUI() # when adding entries here read the comments in the method found bellow named: # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True) @@ -318,50 +319,41 @@ class App(QtCore.QObject): "gerber_isotooldia": self.gerber_defaults_form.gerber_group.iso_tool_dia_entry, "gerber_isopasses": self.gerber_defaults_form.gerber_group.iso_width_entry, "gerber_isooverlap": self.gerber_defaults_form.gerber_group.iso_overlap_entry, - "gerber_ncctools": self.gerber_defaults_form.gerber_group.ncc_tool_dia_entry, - "gerber_nccoverlap": self.gerber_defaults_form.gerber_group.ncc_overlap_entry, - "gerber_nccmargin": self.gerber_defaults_form.gerber_group.ncc_margin_entry, - "gerber_nccmethod": self.gerber_defaults_form.gerber_group.ncc_method_radio, - "gerber_nccconnect": self.gerber_defaults_form.gerber_group.ncc_connect_cb, - "gerber_ncccontour": self.gerber_defaults_form.gerber_group.ncc_contour_cb, - "gerber_nccrest": self.gerber_defaults_form.gerber_group.ncc_rest_cb, "gerber_combine_passes": self.gerber_defaults_form.gerber_group.combine_passes_cb, "gerber_milling_type": self.gerber_defaults_form.gerber_group.milling_type_radio, - "gerber_cutouttooldia": self.gerber_defaults_form.gerber_group.cutout_tooldia_entry, - "gerber_cutoutmargin": self.gerber_defaults_form.gerber_group.cutout_margin_entry, - "gerber_cutoutgapsize": self.gerber_defaults_form.gerber_group.cutout_gap_entry, - "gerber_gaps": self.gerber_defaults_form.gerber_group.gaps_radio, "gerber_noncoppermargin": self.gerber_defaults_form.gerber_group.noncopper_margin_entry, "gerber_noncopperrounded": self.gerber_defaults_form.gerber_group.noncopper_rounded_cb, "gerber_bboxmargin": self.gerber_defaults_form.gerber_group.bbmargin_entry, "gerber_bboxrounded": self.gerber_defaults_form.gerber_group.bbrounded_cb, "gerber_circle_steps": self.gerber_defaults_form.gerber_group.circle_steps_entry, - "excellon_plot": self.excellon_defaults_form.excellon_group.plot_cb, - "excellon_solid": self.excellon_defaults_form.excellon_group.solid_cb, - "excellon_drillz": self.excellon_defaults_form.excellon_group.cutz_entry, - "excellon_travelz": self.excellon_defaults_form.excellon_group.travelz_entry, - "excellon_feedrate": self.excellon_defaults_form.excellon_group.feedrate_entry, - "excellon_feedrate_rapid": self.excellon_defaults_form.excellon_group.feedrate_rapid_entry, - "excellon_spindlespeed": self.excellon_defaults_form.excellon_group.spindlespeed_entry, - "excellon_dwell": self.excellon_defaults_form.excellon_group.dwell_cb, - "excellon_dwelltime": self.excellon_defaults_form.excellon_group.dwelltime_entry, - "excellon_toolchange": self.excellon_defaults_form.excellon_group.toolchange_cb, - "excellon_toolchangez": self.excellon_defaults_form.excellon_group.toolchangez_entry, - "excellon_toolchangexy": self.excellon_defaults_form.excellon_group.toolchangexy_entry, - "excellon_ppname_e": self.excellon_defaults_form.excellon_group.pp_excellon_name_cb, - "excellon_startz": self.excellon_defaults_form.excellon_group.estartz_entry, - "excellon_endz": self.excellon_defaults_form.excellon_group.eendz_entry, - "excellon_tooldia": self.excellon_defaults_form.excellon_group.tooldia_entry, - "excellon_slot_tooldia": self.excellon_defaults_form.excellon_group.slot_tooldia_entry, - "excellon_format_upper_in": self.excellon_defaults_form.excellon_group.excellon_format_upper_in_entry, - "excellon_format_lower_in": self.excellon_defaults_form.excellon_group.excellon_format_lower_in_entry, - "excellon_format_upper_mm": self.excellon_defaults_form.excellon_group.excellon_format_upper_mm_entry, - "excellon_format_lower_mm": self.excellon_defaults_form.excellon_group.excellon_format_lower_mm_entry, - "excellon_zeros": self.excellon_defaults_form.excellon_group.excellon_zeros_radio, - "excellon_units": self.excellon_defaults_form.excellon_group.excellon_units_radio, - "excellon_optimization_type": self.excellon_defaults_form.excellon_group.excellon_optimization_radio, - "excellon_gcode_type": self.excellon_defaults_form.excellon_group.excellon_gcode_type_radio, + + "excellon_plot": self.excellon_defaults_form.excellon_gen_group.plot_cb, + "excellon_solid": self.excellon_defaults_form.excellon_gen_group.solid_cb, + "excellon_format_upper_in": self.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry, + "excellon_format_lower_in": self.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry, + "excellon_format_upper_mm": self.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry, + "excellon_format_lower_mm": self.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry, + "excellon_zeros": self.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio, + "excellon_units": self.excellon_defaults_form.excellon_gen_group.excellon_units_radio, + "excellon_optimization_type": self.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio, + + "excellon_drillz": self.excellon_defaults_form.excellon_opt_group.cutz_entry, + "excellon_travelz": self.excellon_defaults_form.excellon_opt_group.travelz_entry, + "excellon_feedrate": self.excellon_defaults_form.excellon_opt_group.feedrate_entry, + "excellon_feedrate_rapid": self.excellon_defaults_form.excellon_opt_group.feedrate_rapid_entry, + "excellon_spindlespeed": self.excellon_defaults_form.excellon_opt_group.spindlespeed_entry, + "excellon_dwell": self.excellon_defaults_form.excellon_opt_group.dwell_cb, + "excellon_dwelltime": self.excellon_defaults_form.excellon_opt_group.dwelltime_entry, + "excellon_toolchange": self.excellon_defaults_form.excellon_opt_group.toolchange_cb, + "excellon_toolchangez": self.excellon_defaults_form.excellon_opt_group.toolchangez_entry, + "excellon_toolchangexy": self.excellon_defaults_form.excellon_opt_group.toolchangexy_entry, + "excellon_ppname_e": self.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb, + "excellon_startz": self.excellon_defaults_form.excellon_opt_group.estartz_entry, + "excellon_endz": self.excellon_defaults_form.excellon_opt_group.eendz_entry, + "excellon_tooldia": self.excellon_defaults_form.excellon_opt_group.tooldia_entry, + "excellon_slot_tooldia": self.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry, + "excellon_gcode_type": self.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio, "geometry_plot": self.geometry_defaults_form.geometry_group.plot_cb, "geometry_segx": self.geometry_defaults_form.geometry_group.segx_entry, "geometry_segy": self.geometry_defaults_form.geometry_group.segy_entry, @@ -397,7 +389,20 @@ class App(QtCore.QObject): "cncjob_fr_decimals": self.cncjob_defaults_form.cncjob_group.fr_dec_entry, "cncjob_prepend": self.cncjob_defaults_form.cncjob_group.prepend_text, "cncjob_append": self.cncjob_defaults_form.cncjob_group.append_text, - "cncjob_steps_per_circle": self.cncjob_defaults_form.cncjob_group.steps_per_circle_entry + "cncjob_steps_per_circle": self.cncjob_defaults_form.cncjob_group.steps_per_circle_entry, + + "tools_ncctools": self.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry, + "tools_nccoverlap": self.tools_defaults_form.tools_ncc_group.ncc_overlap_entry, + "tools_nccmargin": self.tools_defaults_form.tools_ncc_group.ncc_margin_entry, + "tools_nccmethod": self.tools_defaults_form.tools_ncc_group.ncc_method_radio, + "tools_nccconnect": self.tools_defaults_form.tools_ncc_group.ncc_connect_cb, + "tools_ncccontour": self.tools_defaults_form.tools_ncc_group.ncc_contour_cb, + "tools_nccrest": self.tools_defaults_form.tools_ncc_group.ncc_rest_cb, + + "tools_cutouttooldia": self.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry, + "tools_cutoutmargin": self.tools_defaults_form.tools_cutout_group.cutout_margin_entry, + "tools_cutoutgapsize": self.tools_defaults_form.tools_cutout_group.cutout_gap_entry, + "tools_gaps_rect": self.tools_defaults_form.tools_cutout_group.gaps_radio } # loads postprocessors self.postprocessors = load_postprocessors(self) @@ -407,7 +412,7 @@ class App(QtCore.QObject): # HPGL postprocessor is only for Geometry objects therefore it should not be in the Excellon Preferences if name == 'hpgl': continue - self.excellon_defaults_form.excellon_group.pp_excellon_name_cb.addItem(name) + self.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name) self.defaults = LoudDict() self.defaults.set_change_callback(self.on_defaults_dict_change) # When the dictionary changes. @@ -440,20 +445,9 @@ class App(QtCore.QObject): "gerber_isotooldia": 0.016, "gerber_isopasses": 1, "gerber_isooverlap": 0.15, - "gerber_ncctools": "1.0, 0.5", - "gerber_nccoverlap": 0.4, - "gerber_nccmargin": 1, - "gerber_nccmethod": "seed", - "gerber_nccconnect": True, - "gerber_ncccontour": True, - "gerber_nccrest": False, "gerber_combine_passes": False, "gerber_milling_type": "cl", - "gerber_cutouttooldia": 0.07, - "gerber_cutoutmargin": 0.1, - "gerber_cutoutgapsize": 0.15, - "gerber_gaps": "4", "gerber_noncoppermargin": 0.0, "gerber_noncopperrounded": False, "gerber_bboxmargin": 0.0, @@ -462,6 +456,15 @@ class App(QtCore.QObject): "excellon_plot": True, "excellon_solid": False, + "excellon_format_upper_in": 2, + "excellon_format_lower_in": 4, + "excellon_format_upper_mm": 3, + "excellon_format_lower_mm": 3, + "excellon_zeros": "L", + "excellon_units": "INCH", + "excellon_optimization_type": 'B', + "excellon_search_time": 3, + "excellon_drillz": -0.1, "excellon_travelz": 0.1, "excellon_feedrate": 3.0, @@ -477,14 +480,6 @@ class App(QtCore.QObject): "excellon_startz": None, "excellon_endz": 2.0, "excellon_ppname_e": 'default', - "excellon_format_upper_in": 2, - "excellon_format_lower_in": 4, - "excellon_format_upper_mm": 3, - "excellon_format_lower_mm": 3, - "excellon_zeros": "L", - "excellon_units": "INCH", - "excellon_optimization_type": 'B', - "excellon_search_time": 3, "excellon_gcode_type": "drills", "geometry_plot": True, @@ -524,6 +519,19 @@ class App(QtCore.QObject): "cncjob_prepend": "", "cncjob_append": "", "cncjob_steps_per_circle": 64, + + "tools_ncctools": "1.0, 0.5", + "tools_nccoverlap": 0.4, + "tools_nccmargin": 1, + "tools_nccmethod": "seed", + "tools_nccconnect": True, + "tools_ncccontour": True, + "tools_nccrest": False, + "tools_cutouttooldia": 0.07, + "tools_cutoutmargin": 0.1, + "tools_cutoutgapsize": 0.15, + "tools_gaps_rect": "4", + "global_background_timeout": 300000, # Default value is 5 minutes "global_verbose_error_level": 0, # Shell verbosity 0 = default # (python trace only for unknown errors), @@ -585,6 +593,7 @@ class App(QtCore.QObject): self.excellon_options_form = ExcellonPreferencesUI() self.geometry_options_form = GeometryPreferencesUI() self.cncjob_options_form = CNCJobPreferencesUI() + self.tools_options_form = ToolsPreferencesUI() self.options_form_fields = { "units": self.general_options_form.general_app_group.units_radio, @@ -596,41 +605,37 @@ class App(QtCore.QObject): "gerber_isotooldia": self.gerber_options_form.gerber_group.iso_tool_dia_entry, "gerber_isopasses": self.gerber_options_form.gerber_group.iso_width_entry, "gerber_isooverlap": self.gerber_options_form.gerber_group.iso_overlap_entry, - "gerber_ncctools": self.gerber_options_form.gerber_group.ncc_tool_dia_entry, - "gerber_nccoverlap": self.gerber_options_form.gerber_group.ncc_overlap_entry, - "gerber_nccmargin": self.gerber_options_form.gerber_group.ncc_margin_entry, "gerber_combine_passes": self.gerber_options_form.gerber_group.combine_passes_cb, - "gerber_cutouttooldia": self.gerber_options_form.gerber_group.cutout_tooldia_entry, - "gerber_cutoutmargin": self.gerber_options_form.gerber_group.cutout_margin_entry, - "gerber_cutoutgapsize": self.gerber_options_form.gerber_group.cutout_gap_entry, - "gerber_gaps": self.gerber_options_form.gerber_group.gaps_radio, "gerber_noncoppermargin": self.gerber_options_form.gerber_group.noncopper_margin_entry, "gerber_noncopperrounded": self.gerber_options_form.gerber_group.noncopper_rounded_cb, "gerber_bboxmargin": self.gerber_options_form.gerber_group.bbmargin_entry, "gerber_bboxrounded": self.gerber_options_form.gerber_group.bbrounded_cb, - "excellon_plot": self.excellon_options_form.excellon_group.plot_cb, - "excellon_solid": self.excellon_options_form.excellon_group.solid_cb, - "excellon_drillz": self.excellon_options_form.excellon_group.cutz_entry, - "excellon_travelz": self.excellon_options_form.excellon_group.travelz_entry, - "excellon_feedrate": self.excellon_options_form.excellon_group.feedrate_entry, - "excellon_feedrate_rapid": self.excellon_options_form.excellon_group.feedrate_rapid_entry, - "excellon_spindlespeed": self.excellon_options_form.excellon_group.spindlespeed_entry, - "excellon_dwell": self.excellon_options_form.excellon_group.dwell_cb, - "excellon_dwelltime": self.excellon_options_form.excellon_group.dwelltime_entry, - "excellon_toolchange": self.excellon_options_form.excellon_group.toolchange_cb, - "excellon_toolchangez": self.excellon_options_form.excellon_group.toolchangez_entry, - "excellon_toolchangexy": self.excellon_options_form.excellon_group.toolchangexy_entry, - "excellon_tooldia": self.excellon_options_form.excellon_group.tooldia_entry, - "excellon_ppname_e": self.excellon_options_form.excellon_group.pp_excellon_name_cb, - "excellon_startz": self.excellon_options_form.excellon_group.estartz_entry, - "excellon_endz": self.excellon_options_form.excellon_group.eendz_entry, - "excellon_format_upper_in": self.excellon_options_form.excellon_group.excellon_format_upper_in_entry, - "excellon_format_lower_in": self.excellon_options_form.excellon_group.excellon_format_lower_in_entry, - "excellon_format_upper_mm": self.excellon_options_form.excellon_group.excellon_format_upper_mm_entry, - "excellon_format_lower_mm": self.excellon_options_form.excellon_group.excellon_format_lower_mm_entry, - "excellon_zeros": self.excellon_options_form.excellon_group.excellon_zeros_radio, - "excellon_units": self.excellon_options_form.excellon_group.excellon_units_radio, - "excellon_optimization_type": self.excellon_options_form.excellon_group.excellon_optimization_radio, + + "excellon_plot": self.excellon_options_form.excellon_gen_group.plot_cb, + "excellon_solid": self.excellon_options_form.excellon_gen_group.solid_cb, + "excellon_format_upper_in": self.excellon_options_form.excellon_gen_group.excellon_format_upper_in_entry, + "excellon_format_lower_in": self.excellon_options_form.excellon_gen_group.excellon_format_lower_in_entry, + "excellon_format_upper_mm": self.excellon_options_form.excellon_gen_group.excellon_format_upper_mm_entry, + "excellon_format_lower_mm": self.excellon_options_form.excellon_gen_group.excellon_format_lower_mm_entry, + "excellon_zeros": self.excellon_options_form.excellon_gen_group.excellon_zeros_radio, + "excellon_units": self.excellon_options_form.excellon_gen_group.excellon_units_radio, + "excellon_optimization_type": self.excellon_options_form.excellon_gen_group.excellon_optimization_radio, + + "excellon_drillz": self.excellon_options_form.excellon_opt_group.cutz_entry, + "excellon_travelz": self.excellon_options_form.excellon_opt_group.travelz_entry, + "excellon_feedrate": self.excellon_options_form.excellon_opt_group.feedrate_entry, + "excellon_feedrate_rapid": self.excellon_options_form.excellon_opt_group.feedrate_rapid_entry, + "excellon_spindlespeed": self.excellon_options_form.excellon_opt_group.spindlespeed_entry, + "excellon_dwell": self.excellon_options_form.excellon_opt_group.dwell_cb, + "excellon_dwelltime": self.excellon_options_form.excellon_opt_group.dwelltime_entry, + "excellon_toolchange": self.excellon_options_form.excellon_opt_group.toolchange_cb, + "excellon_toolchangez": self.excellon_options_form.excellon_opt_group.toolchangez_entry, + "excellon_toolchangexy": self.excellon_options_form.excellon_opt_group.toolchangexy_entry, + "excellon_tooldia": self.excellon_options_form.excellon_opt_group.tooldia_entry, + "excellon_ppname_e": self.excellon_options_form.excellon_opt_group.pp_excellon_name_cb, + "excellon_startz": self.excellon_options_form.excellon_opt_group.estartz_entry, + "excellon_endz": self.excellon_options_form.excellon_opt_group.eendz_entry, + "geometry_plot": self.geometry_options_form.geometry_group.plot_cb, "geometry_segx": self.geometry_options_form.geometry_group.segx_entry, "geometry_segy": self.geometry_options_form.geometry_group.segy_entry, @@ -656,15 +661,25 @@ class App(QtCore.QObject): "geometry_depthperpass": self.geometry_options_form.geometry_group.depthperpass_entry, "geometry_multidepth": self.geometry_options_form.geometry_group.multidepth_cb, "geometry_extracut": self.geometry_options_form.geometry_group.extracut_cb, + "cncjob_plot": self.cncjob_options_form.cncjob_group.plot_cb, "cncjob_tooldia": self.cncjob_options_form.cncjob_group.tooldia_entry, "cncjob_prepend": self.cncjob_options_form.cncjob_group.prepend_text, - "cncjob_append": self.cncjob_options_form.cncjob_group.append_text + "cncjob_append": self.cncjob_options_form.cncjob_group.append_text, + + "tools_ncctools": self.tools_options_form.tools_ncc_group.ncc_tool_dia_entry, + "tools_nccoverlap": self.tools_options_form.tools_ncc_group.ncc_overlap_entry, + "tools_nccmargin": self.tools_options_form.tools_ncc_group.ncc_margin_entry, + + "tools_cutouttooldia": self.tools_options_form.tools_cutout_group.cutout_tooldia_entry, + "tools_cutoutmargin": self.tools_options_form.tools_cutout_group.cutout_margin_entry, + "tools_cutoutgapsize": self.tools_options_form.tools_cutout_group.cutout_gap_entry, + "tools_gaps": self.tools_options_form.tools_cutout_group.gaps_radio, } for name in list(self.postprocessors.keys()): self.geometry_options_form.geometry_group.pp_geometry_name_cb.addItem(name) - self.excellon_options_form.excellon_group.pp_excellon_name_cb.addItem(name) + self.excellon_options_form.excellon_opt_group.pp_excellon_name_cb.addItem(name) self.options = LoudDict() self.options.set_change_callback(self.on_options_dict_change) @@ -678,20 +693,22 @@ class App(QtCore.QObject): "gerber_isotooldia": 0.016, "gerber_isopasses": 1, "gerber_isooverlap": 0.15, - "gerber_ncctools": "1.0, 0.5", - "gerber_nccoverlap": 0.4, - "gerber_nccmargin": 1, "gerber_combine_passes": True, - "gerber_cutouttooldia": 0.07, - "gerber_cutoutmargin": 0.1, - "gerber_cutoutgapsize": 0.15, - "gerber_gaps": "4", "gerber_noncoppermargin": 0.0, "gerber_noncopperrounded": False, "gerber_bboxmargin": 0.0, "gerber_bboxrounded": False, "excellon_plot": True, "excellon_solid": False, + "excellon_format_upper_in": 2, + "excellon_format_lower_in": 4, + "excellon_format_upper_mm": 3, + "excellon_format_lower_mm": 3, + "excellon_units": 'INCH', + "excellon_optimization_type": 'B', + "excellon_search_time": 3, + "excellon_zeros": "L", + "excellon_drillz": -0.1, "excellon_travelz": 0.1, "excellon_feedrate": 3.0, @@ -704,16 +721,9 @@ class App(QtCore.QObject): "excellon_toolchangexy": "0.0, 0.0", "excellon_tooldia": 0.016, "excellon_ppname_e": 'default', - "excellon_format_upper_in": 2, - "excellon_format_lower_in": 4, - "excellon_format_upper_mm": 3, - "excellon_format_lower_mm": 3, - "excellon_units": 'INCH', - "excellon_optimization_type": 'B', - "excellon_search_time": 3, "excellon_startz": None, "excellon_endz": 2.0, - "excellon_zeros": "L", + "geometry_plot": True, "geometry_segx": 0.0, "geometry_segy": 0.0, @@ -739,10 +749,20 @@ class App(QtCore.QObject): "geometry_depthperpass": 0.002, "geometry_multidepth": False, "geometry_extracut": False, + "cncjob_plot": True, "cncjob_tooldia": 0.016, "cncjob_prepend": "", "cncjob_append": "", + + "tools_ncctools": "1.0, 0.5", + "tools_nccoverlap": 0.4, + "tools_nccmargin": 1, + "tools_cutouttooldia": 0.07, + "tools_cutoutmargin": 0.1, + "tools_cutoutgapsize": 0.15, + "tools_gaps": "4", + "global_background_timeout": 300000, # Default value is 5 minutes "global_verbose_error_level": 0, # Shell verbosity: # 0 = default(python trace only for unknown errors), @@ -756,6 +776,7 @@ class App(QtCore.QObject): self.exc_form = None self.geo_form = None self.cnc_form = None + self.tools_form = None self.on_options_combo_change(0) # Will show the initial form ### Define OBJECT COLLECTION ### @@ -1091,11 +1112,11 @@ class App(QtCore.QObject): self.general_defaults_form.general_app_group.shell_startup_cb.clicked.connect(self.on_toggle_shell) # Load the defaults values into the Excellon Format and Excellon Zeros fields - self.excellon_defaults_form.excellon_group.excellon_defaults_button.clicked.connect( + self.excellon_defaults_form.excellon_opt_group.excellon_defaults_button.clicked.connect( self.on_excellon_defaults_button) # Load the defaults values into the Excellon Format and Excellon Zeros fields - self.excellon_options_form.excellon_group.excellon_defaults_button.clicked.connect( + self.excellon_options_form.excellon_opt_group.excellon_defaults_button.clicked.connect( self.on_excellon_options_button) # this is a flag to signal to other tools that the ui tooltab is locked and not accessible @@ -2540,9 +2561,9 @@ class App(QtCore.QObject): return # Options to scale - dimensions = ['gerber_isotooldia', 'gerber_cutoutmargin', 'gerber_cutoutgapsize', - 'gerber_noncoppermargin', 'gerber_bboxmargin','gerber_isooverlap','gerber_nccoverlap', - 'gerber_nccmargin','gerber_cutouttooldia','gerber_cutoutgapsize','gerber_cutoutmargin', + dimensions = ['gerber_isotooldia', 'tools_cutoutmargin', 'tools_cutoutgapsize', + 'gerber_noncoppermargin', 'gerber_bboxmargin','gerber_isooverlap','tools_nccoverlap', + 'tools_nccmargin','tools_cutouttooldia','tools_cutoutgapsize', 'gerber_noncoppermargin','gerber_bboxmargin', 'excellon_drillz', "excellon_toolchangexy", 'excellon_travelz', 'excellon_feedrate', 'excellon_feedrate_rapid', 'excellon_toolchangez', @@ -2675,12 +2696,14 @@ class App(QtCore.QObject): self.exc_form = self.excellon_defaults_form self.geo_form = self.geometry_defaults_form self.cnc_form = self.cncjob_defaults_form + self.tools_form = self.tools_defaults_form elif sel == 1: self.gen_form = self.general_options_form self.ger_form = self.gerber_options_form self.exc_form = self.excellon_options_form self.geo_form = self.geometry_options_form self.cnc_form = self.cncjob_options_form + self.tools_form = self.tools_options_form else: return @@ -2719,6 +2742,13 @@ class App(QtCore.QObject): self.ui.cncjob_scroll_area.setWidget(self.cnc_form) self.cnc_form.show() + try: + self.ui.tools_scroll_area.takeWidget() + except: + self.log.debug("Nothing to remove") + self.ui.tools_scroll_area.setWidget(self.tools_form) + self.tools_form.show() + self.log.debug("Finished GUI form initialization.") # self.options2form() diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 91e9cc89..016ebd9b 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -604,6 +604,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.cncjob_scroll_area = VerticalScrollArea() self.cncjob_tab_lay.addWidget(self.cncjob_scroll_area) + self.tools_tab = QtWidgets.QWidget() + self.pref_tab_area.addTab(self.tools_tab, "TOOLS") + self.tools_tab_lay = QtWidgets.QVBoxLayout() + self.tools_tab_lay.setContentsMargins(2, 2, 2, 2) + self.tools_tab.setLayout(self.tools_tab_lay) + + self.tools_scroll_area = VerticalScrollArea() + self.tools_tab_lay.addWidget(self.tools_scroll_area) + self.pref_tab_bottom_layout = QtWidgets.QHBoxLayout() self.pref_tab_bottom_layout.setAlignment(QtCore.Qt.AlignVCenter) self.pref_tab_layout.addLayout(self.pref_tab_bottom_layout) @@ -911,12 +920,17 @@ class ExcellonPreferencesUI(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent=parent) - self.layout = QtWidgets.QVBoxLayout() + self.layout = QtWidgets.QHBoxLayout() self.setLayout(self.layout) - self.excellon_group = ExcellonPrefGroupUI() - self.excellon_group.setFixedWidth(260) - self.layout.addWidget(self.excellon_group) + self.excellon_gen_group = ExcellonGenPrefGroupUI() + self.excellon_gen_group.setFixedWidth(260) + self.excellon_opt_group = ExcellonOptPrefGroupUI() + self.excellon_opt_group.setFixedWidth(260) + + self.layout.addWidget(self.excellon_gen_group) + self.layout.addWidget(self.excellon_opt_group) + self.layout.addStretch() class GeometryPreferencesUI(QtWidgets.QWidget): @@ -931,6 +945,22 @@ class GeometryPreferencesUI(QtWidgets.QWidget): self.layout.addWidget(self.geometry_group) +class ToolsPreferencesUI(QtWidgets.QWidget): + + def __init__(self, parent=None): + QtWidgets.QWidget.__init__(self, parent=parent) + self.layout = QtWidgets.QHBoxLayout() + self.setLayout(self.layout) + + self.tools_ncc_group = ToolsNCCPrefGroupUI() + self.tools_ncc_group.setFixedWidth(260) + self.tools_cutout_group = ToolsCutoutPrefGroupUI() + self.tools_cutout_group.setFixedWidth(260) + + self.layout.addWidget(self.tools_ncc_group) + self.layout.addWidget(self.tools_cutout_group) + self.layout.addStretch() + class CNCJobPreferencesUI(QtWidgets.QWidget): def __init__(self, parent=None): @@ -1345,7 +1375,7 @@ class GerberPrefGroupUI(OptionsGroupUI): grid0.addWidget(self.solid_cb, 0, 1) # Multicolored CB - self.multicolored_cb = FCCheckBox(label='Multicolored') + self.multicolored_cb = FCCheckBox(label='M-Color') self.multicolored_cb.setToolTip( "Draw polygons in different colors." ) @@ -1427,148 +1457,6 @@ class GerberPrefGroupUI(OptionsGroupUI): ) self.layout.addWidget(self.clearcopper_label) - grid5 = QtWidgets.QGridLayout() - self.layout.addLayout(grid5) - ncctdlabel = QtWidgets.QLabel('Tools dia:') - ncctdlabel.setToolTip( - "Diameters of the cutting tools, separated by ','" - ) - grid5.addWidget(ncctdlabel, 0, 0) - self.ncc_tool_dia_entry = FCEntry() - grid5.addWidget(self.ncc_tool_dia_entry, 0, 1) - - nccoverlabel = QtWidgets.QLabel('Overlap:') - nccoverlabel.setToolTip( - "How much (fraction) of the tool width to overlap each tool pass.\n" - "Example:\n" - "A value here of 0.25 means 25% from the tool diameter found above.\n\n" - "Adjust the value starting with lower values\n" - "and increasing it if areas that should be cleared are still \n" - "not cleared.\n" - "Lower values = faster processing, faster execution on PCB.\n" - "Higher values = slow processing and slow execution on CNC\n" - "due of too many paths." - ) - grid5.addWidget(nccoverlabel, 1, 0) - self.ncc_overlap_entry = FloatEntry() - grid5.addWidget(self.ncc_overlap_entry, 1, 1) - - nccmarginlabel = QtWidgets.QLabel('Margin:') - nccmarginlabel.setToolTip( - "Bounding box margin." - ) - grid5.addWidget(nccmarginlabel, 2, 0) - self.ncc_margin_entry = FloatEntry() - grid5.addWidget(self.ncc_margin_entry, 2, 1) - - # Method - methodlabel = QtWidgets.QLabel('Method:') - methodlabel.setToolTip( - "Algorithm for non-copper clearing:
" - "Standard: Fixed step inwards.
" - "Seed-based: Outwards from seed.
" - "Line-based: Parallel lines." - ) - grid5.addWidget(methodlabel, 3, 0) - self.ncc_method_radio = RadioSet([ - {"label": "Standard", "value": "standard"}, - {"label": "Seed-based", "value": "seed"}, - {"label": "Straight lines", "value": "lines"} - ], orientation='vertical', stretch=False) - grid5.addWidget(self.ncc_method_radio, 3, 1) - - # Connect lines - pathconnectlabel = QtWidgets.QLabel("Connect:") - pathconnectlabel.setToolTip( - "Draw lines between resulting\n" - "segments to minimize tool lifts." - ) - grid5.addWidget(pathconnectlabel, 4, 0) - self.ncc_connect_cb = FCCheckBox() - grid5.addWidget(self.ncc_connect_cb, 4, 1) - - contourlabel = QtWidgets.QLabel("Contour:") - contourlabel.setToolTip( - "Cut around the perimeter of the polygon\n" - "to trim rough edges." - ) - grid5.addWidget(contourlabel, 5, 0) - self.ncc_contour_cb = FCCheckBox() - grid5.addWidget(self.ncc_contour_cb, 5, 1) - - restlabel = QtWidgets.QLabel("Rest M.:") - restlabel.setToolTip( - "If checked, use 'rest machining'.\n" - "Basically it will clear copper outside PCB features,\n" - "using the biggest tool and continue with the next tools,\n" - "from bigger to smaller, to clear areas of copper that\n" - "could not be cleared by previous tool.\n" - "If not checked, use the standard algorithm." - ) - grid5.addWidget(restlabel, 6, 0) - self.ncc_rest_cb = FCCheckBox() - grid5.addWidget(self.ncc_rest_cb, 6, 1) - - ## Board cuttout - self.board_cutout_label = QtWidgets.QLabel("Board cutout:") - self.board_cutout_label.setToolTip( - "Create toolpaths to cut around\n" - "the PCB and separate it from\n" - "the original board." - ) - self.layout.addWidget(self.board_cutout_label) - - grid2 = QtWidgets.QGridLayout() - self.layout.addLayout(grid2) - tdclabel = QtWidgets.QLabel('Tool dia:') - tdclabel.setToolTip( - "Diameter of the cutting tool." - ) - grid2.addWidget(tdclabel, 0, 0) - self.cutout_tooldia_entry = LengthEntry() - grid2.addWidget(self.cutout_tooldia_entry, 0, 1) - - marginlabel = QtWidgets.QLabel('Margin:') - marginlabel.setToolTip( - "Distance from objects at which\n" - "to draw the cutout." - ) - grid2.addWidget(marginlabel, 1, 0) - self.cutout_margin_entry = LengthEntry() - grid2.addWidget(self.cutout_margin_entry, 1, 1) - - gaplabel = QtWidgets.QLabel('Gap size:') - gaplabel.setToolTip( - "Size of the gaps in the toolpath\n" - "that will remain to hold the\n" - "board in place." - ) - grid2.addWidget(gaplabel, 2, 0) - self.cutout_gap_entry = LengthEntry() - grid2.addWidget(self.cutout_gap_entry, 2, 1) - - gapslabel = QtWidgets.QLabel('Gaps:') - gapslabel.setToolTip( - "Where to place the gaps, Top/Bottom\n" - "Left/Rigt, or on all 4 sides." - ) - grid2.addWidget(gapslabel, 3, 0) - self.gaps_radio = RadioSet([{'label': '2 (T/B)', 'value': 'tb'}, - {'label': '2 (L/R)', 'value': 'lr'}, - {'label': '4', 'value': '4'}]) - grid2.addWidget(self.gaps_radio, 3, 1) - - ## Non-copper regions - self.noncopper_label = QtWidgets.QLabel("Non-copper regions:") - self.noncopper_label.setToolTip( - "Create polygons covering the\n" - "areas without copper on the PCB.\n" - "Equivalent to the inverse of this\n" - "object. Can be used to remove all\n" - "copper from a specified region." - ) - self.layout.addWidget(self.noncopper_label) - grid3 = QtWidgets.QGridLayout() self.layout.addLayout(grid3) @@ -1619,13 +1507,13 @@ class GerberPrefGroupUI(OptionsGroupUI): self.layout.addStretch() -class ExcellonPrefGroupUI(OptionsGroupUI): +class ExcellonGenPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): # OptionsGroupUI.__init__(self, "Excellon Options", parent=parent) - super(ExcellonPrefGroupUI, self).__init__(self) + super(ExcellonGenPrefGroupUI, self).__init__(self) - self.setTitle(str("Excellon Options")) + self.setTitle(str("Excellon General")) # Plot options self.plot_options_label = QtWidgets.QLabel("Plot Options:") @@ -1741,7 +1629,7 @@ class ExcellonPrefGroupUI(OptionsGroupUI): hlay3 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay3) - self.excellon_zeros_label = QtWidgets.QLabel('Default Zeros Type:') + self.excellon_zeros_label = QtWidgets.QLabel('Default Zeros:') self.excellon_zeros_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_zeros_label.setToolTip( "This sets the type of Excellon zeros.\n" @@ -1769,7 +1657,7 @@ class ExcellonPrefGroupUI(OptionsGroupUI): hlay4 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay4) - self.excellon_units_label = QtWidgets.QLabel('Default Units Type:') + self.excellon_units_label = QtWidgets.QLabel('Default Units:') self.excellon_units_label.setAlignment(QtCore.Qt.AlignLeft) self.excellon_units_label.setToolTip( "This sets the default units of Excellon files.\n" @@ -1842,6 +1730,17 @@ class ExcellonPrefGroupUI(OptionsGroupUI): self.excellon_optimization_label.setDisabled(True) self.excellon_optimization_radio.setDisabled(True) + self.layout.addStretch() + + +class ExcellonOptPrefGroupUI(OptionsGroupUI): + + def __init__(self, parent=None): + # OptionsGroupUI.__init__(self, "Excellon Options", parent=parent) + super(ExcellonOptPrefGroupUI, self).__init__(self) + + self.setTitle(str("Excellon Options")) + ## Create CNC Job self.cncjob_label = QtWidgets.QLabel('Create CNC Job') self.cncjob_label.setToolTip( @@ -2477,6 +2376,167 @@ class CNCJobPrefGroupUI(OptionsGroupUI): self.layout.addLayout(grid0) +class ToolsNCCPrefGroupUI(OptionsGroupUI): + def __init__(self, parent=None): + # OptionsGroupUI.__init__(self, "NCC Tool Options", parent=parent) + super(ToolsNCCPrefGroupUI, self).__init__(self) + + self.setTitle(str("NCC Tool Options")) + + ## Clear non-copper regions + self.clearcopper_label = QtWidgets.QLabel("Clear non-copper:") + self.clearcopper_label.setToolTip( + "Create a Geometry object with\n" + "toolpaths to cut all non-copper regions." + ) + self.layout.addWidget(self.clearcopper_label) + + grid0 = QtWidgets.QGridLayout() + self.layout.addLayout(grid0) + + ncctdlabel = QtWidgets.QLabel('Tools dia:') + ncctdlabel.setToolTip( + "Diameters of the cutting tools, separated by ','" + ) + grid0.addWidget(ncctdlabel, 0, 0) + self.ncc_tool_dia_entry = FCEntry() + grid0.addWidget(self.ncc_tool_dia_entry, 0, 1) + + nccoverlabel = QtWidgets.QLabel('Overlap:') + nccoverlabel.setToolTip( + "How much (fraction) of the tool width to overlap each tool pass.\n" + "Example:\n" + "A value here of 0.25 means 25% from the tool diameter found above.\n\n" + "Adjust the value starting with lower values\n" + "and increasing it if areas that should be cleared are still \n" + "not cleared.\n" + "Lower values = faster processing, faster execution on PCB.\n" + "Higher values = slow processing and slow execution on CNC\n" + "due of too many paths." + ) + grid0.addWidget(nccoverlabel, 1, 0) + self.ncc_overlap_entry = FloatEntry() + grid0.addWidget(self.ncc_overlap_entry, 1, 1) + + nccmarginlabel = QtWidgets.QLabel('Margin:') + nccmarginlabel.setToolTip( + "Bounding box margin." + ) + grid0.addWidget(nccmarginlabel, 2, 0) + self.ncc_margin_entry = FloatEntry() + grid0.addWidget(self.ncc_margin_entry, 2, 1) + + # Method + methodlabel = QtWidgets.QLabel('Method:') + methodlabel.setToolTip( + "Algorithm for non-copper clearing:
" + "Standard: Fixed step inwards.
" + "Seed-based: Outwards from seed.
" + "Line-based: Parallel lines." + ) + grid0.addWidget(methodlabel, 3, 0) + self.ncc_method_radio = RadioSet([ + {"label": "Standard", "value": "standard"}, + {"label": "Seed-based", "value": "seed"}, + {"label": "Straight lines", "value": "lines"} + ], orientation='vertical', stretch=False) + grid0.addWidget(self.ncc_method_radio, 3, 1) + + # Connect lines + pathconnectlabel = QtWidgets.QLabel("Connect:") + pathconnectlabel.setToolTip( + "Draw lines between resulting\n" + "segments to minimize tool lifts." + ) + grid0.addWidget(pathconnectlabel, 4, 0) + self.ncc_connect_cb = FCCheckBox() + grid0.addWidget(self.ncc_connect_cb, 4, 1) + + contourlabel = QtWidgets.QLabel("Contour:") + contourlabel.setToolTip( + "Cut around the perimeter of the polygon\n" + "to trim rough edges." + ) + grid0.addWidget(contourlabel, 5, 0) + self.ncc_contour_cb = FCCheckBox() + grid0.addWidget(self.ncc_contour_cb, 5, 1) + + restlabel = QtWidgets.QLabel("Rest M.:") + restlabel.setToolTip( + "If checked, use 'rest machining'.\n" + "Basically it will clear copper outside PCB features,\n" + "using the biggest tool and continue with the next tools,\n" + "from bigger to smaller, to clear areas of copper that\n" + "could not be cleared by previous tool.\n" + "If not checked, use the standard algorithm." + ) + grid0.addWidget(restlabel, 6, 0) + self.ncc_rest_cb = FCCheckBox() + grid0.addWidget(self.ncc_rest_cb, 6, 1) + + self.layout.addStretch() + + +class ToolsCutoutPrefGroupUI(OptionsGroupUI): + def __init__(self, parent=None): + # OptionsGroupUI.__init__(self, "Cutout Tool Options", parent=parent) + super(ToolsCutoutPrefGroupUI, self).__init__(self) + + self.setTitle(str("Cutout Tool Options")) + + ## Board cuttout + self.board_cutout_label = QtWidgets.QLabel("Board cutout:") + self.board_cutout_label.setToolTip( + "Create toolpaths to cut around\n" + "the PCB and separate it from\n" + "the original board." + ) + self.layout.addWidget(self.board_cutout_label) + + grid0 = QtWidgets.QGridLayout() + self.layout.addLayout(grid0) + + tdclabel = QtWidgets.QLabel('Tool dia:') + tdclabel.setToolTip( + "Diameter of the cutting tool." + ) + grid0.addWidget(tdclabel, 0, 0) + self.cutout_tooldia_entry = LengthEntry() + grid0.addWidget(self.cutout_tooldia_entry, 0, 1) + + marginlabel = QtWidgets.QLabel('Margin:') + marginlabel.setToolTip( + "Distance from objects at which\n" + "to draw the cutout." + ) + grid0.addWidget(marginlabel, 1, 0) + self.cutout_margin_entry = LengthEntry() + grid0.addWidget(self.cutout_margin_entry, 1, 1) + + gaplabel = QtWidgets.QLabel('Gap size:') + gaplabel.setToolTip( + "Size of the gaps in the toolpath\n" + "that will remain to hold the\n" + "board in place." + ) + grid0.addWidget(gaplabel, 2, 0) + self.cutout_gap_entry = LengthEntry() + grid0.addWidget(self.cutout_gap_entry, 2, 1) + + gapslabel = QtWidgets.QLabel('Gaps:') + gapslabel.setToolTip( + "Where to place the gaps, Top/Bottom\n" + "Left/Rigt, or on all 4 sides." + ) + grid0.addWidget(gapslabel, 3, 0) + self.gaps_radio = RadioSet([{'label': '2 (T/B)', 'value': 'tb'}, + {'label': '2 (L/R)', 'value': 'lr'}, + {'label': '4', 'value': '4'}]) + grid0.addWidget(self.gaps_radio, 3, 1) + + self.layout.addStretch() + + class FlatCAMActivityView(QtWidgets.QWidget): def __init__(self, parent=None): diff --git a/README.md b/README.md index c00eb022..8ec6d495 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ CAD program, and create G-Code for Isolation routing. - added shortcut key 'L' for creating 'New Excellon' - added shortcut key combo 'SHIFT+S' for Running a Script. - modified grbl_laser postprocessor file so it includes a Sxxxx command on the line with M02 (laser active) whenever a value is enter in the Spindlespeed entry field +- remade the EDIT -> PREFERENCES window, the Excellon and Gerber sections. Created a new section named TOOLS + 26.01.2019 diff --git a/flatcamTools/ToolCutout.py b/flatcamTools/ToolCutout.py index c7825b62..3a24a54c 100644 --- a/flatcamTools/ToolCutout.py +++ b/flatcamTools/ToolCutout.py @@ -146,8 +146,8 @@ class ToolCutout(FlatCAMTool): "- one gap Left / one gap Right\n" "- one gap on each of the 4 sides." ) - self.gaps_rect_radio = RadioSet([{'label': 'T/B', 'value': 'tb'}, - {'label': 'L/R', 'value': 'lr'}, + self.gaps_rect_radio = RadioSet([{'label': '2(T/B)', 'value': 'tb'}, + {'label': '2(L/R)', 'value': 'lr'}, {'label': '4', 'value': '4'}]) form_layout_3.addRow(gapslabel_rect, self.gaps_rect_radio) @@ -186,11 +186,19 @@ class ToolCutout(FlatCAMTool): def run(self): FlatCAMTool.run(self) + self.set_ui() self.app.ui.notebook.setTabText(2, "Cutout Tool") def install(self, icon=None, separator=None, **kwargs): FlatCAMTool.install(self, icon, separator, shortcut='ALT+U', **kwargs) + def set_ui(self): + self.dia.set_value(float(self.app.defaults["tools_cutouttooldia"])) + self.margin.set_value(float(self.app.defaults["tools_cutoutmargin"])) + self.gapsize.set_value(float(self.app.defaults["tools_cutoutgapsize"])) + self.gaps.set_value(4) + self.gaps_rect_radio.set_value(str(self.app.defaults["tools_gaps_rect"])) + def on_freeform_cutout(self): def subtract_rectangle(obj_, x0, y0, x1, y1): diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index 4782a7bd..a603ffe7 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -244,12 +244,12 @@ class NonCopperClear(FlatCAMTool, Gerber): self.app.ui.notebook.setTabText(2, "NCC Tool") def set_ui(self): - self.ncc_overlap_entry.set_value(self.app.defaults["gerber_nccoverlap"]) - self.ncc_margin_entry.set_value(self.app.defaults["gerber_nccmargin"]) - self.ncc_method_radio.set_value(self.app.defaults["gerber_nccmethod"]) - self.ncc_connect_cb.set_value(self.app.defaults["gerber_nccconnect"]) - self.ncc_contour_cb.set_value(self.app.defaults["gerber_ncccontour"]) - self.ncc_rest_cb.set_value(self.app.defaults["gerber_nccrest"]) + self.ncc_overlap_entry.set_value(self.app.defaults["tools_nccoverlap"]) + self.ncc_margin_entry.set_value(self.app.defaults["tools_nccmargin"]) + self.ncc_method_radio.set_value(self.app.defaults["tools_nccmethod"]) + self.ncc_connect_cb.set_value(self.app.defaults["tools_nccconnect"]) + self.ncc_contour_cb.set_value(self.app.defaults["tools_ncccontour"]) + self.ncc_rest_cb.set_value(self.app.defaults["tools_nccrest"]) self.tools_table.setupContextMenu() self.tools_table.addContextMenu( @@ -289,18 +289,18 @@ class NonCopperClear(FlatCAMTool, Gerber): "pathconnect": self.app.defaults["geometry_pathconnect"], "paintcontour": self.app.defaults["geometry_paintcontour"], "paintoverlap": self.app.defaults["geometry_paintoverlap"], - "nccoverlap": self.app.defaults["gerber_nccoverlap"], - "nccmargin": self.app.defaults["gerber_nccmargin"], - "nccmethod": self.app.defaults["gerber_nccmethod"], - "nccconnect": self.app.defaults["gerber_nccconnect"], - "ncccontour": self.app.defaults["gerber_ncccontour"], - "nccrest": self.app.defaults["gerber_nccrest"] + "nccoverlap": self.app.defaults["tools_nccoverlap"], + "nccmargin": self.app.defaults["tools_nccmargin"], + "nccmethod": self.app.defaults["tools_nccmethod"], + "nccconnect": self.app.defaults["tools_nccconnect"], + "ncccontour": self.app.defaults["tools_ncccontour"], + "nccrest": self.app.defaults["tools_nccrest"] }) try: dias = [float(eval(dia)) for dia in self.app.defaults["gerber_ncctools"].split(",")] except: - log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> Gerber Object -> NCC Tools.") + log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> TOOLS -> NCC Tools.") return self.tooluid = 0 @@ -550,22 +550,22 @@ class NonCopperClear(FlatCAMTool, Gerber): def on_ncc(self): over = self.ncc_overlap_entry.get_value() - over = over if over else self.app.defaults["gerber_nccoverlap"] + over = over if over else self.app.defaults["tools_nccoverlap"] margin = self.ncc_margin_entry.get_value() - margin = margin if margin else self.app.defaults["gerber_nccmargin"] + margin = margin if margin else self.app.defaults["tools_nccmargin"] connect = self.ncc_connect_cb.get_value() - connect = connect if connect else self.app.defaults["gerber_nccconnect"] + connect = connect if connect else self.app.defaults["tools_nccconnect"] contour = self.ncc_contour_cb.get_value() - contour = contour if contour else self.app.defaults["gerber_ncccontour"] + contour = contour if contour else self.app.defaults["tools_ncccontour"] clearing_method = self.ncc_rest_cb.get_value() - clearing_method = clearing_method if clearing_method else self.app.defaults["gerber_nccrest"] + clearing_method = clearing_method if clearing_method else self.app.defaults["tools_nccrest"] pol_method = self.ncc_method_radio.get_value() - pol_method = pol_method if pol_method else self.app.defaults["gerber_nccmethod"] + pol_method = pol_method if pol_method else self.app.defaults["tools_nccmethod"] self.obj_name = self.object_combo.currentText() # Get source object.