diff --git a/FlatCAMApp.py b/FlatCAMApp.py
index 19b5bd6c..28335287 100644
--- a/FlatCAMApp.py
+++ b/FlatCAMApp.py
@@ -379,539 +379,11 @@ class App(QtCore.QObject):
os.chdir(self.app_home)
- # #############################################################################
- # ##################### CREATE MULTIPROCESSING POOL ###########################
- # #############################################################################
- self.pool = Pool(processes=cpu_count())
-
- # ##########################################################################
- # ################## Setting the Splash Screen #############################
- # ##########################################################################
-
- settings = QSettings("Open Source", "FlatCAM")
- if settings.contains("splash_screen"):
- show_splash = settings.value("splash_screen")
- else:
- settings.setValue('splash_screen', 1)
-
- # This will write the setting to the platform specific storage.
- del settings
- show_splash = 1
-
- if show_splash and self.cmd_line_headless != 1:
- splash_pix = QtGui.QPixmap('share/splash.png')
- self.splash = QtWidgets.QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
- # self.splash.setMask(splash_pix.mask())
-
- # move splashscreen to the current monitor
- desktop = QtWidgets.QApplication.desktop()
- screen = desktop.screenNumber(QtGui.QCursor.pos())
- current_screen_center = desktop.availableGeometry(screen).center()
- self.splash.move(current_screen_center - self.splash.rect().center())
-
- self.splash.show()
- self.splash.showMessage(_("FlatCAM is initializing ..."),
- alignment=Qt.AlignBottom | Qt.AlignLeft,
- color=QtGui.QColor("gray"))
- else:
- show_splash = 0
-
- # #############################################################################
- # ##################### Initialize GUI ########################################
- # #############################################################################
-
- # FlatCAM colors used in plotting
- self.FC_light_green = '#BBF268BF'
- self.FC_dark_green = '#006E20BF'
- self.FC_light_blue = '#a5a5ffbf'
- self.FC_dark_blue = '#0000ffbf'
-
- QtCore.QObject.__init__(self)
-
- self.ui = FlatCAMGUI(self.version, self.beta, self)
-
- settings = QtCore.QSettings("Open Source", "FlatCAM")
- if settings.contains("theme"):
- theme = settings.value('theme', type=str)
- else:
- theme = 'white'
-
- if theme == 'white':
- self.cursor_color_3D = 'black'
- else:
- self.cursor_color_3D = 'gray'
-
- self.ui.geom_update[int, int, int, int, int].connect(self.save_geometry)
- self.ui.final_save.connect(self.final_save)
-
- # #############################################################################
- # ############################## Data #########################################
- # #############################################################################
- self.recent = []
- self.recent_projects = []
-
- self.clipboard = QtWidgets.QApplication.clipboard()
-
- self.project_filename = None
- self.toggle_units_ignore = False
-
- # self.defaults_form = PreferencesUI()
-
- # 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)
- self.defaults_form_fields = {
- # General App
- "units": self.ui.general_defaults_form.general_app_group.units_radio,
- "global_graphic_engine": self.ui.general_defaults_form.general_app_group.ge_radio,
- "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio,
- "global_portable": self.ui.general_defaults_form.general_app_group.portability_cb,
- "global_language": self.ui.general_defaults_form.general_app_group.language_cb,
-
- "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb,
- "global_send_stats": self.ui.general_defaults_form.general_app_group.send_stats_cb,
- "global_pan_button": self.ui.general_defaults_form.general_app_group.pan_button_radio,
- "global_mselect_key": self.ui.general_defaults_form.general_app_group.mselect_radio,
-
- "global_worker_number": self.ui.general_defaults_form.general_app_group.worker_number_sb,
- "global_tolerance": self.ui.general_defaults_form.general_app_group.tol_entry,
-
- "global_open_style": self.ui.general_defaults_form.general_app_group.open_style_cb,
-
- "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_spinner,
- "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb,
-
- "global_bookmarks_limit": self.ui.general_defaults_form.general_app_group.bm_limit_spinner,
-
- # General GUI Preferences
- "global_gridx": self.ui.general_defaults_form.general_gui_group.gridx_entry,
- "global_gridy": self.ui.general_defaults_form.general_gui_group.gridy_entry,
- "global_snap_max": self.ui.general_defaults_form.general_gui_group.snap_max_dist_entry,
- "global_workspace": self.ui.general_defaults_form.general_gui_group.workspace_cb,
- "global_workspaceT": self.ui.general_defaults_form.general_gui_group.wk_cb,
-
- "global_plot_fill": self.ui.general_defaults_form.general_gui_group.pf_color_entry,
- "global_plot_line": self.ui.general_defaults_form.general_gui_group.pl_color_entry,
- "global_sel_fill": self.ui.general_defaults_form.general_gui_group.sf_color_entry,
- "global_sel_line": self.ui.general_defaults_form.general_gui_group.sl_color_entry,
- "global_alt_sel_fill": self.ui.general_defaults_form.general_gui_group.alt_sf_color_entry,
- "global_alt_sel_line": self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry,
- "global_draw_color": self.ui.general_defaults_form.general_gui_group.draw_color_entry,
- "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry,
-
- "global_proj_item_color": self.ui.general_defaults_form.general_gui_group.proj_color_entry,
- "global_proj_item_dis_color": self.ui.general_defaults_form.general_gui_group.proj_color_dis_entry,
- "global_activity_icon": self.ui.general_defaults_form.general_gui_group.activity_combo,
-
- # General GUI Settings
- "global_theme": self.ui.general_defaults_form.general_gui_set_group.theme_radio,
- "global_layout": self.ui.general_defaults_form.general_gui_set_group.layout_combo,
- "global_hover": self.ui.general_defaults_form.general_gui_set_group.hover_cb,
- "global_selection_shape": self.ui.general_defaults_form.general_gui_set_group.selection_cb,
- "global_systray_icon": self.ui.general_defaults_form.general_gui_set_group.systray_cb,
- "global_shell_at_startup": self.ui.general_defaults_form.general_gui_set_group.shell_startup_cb,
- "global_project_at_startup": self.ui.general_defaults_form.general_gui_set_group.project_startup_cb,
- "global_project_autohide": self.ui.general_defaults_form.general_gui_set_group.project_autohide_cb,
- "global_toggle_tooltips": self.ui.general_defaults_form.general_gui_set_group.toggle_tooltips_cb,
- "global_delete_confirmation": self.ui.general_defaults_form.general_gui_set_group.delete_conf_cb,
- "global_cursor_type": self.ui.general_defaults_form.general_gui_set_group.cursor_radio,
- "global_cursor_size": self.ui.general_defaults_form.general_gui_set_group.cursor_size_entry,
-
- # Gerber General
- "gerber_plot": self.ui.gerber_defaults_form.gerber_gen_group.plot_cb,
- "gerber_solid": self.ui.gerber_defaults_form.gerber_gen_group.solid_cb,
- "gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
- "gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
- "gerber_def_units": self.ui.gerber_defaults_form.gerber_gen_group.gerber_units_radio,
- "gerber_def_zeros": self.ui.gerber_defaults_form.gerber_gen_group.gerber_zeros_radio,
-
- # Gerber Options
- "gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry,
- "gerber_isopasses": self.ui.gerber_defaults_form.gerber_opt_group.iso_width_entry,
- "gerber_isooverlap": self.ui.gerber_defaults_form.gerber_opt_group.iso_overlap_entry,
- "gerber_combine_passes": self.ui.gerber_defaults_form.gerber_opt_group.combine_passes_cb,
- "gerber_milling_type": self.ui.gerber_defaults_form.gerber_opt_group.milling_type_radio,
- "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry,
- "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb,
- "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry,
- "gerber_bboxrounded": self.ui.gerber_defaults_form.gerber_opt_group.bbrounded_cb,
-
- # Gerber Advanced Options
- "gerber_aperture_display": self.ui.gerber_defaults_form.gerber_adv_opt_group.aperture_table_visibility_cb,
- # "gerber_aperture_scale_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.scale_aperture_entry,
- # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry,
- "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb,
- "gerber_tool_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.tool_type_radio,
- "gerber_vtipdia": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipdia_spinner,
- "gerber_vtipangle": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipangle_spinner,
- "gerber_vcutz": self.ui.gerber_defaults_form.gerber_adv_opt_group.cutz_spinner,
-
- "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio,
- "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb,
- "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner,
-
- # Gerber Export
- "gerber_exp_units": self.ui.gerber_defaults_form.gerber_exp_group.gerber_units_radio,
- "gerber_exp_integer": self.ui.gerber_defaults_form.gerber_exp_group.format_whole_entry,
- "gerber_exp_decimals": self.ui.gerber_defaults_form.gerber_exp_group.format_dec_entry,
- "gerber_exp_zeros": self.ui.gerber_defaults_form.gerber_exp_group.zeros_radio,
-
- # Gerber Editor
- "gerber_editor_sel_limit": self.ui.gerber_defaults_form.gerber_editor_group.sel_limit_entry,
- "gerber_editor_newcode": self.ui.gerber_defaults_form.gerber_editor_group.addcode_entry,
- "gerber_editor_newsize": self.ui.gerber_defaults_form.gerber_editor_group.addsize_entry,
- "gerber_editor_newtype": self.ui.gerber_defaults_form.gerber_editor_group.addtype_combo,
- "gerber_editor_newdim": self.ui.gerber_defaults_form.gerber_editor_group.adddim_entry,
- "gerber_editor_array_size": self.ui.gerber_defaults_form.gerber_editor_group.grb_array_size_entry,
- "gerber_editor_lin_axis": self.ui.gerber_defaults_form.gerber_editor_group.grb_axis_radio,
- "gerber_editor_lin_pitch": self.ui.gerber_defaults_form.gerber_editor_group.grb_pitch_entry,
- "gerber_editor_lin_angle": self.ui.gerber_defaults_form.gerber_editor_group.grb_angle_entry,
- "gerber_editor_circ_dir": self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_dir_radio,
- "gerber_editor_circ_angle":
- self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_angle_entry,
- "gerber_editor_scale_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_scale_entry,
- "gerber_editor_buff_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_buff_entry,
- "gerber_editor_ma_low": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_low_entry,
- "gerber_editor_ma_high": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_high_entry,
-
- # Excellon General
- "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb,
- "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb,
- "excellon_format_upper_in":
- self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry,
- "excellon_format_lower_in":
- self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry,
- "excellon_format_upper_mm":
- self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry,
- "excellon_format_lower_mm":
- self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry,
- "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio,
- "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio,
- "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb,
- "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio,
- "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry,
-
- # Excellon Options
- "excellon_drillz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry,
- "excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry,
- "excellon_endz": self.ui.excellon_defaults_form.excellon_opt_group.eendz_entry,
- "excellon_feedrate": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_entry,
- "excellon_spindlespeed": self.ui.excellon_defaults_form.excellon_opt_group.spindlespeed_entry,
- "excellon_dwell": self.ui.excellon_defaults_form.excellon_opt_group.dwell_cb,
- "excellon_dwelltime": self.ui.excellon_defaults_form.excellon_opt_group.dwelltime_entry,
- "excellon_toolchange": self.ui.excellon_defaults_form.excellon_opt_group.toolchange_cb,
- "excellon_toolchangez": self.ui.excellon_defaults_form.excellon_opt_group.toolchangez_entry,
- "excellon_ppname_e": self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb,
- "excellon_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.tooldia_entry,
- "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry,
- "excellon_gcode_type": self.ui.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio,
-
- # Excellon Advanced Options
- "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry,
- "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry,
- "excellon_startz": self.ui.excellon_defaults_form.excellon_adv_opt_group.estartz_entry,
- "excellon_feedrate_rapid": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_rapid_entry,
- "excellon_z_pdepth": self.ui.excellon_defaults_form.excellon_adv_opt_group.pdepth_entry,
- "excellon_feedrate_probe": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_probe_entry,
- "excellon_spindledir": self.ui.excellon_defaults_form.excellon_adv_opt_group.spindledir_radio,
- "excellon_f_plunge": self.ui.excellon_defaults_form.excellon_adv_opt_group.fplunge_cb,
- "excellon_f_retract": self.ui.excellon_defaults_form.excellon_adv_opt_group.fretract_cb,
-
- # Excellon Export
- "excellon_exp_units": self.ui.excellon_defaults_form.excellon_exp_group.excellon_units_radio,
- "excellon_exp_format": self.ui.excellon_defaults_form.excellon_exp_group.format_radio,
- "excellon_exp_integer": self.ui.excellon_defaults_form.excellon_exp_group.format_whole_entry,
- "excellon_exp_decimals": self.ui.excellon_defaults_form.excellon_exp_group.format_dec_entry,
- "excellon_exp_zeros": self.ui.excellon_defaults_form.excellon_exp_group.zeros_radio,
- "excellon_exp_slot_type": self.ui.excellon_defaults_form.excellon_exp_group.slot_type_radio,
-
- # Excellon Editor
- "excellon_editor_sel_limit": self.ui.excellon_defaults_form.excellon_editor_group.sel_limit_entry,
- "excellon_editor_newdia": self.ui.excellon_defaults_form.excellon_editor_group.addtool_entry,
- "excellon_editor_array_size": self.ui.excellon_defaults_form.excellon_editor_group.drill_array_size_entry,
- "excellon_editor_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_axis_radio,
- "excellon_editor_lin_pitch": self.ui.excellon_defaults_form.excellon_editor_group.drill_pitch_entry,
- "excellon_editor_lin_angle": self.ui.excellon_defaults_form.excellon_editor_group.drill_angle_entry,
- "excellon_editor_circ_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_dir_radio,
- "excellon_editor_circ_angle":
- self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_angle_entry,
- # Excellon Slots
- "excellon_editor_slot_direction":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_axis_radio,
- "excellon_editor_slot_angle":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_angle_spinner,
- "excellon_editor_slot_length":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_length_entry,
- # Excellon Slots
- "excellon_editor_slot_array_size":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_array_size_entry,
- "excellon_editor_slot_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.slot_array_axis_radio,
- "excellon_editor_slot_lin_pitch":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_array_pitch_entry,
- "excellon_editor_slot_lin_angle":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_array_angle_entry,
- "excellon_editor_slot_circ_dir":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_dir_radio,
- "excellon_editor_slot_circ_angle":
- self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
-
- # Geometry General
- "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb,
- "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry,
- "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry,
-
- # Geometry Options
- "geometry_cutz": self.ui.geometry_defaults_form.geometry_opt_group.cutz_entry,
- "geometry_travelz": self.ui.geometry_defaults_form.geometry_opt_group.travelz_entry,
- "geometry_feedrate": self.ui.geometry_defaults_form.geometry_opt_group.cncfeedrate_entry,
- "geometry_feedrate_z": self.ui.geometry_defaults_form.geometry_opt_group.cncplunge_entry,
- "geometry_spindlespeed": self.ui.geometry_defaults_form.geometry_opt_group.cncspindlespeed_entry,
- "geometry_dwell": self.ui.geometry_defaults_form.geometry_opt_group.dwell_cb,
- "geometry_dwelltime": self.ui.geometry_defaults_form.geometry_opt_group.dwelltime_entry,
- "geometry_ppname_g": self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb,
- "geometry_toolchange": self.ui.geometry_defaults_form.geometry_opt_group.toolchange_cb,
- "geometry_toolchangez": self.ui.geometry_defaults_form.geometry_opt_group.toolchangez_entry,
- "geometry_endz": self.ui.geometry_defaults_form.geometry_opt_group.gendz_entry,
- "geometry_depthperpass": self.ui.geometry_defaults_form.geometry_opt_group.depthperpass_entry,
- "geometry_multidepth": self.ui.geometry_defaults_form.geometry_opt_group.multidepth_cb,
-
- # Geometry Advanced Options
- "geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_adv_opt_group.toolchangexy_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_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
- "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_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,
- "geometry_f_plunge": self.ui.geometry_defaults_form.geometry_adv_opt_group.fplunge_cb,
- "geometry_segx": self.ui.geometry_defaults_form.geometry_adv_opt_group.segx_entry,
- "geometry_segy": self.ui.geometry_defaults_form.geometry_adv_opt_group.segy_entry,
-
- # Geometry Editor
- "geometry_editor_sel_limit": self.ui.geometry_defaults_form.geometry_editor_group.sel_limit_entry,
- "geometry_editor_milling_type": self.ui.geometry_defaults_form.geometry_editor_group.milling_type_radio,
-
- # CNCJob General
- "cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb,
- "cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_gen_group.cncplot_method_radio,
- "cncjob_annotation": self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_cb,
-
- "cncjob_tooldia": self.ui.cncjob_defaults_form.cncjob_gen_group.tooldia_entry,
- "cncjob_coords_type": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_type_radio,
- "cncjob_coords_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_dec_entry,
- "cncjob_fr_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.fr_dec_entry,
- "cncjob_steps_per_circle": self.ui.cncjob_defaults_form.cncjob_gen_group.steps_per_circle_entry,
-
- # CNC Job Options
- "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_opt_group.prepend_text,
- "cncjob_append": self.ui.cncjob_defaults_form.cncjob_opt_group.append_text,
-
- # CNC Job Advanced Options
- "cncjob_toolchange_macro": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_text,
- "cncjob_toolchange_macro_enable": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_cb,
- "cncjob_annotation_fontsize": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontsize_sp,
- "cncjob_annotation_fontcolor": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry,
-
- # NCC Tool
- "tools_ncctools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry,
- "tools_nccorder": self.ui.tools_defaults_form.tools_ncc_group.ncc_order_radio,
- "tools_nccoverlap": self.ui.tools_defaults_form.tools_ncc_group.ncc_overlap_entry,
- "tools_nccmargin": self.ui.tools_defaults_form.tools_ncc_group.ncc_margin_entry,
- "tools_nccmethod": self.ui.tools_defaults_form.tools_ncc_group.ncc_method_radio,
- "tools_nccconnect": self.ui.tools_defaults_form.tools_ncc_group.ncc_connect_cb,
- "tools_ncccontour": self.ui.tools_defaults_form.tools_ncc_group.ncc_contour_cb,
- "tools_nccrest": self.ui.tools_defaults_form.tools_ncc_group.ncc_rest_cb,
- "tools_ncc_offset_choice": self.ui.tools_defaults_form.tools_ncc_group.ncc_choice_offset_cb,
- "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner,
- "tools_nccref": self.ui.tools_defaults_form.tools_ncc_group.reference_radio,
- "tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio,
- "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio,
- "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio,
- "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry,
- "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry,
- "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry,
- "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry,
-
- # CutOut Tool
- "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry,
- "tools_cutoutkind": self.ui.tools_defaults_form.tools_cutout_group.obj_kind_combo,
- "tools_cutoutmargin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry,
- "tools_cutoutgapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry,
- "tools_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo,
- "tools_cutout_convexshape": self.ui.tools_defaults_form.tools_cutout_group.convex_box,
-
- # Paint Area Tool
- "tools_painttooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry,
- "tools_paintorder": self.ui.tools_defaults_form.tools_paint_group.paint_order_radio,
- "tools_paintoverlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry,
- "tools_paintmargin": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry,
- "tools_paintmethod": self.ui.tools_defaults_form.tools_paint_group.paintmethod_combo,
- "tools_selectmethod": self.ui.tools_defaults_form.tools_paint_group.selectmethod_combo,
- "tools_pathconnect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb,
- "tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
- "tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
-
- # 2-sided Tool
- "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
- "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
- "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry,
-
- # Film Tool
- "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio,
- "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry,
- "tools_film_scale_stroke": self.ui.tools_defaults_form.tools_film_group.film_scale_stroke_entry,
- "tools_film_color": self.ui.tools_defaults_form.tools_film_group.film_color_entry,
- "tools_film_scale_cb": self.ui.tools_defaults_form.tools_film_group.film_scale_cb,
- "tools_film_scale_x_entry": self.ui.tools_defaults_form.tools_film_group.film_scalex_entry,
- "tools_film_scale_y_entry": self.ui.tools_defaults_form.tools_film_group.film_scaley_entry,
- "tools_film_skew_cb": self.ui.tools_defaults_form.tools_film_group.film_skew_cb,
- "tools_film_skew_x_entry": self.ui.tools_defaults_form.tools_film_group.film_skewx_entry,
- "tools_film_skew_y_entry": self.ui.tools_defaults_form.tools_film_group.film_skewy_entry,
- "tools_film_skew_ref_radio": self.ui.tools_defaults_form.tools_film_group.film_skew_reference,
- "tools_film_mirror_cb": self.ui.tools_defaults_form.tools_film_group.film_mirror_cb,
- "tools_film_mirror_axis_radio": self.ui.tools_defaults_form.tools_film_group.film_mirror_axis,
-
- # Panelize Tool
- "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns,
- "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows,
- "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns,
- "tools_panelize_rows": self.ui.tools_defaults_form.tools_panelize_group.prows,
- "tools_panelize_constrain": self.ui.tools_defaults_form.tools_panelize_group.pconstrain_cb,
- "tools_panelize_constrainx": self.ui.tools_defaults_form.tools_panelize_group.px_width_entry,
- "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry,
- "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio,
-
- # Calculators Tool
- "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry,
- "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry,
- "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry,
- "tools_calc_electro_length": self.ui.tools_defaults_form.tools_calculators_group.pcblength_entry,
- "tools_calc_electro_width": self.ui.tools_defaults_form.tools_calculators_group.pcbwidth_entry,
- "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry,
- "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry,
-
- # Transformations Tool
- "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry,
- "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry,
- "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry,
- "tools_transform_scale_x": self.ui.tools_defaults_form.tools_transform_group.scalex_entry,
- "tools_transform_scale_y": self.ui.tools_defaults_form.tools_transform_group.scaley_entry,
- "tools_transform_scale_link": self.ui.tools_defaults_form.tools_transform_group.link_cb,
- "tools_transform_scale_reference": self.ui.tools_defaults_form.tools_transform_group.reference_cb,
- "tools_transform_offset_x": self.ui.tools_defaults_form.tools_transform_group.offx_entry,
- "tools_transform_offset_y": self.ui.tools_defaults_form.tools_transform_group.offy_entry,
- "tools_transform_mirror_reference": self.ui.tools_defaults_form.tools_transform_group.mirror_reference_cb,
- "tools_transform_mirror_point": self.ui.tools_defaults_form.tools_transform_group.flip_ref_entry,
-
- # SolderPaste Dispensing Tool
- "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry,
- "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry,
- "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry,
- "tools_solderpaste_z_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.z_dispense_entry,
- "tools_solderpaste_z_stop": self.ui.tools_defaults_form.tools_solderpaste_group.z_stop_entry,
- "tools_solderpaste_z_travel": self.ui.tools_defaults_form.tools_solderpaste_group.z_travel_entry,
- "tools_solderpaste_z_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.z_toolchange_entry,
- "tools_solderpaste_xy_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.xy_toolchange_entry,
- "tools_solderpaste_frxy": self.ui.tools_defaults_form.tools_solderpaste_group.frxy_entry,
- "tools_solderpaste_frz": self.ui.tools_defaults_form.tools_solderpaste_group.frz_entry,
- "tools_solderpaste_frz_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.frz_dispense_entry,
- "tools_solderpaste_speedfwd": self.ui.tools_defaults_form.tools_solderpaste_group.speedfwd_entry,
- "tools_solderpaste_dwellfwd": self.ui.tools_defaults_form.tools_solderpaste_group.dwellfwd_entry,
- "tools_solderpaste_speedrev": self.ui.tools_defaults_form.tools_solderpaste_group.speedrev_entry,
- "tools_solderpaste_dwellrev": self.ui.tools_defaults_form.tools_solderpaste_group.dwellrev_entry,
- "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
- "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
-
- # ###################################################################################
- # ################################ TOOLS 2 ##########################################
- # ###################################################################################
-
- # Optimal Tool
- "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
-
- # Check Rules Tool
- "tools_cr_trace_size": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_cb,
- "tools_cr_trace_size_val": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_entry,
- "tools_cr_c2c": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_cb,
- "tools_cr_c2c_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_entry,
- "tools_cr_c2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_cb,
- "tools_cr_c2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_entry,
- "tools_cr_s2s": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_cb,
- "tools_cr_s2s_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_entry,
- "tools_cr_s2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_cb,
- "tools_cr_s2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_entry,
- "tools_cr_s2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_cb,
- "tools_cr_s2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_entry,
- "tools_cr_sm2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_cb,
- "tools_cr_sm2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_entry,
- "tools_cr_ri": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_cb,
- "tools_cr_ri_val": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_entry,
- "tools_cr_h2h": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_cb,
- "tools_cr_h2h_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_entry,
- "tools_cr_dh": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_cb,
- "tools_cr_dh_val": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_entry,
-
- # QRCode Tool
- "tools_qrcode_version": self.ui.tools2_defaults_form.tools2_qrcode_group.version_entry,
- "tools_qrcode_error": self.ui.tools2_defaults_form.tools2_qrcode_group.error_radio,
- "tools_qrcode_box_size": self.ui.tools2_defaults_form.tools2_qrcode_group.bsize_entry,
- "tools_qrcode_border_size": self.ui.tools2_defaults_form.tools2_qrcode_group.border_size_entry,
- "tools_qrcode_qrdata": self.ui.tools2_defaults_form.tools2_qrcode_group.text_data,
- "tools_qrcode_polarity": self.ui.tools2_defaults_form.tools2_qrcode_group.pol_radio,
- "tools_qrcode_rounded": self.ui.tools2_defaults_form.tools2_qrcode_group.bb_radio,
- "tools_qrcode_fill_color": self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry,
- "tools_qrcode_back_color": self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry,
- "tools_qrcode_sel_limit": self.ui.tools2_defaults_form.tools2_qrcode_group.sel_limit_entry,
-
- # Copper Fill Tool
- "tools_copperfill_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
- "tools_copperfill_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
- "tools_copperfill_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
- "tools_copperfill_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
- "tools_copperfill_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
-
- # Utilities
- # File associations
- "fa_excellon": self.ui.util_defaults_form.fa_excellon_group.exc_list_text,
- "fa_gcode": self.ui.util_defaults_form.fa_gcode_group.gco_list_text,
- # "fa_geometry": self.ui.util_defaults_form.fa_geometry_group.close_paths_cb,
- "fa_gerber": self.ui.util_defaults_form.fa_gerber_group.grb_list_text,
- "util_autocomplete_keywords": self.ui.util_defaults_form.kw_group.kw_list_text,
-
- }
-
- # ############################
- # ### LOAD POSTPROCESSORS ####
- # ############################
-
- self.postprocessors = load_postprocessors(self)
-
- for name in list(self.postprocessors.keys()):
- # 'Paste' postprocessors are to be used only in the Solder Paste Dispensing Tool
- if name.partition('_')[0] == 'Paste':
- self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo.addItem(name)
- continue
-
- self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb.addItem(name)
- # HPGL postprocessor is only for Geometry objects therefore it should not be in the Excellon Preferences
- if name == 'hpgl':
- continue
-
- self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
-
- # ############################
- # ### LOAD LANGUAGES ####
- # ############################
-
- self.languages = fcTranslate.load_languages()
- for name in sorted(self.languages.values()):
- self.ui.general_defaults_form.general_app_group.language_cb.addItem(name)
-
# #################################################################################
# #################### DEFAULTS - PREFERENCES STORAGE #############################
# #################################################################################
self.defaults = LoudDict()
- self.defaults.set_change_callback(self.on_defaults_dict_change) # When the dictionary changes.
self.defaults.update({
# Global APP Preferences
"first_run": True,
@@ -1391,9 +863,555 @@ class App(QtCore.QObject):
if user_defaults:
self.load_defaults(filename='current_defaults')
- # #############################################################
- # ############## APPLY APP LANGUAGE ###########################
- # #############################################################
+ # #############################################################################
+ # ##################### CREATE MULTIPROCESSING POOL ###########################
+ # #############################################################################
+
+ self.pool = Pool(processes=cpu_count())
+
+ # ##########################################################################
+ # ################## Setting the Splash Screen #############################
+ # ##########################################################################
+
+ settings = QSettings("Open Source", "FlatCAM")
+ if settings.contains("splash_screen"):
+ show_splash = settings.value("splash_screen")
+ else:
+ settings.setValue('splash_screen', 1)
+
+ # This will write the setting to the platform specific storage.
+ del settings
+ show_splash = 1
+
+ if show_splash and self.cmd_line_headless != 1:
+ splash_pix = QtGui.QPixmap('share/splash.png')
+ self.splash = QtWidgets.QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
+ # self.splash.setMask(splash_pix.mask())
+
+ # move splashscreen to the current monitor
+ desktop = QtWidgets.QApplication.desktop()
+ screen = desktop.screenNumber(QtGui.QCursor.pos())
+ current_screen_center = desktop.availableGeometry(screen).center()
+ self.splash.move(current_screen_center - self.splash.rect().center())
+
+ self.splash.show()
+ self.splash.showMessage(_("FlatCAM is initializing ..."),
+ alignment=Qt.AlignBottom | Qt.AlignLeft,
+ color=QtGui.QColor("gray"))
+ else:
+ show_splash = 0
+
+ # #############################################################################
+ # ##################### Initialize GUI ########################################
+ # #############################################################################
+
+ # FlatCAM colors used in plotting
+ self.FC_light_green = '#BBF268BF'
+ self.FC_dark_green = '#006E20BF'
+ self.FC_light_blue = '#a5a5ffbf'
+ self.FC_dark_blue = '#0000ffbf'
+
+ QtCore.QObject.__init__(self)
+
+ self.ui = FlatCAMGUI(self.version, self.beta, self)
+
+ settings = QtCore.QSettings("Open Source", "FlatCAM")
+ if settings.contains("theme"):
+ theme = settings.value('theme', type=str)
+ else:
+ theme = 'white'
+
+ if theme == 'white':
+ self.cursor_color_3D = 'black'
+ else:
+ self.cursor_color_3D = 'gray'
+
+ self.ui.geom_update[int, int, int, int, int].connect(self.save_geometry)
+ self.ui.final_save.connect(self.final_save)
+
+ # restore the toolbar view
+ self.restore_toolbar_view()
+
+ # restore the GUI geometry
+ self.restore_main_win_geom()
+
+ # set FlatCAM units in the Status bar
+ self.set_screen_units(self.defaults['units'])
+
+ # #############################################################################
+ # ######################## UPDATE PREFERENCES GUI FORMS #######################
+ # #############################################################################
+
+ # 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)
+ self.defaults_form_fields = {
+ # General App
+ "units": self.ui.general_defaults_form.general_app_group.units_radio,
+ "global_graphic_engine": self.ui.general_defaults_form.general_app_group.ge_radio,
+ "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio,
+ "global_portable": self.ui.general_defaults_form.general_app_group.portability_cb,
+ "global_language": self.ui.general_defaults_form.general_app_group.language_cb,
+
+ "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb,
+ "global_send_stats": self.ui.general_defaults_form.general_app_group.send_stats_cb,
+ "global_pan_button": self.ui.general_defaults_form.general_app_group.pan_button_radio,
+ "global_mselect_key": self.ui.general_defaults_form.general_app_group.mselect_radio,
+
+ "global_worker_number": self.ui.general_defaults_form.general_app_group.worker_number_sb,
+ "global_tolerance": self.ui.general_defaults_form.general_app_group.tol_entry,
+
+ "global_open_style": self.ui.general_defaults_form.general_app_group.open_style_cb,
+
+ "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_spinner,
+ "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb,
+
+ "global_bookmarks_limit": self.ui.general_defaults_form.general_app_group.bm_limit_spinner,
+
+ # General GUI Preferences
+ "global_gridx": self.ui.general_defaults_form.general_gui_group.gridx_entry,
+ "global_gridy": self.ui.general_defaults_form.general_gui_group.gridy_entry,
+ "global_snap_max": self.ui.general_defaults_form.general_gui_group.snap_max_dist_entry,
+ "global_workspace": self.ui.general_defaults_form.general_gui_group.workspace_cb,
+ "global_workspaceT": self.ui.general_defaults_form.general_gui_group.wk_cb,
+
+ "global_plot_fill": self.ui.general_defaults_form.general_gui_group.pf_color_entry,
+ "global_plot_line": self.ui.general_defaults_form.general_gui_group.pl_color_entry,
+ "global_sel_fill": self.ui.general_defaults_form.general_gui_group.sf_color_entry,
+ "global_sel_line": self.ui.general_defaults_form.general_gui_group.sl_color_entry,
+ "global_alt_sel_fill": self.ui.general_defaults_form.general_gui_group.alt_sf_color_entry,
+ "global_alt_sel_line": self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry,
+ "global_draw_color": self.ui.general_defaults_form.general_gui_group.draw_color_entry,
+ "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry,
+
+ "global_proj_item_color": self.ui.general_defaults_form.general_gui_group.proj_color_entry,
+ "global_proj_item_dis_color": self.ui.general_defaults_form.general_gui_group.proj_color_dis_entry,
+ "global_activity_icon": self.ui.general_defaults_form.general_gui_group.activity_combo,
+
+ # General GUI Settings
+ "global_theme": self.ui.general_defaults_form.general_gui_set_group.theme_radio,
+ "global_layout": self.ui.general_defaults_form.general_gui_set_group.layout_combo,
+ "global_hover": self.ui.general_defaults_form.general_gui_set_group.hover_cb,
+ "global_selection_shape": self.ui.general_defaults_form.general_gui_set_group.selection_cb,
+ "global_systray_icon": self.ui.general_defaults_form.general_gui_set_group.systray_cb,
+ "global_shell_at_startup": self.ui.general_defaults_form.general_gui_set_group.shell_startup_cb,
+ "global_project_at_startup": self.ui.general_defaults_form.general_gui_set_group.project_startup_cb,
+ "global_project_autohide": self.ui.general_defaults_form.general_gui_set_group.project_autohide_cb,
+ "global_toggle_tooltips": self.ui.general_defaults_form.general_gui_set_group.toggle_tooltips_cb,
+ "global_delete_confirmation": self.ui.general_defaults_form.general_gui_set_group.delete_conf_cb,
+ "global_cursor_type": self.ui.general_defaults_form.general_gui_set_group.cursor_radio,
+ "global_cursor_size": self.ui.general_defaults_form.general_gui_set_group.cursor_size_entry,
+
+ # Gerber General
+ "gerber_plot": self.ui.gerber_defaults_form.gerber_gen_group.plot_cb,
+ "gerber_solid": self.ui.gerber_defaults_form.gerber_gen_group.solid_cb,
+ "gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
+ "gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
+ "gerber_def_units": self.ui.gerber_defaults_form.gerber_gen_group.gerber_units_radio,
+ "gerber_def_zeros": self.ui.gerber_defaults_form.gerber_gen_group.gerber_zeros_radio,
+
+ # Gerber Options
+ "gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry,
+ "gerber_isopasses": self.ui.gerber_defaults_form.gerber_opt_group.iso_width_entry,
+ "gerber_isooverlap": self.ui.gerber_defaults_form.gerber_opt_group.iso_overlap_entry,
+ "gerber_combine_passes": self.ui.gerber_defaults_form.gerber_opt_group.combine_passes_cb,
+ "gerber_milling_type": self.ui.gerber_defaults_form.gerber_opt_group.milling_type_radio,
+ "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry,
+ "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb,
+ "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry,
+ "gerber_bboxrounded": self.ui.gerber_defaults_form.gerber_opt_group.bbrounded_cb,
+
+ # Gerber Advanced Options
+ "gerber_aperture_display": self.ui.gerber_defaults_form.gerber_adv_opt_group.aperture_table_visibility_cb,
+ # "gerber_aperture_scale_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.scale_aperture_entry,
+ # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry,
+ "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb,
+ "gerber_tool_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.tool_type_radio,
+ "gerber_vtipdia": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipdia_spinner,
+ "gerber_vtipangle": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipangle_spinner,
+ "gerber_vcutz": self.ui.gerber_defaults_form.gerber_adv_opt_group.cutz_spinner,
+
+ "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio,
+ "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb,
+ "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner,
+
+ # Gerber Export
+ "gerber_exp_units": self.ui.gerber_defaults_form.gerber_exp_group.gerber_units_radio,
+ "gerber_exp_integer": self.ui.gerber_defaults_form.gerber_exp_group.format_whole_entry,
+ "gerber_exp_decimals": self.ui.gerber_defaults_form.gerber_exp_group.format_dec_entry,
+ "gerber_exp_zeros": self.ui.gerber_defaults_form.gerber_exp_group.zeros_radio,
+
+ # Gerber Editor
+ "gerber_editor_sel_limit": self.ui.gerber_defaults_form.gerber_editor_group.sel_limit_entry,
+ "gerber_editor_newcode": self.ui.gerber_defaults_form.gerber_editor_group.addcode_entry,
+ "gerber_editor_newsize": self.ui.gerber_defaults_form.gerber_editor_group.addsize_entry,
+ "gerber_editor_newtype": self.ui.gerber_defaults_form.gerber_editor_group.addtype_combo,
+ "gerber_editor_newdim": self.ui.gerber_defaults_form.gerber_editor_group.adddim_entry,
+ "gerber_editor_array_size": self.ui.gerber_defaults_form.gerber_editor_group.grb_array_size_entry,
+ "gerber_editor_lin_axis": self.ui.gerber_defaults_form.gerber_editor_group.grb_axis_radio,
+ "gerber_editor_lin_pitch": self.ui.gerber_defaults_form.gerber_editor_group.grb_pitch_entry,
+ "gerber_editor_lin_angle": self.ui.gerber_defaults_form.gerber_editor_group.grb_angle_entry,
+ "gerber_editor_circ_dir": self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_dir_radio,
+ "gerber_editor_circ_angle":
+ self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_angle_entry,
+ "gerber_editor_scale_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_scale_entry,
+ "gerber_editor_buff_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_buff_entry,
+ "gerber_editor_ma_low": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_low_entry,
+ "gerber_editor_ma_high": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_high_entry,
+
+ # Excellon General
+ "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb,
+ "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb,
+ "excellon_format_upper_in":
+ self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry,
+ "excellon_format_lower_in":
+ self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry,
+ "excellon_format_upper_mm":
+ self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry,
+ "excellon_format_lower_mm":
+ self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry,
+ "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio,
+ "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio,
+ "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb,
+ "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio,
+ "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry,
+
+ # Excellon Options
+ "excellon_drillz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry,
+ "excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry,
+ "excellon_endz": self.ui.excellon_defaults_form.excellon_opt_group.eendz_entry,
+ "excellon_feedrate": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_entry,
+ "excellon_spindlespeed": self.ui.excellon_defaults_form.excellon_opt_group.spindlespeed_entry,
+ "excellon_dwell": self.ui.excellon_defaults_form.excellon_opt_group.dwell_cb,
+ "excellon_dwelltime": self.ui.excellon_defaults_form.excellon_opt_group.dwelltime_entry,
+ "excellon_toolchange": self.ui.excellon_defaults_form.excellon_opt_group.toolchange_cb,
+ "excellon_toolchangez": self.ui.excellon_defaults_form.excellon_opt_group.toolchangez_entry,
+ "excellon_ppname_e": self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb,
+ "excellon_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.tooldia_entry,
+ "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry,
+ "excellon_gcode_type": self.ui.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio,
+
+ # Excellon Advanced Options
+ "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry,
+ "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry,
+ "excellon_startz": self.ui.excellon_defaults_form.excellon_adv_opt_group.estartz_entry,
+ "excellon_feedrate_rapid": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_rapid_entry,
+ "excellon_z_pdepth": self.ui.excellon_defaults_form.excellon_adv_opt_group.pdepth_entry,
+ "excellon_feedrate_probe": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_probe_entry,
+ "excellon_spindledir": self.ui.excellon_defaults_form.excellon_adv_opt_group.spindledir_radio,
+ "excellon_f_plunge": self.ui.excellon_defaults_form.excellon_adv_opt_group.fplunge_cb,
+ "excellon_f_retract": self.ui.excellon_defaults_form.excellon_adv_opt_group.fretract_cb,
+
+ # Excellon Export
+ "excellon_exp_units": self.ui.excellon_defaults_form.excellon_exp_group.excellon_units_radio,
+ "excellon_exp_format": self.ui.excellon_defaults_form.excellon_exp_group.format_radio,
+ "excellon_exp_integer": self.ui.excellon_defaults_form.excellon_exp_group.format_whole_entry,
+ "excellon_exp_decimals": self.ui.excellon_defaults_form.excellon_exp_group.format_dec_entry,
+ "excellon_exp_zeros": self.ui.excellon_defaults_form.excellon_exp_group.zeros_radio,
+ "excellon_exp_slot_type": self.ui.excellon_defaults_form.excellon_exp_group.slot_type_radio,
+
+ # Excellon Editor
+ "excellon_editor_sel_limit": self.ui.excellon_defaults_form.excellon_editor_group.sel_limit_entry,
+ "excellon_editor_newdia": self.ui.excellon_defaults_form.excellon_editor_group.addtool_entry,
+ "excellon_editor_array_size": self.ui.excellon_defaults_form.excellon_editor_group.drill_array_size_entry,
+ "excellon_editor_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_axis_radio,
+ "excellon_editor_lin_pitch": self.ui.excellon_defaults_form.excellon_editor_group.drill_pitch_entry,
+ "excellon_editor_lin_angle": self.ui.excellon_defaults_form.excellon_editor_group.drill_angle_entry,
+ "excellon_editor_circ_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_dir_radio,
+ "excellon_editor_circ_angle":
+ self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_angle_entry,
+ # Excellon Slots
+ "excellon_editor_slot_direction":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_axis_radio,
+ "excellon_editor_slot_angle":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_angle_spinner,
+ "excellon_editor_slot_length":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_length_entry,
+ # Excellon Slots
+ "excellon_editor_slot_array_size":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_array_size_entry,
+ "excellon_editor_slot_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.slot_array_axis_radio,
+ "excellon_editor_slot_lin_pitch":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_array_pitch_entry,
+ "excellon_editor_slot_lin_angle":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_array_angle_entry,
+ "excellon_editor_slot_circ_dir":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_dir_radio,
+ "excellon_editor_slot_circ_angle":
+ self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
+
+ # Geometry General
+ "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb,
+ "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry,
+ "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry,
+
+ # Geometry Options
+ "geometry_cutz": self.ui.geometry_defaults_form.geometry_opt_group.cutz_entry,
+ "geometry_travelz": self.ui.geometry_defaults_form.geometry_opt_group.travelz_entry,
+ "geometry_feedrate": self.ui.geometry_defaults_form.geometry_opt_group.cncfeedrate_entry,
+ "geometry_feedrate_z": self.ui.geometry_defaults_form.geometry_opt_group.cncplunge_entry,
+ "geometry_spindlespeed": self.ui.geometry_defaults_form.geometry_opt_group.cncspindlespeed_entry,
+ "geometry_dwell": self.ui.geometry_defaults_form.geometry_opt_group.dwell_cb,
+ "geometry_dwelltime": self.ui.geometry_defaults_form.geometry_opt_group.dwelltime_entry,
+ "geometry_ppname_g": self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb,
+ "geometry_toolchange": self.ui.geometry_defaults_form.geometry_opt_group.toolchange_cb,
+ "geometry_toolchangez": self.ui.geometry_defaults_form.geometry_opt_group.toolchangez_entry,
+ "geometry_endz": self.ui.geometry_defaults_form.geometry_opt_group.gendz_entry,
+ "geometry_depthperpass": self.ui.geometry_defaults_form.geometry_opt_group.depthperpass_entry,
+ "geometry_multidepth": self.ui.geometry_defaults_form.geometry_opt_group.multidepth_cb,
+
+ # Geometry Advanced Options
+ "geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_adv_opt_group.toolchangexy_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_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
+ "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_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,
+ "geometry_f_plunge": self.ui.geometry_defaults_form.geometry_adv_opt_group.fplunge_cb,
+ "geometry_segx": self.ui.geometry_defaults_form.geometry_adv_opt_group.segx_entry,
+ "geometry_segy": self.ui.geometry_defaults_form.geometry_adv_opt_group.segy_entry,
+
+ # Geometry Editor
+ "geometry_editor_sel_limit": self.ui.geometry_defaults_form.geometry_editor_group.sel_limit_entry,
+ "geometry_editor_milling_type": self.ui.geometry_defaults_form.geometry_editor_group.milling_type_radio,
+
+ # CNCJob General
+ "cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb,
+ "cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_gen_group.cncplot_method_radio,
+ "cncjob_annotation": self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_cb,
+
+ "cncjob_tooldia": self.ui.cncjob_defaults_form.cncjob_gen_group.tooldia_entry,
+ "cncjob_coords_type": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_type_radio,
+ "cncjob_coords_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_dec_entry,
+ "cncjob_fr_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.fr_dec_entry,
+ "cncjob_steps_per_circle": self.ui.cncjob_defaults_form.cncjob_gen_group.steps_per_circle_entry,
+
+ # CNC Job Options
+ "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_opt_group.prepend_text,
+ "cncjob_append": self.ui.cncjob_defaults_form.cncjob_opt_group.append_text,
+
+ # CNC Job Advanced Options
+ "cncjob_toolchange_macro": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_text,
+ "cncjob_toolchange_macro_enable": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_cb,
+ "cncjob_annotation_fontsize": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontsize_sp,
+ "cncjob_annotation_fontcolor": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry,
+
+ # NCC Tool
+ "tools_ncctools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry,
+ "tools_nccorder": self.ui.tools_defaults_form.tools_ncc_group.ncc_order_radio,
+ "tools_nccoverlap": self.ui.tools_defaults_form.tools_ncc_group.ncc_overlap_entry,
+ "tools_nccmargin": self.ui.tools_defaults_form.tools_ncc_group.ncc_margin_entry,
+ "tools_nccmethod": self.ui.tools_defaults_form.tools_ncc_group.ncc_method_radio,
+ "tools_nccconnect": self.ui.tools_defaults_form.tools_ncc_group.ncc_connect_cb,
+ "tools_ncccontour": self.ui.tools_defaults_form.tools_ncc_group.ncc_contour_cb,
+ "tools_nccrest": self.ui.tools_defaults_form.tools_ncc_group.ncc_rest_cb,
+ "tools_ncc_offset_choice": self.ui.tools_defaults_form.tools_ncc_group.ncc_choice_offset_cb,
+ "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner,
+ "tools_nccref": self.ui.tools_defaults_form.tools_ncc_group.reference_radio,
+ "tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio,
+ "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio,
+ "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio,
+ "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry,
+ "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry,
+ "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry,
+ "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry,
+
+ # CutOut Tool
+ "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry,
+ "tools_cutoutkind": self.ui.tools_defaults_form.tools_cutout_group.obj_kind_combo,
+ "tools_cutoutmargin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry,
+ "tools_cutoutgapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry,
+ "tools_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo,
+ "tools_cutout_convexshape": self.ui.tools_defaults_form.tools_cutout_group.convex_box,
+
+ # Paint Area Tool
+ "tools_painttooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry,
+ "tools_paintorder": self.ui.tools_defaults_form.tools_paint_group.paint_order_radio,
+ "tools_paintoverlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry,
+ "tools_paintmargin": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry,
+ "tools_paintmethod": self.ui.tools_defaults_form.tools_paint_group.paintmethod_combo,
+ "tools_selectmethod": self.ui.tools_defaults_form.tools_paint_group.selectmethod_combo,
+ "tools_pathconnect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb,
+ "tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
+ "tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
+
+ # 2-sided Tool
+ "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
+ "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
+ "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry,
+
+ # Film Tool
+ "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio,
+ "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry,
+ "tools_film_scale_stroke": self.ui.tools_defaults_form.tools_film_group.film_scale_stroke_entry,
+ "tools_film_color": self.ui.tools_defaults_form.tools_film_group.film_color_entry,
+ "tools_film_scale_cb": self.ui.tools_defaults_form.tools_film_group.film_scale_cb,
+ "tools_film_scale_x_entry": self.ui.tools_defaults_form.tools_film_group.film_scalex_entry,
+ "tools_film_scale_y_entry": self.ui.tools_defaults_form.tools_film_group.film_scaley_entry,
+ "tools_film_skew_cb": self.ui.tools_defaults_form.tools_film_group.film_skew_cb,
+ "tools_film_skew_x_entry": self.ui.tools_defaults_form.tools_film_group.film_skewx_entry,
+ "tools_film_skew_y_entry": self.ui.tools_defaults_form.tools_film_group.film_skewy_entry,
+ "tools_film_skew_ref_radio": self.ui.tools_defaults_form.tools_film_group.film_skew_reference,
+ "tools_film_mirror_cb": self.ui.tools_defaults_form.tools_film_group.film_mirror_cb,
+ "tools_film_mirror_axis_radio": self.ui.tools_defaults_form.tools_film_group.film_mirror_axis,
+
+ # Panelize Tool
+ "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns,
+ "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows,
+ "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns,
+ "tools_panelize_rows": self.ui.tools_defaults_form.tools_panelize_group.prows,
+ "tools_panelize_constrain": self.ui.tools_defaults_form.tools_panelize_group.pconstrain_cb,
+ "tools_panelize_constrainx": self.ui.tools_defaults_form.tools_panelize_group.px_width_entry,
+ "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry,
+ "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio,
+
+ # Calculators Tool
+ "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry,
+ "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry,
+ "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry,
+ "tools_calc_electro_length": self.ui.tools_defaults_form.tools_calculators_group.pcblength_entry,
+ "tools_calc_electro_width": self.ui.tools_defaults_form.tools_calculators_group.pcbwidth_entry,
+ "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry,
+ "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry,
+
+ # Transformations Tool
+ "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry,
+ "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry,
+ "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry,
+ "tools_transform_scale_x": self.ui.tools_defaults_form.tools_transform_group.scalex_entry,
+ "tools_transform_scale_y": self.ui.tools_defaults_form.tools_transform_group.scaley_entry,
+ "tools_transform_scale_link": self.ui.tools_defaults_form.tools_transform_group.link_cb,
+ "tools_transform_scale_reference": self.ui.tools_defaults_form.tools_transform_group.reference_cb,
+ "tools_transform_offset_x": self.ui.tools_defaults_form.tools_transform_group.offx_entry,
+ "tools_transform_offset_y": self.ui.tools_defaults_form.tools_transform_group.offy_entry,
+ "tools_transform_mirror_reference": self.ui.tools_defaults_form.tools_transform_group.mirror_reference_cb,
+ "tools_transform_mirror_point": self.ui.tools_defaults_form.tools_transform_group.flip_ref_entry,
+
+ # SolderPaste Dispensing Tool
+ "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry,
+ "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry,
+ "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry,
+ "tools_solderpaste_z_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.z_dispense_entry,
+ "tools_solderpaste_z_stop": self.ui.tools_defaults_form.tools_solderpaste_group.z_stop_entry,
+ "tools_solderpaste_z_travel": self.ui.tools_defaults_form.tools_solderpaste_group.z_travel_entry,
+ "tools_solderpaste_z_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.z_toolchange_entry,
+ "tools_solderpaste_xy_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.xy_toolchange_entry,
+ "tools_solderpaste_frxy": self.ui.tools_defaults_form.tools_solderpaste_group.frxy_entry,
+ "tools_solderpaste_frz": self.ui.tools_defaults_form.tools_solderpaste_group.frz_entry,
+ "tools_solderpaste_frz_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.frz_dispense_entry,
+ "tools_solderpaste_speedfwd": self.ui.tools_defaults_form.tools_solderpaste_group.speedfwd_entry,
+ "tools_solderpaste_dwellfwd": self.ui.tools_defaults_form.tools_solderpaste_group.dwellfwd_entry,
+ "tools_solderpaste_speedrev": self.ui.tools_defaults_form.tools_solderpaste_group.speedrev_entry,
+ "tools_solderpaste_dwellrev": self.ui.tools_defaults_form.tools_solderpaste_group.dwellrev_entry,
+ "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
+ "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
+
+ # ###################################################################################
+ # ################################ TOOLS 2 ##########################################
+ # ###################################################################################
+
+ # Optimal Tool
+ "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
+
+ # Check Rules Tool
+ "tools_cr_trace_size": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_cb,
+ "tools_cr_trace_size_val": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_entry,
+ "tools_cr_c2c": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_cb,
+ "tools_cr_c2c_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_entry,
+ "tools_cr_c2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_cb,
+ "tools_cr_c2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_entry,
+ "tools_cr_s2s": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_cb,
+ "tools_cr_s2s_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_entry,
+ "tools_cr_s2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_cb,
+ "tools_cr_s2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_entry,
+ "tools_cr_s2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_cb,
+ "tools_cr_s2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_entry,
+ "tools_cr_sm2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_cb,
+ "tools_cr_sm2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_entry,
+ "tools_cr_ri": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_cb,
+ "tools_cr_ri_val": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_entry,
+ "tools_cr_h2h": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_cb,
+ "tools_cr_h2h_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_entry,
+ "tools_cr_dh": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_cb,
+ "tools_cr_dh_val": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_entry,
+
+ # QRCode Tool
+ "tools_qrcode_version": self.ui.tools2_defaults_form.tools2_qrcode_group.version_entry,
+ "tools_qrcode_error": self.ui.tools2_defaults_form.tools2_qrcode_group.error_radio,
+ "tools_qrcode_box_size": self.ui.tools2_defaults_form.tools2_qrcode_group.bsize_entry,
+ "tools_qrcode_border_size": self.ui.tools2_defaults_form.tools2_qrcode_group.border_size_entry,
+ "tools_qrcode_qrdata": self.ui.tools2_defaults_form.tools2_qrcode_group.text_data,
+ "tools_qrcode_polarity": self.ui.tools2_defaults_form.tools2_qrcode_group.pol_radio,
+ "tools_qrcode_rounded": self.ui.tools2_defaults_form.tools2_qrcode_group.bb_radio,
+ "tools_qrcode_fill_color": self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry,
+ "tools_qrcode_back_color": self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry,
+ "tools_qrcode_sel_limit": self.ui.tools2_defaults_form.tools2_qrcode_group.sel_limit_entry,
+
+ # Copper Fill Tool
+ "tools_copperfill_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
+ "tools_copperfill_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
+ "tools_copperfill_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
+ "tools_copperfill_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
+ "tools_copperfill_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
+
+ # Utilities
+ # File associations
+ "fa_excellon": self.ui.util_defaults_form.fa_excellon_group.exc_list_text,
+ "fa_gcode": self.ui.util_defaults_form.fa_gcode_group.gco_list_text,
+ # "fa_geometry": self.ui.util_defaults_form.fa_geometry_group.close_paths_cb,
+ "fa_gerber": self.ui.util_defaults_form.fa_gerber_group.grb_list_text,
+ "util_autocomplete_keywords": self.ui.util_defaults_form.kw_group.kw_list_text,
+
+ }
+
+ # update the Preferences GUI elements with the values in the self.defaults
+ self.defaults_write_form()
+
+ # When the self.defaults dictionary changes will update the Preferences GUI forms
+ self.defaults.set_change_callback(self.on_defaults_dict_change)
+
+ # #############################################################################
+ # ############################## Data #########################################
+ # #############################################################################
+
+ self.recent = []
+ self.recent_projects = []
+
+ self.clipboard = QtWidgets.QApplication.clipboard()
+
+ self.project_filename = None
+ self.toggle_units_ignore = False
+
+ # #############################################################################
+ # ########################## LOAD POSTPROCESSORS ##############################
+ # #############################################################################
+
+ self.postprocessors = load_postprocessors(self)
+
+ for name in list(self.postprocessors.keys()):
+ # 'Paste' postprocessors are to be used only in the Solder Paste Dispensing Tool
+ if name.partition('_')[0] == 'Paste':
+ self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo.addItem(name)
+ continue
+
+ self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb.addItem(name)
+ # HPGL postprocessor is only for Geometry objects therefore it should not be in the Excellon Preferences
+ if name == 'hpgl':
+ continue
+
+ self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
+
+ # #############################################################################
+ # ########################## LOAD LANGUAGES ##################################
+ # #############################################################################
+
+ self.languages = fcTranslate.load_languages()
+ for name in sorted(self.languages.values()):
+ self.ui.general_defaults_form.general_app_group.language_cb.addItem(name)
+
+ # #############################################################################
+ # ############################ APPLY APP LANGUAGE #############################
+ # #############################################################################
ret_val = fcTranslate.apply_language('strings')
@@ -1406,9 +1424,9 @@ class App(QtCore.QObject):
self.ui.general_defaults_form.general_app_group.language_cb.setCurrentText(ret_val)
log.debug("App.__init__() --> Applied %s language." % str(ret_val).capitalize())
- # ##############################################################
- # ################# CREATE UNIQUE SERIAL NUMBER ################
- # ##############################################################
+ # #############################################################################
+ # ########################### CREATE UNIQUE SERIAL NUMBER #####################
+ # #############################################################################
chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
if self.defaults['global_serial'] == 0 or len(str(self.defaults['global_serial'])) < 10:
@@ -1416,7 +1434,6 @@ class App(QtCore.QObject):
self.save_defaults(silent=True, first_time=True)
self.propagate_defaults(silent=True)
- self.restore_main_win_geom()
# def auto_save_defaults():
# try:
@@ -1452,9 +1469,9 @@ class App(QtCore.QObject):
# ### End of Data ####
- # ##############################################
- # ######### SETUP OBJECT COLLECTION ############
- # ##############################################
+ # #############################################################################
+ # ######################## SETUP OBJECT COLLECTION ############################
+ # #############################################################################
self.collection = ObjectCollection(self)
self.ui.project_tab_layout.addWidget(self.collection.view)
@@ -1465,9 +1482,9 @@ class App(QtCore.QObject):
self.collection.view.setMinimumWidth(290)
self.log.debug("Finished creating Object Collection.")
- # ###############################################
- # ############# SETUP Plot Area #################
- # ###############################################
+ # #############################################################################
+ # ############################## SETUP Plot Area ##############################
+ # #############################################################################
# determine if the Legacy Graphic Engine is to be used or the OpenGL one
if self.defaults["global_graphic_engine"] == '3D':
@@ -1504,9 +1521,9 @@ class App(QtCore.QObject):
color=QtGui.QColor("gray"))
self.ui.splitter.setStretchFactor(1, 2)
- # #################################################################
- # ####################### SYS TRAY ################################
- # #################################################################
+ # #############################################################################
+ # ################################### SYS TRAY ################################
+ # #############################################################################
if self.defaults["global_systray_icon"]:
self.parent_w = QtWidgets.QWidget()
@@ -1518,9 +1535,9 @@ class App(QtCore.QObject):
self.trayIcon = FlatCAMSystemTray(app=self, icon=QtGui.QIcon('share/flatcam_icon32_green.png'),
parent=self.parent_w)
- # #################################################################
- # ####################### Worker SETUP ############################
- # #################################################################
+ # #############################################################################
+ # ################################## Worker SETUP #############################
+ # #############################################################################
if self.defaults["global_worker_number"]:
self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
else:
@@ -1528,18 +1545,18 @@ class App(QtCore.QObject):
self.worker_task.connect(self.workers.add_task)
self.log.debug("Finished creating Workers crew.")
- # #################################################################
- # ######################## Activity Monitor #######################
- # #################################################################
+ # #############################################################################
+ # ################################# Activity Monitor ##########################
+ # #############################################################################
self.activity_view = FlatCAMActivityView(app=self)
self.ui.infobar.addWidget(self.activity_view)
self.proc_container = FCVisibleProcessContainer(self.activity_view)
- # #################################################################
- # ######################### Signal handling #######################
- # #################################################################
+ # #############################################################################
+ # ################################## Signal handling ##########################
+ # #############################################################################
- # ########################### Custom signals #####################
+ # ################################# Custom signals ###########################
# signal for displaying messages in status bar
self.inform.connect(self.info)
# signal to be called when the app is quiting
@@ -1718,9 +1735,9 @@ class App(QtCore.QObject):
self.ui.pref_export_button.clicked.connect(self.on_export_preferences)
self.ui.pref_open_button.clicked.connect(self.on_preferences_open_folder)
- # ##############################
- # ### GUI PREFERENCES SIGNALS ##
- # ##############################
+ # #############################################################################
+ # ######################### GUI PREFERENCES SIGNALS ###########################
+ # #############################################################################
self.ui.general_defaults_form.general_app_group.ge_radio.activated_custom.connect(self.on_app_restart)
self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(
@@ -1729,9 +1746,9 @@ class App(QtCore.QObject):
self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
lambda: self.on_toggle_units(no_pref=False))
- # ###############################################################
- # ################### GUI COLORS SIGNALS ########################
- # ###############################################################
+ # #############################################################################
+ # ############################# GUI COLORS SIGNALS ############################
+ # #############################################################################
# Setting plot colors signals
self.ui.general_defaults_form.general_gui_group.pf_color_entry.editingFinished.connect(
@@ -1793,15 +1810,15 @@ class App(QtCore.QObject):
self.ui.general_defaults_form.general_gui_group.proj_color_dis_button.clicked.connect(
self.on_proj_color_dis_button)
- # ########## workspace setting signals ###########
+ # ############################# workspace setting signals #####################
self.ui.general_defaults_form.general_gui_group.wk_cb.currentIndexChanged.connect(self.on_workspace_modified)
self.ui.general_defaults_form.general_gui_group.workspace_cb.stateChanged.connect(self.on_workspace)
self.ui.general_defaults_form.general_gui_set_group.layout_combo.activated.connect(self.on_layout)
- # #################################################
- # ############ GUI SETTINGS SIGNALS ###############
- # #################################################
+ # #############################################################################
+ # ############################# GUI SETTINGS SIGNALS ##########################
+ # #############################################################################
self.ui.general_defaults_form.general_gui_set_group.theme_radio.activated_custom.connect(self.on_theme_change)
self.ui.general_defaults_form.general_gui_set_group.cursor_radio.activated_custom.connect(self.on_cursor_type)
@@ -1858,9 +1875,9 @@ class App(QtCore.QObject):
# when there are arguments at application startup this get launched
self.args_at_startup[list].connect(self.on_startup_args)
- # ##############################################################
- # ############### FILE ASSOCIATIONS SIGNALS ####################
- # ##############################################################
+ # #############################################################################
+ # ########################## FILE ASSOCIATIONS SIGNALS ########################
+ # #############################################################################
self.ui.util_defaults_form.fa_excellon_group.restore_btn.clicked.connect(
lambda: self.restore_extensions(ext_type='excellon'))
@@ -1898,9 +1915,9 @@ class App(QtCore.QObject):
self.ui.util_defaults_form.fa_gerber_group.grb_list_btn.clicked.connect(
lambda: self.on_register_files(obj_type='gerber'))
- # ##############################################################
- # ###################### KEYWORDS SIGNALS ######################
- # ##############################################################
+ # #############################################################################
+ # ################################ KEYWORDS SIGNALS ###########################
+ # #############################################################################
self.ui.util_defaults_form.kw_group.restore_btn.clicked.connect(
lambda: self.restore_extensions(ext_type='keyword'))
self.ui.util_defaults_form.kw_group.del_all_btn.clicked.connect(
@@ -3566,15 +3583,11 @@ class App(QtCore.QObject):
self.defaults["global_toolbar_view"] = 511
e = sys.exc_info()[0]
App.log.error(str(e))
- self.inform.emit('[ERROR] %s' %
- _("Failed to parse defaults file."))
+ self.inform.emit('[ERROR] %s' % _("Failed to parse defaults file."))
return
self.defaults.update(defaults)
log.debug("FlatCAM defaults loaded from: %s" % filename)
- # restore the toolbar view
- self.restore_toolbar_view()
-
def on_import_preferences(self):
"""
Loads the aplication's factory default settings from factory_defaults.FlatConfig into
@@ -5529,6 +5542,8 @@ class App(QtCore.QObject):
scale_defaults(factor)
self.defaults_write_form(fl_units=new_units)
+ self.defaults["units"] = new_units
+
# save the defaults to file, some may assume that the conversion is enough and it's not
self.on_save_button()
@@ -5587,6 +5602,7 @@ class App(QtCore.QObject):
self.ui.general_defaults_form.general_app_group.units_radio.set_value("IN")
else:
self.ui.general_defaults_form.general_app_group.units_radio.set_value("MM")
+
self.on_toggle_units(no_pref=True)
self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
diff --git a/FlatCAMObj.py b/FlatCAMObj.py
index 0782c01e..f8c63c48 100644
--- a/FlatCAMObj.py
+++ b/FlatCAMObj.py
@@ -3306,104 +3306,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
optionChanged = QtCore.pyqtSignal(str)
ui_type = GeometryObjectUI
- def merge(self, geo_list, geo_final, multigeo=None):
- """
- Merges the geometry of objects in grb_list into
- the geometry of geo_final.
-
- :param geo_list: List of FlatCAMGerber Objects to join.
- :param geo_final: Destination FlatCAMGerber object.
- :return: None
- """
-
- if geo_final.solid_geometry is None:
- geo_final.solid_geometry = []
-
- if type(geo_final.solid_geometry) is not list:
- geo_final.solid_geometry = [geo_final.solid_geometry]
-
- for geo in geo_list:
- for option in geo.options:
- if option is not 'name':
- try:
- geo_final.options[option] = geo.options[option]
- except Exception as e:
- log.warning("Failed to copy option %s. Error: %s" % (str(option), str(e)))
-
- # Expand lists
- if type(geo) is list:
- FlatCAMGeometry.merge(self, geo_list=geo, geo_final=geo_final)
- # If not list, just append
- else:
- # merge solid_geometry, useful for singletool geometry, for multitool each is empty
- if multigeo is None or multigeo is False:
- geo_final.multigeo = False
- try:
- geo_final.solid_geometry.append(geo.solid_geometry)
- except Exception as e:
- log.debug("FlatCAMGeometry.merge() --> %s" % str(e))
- else:
- geo_final.multigeo = True
- # if multigeo the solid_geometry is empty in the object attributes because it now lives in the
- # tools object attribute, as a key value
- geo_final.solid_geometry = []
-
- # find the tool_uid maximum value in the geo_final
- geo_final_uid_list = []
- for key in geo_final.tools:
- geo_final_uid_list.append(int(key))
-
- try:
- max_uid = max(geo_final_uid_list, key=int)
- except ValueError:
- max_uid = 0
-
- # add and merge tools. If what we try to merge as Geometry is Excellon's and/or Gerber's then don't try
- # to merge the obj.tools as it is likely there is none to merge.
- if not isinstance(geo, FlatCAMGerber) and not isinstance(geo, FlatCAMExcellon):
- for tool_uid in geo.tools:
- max_uid += 1
- geo_final.tools[max_uid] = deepcopy(geo.tools[tool_uid])
-
- @staticmethod
- def get_pts(o):
- """
- Returns a list of all points in the object, where
- the object can be a MultiPolygon, Polygon, Not a polygon, or a list
- of such. Search is done recursively.
-
- :param: geometric object
- :return: List of points
- :rtype: list
- """
- pts = []
-
- # Iterable: descend into each item.
- try:
- for subo in o:
- pts += FlatCAMGeometry.get_pts(subo)
-
- # Non-iterable
- except TypeError:
- if o is not None:
- if type(o) == MultiPolygon:
- for poly in o:
- pts += FlatCAMGeometry.get_pts(poly)
- # ## Descend into .exerior and .interiors
- elif type(o) == Polygon:
- pts += FlatCAMGeometry.get_pts(o.exterior)
- for i in o.interiors:
- pts += FlatCAMGeometry.get_pts(i)
- elif type(o) == MultiLineString:
- for line in o:
- pts += FlatCAMGeometry.get_pts(line)
- # ## Has .coords: list them.
- else:
- pts += list(o.coords)
- else:
- return
- return pts
-
def __init__(self, name):
FlatCAMObj.__init__(self, name)
Geometry.__init__(self, geo_steps_per_circle=int(self.app.defaults["geometry_circle_steps"]))
@@ -3477,7 +3379,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
# flag to store if the geometry is part of a special group of geometries that can't be processed by the default
# engine of FlatCAM. Most likely are generated by some of tools and are special cases of geometries.
- self. special_group = None
+ self.special_group = None
self.old_pp_state = self.app.defaults["geometry_multidepth"]
self.old_toolchangeg_state = self.app.defaults["geometry_toolchange"]
@@ -3506,9 +3408,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
tool_idx += 1
row_no = tool_idx - 1
- id = QtWidgets.QTableWidgetItem('%d' % int(tool_idx))
- id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
- self.ui.geo_tools_table.setItem(row_no, 0, id) # Tool name/id
+ tool_id = QtWidgets.QTableWidgetItem('%d' % int(tool_idx))
+ tool_id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
+ self.ui.geo_tools_table.setItem(row_no, 0, tool_id) # Tool name/id
# Make sure that the tool diameter when in MM is with no more than 2 decimals.
# There are no tool bits in MM with more than 3 decimals diameter.
@@ -3754,7 +3656,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
# again float type; dict's don't like having keys changed when iterated through therefore the need for the
# following convoluted way of changing the keys from string to float type
temp_tools = {}
- new_key = 0.0
for tooluid_key in self.tools:
val = deepcopy(self.tools[tooluid_key])
new_key = deepcopy(int(tooluid_key))
@@ -3775,6 +3676,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
return
self.ui.geo_tools_table.setupContextMenu()
+ self.ui.geo_tools_table.addContextMenu(
+ _("Add from Tool DB"), self.on_tool_add_from_db, icon=QtGui.QIcon("share/plus16.png"))
self.ui.geo_tools_table.addContextMenu(
_("Copy"), self.on_tool_copy, icon=QtGui.QIcon("share/copy16.png"))
self.ui.geo_tools_table.addContextMenu(
@@ -4076,6 +3979,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
if self.ui.geo_tools_table.rowCount() != 0:
self.ui.geo_param_frame.setDisabled(False)
+ def on_tool_add_from_db(self):
+ pass
+
def on_tool_copy(self, all=None):
self.ui_disconnect()
@@ -4670,16 +4576,16 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
# test to see if we have tools available in the tool table
if self.ui.geo_tools_table.selectedItems():
for x in self.ui.geo_tools_table.selectedItems():
- try:
- tooldia = float(self.ui.geo_tools_table.item(x.row(), 1).text())
- except ValueError:
- # try to convert comma to decimal point. if it's still not working error message and return
- try:
- tooldia = float(self.ui.geo_tools_table.item(x.row(), 1).text().replace(',', '.'))
- except ValueError:
- self.app.inform.emit('[ERROR_NOTCL] %s' %
- _("Wrong value format entered, use a number."))
- return
+ # try:
+ # tooldia = float(self.ui.geo_tools_table.item(x.row(), 1).text())
+ # except ValueError:
+ # # try to convert comma to decimal point. if it's still not working error message and return
+ # try:
+ # tooldia = float(self.ui.geo_tools_table.item(x.row(), 1).text().replace(',', '.'))
+ # except ValueError:
+ # self.app.inform.emit('[ERROR_NOTCL] %s' %
+ # _("Wrong value format entered, use a number."))
+ # return
tooluid = int(self.ui.geo_tools_table.item(x.row(), 5).text())
for tooluid_key, tooluid_value in self.tools.items():
@@ -5630,6 +5536,105 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
self.ui.plot_cb.setChecked(True)
self.ui_connect()
+ def merge(self, geo_list, geo_final, multigeo=None):
+ """
+ Merges the geometry of objects in grb_list into
+ the geometry of geo_final.
+
+ :param geo_list: List of FlatCAMGerber Objects to join.
+ :param geo_final: Destination FlatCAMGerber object.
+ :param multigeo: if the merged geometry objects are of type MultiGeo
+ :return: None
+ """
+
+ if geo_final.solid_geometry is None:
+ geo_final.solid_geometry = []
+
+ if type(geo_final.solid_geometry) is not list:
+ geo_final.solid_geometry = [geo_final.solid_geometry]
+
+ for geo in geo_list:
+ for option in geo.options:
+ if option is not 'name':
+ try:
+ geo_final.options[option] = geo.options[option]
+ except Exception as e:
+ log.warning("Failed to copy option %s. Error: %s" % (str(option), str(e)))
+
+ # Expand lists
+ if type(geo) is list:
+ FlatCAMGeometry.merge(self, geo_list=geo, geo_final=geo_final)
+ # If not list, just append
+ else:
+ # merge solid_geometry, useful for singletool geometry, for multitool each is empty
+ if multigeo is None or multigeo is False:
+ geo_final.multigeo = False
+ try:
+ geo_final.solid_geometry.append(geo.solid_geometry)
+ except Exception as e:
+ log.debug("FlatCAMGeometry.merge() --> %s" % str(e))
+ else:
+ geo_final.multigeo = True
+ # if multigeo the solid_geometry is empty in the object attributes because it now lives in the
+ # tools object attribute, as a key value
+ geo_final.solid_geometry = []
+
+ # find the tool_uid maximum value in the geo_final
+ geo_final_uid_list = []
+ for key in geo_final.tools:
+ geo_final_uid_list.append(int(key))
+
+ try:
+ max_uid = max(geo_final_uid_list, key=int)
+ except ValueError:
+ max_uid = 0
+
+ # add and merge tools. If what we try to merge as Geometry is Excellon's and/or Gerber's then don't try
+ # to merge the obj.tools as it is likely there is none to merge.
+ if not isinstance(geo, FlatCAMGerber) and not isinstance(geo, FlatCAMExcellon):
+ for tool_uid in geo.tools:
+ max_uid += 1
+ geo_final.tools[max_uid] = deepcopy(geo.tools[tool_uid])
+
+ @staticmethod
+ def get_pts(o):
+ """
+ Returns a list of all points in the object, where
+ the object can be a MultiPolygon, Polygon, Not a polygon, or a list
+ of such. Search is done recursively.
+
+ :param: geometric object
+ :return: List of points
+ :rtype: list
+ """
+ pts = []
+
+ # Iterable: descend into each item.
+ try:
+ for subo in o:
+ pts += FlatCAMGeometry.get_pts(subo)
+
+ # Non-iterable
+ except TypeError:
+ if o is not None:
+ if type(o) == MultiPolygon:
+ for poly in o:
+ pts += FlatCAMGeometry.get_pts(poly)
+ # ## Descend into .exerior and .interiors
+ elif type(o) == Polygon:
+ pts += FlatCAMGeometry.get_pts(o.exterior)
+ for i in o.interiors:
+ pts += FlatCAMGeometry.get_pts(i)
+ elif type(o) == MultiLineString:
+ for line in o:
+ pts += FlatCAMGeometry.get_pts(line)
+ # ## Has .coords: list them.
+ else:
+ pts += list(o.coords)
+ else:
+ return
+ return pts
+
class FlatCAMCNCjob(FlatCAMObj, CNCjob):
"""
diff --git a/README.md b/README.md
index b0d35700..b75fd366 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing.
- wip
- getting rid of all the Options GUI and related functions as it is no longer supported
+- updated the UI in Geometry UI
+- optimized the order of the defaults storage declaration and the update of the Preferences GUI from the defaults
3.11.2019
diff --git a/camlib.py b/camlib.py
index a777d30b..4fc10b8a 100644
--- a/camlib.py
+++ b/camlib.py
@@ -497,10 +497,6 @@ class Geometry(object):
from flatcamGUI.PlotCanvasLegacy import ShapeCollectionLegacy
self.temp_shapes = ShapeCollectionLegacy(obj=self, app=self.app, name='camlib.geometry')
- # if geo_steps_per_circle is None:
- # geo_steps_per_circle = int(Geometry.defaults["geo_steps_per_circle"])
- # self.geo_steps_per_circle = geo_steps_per_circle
-
def plot_temp_shapes(self, element, color='red'):
try:
diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py
index 4240e245..a900b314 100644
--- a/flatcamEditors/FlatCAMExcEditor.py
+++ b/flatcamEditors/FlatCAMExcEditor.py
@@ -1449,7 +1449,7 @@ class FlatCAMExcEditor(QtCore.QObject):
self.decimals = 4
# ## Current application units in Upper Case
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+ self.units = self.app.defaults['units'].upper()
self.exc_edit_widget = QtWidgets.QWidget()
# ## Box for custom widgets
diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py
index 62e37ebf..9a8360c1 100644
--- a/flatcamEditors/FlatCAMGrbEditor.py
+++ b/flatcamEditors/FlatCAMGrbEditor.py
@@ -2356,7 +2356,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.decimals = 4
# Current application units in Upper Case
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+ self.units = self.app.defaults['units'].upper()
self.grb_edit_widget = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
@@ -3023,7 +3023,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
def set_ui(self):
# updated units
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+ self.units = self.app.defaults['units'].upper()
if self.units == "IN":
self.decimals = 4
diff --git a/flatcamGUI/ObjectUI.py b/flatcamGUI/ObjectUI.py
index 2bc79b86..c04a0212 100644
--- a/flatcamGUI/ObjectUI.py
+++ b/flatcamGUI/ObjectUI.py
@@ -385,7 +385,7 @@ class GerberObjectUI(ObjectUI):
"- conventional / useful when there is no backlash compensation")
)
self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'},
- {'label': _('Conv.'), 'value': 'cv'}])
+ {'label': _('Conventional'), 'value': 'cv'}])
grid1.addWidget(self.milling_type_label, 7, 0)
grid1.addWidget(self.milling_type_radio, 7, 1, 1, 2)
@@ -934,12 +934,11 @@ class ExcellonObjectUI(ObjectUI):
grid2.setColumnStretch(0, 0)
grid2.setColumnStretch(1, 1)
- choose_tools_label = QtWidgets.QLabel(
- _("Select from the Tools Table above\n"
- "the hole dias that are to be drilled.\n"
- "Use the # column to make the selection.")
- )
- grid2.addWidget(choose_tools_label, 0, 0, 1, 3)
+ # choose_tools_label = QtWidgets.QLabel(
+ # _("Select from the Tools Table above the hole dias to be\n"
+ # "drilled. Use the # column to make the selection.")
+ # )
+ # grid2.addWidget(choose_tools_label, 0, 0, 1, 3)
# ### Choose what to use for Gcode creation: Drills, Slots or Both
gcode_type_label = QtWidgets.QLabel('%s' % _('Gcode'))
@@ -967,17 +966,12 @@ class ExcellonObjectUI(ObjectUI):
# ### Milling Holes Drills ####
self.mill_hole_label = QtWidgets.QLabel('%s' % _('Mill Holes'))
self.mill_hole_label.setToolTip(
- _("Create Geometry for milling holes.")
+ _("Create Geometry for milling holes.\n"
+ "Select from the Tools Table above the hole dias to be\n"
+ "milled. Use the # column to make the selection.")
)
grid2.addWidget(self.mill_hole_label, 3, 0, 1, 3)
- self.choose_tools_label2 = QtWidgets.QLabel(
- _("Select from the Tools Table above\n"
- "the hole dias that are to be milled.\n"
- "Use the # column to make the selection.")
- )
- grid2.addWidget(self.choose_tools_label2, 4, 0, 1, 3)
-
self.tdlabel = QtWidgets.QLabel('%s:' % _('Drill Tool dia'))
self.tdlabel.setToolTip(
_("Diameter of the cutting tool.")
@@ -993,9 +987,9 @@ class ExcellonObjectUI(ObjectUI):
"for milling DRILLS toolpaths.")
)
- grid2.addWidget(self.tdlabel, 5, 0)
- grid2.addWidget(self.tooldia_entry, 5, 1)
- grid2.addWidget(self.generate_milling_button, 5, 2)
+ grid2.addWidget(self.tdlabel, 4, 0)
+ grid2.addWidget(self.tooldia_entry, 4, 1)
+ grid2.addWidget(self.generate_milling_button, 4, 2)
self.stdlabel = QtWidgets.QLabel('%s:' % _('Slot Tool dia'))
self.stdlabel.setToolTip(
@@ -1014,9 +1008,9 @@ class ExcellonObjectUI(ObjectUI):
"for milling SLOTS toolpaths.")
)
- grid2.addWidget(self.stdlabel, 6, 0)
- grid2.addWidget(self.slot_tooldia_entry, 6, 1)
- grid2.addWidget(self.generate_milling_slots_button, 6, 2)
+ grid2.addWidget(self.stdlabel, 5, 0)
+ grid2.addWidget(self.slot_tooldia_entry, 5, 1)
+ grid2.addWidget(self.generate_milling_slots_button, 5, 2)
def hide_drills(self, state=True):
if state is True:
@@ -1152,6 +1146,8 @@ class GeometryObjectUI(ObjectUI):
# Tool Offset
self.grid1 = QtWidgets.QGridLayout()
self.geo_tools_box.addLayout(self.grid1)
+ self.grid1.setColumnStretch(0, 0)
+ self.grid1.setColumnStretch(1, 1)
self.tool_offset_lbl = QtWidgets.QLabel('%s:' % _('Tool Offset'))
self.tool_offset_lbl.setToolTip(
@@ -1162,70 +1158,58 @@ class GeometryObjectUI(ObjectUI):
"cut and negative for 'inside' cut."
)
)
- self.grid1.addWidget(self.tool_offset_lbl, 0, 0)
self.tool_offset_entry = FCDoubleSpinner()
self.tool_offset_entry.set_precision(self.decimals)
self.tool_offset_entry.setRange(-9999.9999, 9999.9999)
self.tool_offset_entry.setSingleStep(0.1)
- spacer_lbl = QtWidgets.QLabel(" ")
- spacer_lbl.setMinimumWidth(80)
+ self.grid1.addWidget(self.tool_offset_lbl, 0, 0)
+ self.grid1.addWidget(self.tool_offset_entry, 0, 1, 1, 2)
- self.grid1.addWidget(self.tool_offset_entry, 0, 1)
- self.grid1.addWidget(spacer_lbl, 0, 2)
- # ### Add a new Tool ####
- hlay = QtWidgets.QHBoxLayout()
- self.geo_tools_box.addLayout(hlay)
-
- # self.addtool_label = QtWidgets.QLabel('Tool')
- # self.addtool_label.setToolTip(
- # "Add/Copy/Delete a tool to the tool list."
- # )
self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia'))
self.addtool_entry_lbl.setToolTip(
- _(
- "Diameter for the new tool"
- )
+ _("Diameter for the new tool")
)
self.addtool_entry = FCDoubleSpinner()
self.addtool_entry.set_precision(self.decimals)
self.addtool_entry.setRange(0.00001, 9999.9999)
self.addtool_entry.setSingleStep(0.1)
- hlay.addWidget(self.addtool_entry_lbl)
- hlay.addWidget(self.addtool_entry)
+ self.addtool_btn = QtWidgets.QPushButton(_('Add'))
+ self.addtool_btn.setToolTip(
+ _("Add a new tool to the Tool Table\n"
+ "with the specified diameter.")
+ )
+
+ self.grid1.addWidget(self.addtool_entry_lbl, 1, 0)
+ self.grid1.addWidget(self.addtool_entry, 1, 1)
+ self.grid1.addWidget(self.addtool_btn, 1, 2)
+
+ self.addtool_from_db_btn = QtWidgets.QPushButton(_('Add Tool from DataBase'))
+ self.addtool_from_db_btn.setToolTip(
+ _("Add a new tool to the Tool Table\n"
+ "from the Tool DataBase.")
+ )
+ self.grid1.addWidget(self.addtool_from_db_btn, 2, 0, 1, 3)
grid2 = QtWidgets.QGridLayout()
self.geo_tools_box.addLayout(grid2)
- self.addtool_btn = QtWidgets.QPushButton(_('Add'))
- self.addtool_btn.setToolTip(
- _(
- "Add a new tool to the Tool Table\n"
- "with the diameter specified above."
- )
- )
-
self.copytool_btn = QtWidgets.QPushButton(_('Copy'))
self.copytool_btn.setToolTip(
- _(
- "Copy a selection of tools in the Tool Table\n"
- "by first selecting a row in the Tool Table."
- )
+ _("Copy a selection of tools in the Tool Table\n"
+ "by first selecting a row in the Tool Table.")
)
self.deltool_btn = QtWidgets.QPushButton(_('Delete'))
self.deltool_btn.setToolTip(
- _(
- "Delete a selection of tools in the Tool Table\n"
- "by first selecting a row in the Tool Table."
- )
+ _("Delete a selection of tools in the Tool Table\n"
+ "by first selecting a row in the Tool Table.")
)
- grid2.addWidget(self.addtool_btn, 0, 0)
- grid2.addWidget(self.copytool_btn, 0, 1)
- grid2.addWidget(self.deltool_btn, 0, 2)
+ grid2.addWidget(self.copytool_btn, 0, 0)
+ grid2.addWidget(self.deltool_btn, 0, 1)
self.empty_label = QtWidgets.QLabel('')
self.geo_tools_box.addWidget(self.empty_label)
diff --git a/flatcamGUI/PlotCanvas.py b/flatcamGUI/PlotCanvas.py
index b414804a..6f564188 100644
--- a/flatcamGUI/PlotCanvas.py
+++ b/flatcamGUI/PlotCanvas.py
@@ -120,7 +120,7 @@ class PlotCanvas(QtCore.QObject, VisPyCanvas):
a3p_mm = np.array([(0, 0), (297, 0), (297, 420), (0, 420)])
a3l_mm = np.array([(0, 0), (420, 0), (420, 297), (0, 297)])
- if self.fcapp.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM':
+ if self.fcapp.defaults['units'].upper() == 'MM':
if self.fcapp.defaults['global_workspaceT'] == 'A4P':
a = a4p_mm
elif self.fcapp.defaults['global_workspaceT'] == 'A4L':
diff --git a/flatcamTools/ToolDistance.py b/flatcamTools/ToolDistance.py
index 3365aad7..ff28bb04 100644
--- a/flatcamTools/ToolDistance.py
+++ b/flatcamTools/ToolDistance.py
@@ -34,7 +34,7 @@ class Distance(FlatCAMTool):
self.app = app
self.canvas = self.app.plotcanvas
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
+ self.units = self.app.defaults['units'].lower()
# ## Title
title_label = QtWidgets.QLabel("%s
" % self.toolName)
diff --git a/flatcamTools/ToolDistanceMin.py b/flatcamTools/ToolDistanceMin.py
index d99f3f77..9777ac7e 100644
--- a/flatcamTools/ToolDistanceMin.py
+++ b/flatcamTools/ToolDistanceMin.py
@@ -35,7 +35,7 @@ class DistanceMin(FlatCAMTool):
self.app = app
self.canvas = self.app.plotcanvas
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
+ self.units = self.app.defaults['units'].lower()
# ## Title
title_label = QtWidgets.QLabel("%s
" % self.toolName)
diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py
index 835eb926..9ccf4f7d 100644
--- a/flatcamTools/ToolNonCopperClear.py
+++ b/flatcamTools/ToolNonCopperClear.py
@@ -421,7 +421,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.ncc_offset_spinner.set_precision(4)
self.ncc_offset_spinner.setWrapping(True)
- units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+ units = self.app.defaults['units'].upper()
if units == 'MM':
self.ncc_offset_spinner.setSingleStep(0.1)
else:
diff --git a/flatcamTools/ToolOptimal.py b/flatcamTools/ToolOptimal.py
index 8dc7ea45..380752de 100644
--- a/flatcamTools/ToolOptimal.py
+++ b/flatcamTools/ToolOptimal.py
@@ -39,7 +39,7 @@ class ToolOptimal(FlatCAMTool):
def __init__(self, app):
FlatCAMTool.__init__(self, app)
- self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
+ self.units = self.app.defaults['units'].upper()
self.decimals = 4
# ############################################################################