flatcam/appGUI/preferences/PreferencesUIManager.py

1143 lines
69 KiB
Python

import os
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import QSettings
from defaults import FlatCAMDefaults
import logging
import gettext
import appTranslation as fcTranslate
import builtins
fcTranslate.apply_language('strings')
if '_' not in builtins.__dict__:
_ = gettext.gettext
settings = QSettings("Open Source", "FlatCAM")
if settings.contains("machinist"):
machinist_setting = settings.value('machinist', type=int)
else:
machinist_setting = 0
log = logging.getLogger('base2')
class PreferencesUIManager:
def __init__(self, defaults: FlatCAMDefaults, data_path: str, ui, inform):
"""
Class that control the Preferences Tab
:param defaults: a dictionary storage where all the application settings are stored
:param data_path: a path to the file where all the preferences are stored for persistence
:param ui: reference to the MainGUI class which constructs the UI
:param inform: a pyqtSignal used to display information's in the StatusBar of the GUI
"""
self.defaults = defaults
self.data_path = data_path
self.ui = ui
self.inform = inform
self.ignore_tab_close_event = False
# if Preferences are changed in the Edit -> Preferences tab the value will be set to True
self.preferences_changed_flag = False
# when adding entries here read the comments in the method found below named:
# def app_obj.new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
self.defaults_form_fields = {
# General App
"decimals_inch": self.ui.general_defaults_form.general_app_group.precision_inch_entry,
"decimals_metric": self.ui.general_defaults_form.general_app_group.precision_metric_entry,
"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_systray_icon": self.ui.general_defaults_form.general_app_group.systray_cb,
"global_shell_at_startup": self.ui.general_defaults_form.general_app_group.shell_startup_cb,
"global_project_at_startup": self.ui.general_defaults_form.general_app_group.project_startup_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_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_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_autosave": self.ui.general_defaults_form.general_app_group.autosave_cb,
"global_autosave_timeout": self.ui.general_defaults_form.general_app_group.autosave_entry,
"global_tpdf_tmargin": self.ui.general_defaults_form.general_app_group.tmargin_entry,
"global_tpdf_bmargin": self.ui.general_defaults_form.general_app_group.bmargin_entry,
"global_tpdf_lmargin": self.ui.general_defaults_form.general_app_group.lmargin_entry,
"global_tpdf_rmargin": self.ui.general_defaults_form.general_app_group.rmargin_entry,
# General GUI Preferences
"global_theme": self.ui.general_defaults_form.general_gui_group.theme_radio,
"global_gray_icons": self.ui.general_defaults_form.general_gui_group.gray_icons_cb,
"global_layout": self.ui.general_defaults_form.general_gui_group.layout_combo,
"global_hover": self.ui.general_defaults_form.general_gui_group.hover_cb,
"global_selection_shape": self.ui.general_defaults_form.general_gui_group.selection_cb,
"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_project_autohide": self.ui.general_defaults_form.general_gui_group.project_autohide_cb,
# General GUI Settings
"global_gridx": self.ui.general_defaults_form.general_app_set_group.gridx_entry,
"global_gridy": self.ui.general_defaults_form.general_app_set_group.gridy_entry,
"global_snap_max": self.ui.general_defaults_form.general_app_set_group.snap_max_dist_entry,
"global_workspace": self.ui.general_defaults_form.general_app_set_group.workspace_cb,
"global_workspaceT": self.ui.general_defaults_form.general_app_set_group.wk_cb,
"global_workspace_orientation": self.ui.general_defaults_form.general_app_set_group.wk_orientation_radio,
"global_cursor_type": self.ui.general_defaults_form.general_app_set_group.cursor_radio,
"global_cursor_size": self.ui.general_defaults_form.general_app_set_group.cursor_size_entry,
"global_cursor_width": self.ui.general_defaults_form.general_app_set_group.cursor_width_entry,
"global_cursor_color_enabled": self.ui.general_defaults_form.general_app_set_group.mouse_cursor_color_cb,
"global_cursor_color": self.ui.general_defaults_form.general_app_set_group.mouse_cursor_entry,
"global_pan_button": self.ui.general_defaults_form.general_app_set_group.pan_button_radio,
"global_mselect_key": self.ui.general_defaults_form.general_app_set_group.mselect_radio,
"global_delete_confirmation": self.ui.general_defaults_form.general_app_set_group.delete_conf_cb,
"global_open_style": self.ui.general_defaults_form.general_app_set_group.open_style_cb,
"global_toggle_tooltips": self.ui.general_defaults_form.general_app_set_group.toggle_tooltips_cb,
"global_machinist_setting": self.ui.general_defaults_form.general_app_set_group.machinist_cb,
"global_bookmarks_limit": self.ui.general_defaults_form.general_app_set_group.bm_limit_spinner,
"global_activity_icon": self.ui.general_defaults_form.general_app_set_group.activity_combo,
# 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_clean_apertures": self.ui.gerber_defaults_form.gerber_gen_group.gerber_clean_cb,
"gerber_extra_buffering": self.ui.gerber_defaults_form.gerber_gen_group.gerber_extra_buffering,
"gerber_plot_fill": self.ui.gerber_defaults_form.gerber_gen_group.fill_color_entry,
"gerber_plot_line": self.ui.gerber_defaults_form.gerber_gen_group.line_color_entry,
# Gerber Options
"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_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio,
"gerber_delayed_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.delayed_buffer_cb,
"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_multicolored": self.ui.excellon_defaults_form.excellon_gen_group.multicolored_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_plot_fill": self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry,
"excellon_plot_line": self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry,
# Excellon Options
"excellon_operation": self.ui.excellon_defaults_form.excellon_opt_group.operation_radio,
"excellon_milling_type": self.ui.excellon_defaults_form.excellon_opt_group.milling_type_radio,
"excellon_milling_dia": self.ui.excellon_defaults_form.excellon_opt_group.mill_dia_entry,
"excellon_cutz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry,
"excellon_multidepth": self.ui.excellon_defaults_form.excellon_opt_group.mpass_cb,
"excellon_depthperpass": self.ui.excellon_defaults_form.excellon_opt_group.maxdepth_entry,
"excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry,
"excellon_endz": self.ui.excellon_defaults_form.excellon_opt_group.endz_entry,
"excellon_endxy": self.ui.excellon_defaults_form.excellon_opt_group.endxy_entry,
"excellon_feedrate_z": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_z_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_multicolored": self.ui.geometry_defaults_form.geometry_gen_group.multicolored_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_plot_line": self.ui.geometry_defaults_form.geometry_gen_group.line_color_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.feedrate_z_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.endz_entry,
"geometry_endxy": self.ui.geometry_defaults_form.geometry_opt_group.endxy_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.feedrate_rapid_entry,
"geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
"geometry_extracut_length": self.ui.geometry_defaults_form.geometry_adv_opt_group.e_cut_entry,
"geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry,
"geometry_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_area_exclusion": self.ui.geometry_defaults_form.geometry_adv_opt_group.exclusion_cb,
"geometry_area_shape": self.ui.geometry_defaults_form.geometry_adv_opt_group.area_shape_radio,
"geometry_area_strategy": self.ui.geometry_defaults_form.geometry_adv_opt_group.strategy_radio,
"geometry_area_overz": self.ui.geometry_defaults_form.geometry_adv_opt_group.over_z_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,
"cncjob_line_ending": self.ui.cncjob_defaults_form.cncjob_gen_group.line_ending_cb,
"cncjob_plot_line": self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry,
"cncjob_plot_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry,
"cncjob_travel_line": self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry,
"cncjob_travel_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_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,
# Isolation Routing Tool
"tools_iso_tooldia": self.ui.tools_defaults_form.tools_iso_group.tool_dia_entry,
"tools_iso_order": self.ui.tools_defaults_form.tools_iso_group.order_radio,
"tools_iso_tool_type": self.ui.tools_defaults_form.tools_iso_group.tool_type_radio,
"tools_iso_tool_vtipdia": self.ui.tools_defaults_form.tools_iso_group.tipdia_entry,
"tools_iso_tool_vtipangle": self.ui.tools_defaults_form.tools_iso_group.tipangle_entry,
"tools_iso_tool_cutz": self.ui.tools_defaults_form.tools_iso_group.cutz_entry,
"tools_iso_newdia": self.ui.tools_defaults_form.tools_iso_group.newdia_entry,
"tools_iso_passes": self.ui.tools_defaults_form.tools_iso_group.passes_entry,
"tools_iso_overlap": self.ui.tools_defaults_form.tools_iso_group.overlap_entry,
"tools_iso_milling_type": self.ui.tools_defaults_form.tools_iso_group.milling_type_radio,
"tools_iso_follow": self.ui.tools_defaults_form.tools_iso_group.follow_cb,
"tools_iso_isotype": self.ui.tools_defaults_form.tools_iso_group.iso_type_radio,
"tools_iso_rest": self.ui.tools_defaults_form.tools_iso_group.rest_cb,
"tools_iso_combine_passes": self.ui.tools_defaults_form.tools_iso_group.combine_passes_cb,
"tools_iso_isoexcept": self.ui.tools_defaults_form.tools_iso_group.except_cb,
"tools_iso_selection": self.ui.tools_defaults_form.tools_iso_group.select_combo,
"tools_iso_area_shape": self.ui.tools_defaults_form.tools_iso_group.area_shape_radio,
"tools_iso_plotting": self.ui.tools_defaults_form.tools_iso_group.plotting_radio,
# 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_combo,
"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.select_combo,
"tools_ncc_area_shape": self.ui.tools_defaults_form.tools_ncc_group.area_shape_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,
"tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.plotting_radio,
# 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_cutout_z": self.ui.tools_defaults_form.tools_cutout_group.cutz_entry,
"tools_cutout_depthperpass": self.ui.tools_defaults_form.tools_cutout_group.maxdepth_entry,
"tools_cutout_mdepth": self.ui.tools_defaults_form.tools_cutout_group.mpass_cb,
"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_paint_area_shape": self.ui.tools_defaults_form.tools_paint_group.area_shape_radio,
"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,
"tools_paintrest": self.ui.tools_defaults_form.tools_paint_group.rest_cb,
"tools_painttool_type": self.ui.tools_defaults_form.tools_paint_group.tool_type_radio,
"tools_paintcutz": self.ui.tools_defaults_form.tools_paint_group.cutz_entry,
"tools_painttipdia": self.ui.tools_defaults_form.tools_paint_group.tipdia_entry,
"tools_painttipangle": self.ui.tools_defaults_form.tools_paint_group.tipangle_entry,
"tools_paintnewdia": self.ui.tools_defaults_form.tools_paint_group.newdia_entry,
# 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,
"tools_2sided_allign_axis": self.ui.tools_defaults_form.tools_2sided_group.align_axis_radio,
# 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,
"tools_film_file_type_radio": self.ui.tools_defaults_form.tools_film_group.file_type_radio,
"tools_film_orientation": self.ui.tools_defaults_form.tools_film_group.orientation_radio,
"tools_film_pagesize": self.ui.tools_defaults_form.tools_film_group.pagesize_combo,
# 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_reference": self.ui.tools_defaults_form.tools_transform_group.ref_combo,
"tools_transform_ref_object": self.ui.tools_defaults_form.tools_transform_group.type_obj_combo,
"tools_transform_ref_point": self.ui.tools_defaults_form.tools_transform_group.point_entry,
"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_skew_link": self.ui.tools_defaults_form.tools_transform_group.skew_link_cb,
"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.scale_link_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_buffer_dis": self.ui.tools_defaults_form.tools_transform_group.buffer_entry,
"tools_transform_buffer_factor": self.ui.tools_defaults_form.tools_transform_group.buffer_factor_entry,
"tools_transform_buffer_corner": self.ui.tools_defaults_form.tools_transform_group.buffer_rounded_cb,
# 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,
# Corner Markers Tool
"tools_corners_thickness": self.ui.tools_defaults_form.tools_corners_group.thick_entry,
"tools_corners_length": self.ui.tools_defaults_form.tools_corners_group.l_entry,
"tools_corners_margin": self.ui.tools_defaults_form.tools_corners_group.margin_entry,
# #######################################################################################################
# ########################################## 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 Thieving Tool
"tools_copper_thieving_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
"tools_copper_thieving_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
"tools_copper_thieving_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
"tools_copper_thieving_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
"tools_copper_thieving_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
"tools_copper_thieving_fill_type": self.ui.tools2_defaults_form.tools2_cfill_group.fill_type_radio,
"tools_copper_thieving_dots_dia": self.ui.tools2_defaults_form.tools2_cfill_group.dot_dia_entry,
"tools_copper_thieving_dots_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.dot_spacing_entry,
"tools_copper_thieving_squares_size": self.ui.tools2_defaults_form.tools2_cfill_group.square_size_entry,
"tools_copper_thieving_squares_spacing":
self.ui.tools2_defaults_form.tools2_cfill_group.squares_spacing_entry,
"tools_copper_thieving_lines_size": self.ui.tools2_defaults_form.tools2_cfill_group.line_size_entry,
"tools_copper_thieving_lines_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.lines_spacing_entry,
"tools_copper_thieving_rb_margin": self.ui.tools2_defaults_form.tools2_cfill_group.rb_margin_entry,
"tools_copper_thieving_rb_thickness": self.ui.tools2_defaults_form.tools2_cfill_group.rb_thickness_entry,
"tools_copper_thieving_mask_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_ppm_entry,
# Fiducials Tool
"tools_fiducials_dia": self.ui.tools2_defaults_form.tools2_fiducials_group.dia_entry,
"tools_fiducials_margin": self.ui.tools2_defaults_form.tools2_fiducials_group.margin_entry,
"tools_fiducials_mode": self.ui.tools2_defaults_form.tools2_fiducials_group.mode_radio,
"tools_fiducials_second_pos": self.ui.tools2_defaults_form.tools2_fiducials_group.pos_radio,
"tools_fiducials_type": self.ui.tools2_defaults_form.tools2_fiducials_group.fid_type_radio,
"tools_fiducials_line_thickness": self.ui.tools2_defaults_form.tools2_fiducials_group.line_thickness_entry,
# Calibration Tool
"tools_cal_calsource": self.ui.tools2_defaults_form.tools2_cal_group.cal_source_radio,
"tools_cal_travelz": self.ui.tools2_defaults_form.tools2_cal_group.travelz_entry,
"tools_cal_verz": self.ui.tools2_defaults_form.tools2_cal_group.verz_entry,
"tools_cal_zeroz": self.ui.tools2_defaults_form.tools2_cal_group.zeroz_cb,
"tools_cal_toolchangez": self.ui.tools2_defaults_form.tools2_cal_group.toolchangez_entry,
"tools_cal_toolchange_xy": self.ui.tools2_defaults_form.tools2_cal_group.toolchange_xy_entry,
"tools_cal_sec_point": self.ui.tools2_defaults_form.tools2_cal_group.second_point_radio,
# Extract Drills Tool
"tools_edrills_hole_type": self.ui.tools2_defaults_form.tools2_edrills_group.hole_size_radio,
"tools_edrills_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_edrills_group.dia_entry,
"tools_edrills_hole_prop_factor": self.ui.tools2_defaults_form.tools2_edrills_group.factor_entry,
"tools_edrills_circular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.circular_ring_entry,
"tools_edrills_oblong_ring": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_ring_entry,
"tools_edrills_square_ring": self.ui.tools2_defaults_form.tools2_edrills_group.square_ring_entry,
"tools_edrills_rectangular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_ring_entry,
"tools_edrills_others_ring": self.ui.tools2_defaults_form.tools2_edrills_group.other_ring_entry,
"tools_edrills_circular": self.ui.tools2_defaults_form.tools2_edrills_group.circular_cb,
"tools_edrills_oblong": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_cb,
"tools_edrills_square": self.ui.tools2_defaults_form.tools2_edrills_group.square_cb,
"tools_edrills_rectangular": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_cb,
"tools_edrills_others": self.ui.tools2_defaults_form.tools2_edrills_group.other_cb,
# Punch Gerber Tool
"tools_punch_hole_type": self.ui.tools2_defaults_form.tools2_punch_group.hole_size_radio,
"tools_punch_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_punch_group.dia_entry,
"tools_punch_hole_prop_factor": self.ui.tools2_defaults_form.tools2_punch_group.factor_entry,
"tools_punch_circular_ring": self.ui.tools2_defaults_form.tools2_punch_group.circular_ring_entry,
"tools_punch_oblong_ring": self.ui.tools2_defaults_form.tools2_punch_group.oblong_ring_entry,
"tools_punch_square_ring": self.ui.tools2_defaults_form.tools2_punch_group.square_ring_entry,
"tools_punch_rectangular_ring": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_ring_entry,
"tools_punch_others_ring": self.ui.tools2_defaults_form.tools2_punch_group.other_ring_entry,
"tools_punch_circular": self.ui.tools2_defaults_form.tools2_punch_group.circular_cb,
"tools_punch_oblong": self.ui.tools2_defaults_form.tools2_punch_group.oblong_cb,
"tools_punch_square": self.ui.tools2_defaults_form.tools2_punch_group.square_cb,
"tools_punch_rectangular": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_cb,
"tools_punch_others": self.ui.tools2_defaults_form.tools2_punch_group.other_cb,
# Invert Gerber Tool
"tools_invert_margin": self.ui.tools2_defaults_form.tools2_invert_group.margin_entry,
"tools_invert_join_style": self.ui.tools2_defaults_form.tools2_invert_group.join_radio,
# 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,
}
def defaults_read_form(self):
"""
Will read all the values in the Preferences GUI and update the defaults dictionary.
:return: None
"""
for option in self.defaults_form_fields:
try:
self.defaults[option] = self.defaults_form_fields[option].get_value()
except Exception as e:
log.debug("App.defaults_read_form() --> %s" % str(e))
def defaults_write_form(self, factor=None, fl_units=None, source_dict=None):
"""
Will set the values for all the GUI elements in Preferences GUI based on the values found in the
self.defaults dictionary.
:param factor: will apply a factor to the values that written in the GUI elements
:param fl_units: current measuring units in FlatCAM: Metric or Inch
:param source_dict: the repository of options, usually is the self.defaults
:return: None
"""
options_storage = self.defaults if source_dict is None else source_dict
for option in options_storage:
if source_dict:
self.defaults_write_form_field(option, factor=factor, units=fl_units, defaults_dict=source_dict)
else:
self.defaults_write_form_field(option, factor=factor, units=fl_units)
def defaults_write_form_field(self, field, factor=None, units=None, defaults_dict=None):
"""
Basically it is the worker in the self.defaults_write_form()
:param field: the GUI element in Preferences GUI to be updated
:param factor: factor to be applied to the field parameter
:param units: current FlatCAM measuring units
:param defaults_dict: the defaults storage
:return: None, it updates GUI elements
"""
def_dict = self.defaults if defaults_dict is None else defaults_dict
try:
value = def_dict[field]
# log.debug("value is " + str(value) + " and factor is "+str(factor))
if factor is not None:
value *= factor
form_field = self.defaults_form_fields[field]
if units is None:
form_field.set_value(value)
elif (units == 'IN' or units == 'MM') and (field == 'global_gridx' or field == 'global_gridy'):
form_field.set_value(value)
except KeyError:
pass
except AttributeError:
log.debug(field)
def show_preferences_gui(self):
"""
Called to initialize and show the Preferences appGUI
:return: None
"""
gen_form = self.ui.general_defaults_form
try:
self.ui.general_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.general_scroll_area.setWidget(gen_form)
gen_form.show()
ger_form = self.ui.gerber_defaults_form
try:
self.ui.gerber_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.gerber_scroll_area.setWidget(ger_form)
ger_form.show()
exc_form = self.ui.excellon_defaults_form
try:
self.ui.excellon_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.excellon_scroll_area.setWidget(exc_form)
exc_form.show()
geo_form = self.ui.geometry_defaults_form
try:
self.ui.geometry_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.geometry_scroll_area.setWidget(geo_form)
geo_form.show()
cnc_form = self.ui.cncjob_defaults_form
try:
self.ui.cncjob_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.cncjob_scroll_area.setWidget(cnc_form)
cnc_form.show()
tools_form = self.ui.tools_defaults_form
try:
self.ui.tools_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.tools_scroll_area.setWidget(tools_form)
tools_form.show()
tools2_form = self.ui.tools2_defaults_form
try:
self.ui.tools2_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.tools2_scroll_area.setWidget(tools2_form)
tools2_form.show()
fa_form = self.ui.util_defaults_form
try:
self.ui.fa_scroll_area.takeWidget()
except Exception:
log.debug("Nothing to remove")
self.ui.fa_scroll_area.setWidget(fa_form)
fa_form.show()
# Initialize the color box's color in Preferences -> Global -> Colors
self.__init_color_pickers()
# Button handlers
self.ui.pref_save_button.clicked.connect(lambda: self.on_save_button(save_to_file=True))
self.ui.pref_apply_button.clicked.connect(lambda: self.on_save_button(save_to_file=False))
self.ui.pref_close_button.clicked.connect(self.on_pref_close_button)
self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
log.debug("Finished Preferences GUI form initialization.")
def __init_color_pickers(self):
# Init Gerber Plot Colors
self.ui.gerber_defaults_form.gerber_gen_group.fill_color_entry.set_value(self.defaults['gerber_plot_fill'])
self.ui.gerber_defaults_form.gerber_gen_group.line_color_entry.set_value(self.defaults['gerber_plot_line'])
self.ui.gerber_defaults_form.gerber_gen_group.gerber_alpha_entry.set_value(
int(self.defaults['gerber_plot_fill'][7:9], 16)) # alpha
# Init Excellon Plot Colors
self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry.set_value(
self.defaults['excellon_plot_fill'])
self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry.set_value(
self.defaults['excellon_plot_line'])
self.ui.excellon_defaults_form.excellon_gen_group.excellon_alpha_entry.set_value(
int(self.defaults['excellon_plot_fill'][7:9], 16))
# Init Geometry Plot Colors
self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry.set_value(
self.defaults['geometry_plot_line'])
# Init CNCJob Travel Line Colors
self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_entry.set_value(
self.defaults['cncjob_travel_fill'])
self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry.set_value(
self.defaults['cncjob_travel_line'])
self.ui.cncjob_defaults_form.cncjob_gen_group.cncjob_alpha_entry.set_value(
int(self.defaults['cncjob_travel_fill'][7:9], 16)) # alpha
# Init CNCJob Plot Colors
self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry.set_value(
self.defaults['cncjob_plot_fill'])
self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry.set_value(
self.defaults['cncjob_plot_line'])
# Init Left-Right Selection colors
self.ui.general_defaults_form.general_gui_group.sf_color_entry.set_value(self.defaults['global_sel_fill'])
self.ui.general_defaults_form.general_gui_group.sl_color_entry.set_value(self.defaults['global_sel_line'])
self.ui.general_defaults_form.general_gui_group.left_right_alpha_entry.set_value(
int(self.defaults['global_sel_fill'][7:9], 16))
# Init Right-Left Selection colors
self.ui.general_defaults_form.general_gui_group.alt_sf_color_entry.set_value(
self.defaults['global_alt_sel_fill'])
self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry.set_value(
self.defaults['global_alt_sel_line'])
self.ui.general_defaults_form.general_gui_group.right_left_alpha_entry.set_value(
int(self.defaults['global_sel_fill'][7:9], 16))
# Init Draw color and Selection Draw Color
self.ui.general_defaults_form.general_gui_group.draw_color_entry.set_value(
self.defaults['global_draw_color'])
self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry.set_value(
self.defaults['global_sel_draw_color'])
# Init Project Items color
self.ui.general_defaults_form.general_gui_group.proj_color_entry.set_value(
self.defaults['global_proj_item_color'])
# Init Project Disabled Items color
self.ui.general_defaults_form.general_gui_group.proj_color_dis_entry.set_value(
self.defaults['global_proj_item_dis_color'])
# Init Mouse Cursor color
self.ui.general_defaults_form.general_app_set_group.mouse_cursor_entry.set_value(
self.defaults['global_cursor_color'])
# Init the Annotation CNC Job color
self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry.set_value(
self.defaults['cncjob_annotation_fontcolor'])
# Init the Tool Film color
self.ui.tools_defaults_form.tools_film_group.film_color_entry.set_value(
self.defaults['tools_film_color'])
# Init the Tool QRCode colors
self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry.set_value(
self.defaults['tools_qrcode_fill_color'])
self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry.set_value(
self.defaults['tools_qrcode_back_color'])
def on_save_button(self, save_to_file=True):
log.debug("on_save_button() --> Applying preferences to file.")
# Preferences saved, update flag
self.preferences_changed_flag = False
# Preferences save, update the color of the Preferences Tab text
for idx in range(self.ui.plot_tab_area.count()):
if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
# restore the default stylesheet by setting a blank one
self.ui.pref_apply_button.setStyleSheet("")
self.inform.emit('%s' % _("Preferences applied."))
# make sure we update the self.current_defaults dict used to undo changes to self.defaults
self.defaults.current_defaults.update(self.defaults)
# deal with theme change
theme_settings = QtCore.QSettings("Open Source", "FlatCAM")
if theme_settings.contains("theme"):
theme = theme_settings.value('theme', type=str)
else:
theme = 'white'
should_restart = False
theme_new_val = self.ui.general_defaults_form.general_gui_group.theme_radio.get_value()
ge = self.defaults["global_graphic_engine"]
ge_val = self.ui.general_defaults_form.general_app_group.ge_radio.get_value()
if theme_new_val != theme or ge != ge_val:
msgbox = QtWidgets.QMessageBox()
msgbox.setText(_("Are you sure you want to continue?"))
msgbox.setWindowTitle(_("Application will restart"))
msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/warning.png'))
msgbox.setIcon(QtWidgets.QMessageBox.Question)
bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.NoRole)
msgbox.setDefaultButton(bt_yes)
msgbox.exec_()
response = msgbox.clickedButton()
if theme_new_val != theme:
if response == bt_yes:
theme_settings.setValue('theme', theme_new_val)
# This will write the setting to the platform specific storage.
del theme_settings
should_restart = True
else:
self.ui.general_defaults_form.general_gui_group.theme_radio.set_value(theme)
else:
if response == bt_yes:
self.defaults["global_graphic_engine"] = ge_val
should_restart = True
else:
self.ui.general_defaults_form.general_app_group.ge_radio.set_value(ge)
if save_to_file or should_restart is True:
# Re-fresh project options
self.ui.app.on_options_app2project()
self.save_defaults(silent=False)
# load the defaults so they are updated into the app
self.defaults.load(filename=os.path.join(self.data_path, 'current_defaults.FlatConfig'))
settgs = QSettings("Open Source", "FlatCAM")
# save the notebook font size
fsize = self.ui.general_defaults_form.general_app_set_group.notebook_font_size_spinner.get_value()
settgs.setValue('notebook_font_size', fsize)
# save the axis font size
g_fsize = self.ui.general_defaults_form.general_app_set_group.axis_font_size_spinner.get_value()
settgs.setValue('axis_font_size', g_fsize)
# save the textbox font size
tb_fsize = self.ui.general_defaults_form.general_app_set_group.textbox_font_size_spinner.get_value()
settgs.setValue('textbox_font_size', tb_fsize)
# save the HUD font size
hud_fsize = self.ui.general_defaults_form.general_app_set_group.hud_font_size_spinner.get_value()
settgs.setValue('hud_font_size', hud_fsize)
settgs.setValue(
'machinist',
1 if self.ui.general_defaults_form.general_app_set_group.machinist_cb.get_value() else 0
)
# This will write the setting to the platform specific storage.
del settgs
if save_to_file:
# close the tab and delete it
for idx in range(self.ui.plot_tab_area.count()):
if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
self.ui.plot_tab_area.closeTab(idx)
break
if should_restart is True:
self.ui.app.on_app_restart()
def on_pref_close_button(self):
# Preferences saved, update flag
self.preferences_changed_flag = False
self.ignore_tab_close_event = True
# restore stylesheet to default for the statusBar icon
self.ui.pref_status_label.setStyleSheet("")
try:
self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.disconnect()
except (TypeError, AttributeError):
pass
self.defaults_write_form(source_dict=self.defaults.current_defaults)
self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
lambda: self.ui.app.on_toggle_units(no_pref=False))
self.defaults.update(self.defaults.current_defaults)
# Preferences save, update the color of the Preferences Tab text
for idx in range(self.ui.plot_tab_area.count()):
if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
self.ui.plot_tab_area.closeTab(idx)
break
self.inform.emit('%s' % _("Preferences closed without saving."))
self.ignore_tab_close_event = False
def on_restore_defaults_preferences(self):
"""
Loads the application's factory default settings into ``self.defaults``.
:return: None
"""
log.debug("on_restore_defaults_preferences()")
self.defaults.reset_to_factory_defaults()
self.on_preferences_edited()
self.inform.emit('[success] %s' % _("Preferences default values are restored."))
def save_defaults(self, silent=False, data_path=None, first_time=False):
"""
Saves application default options
``self.defaults`` to current_defaults.FlatConfig file.
Save the toolbars visibility status to the preferences file (current_defaults.FlatConfig) to be
used at the next launch of the application.
:param silent: Whether to display a message in status bar or not; boolean
:param data_path: The path where to save the preferences file (current_defaults.FlatConfig)
When the application is portable it should be a mobile location.
:param first_time: Boolean. If True will execute some code when the app is run first time
:return: None
"""
log.debug("App.PreferencesUIManager.save_defaults()")
if data_path is None:
data_path = self.data_path
self.defaults.propagate_defaults()
if first_time is False:
self.save_toolbar_view()
# Save the options to disk
filename = os.path.join(data_path, "current_defaults.FlatConfig")
try:
self.defaults.write(filename=filename)
except Exception as e:
log.error("save_defaults() --> Failed to write defaults to file %s" % str(e))
self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
return
if not silent:
self.inform.emit('[success] %s' % _("Preferences saved."))
# update the autosave timer
self.ui.app.save_project_auto_update()
def save_toolbar_view(self):
"""
Will save the toolbar view state to the defaults
:return: None
"""
# Save the toolbar view
tb_status = 0
if self.ui.toolbarfile.isVisible():
tb_status += 1
if self.ui.toolbaredit.isVisible():
tb_status += 2
if self.ui.toolbarview.isVisible():
tb_status += 4
if self.ui.toolbartools.isVisible():
tb_status += 8
if self.ui.exc_edit_toolbar.isVisible():
tb_status += 16
if self.ui.geo_edit_toolbar.isVisible():
tb_status += 32
if self.ui.grb_edit_toolbar.isVisible():
tb_status += 64
if self.ui.status_toolbar.isVisible():
tb_status += 128
if self.ui.toolbarshell.isVisible():
tb_status += 256
self.defaults["global_toolbar_view"] = tb_status
def on_preferences_edited(self):
"""
Executed when a preference was changed in the Edit -> Preferences tab.
Will color the Preferences tab text to Red color.
:return:
"""
if self.preferences_changed_flag is False:
self.inform.emit('[WARNING_NOTCL] %s' % _("Preferences edited but not saved."))
for idx in range(self.ui.plot_tab_area.count()):
if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('red'))
self.ui.pref_apply_button.setStyleSheet("QPushButton {color: red;}")
self.preferences_changed_flag = True
def on_close_preferences_tab(self):
if self.ignore_tab_close_event:
return
# restore stylesheet to default for the statusBar icon
self.ui.pref_status_label.setStyleSheet("")
# disconnect
for idx in range(self.ui.pref_tab_area.count()):
for tb in self.ui.pref_tab_area.widget(idx).findChildren(QtCore.QObject):
try:
tb.textEdited.disconnect(self.on_preferences_edited)
except (TypeError, AttributeError):
pass
try:
tb.modificationChanged.disconnect(self.on_preferences_edited)
except (TypeError, AttributeError):
pass
try:
tb.toggled.disconnect(self.on_preferences_edited)
except (TypeError, AttributeError):
pass
try:
tb.valueChanged.disconnect(self.on_preferences_edited)
except (TypeError, AttributeError):
pass
try:
tb.currentIndexChanged.disconnect(self.on_preferences_edited)
except (TypeError, AttributeError):
pass
# Prompt user to save
if self.preferences_changed_flag is True:
msgbox = QtWidgets.QMessageBox()
msgbox.setText(_("One or more values are changed.\n"
"Do you want to save the Preferences?"))
msgbox.setWindowTitle(_("Save Preferences"))
msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/save_as.png'))
msgbox.setIcon(QtWidgets.QMessageBox.Question)
bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
msgbox.setDefaultButton(bt_yes)
msgbox.exec_()
response = msgbox.clickedButton()
if response == bt_yes:
self.on_save_button(save_to_file=True)
self.inform.emit('[success] %s' % _("Preferences saved."))
else:
self.preferences_changed_flag = False
self.inform.emit('')
return