PreferencesUIManager.py 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. import os
  2. from typing import Any, Dict
  3. from PyQt5 import QtGui, QtCore, QtWidgets
  4. from PyQt5.QtCore import QSettings
  5. from defaults import FlatCAMDefaults
  6. import logging
  7. import gettext
  8. import FlatCAMTranslation as fcTranslate
  9. import builtins
  10. from flatcamGUI.preferences.OptionUI import OptionUI
  11. fcTranslate.apply_language('strings')
  12. if '_' not in builtins.__dict__:
  13. _ = gettext.gettext
  14. settings = QSettings("Open Source", "FlatCAM")
  15. if settings.contains("machinist"):
  16. machinist_setting = settings.value('machinist', type=int)
  17. else:
  18. machinist_setting = 0
  19. log = logging.getLogger('PreferencesUIManager')
  20. class PreferencesUIManager:
  21. def __init__(self, defaults: FlatCAMDefaults, data_path: str, ui, inform):
  22. """
  23. Class that control the Preferences Tab
  24. :param defaults: a dictionary storage where all the application settings are stored
  25. :param data_path: a path to the file where all the preferences are stored for persistence
  26. :param ui: reference to the FlatCAMGUI class which constructs the UI
  27. :param inform: a pyqtSignal used to display information's in the StatusBar of the GUI
  28. """
  29. self.defaults = defaults
  30. self.data_path = data_path
  31. self.ui = ui
  32. self.inform = inform
  33. self.ignore_tab_close_event = False
  34. # if Preferences are changed in the Edit -> Preferences tab the value will be set to True
  35. self.preferences_changed_flag = False
  36. # when adding entries here read the comments in the method found below named:
  37. # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
  38. self.defaults_form_fields = {
  39. # General App
  40. "decimals_inch": self.ui.general_defaults_form.general_app_group.precision_inch_entry,
  41. "decimals_metric": self.ui.general_defaults_form.general_app_group.precision_metric_entry,
  42. "units": self.ui.general_defaults_form.general_app_group.units_radio,
  43. "global_graphic_engine": self.ui.general_defaults_form.general_app_group.ge_radio,
  44. "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio,
  45. "global_portable": self.ui.general_defaults_form.general_app_group.portability_cb,
  46. "global_language": self.ui.general_defaults_form.general_app_group.language_cb,
  47. "global_systray_icon": self.ui.general_defaults_form.general_app_group.systray_cb,
  48. "global_shell_at_startup": self.ui.general_defaults_form.general_app_group.shell_startup_cb,
  49. "global_project_at_startup": self.ui.general_defaults_form.general_app_group.project_startup_cb,
  50. "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb,
  51. "global_send_stats": self.ui.general_defaults_form.general_app_group.send_stats_cb,
  52. "global_worker_number": self.ui.general_defaults_form.general_app_group.worker_number_sb,
  53. "global_tolerance": self.ui.general_defaults_form.general_app_group.tol_entry,
  54. "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_spinner,
  55. "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb,
  56. "global_autosave": self.ui.general_defaults_form.general_app_group.autosave_cb,
  57. "global_autosave_timeout": self.ui.general_defaults_form.general_app_group.autosave_entry,
  58. "global_tpdf_tmargin": self.ui.general_defaults_form.general_app_group.tmargin_entry,
  59. "global_tpdf_bmargin": self.ui.general_defaults_form.general_app_group.bmargin_entry,
  60. "global_tpdf_lmargin": self.ui.general_defaults_form.general_app_group.lmargin_entry,
  61. "global_tpdf_rmargin": self.ui.general_defaults_form.general_app_group.rmargin_entry,
  62. # Gerber General
  63. "gerber_plot": self.ui.gerber_defaults_form.gerber_gen_group.plot_cb,
  64. "gerber_solid": self.ui.gerber_defaults_form.gerber_gen_group.solid_cb,
  65. "gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
  66. "gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
  67. "gerber_def_units": self.ui.gerber_defaults_form.gerber_gen_group.gerber_units_radio,
  68. "gerber_def_zeros": self.ui.gerber_defaults_form.gerber_gen_group.gerber_zeros_radio,
  69. "gerber_clean_apertures": self.ui.gerber_defaults_form.gerber_gen_group.gerber_clean_cb,
  70. "gerber_extra_buffering": self.ui.gerber_defaults_form.gerber_gen_group.gerber_extra_buffering,
  71. "gerber_plot_fill": self.ui.gerber_defaults_form.gerber_gen_group.pf_color_entry,
  72. "gerber_plot_line": self.ui.gerber_defaults_form.gerber_gen_group.pl_color_entry,
  73. # Gerber Options
  74. "gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry,
  75. "gerber_isopasses": self.ui.gerber_defaults_form.gerber_opt_group.iso_width_entry,
  76. "gerber_isooverlap": self.ui.gerber_defaults_form.gerber_opt_group.iso_overlap_entry,
  77. "gerber_combine_passes": self.ui.gerber_defaults_form.gerber_opt_group.combine_passes_cb,
  78. "gerber_iso_scope": self.ui.gerber_defaults_form.gerber_opt_group.iso_scope_radio,
  79. "gerber_milling_type": self.ui.gerber_defaults_form.gerber_opt_group.milling_type_radio,
  80. "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry,
  81. "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb,
  82. "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry,
  83. "gerber_bboxrounded": self.ui.gerber_defaults_form.gerber_opt_group.bbrounded_cb,
  84. # Gerber Advanced Options
  85. "gerber_aperture_display": self.ui.gerber_defaults_form.gerber_adv_opt_group.aperture_table_visibility_cb,
  86. # "gerber_aperture_scale_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.scale_aperture_entry,
  87. # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry,
  88. "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb,
  89. "gerber_tool_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.tool_type_radio,
  90. "gerber_vtipdia": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipdia_spinner,
  91. "gerber_vtipangle": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipangle_spinner,
  92. "gerber_vcutz": self.ui.gerber_defaults_form.gerber_adv_opt_group.cutz_spinner,
  93. "gerber_iso_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.iso_type_radio,
  94. "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio,
  95. "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb,
  96. "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner,
  97. # Gerber Export
  98. "gerber_exp_units": self.ui.gerber_defaults_form.gerber_exp_group.gerber_units_radio,
  99. "gerber_exp_integer": self.ui.gerber_defaults_form.gerber_exp_group.format_whole_entry,
  100. "gerber_exp_decimals": self.ui.gerber_defaults_form.gerber_exp_group.format_dec_entry,
  101. "gerber_exp_zeros": self.ui.gerber_defaults_form.gerber_exp_group.zeros_radio,
  102. # Gerber Editor
  103. "gerber_editor_sel_limit": self.ui.gerber_defaults_form.gerber_editor_group.sel_limit_entry,
  104. "gerber_editor_newcode": self.ui.gerber_defaults_form.gerber_editor_group.addcode_entry,
  105. "gerber_editor_newsize": self.ui.gerber_defaults_form.gerber_editor_group.addsize_entry,
  106. "gerber_editor_newtype": self.ui.gerber_defaults_form.gerber_editor_group.addtype_combo,
  107. "gerber_editor_newdim": self.ui.gerber_defaults_form.gerber_editor_group.adddim_entry,
  108. "gerber_editor_array_size": self.ui.gerber_defaults_form.gerber_editor_group.grb_array_size_entry,
  109. "gerber_editor_lin_axis": self.ui.gerber_defaults_form.gerber_editor_group.grb_axis_radio,
  110. "gerber_editor_lin_pitch": self.ui.gerber_defaults_form.gerber_editor_group.grb_pitch_entry,
  111. "gerber_editor_lin_angle": self.ui.gerber_defaults_form.gerber_editor_group.grb_angle_entry,
  112. "gerber_editor_circ_dir": self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_dir_radio,
  113. "gerber_editor_circ_angle":
  114. self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_angle_entry,
  115. "gerber_editor_scale_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_scale_entry,
  116. "gerber_editor_buff_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_buff_entry,
  117. "gerber_editor_ma_low": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_low_entry,
  118. "gerber_editor_ma_high": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_high_entry,
  119. # Excellon General
  120. "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb,
  121. "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb,
  122. "excellon_format_upper_in":
  123. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry,
  124. "excellon_format_lower_in":
  125. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry,
  126. "excellon_format_upper_mm":
  127. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry,
  128. "excellon_format_lower_mm":
  129. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry,
  130. "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio,
  131. "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio,
  132. "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb,
  133. "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio,
  134. "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry,
  135. "excellon_plot_fill": self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry,
  136. "excellon_plot_line": self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry,
  137. # Excellon Options
  138. "excellon_operation": self.ui.excellon_defaults_form.excellon_opt_group.operation_radio,
  139. "excellon_milling_type": self.ui.excellon_defaults_form.excellon_opt_group.milling_type_radio,
  140. "excellon_milling_dia": self.ui.excellon_defaults_form.excellon_opt_group.mill_dia_entry,
  141. "excellon_cutz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry,
  142. "excellon_multidepth": self.ui.excellon_defaults_form.excellon_opt_group.mpass_cb,
  143. "excellon_depthperpass": self.ui.excellon_defaults_form.excellon_opt_group.maxdepth_entry,
  144. "excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry,
  145. "excellon_endz": self.ui.excellon_defaults_form.excellon_opt_group.endz_entry,
  146. "excellon_endxy": self.ui.excellon_defaults_form.excellon_opt_group.endxy_entry,
  147. "excellon_feedrate_z": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_z_entry,
  148. "excellon_spindlespeed": self.ui.excellon_defaults_form.excellon_opt_group.spindlespeed_entry,
  149. "excellon_dwell": self.ui.excellon_defaults_form.excellon_opt_group.dwell_cb,
  150. "excellon_dwelltime": self.ui.excellon_defaults_form.excellon_opt_group.dwelltime_entry,
  151. "excellon_toolchange": self.ui.excellon_defaults_form.excellon_opt_group.toolchange_cb,
  152. "excellon_toolchangez": self.ui.excellon_defaults_form.excellon_opt_group.toolchangez_entry,
  153. "excellon_ppname_e": self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb,
  154. "excellon_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.tooldia_entry,
  155. "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry,
  156. "excellon_gcode_type": self.ui.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio,
  157. # Excellon Advanced Options
  158. "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry,
  159. "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry,
  160. "excellon_startz": self.ui.excellon_defaults_form.excellon_adv_opt_group.estartz_entry,
  161. "excellon_feedrate_rapid": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_rapid_entry,
  162. "excellon_z_pdepth": self.ui.excellon_defaults_form.excellon_adv_opt_group.pdepth_entry,
  163. "excellon_feedrate_probe": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_probe_entry,
  164. "excellon_spindledir": self.ui.excellon_defaults_form.excellon_adv_opt_group.spindledir_radio,
  165. "excellon_f_plunge": self.ui.excellon_defaults_form.excellon_adv_opt_group.fplunge_cb,
  166. "excellon_f_retract": self.ui.excellon_defaults_form.excellon_adv_opt_group.fretract_cb,
  167. # Excellon Export
  168. "excellon_exp_units": self.ui.excellon_defaults_form.excellon_exp_group.excellon_units_radio,
  169. "excellon_exp_format": self.ui.excellon_defaults_form.excellon_exp_group.format_radio,
  170. "excellon_exp_integer": self.ui.excellon_defaults_form.excellon_exp_group.format_whole_entry,
  171. "excellon_exp_decimals": self.ui.excellon_defaults_form.excellon_exp_group.format_dec_entry,
  172. "excellon_exp_zeros": self.ui.excellon_defaults_form.excellon_exp_group.zeros_radio,
  173. "excellon_exp_slot_type": self.ui.excellon_defaults_form.excellon_exp_group.slot_type_radio,
  174. # Excellon Editor
  175. "excellon_editor_sel_limit": self.ui.excellon_defaults_form.excellon_editor_group.sel_limit_entry,
  176. "excellon_editor_newdia": self.ui.excellon_defaults_form.excellon_editor_group.addtool_entry,
  177. "excellon_editor_array_size": self.ui.excellon_defaults_form.excellon_editor_group.drill_array_size_entry,
  178. "excellon_editor_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_axis_radio,
  179. "excellon_editor_lin_pitch": self.ui.excellon_defaults_form.excellon_editor_group.drill_pitch_entry,
  180. "excellon_editor_lin_angle": self.ui.excellon_defaults_form.excellon_editor_group.drill_angle_entry,
  181. "excellon_editor_circ_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_dir_radio,
  182. "excellon_editor_circ_angle":
  183. self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_angle_entry,
  184. # Excellon Slots
  185. "excellon_editor_slot_direction":
  186. self.ui.excellon_defaults_form.excellon_editor_group.slot_axis_radio,
  187. "excellon_editor_slot_angle":
  188. self.ui.excellon_defaults_form.excellon_editor_group.slot_angle_spinner,
  189. "excellon_editor_slot_length":
  190. self.ui.excellon_defaults_form.excellon_editor_group.slot_length_entry,
  191. # Excellon Slots
  192. "excellon_editor_slot_array_size":
  193. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_size_entry,
  194. "excellon_editor_slot_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.slot_array_axis_radio,
  195. "excellon_editor_slot_lin_pitch":
  196. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_pitch_entry,
  197. "excellon_editor_slot_lin_angle":
  198. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_angle_entry,
  199. "excellon_editor_slot_circ_dir":
  200. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_dir_radio,
  201. "excellon_editor_slot_circ_angle":
  202. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
  203. # Geometry General
  204. "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb,
  205. "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry,
  206. "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry,
  207. "geometry_plot_line": self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry,
  208. # Geometry Options
  209. "geometry_cutz": self.ui.geometry_defaults_form.geometry_opt_group.cutz_entry,
  210. "geometry_travelz": self.ui.geometry_defaults_form.geometry_opt_group.travelz_entry,
  211. "geometry_feedrate": self.ui.geometry_defaults_form.geometry_opt_group.cncfeedrate_entry,
  212. "geometry_feedrate_z": self.ui.geometry_defaults_form.geometry_opt_group.feedrate_z_entry,
  213. "geometry_spindlespeed": self.ui.geometry_defaults_form.geometry_opt_group.cncspindlespeed_entry,
  214. "geometry_dwell": self.ui.geometry_defaults_form.geometry_opt_group.dwell_cb,
  215. "geometry_dwelltime": self.ui.geometry_defaults_form.geometry_opt_group.dwelltime_entry,
  216. "geometry_ppname_g": self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb,
  217. "geometry_toolchange": self.ui.geometry_defaults_form.geometry_opt_group.toolchange_cb,
  218. "geometry_toolchangez": self.ui.geometry_defaults_form.geometry_opt_group.toolchangez_entry,
  219. "geometry_endz": self.ui.geometry_defaults_form.geometry_opt_group.endz_entry,
  220. "geometry_endxy": self.ui.geometry_defaults_form.geometry_opt_group.endxy_entry,
  221. "geometry_depthperpass": self.ui.geometry_defaults_form.geometry_opt_group.depthperpass_entry,
  222. "geometry_multidepth": self.ui.geometry_defaults_form.geometry_opt_group.multidepth_cb,
  223. # Geometry Advanced Options
  224. "geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_adv_opt_group.toolchangexy_entry,
  225. "geometry_startz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gstartz_entry,
  226. "geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_rapid_entry,
  227. "geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
  228. "geometry_extracut_length": self.ui.geometry_defaults_form.geometry_adv_opt_group.e_cut_entry,
  229. "geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry,
  230. "geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry,
  231. "geometry_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,
  232. "geometry_f_plunge": self.ui.geometry_defaults_form.geometry_adv_opt_group.fplunge_cb,
  233. "geometry_segx": self.ui.geometry_defaults_form.geometry_adv_opt_group.segx_entry,
  234. "geometry_segy": self.ui.geometry_defaults_form.geometry_adv_opt_group.segy_entry,
  235. # Geometry Editor
  236. "geometry_editor_sel_limit": self.ui.geometry_defaults_form.geometry_editor_group.sel_limit_entry,
  237. "geometry_editor_milling_type": self.ui.geometry_defaults_form.geometry_editor_group.milling_type_radio,
  238. # CNCJob General
  239. "cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb,
  240. "cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_gen_group.cncplot_method_radio,
  241. "cncjob_annotation": self.ui.cncjob_defaults_form.cncjob_gen_group.annotation_cb,
  242. "cncjob_tooldia": self.ui.cncjob_defaults_form.cncjob_gen_group.tooldia_entry,
  243. "cncjob_coords_type": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_type_radio,
  244. "cncjob_coords_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_dec_entry,
  245. "cncjob_fr_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.fr_dec_entry,
  246. "cncjob_steps_per_circle": self.ui.cncjob_defaults_form.cncjob_gen_group.steps_per_circle_entry,
  247. "cncjob_line_ending": self.ui.cncjob_defaults_form.cncjob_gen_group.line_ending_cb,
  248. "cncjob_plot_line": self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry,
  249. "cncjob_plot_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry,
  250. "cncjob_travel_line": self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry,
  251. "cncjob_travel_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_entry,
  252. # CNC Job Options
  253. "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_opt_group.prepend_text,
  254. "cncjob_append": self.ui.cncjob_defaults_form.cncjob_opt_group.append_text,
  255. # CNC Job Advanced Options
  256. "cncjob_toolchange_macro": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_text,
  257. "cncjob_toolchange_macro_enable": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.toolchange_cb,
  258. "cncjob_annotation_fontsize": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontsize_sp,
  259. "cncjob_annotation_fontcolor": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry,
  260. # NCC Tool
  261. "tools_ncctools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry,
  262. "tools_nccorder": self.ui.tools_defaults_form.tools_ncc_group.ncc_order_radio,
  263. "tools_nccoverlap": self.ui.tools_defaults_form.tools_ncc_group.ncc_overlap_entry,
  264. "tools_nccmargin": self.ui.tools_defaults_form.tools_ncc_group.ncc_margin_entry,
  265. "tools_nccmethod": self.ui.tools_defaults_form.tools_ncc_group.ncc_method_combo,
  266. "tools_nccconnect": self.ui.tools_defaults_form.tools_ncc_group.ncc_connect_cb,
  267. "tools_ncccontour": self.ui.tools_defaults_form.tools_ncc_group.ncc_contour_cb,
  268. "tools_nccrest": self.ui.tools_defaults_form.tools_ncc_group.ncc_rest_cb,
  269. "tools_ncc_offset_choice": self.ui.tools_defaults_form.tools_ncc_group.ncc_choice_offset_cb,
  270. "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner,
  271. "tools_nccref": self.ui.tools_defaults_form.tools_ncc_group.select_combo,
  272. "tools_ncc_area_shape": self.ui.tools_defaults_form.tools_ncc_group.area_shape_radio,
  273. "tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio,
  274. "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio,
  275. "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio,
  276. "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry,
  277. "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry,
  278. "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry,
  279. "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry,
  280. # CutOut Tool
  281. "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry,
  282. "tools_cutoutkind": self.ui.tools_defaults_form.tools_cutout_group.obj_kind_combo,
  283. "tools_cutoutmargin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry,
  284. "tools_cutout_z": self.ui.tools_defaults_form.tools_cutout_group.cutz_entry,
  285. "tools_cutout_depthperpass": self.ui.tools_defaults_form.tools_cutout_group.maxdepth_entry,
  286. "tools_cutout_mdepth": self.ui.tools_defaults_form.tools_cutout_group.mpass_cb,
  287. "tools_cutoutgapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry,
  288. "tools_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo,
  289. "tools_cutout_convexshape": self.ui.tools_defaults_form.tools_cutout_group.convex_box,
  290. # Paint Area Tool
  291. "tools_painttooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry,
  292. "tools_paintorder": self.ui.tools_defaults_form.tools_paint_group.paint_order_radio,
  293. "tools_paintoverlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry,
  294. "tools_paintmargin": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry,
  295. "tools_paintmethod": self.ui.tools_defaults_form.tools_paint_group.paintmethod_combo,
  296. "tools_selectmethod": self.ui.tools_defaults_form.tools_paint_group.selectmethod_combo,
  297. "tools_paint_area_shape": self.ui.tools_defaults_form.tools_paint_group.area_shape_radio,
  298. "tools_pathconnect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb,
  299. "tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
  300. "tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
  301. "tools_paintrest": self.ui.tools_defaults_form.tools_paint_group.rest_cb,
  302. "tools_painttool_type": self.ui.tools_defaults_form.tools_paint_group.tool_type_radio,
  303. "tools_paintcutz": self.ui.tools_defaults_form.tools_paint_group.cutz_entry,
  304. "tools_painttipdia": self.ui.tools_defaults_form.tools_paint_group.tipdia_entry,
  305. "tools_painttipangle": self.ui.tools_defaults_form.tools_paint_group.tipangle_entry,
  306. "tools_paintnewdia": self.ui.tools_defaults_form.tools_paint_group.newdia_entry,
  307. # 2-sided Tool
  308. "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
  309. "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
  310. "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry,
  311. "tools_2sided_allign_axis": self.ui.tools_defaults_form.tools_2sided_group.align_axis_radio,
  312. # Film Tool
  313. "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio,
  314. "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry,
  315. "tools_film_scale_stroke": self.ui.tools_defaults_form.tools_film_group.film_scale_stroke_entry,
  316. "tools_film_color": self.ui.tools_defaults_form.tools_film_group.film_color_entry,
  317. "tools_film_scale_cb": self.ui.tools_defaults_form.tools_film_group.film_scale_cb,
  318. "tools_film_scale_x_entry": self.ui.tools_defaults_form.tools_film_group.film_scalex_entry,
  319. "tools_film_scale_y_entry": self.ui.tools_defaults_form.tools_film_group.film_scaley_entry,
  320. "tools_film_skew_cb": self.ui.tools_defaults_form.tools_film_group.film_skew_cb,
  321. "tools_film_skew_x_entry": self.ui.tools_defaults_form.tools_film_group.film_skewx_entry,
  322. "tools_film_skew_y_entry": self.ui.tools_defaults_form.tools_film_group.film_skewy_entry,
  323. "tools_film_skew_ref_radio": self.ui.tools_defaults_form.tools_film_group.film_skew_reference,
  324. "tools_film_mirror_cb": self.ui.tools_defaults_form.tools_film_group.film_mirror_cb,
  325. "tools_film_mirror_axis_radio": self.ui.tools_defaults_form.tools_film_group.film_mirror_axis,
  326. "tools_film_file_type_radio": self.ui.tools_defaults_form.tools_film_group.file_type_radio,
  327. "tools_film_orientation": self.ui.tools_defaults_form.tools_film_group.orientation_radio,
  328. "tools_film_pagesize": self.ui.tools_defaults_form.tools_film_group.pagesize_combo,
  329. # Panelize Tool
  330. "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns,
  331. "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows,
  332. "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns,
  333. "tools_panelize_rows": self.ui.tools_defaults_form.tools_panelize_group.prows,
  334. "tools_panelize_constrain": self.ui.tools_defaults_form.tools_panelize_group.pconstrain_cb,
  335. "tools_panelize_constrainx": self.ui.tools_defaults_form.tools_panelize_group.px_width_entry,
  336. "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry,
  337. "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio,
  338. # Calculators Tool
  339. "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry,
  340. "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry,
  341. "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry,
  342. "tools_calc_electro_length": self.ui.tools_defaults_form.tools_calculators_group.pcblength_entry,
  343. "tools_calc_electro_width": self.ui.tools_defaults_form.tools_calculators_group.pcbwidth_entry,
  344. "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry,
  345. "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry,
  346. # Transformations Tool
  347. "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry,
  348. "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry,
  349. "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry,
  350. "tools_transform_scale_x": self.ui.tools_defaults_form.tools_transform_group.scalex_entry,
  351. "tools_transform_scale_y": self.ui.tools_defaults_form.tools_transform_group.scaley_entry,
  352. "tools_transform_scale_link": self.ui.tools_defaults_form.tools_transform_group.link_cb,
  353. "tools_transform_scale_reference": self.ui.tools_defaults_form.tools_transform_group.reference_cb,
  354. "tools_transform_offset_x": self.ui.tools_defaults_form.tools_transform_group.offx_entry,
  355. "tools_transform_offset_y": self.ui.tools_defaults_form.tools_transform_group.offy_entry,
  356. "tools_transform_mirror_reference": self.ui.tools_defaults_form.tools_transform_group.mirror_reference_cb,
  357. "tools_transform_mirror_point": self.ui.tools_defaults_form.tools_transform_group.flip_ref_entry,
  358. "tools_transform_buffer_dis": self.ui.tools_defaults_form.tools_transform_group.buffer_entry,
  359. "tools_transform_buffer_factor": self.ui.tools_defaults_form.tools_transform_group.buffer_factor_entry,
  360. "tools_transform_buffer_corner": self.ui.tools_defaults_form.tools_transform_group.buffer_rounded_cb,
  361. # SolderPaste Dispensing Tool
  362. "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry,
  363. "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry,
  364. "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry,
  365. "tools_solderpaste_z_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.z_dispense_entry,
  366. "tools_solderpaste_z_stop": self.ui.tools_defaults_form.tools_solderpaste_group.z_stop_entry,
  367. "tools_solderpaste_z_travel": self.ui.tools_defaults_form.tools_solderpaste_group.z_travel_entry,
  368. "tools_solderpaste_z_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.z_toolchange_entry,
  369. "tools_solderpaste_xy_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.xy_toolchange_entry,
  370. "tools_solderpaste_frxy": self.ui.tools_defaults_form.tools_solderpaste_group.frxy_entry,
  371. "tools_solderpaste_frz": self.ui.tools_defaults_form.tools_solderpaste_group.frz_entry,
  372. "tools_solderpaste_frz_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.frz_dispense_entry,
  373. "tools_solderpaste_speedfwd": self.ui.tools_defaults_form.tools_solderpaste_group.speedfwd_entry,
  374. "tools_solderpaste_dwellfwd": self.ui.tools_defaults_form.tools_solderpaste_group.dwellfwd_entry,
  375. "tools_solderpaste_speedrev": self.ui.tools_defaults_form.tools_solderpaste_group.speedrev_entry,
  376. "tools_solderpaste_dwellrev": self.ui.tools_defaults_form.tools_solderpaste_group.dwellrev_entry,
  377. "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
  378. "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
  379. # #######################################################################################################
  380. # ########################################## TOOLS 2 ####################################################
  381. # #######################################################################################################
  382. # Optimal Tool
  383. "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
  384. # Check Rules Tool
  385. "tools_cr_trace_size": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_cb,
  386. "tools_cr_trace_size_val": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_entry,
  387. "tools_cr_c2c": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_cb,
  388. "tools_cr_c2c_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_entry,
  389. "tools_cr_c2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_cb,
  390. "tools_cr_c2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_entry,
  391. "tools_cr_s2s": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_cb,
  392. "tools_cr_s2s_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_entry,
  393. "tools_cr_s2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_cb,
  394. "tools_cr_s2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_entry,
  395. "tools_cr_s2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_cb,
  396. "tools_cr_s2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_entry,
  397. "tools_cr_sm2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_cb,
  398. "tools_cr_sm2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_entry,
  399. "tools_cr_ri": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_cb,
  400. "tools_cr_ri_val": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_entry,
  401. "tools_cr_h2h": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_cb,
  402. "tools_cr_h2h_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_entry,
  403. "tools_cr_dh": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_cb,
  404. "tools_cr_dh_val": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_entry,
  405. # QRCode Tool
  406. "tools_qrcode_version": self.ui.tools2_defaults_form.tools2_qrcode_group.version_entry,
  407. "tools_qrcode_error": self.ui.tools2_defaults_form.tools2_qrcode_group.error_radio,
  408. "tools_qrcode_box_size": self.ui.tools2_defaults_form.tools2_qrcode_group.bsize_entry,
  409. "tools_qrcode_border_size": self.ui.tools2_defaults_form.tools2_qrcode_group.border_size_entry,
  410. "tools_qrcode_qrdata": self.ui.tools2_defaults_form.tools2_qrcode_group.text_data,
  411. "tools_qrcode_polarity": self.ui.tools2_defaults_form.tools2_qrcode_group.pol_radio,
  412. "tools_qrcode_rounded": self.ui.tools2_defaults_form.tools2_qrcode_group.bb_radio,
  413. "tools_qrcode_fill_color": self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry,
  414. "tools_qrcode_back_color": self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry,
  415. "tools_qrcode_sel_limit": self.ui.tools2_defaults_form.tools2_qrcode_group.sel_limit_entry,
  416. # Copper Thieving Tool
  417. "tools_copper_thieving_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
  418. "tools_copper_thieving_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
  419. "tools_copper_thieving_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
  420. "tools_copper_thieving_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
  421. "tools_copper_thieving_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
  422. "tools_copper_thieving_fill_type": self.ui.tools2_defaults_form.tools2_cfill_group.fill_type_radio,
  423. "tools_copper_thieving_dots_dia": self.ui.tools2_defaults_form.tools2_cfill_group.dot_dia_entry,
  424. "tools_copper_thieving_dots_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.dot_spacing_entry,
  425. "tools_copper_thieving_squares_size": self.ui.tools2_defaults_form.tools2_cfill_group.square_size_entry,
  426. "tools_copper_thieving_squares_spacing":
  427. self.ui.tools2_defaults_form.tools2_cfill_group.squares_spacing_entry,
  428. "tools_copper_thieving_lines_size": self.ui.tools2_defaults_form.tools2_cfill_group.line_size_entry,
  429. "tools_copper_thieving_lines_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.lines_spacing_entry,
  430. "tools_copper_thieving_rb_margin": self.ui.tools2_defaults_form.tools2_cfill_group.rb_margin_entry,
  431. "tools_copper_thieving_rb_thickness": self.ui.tools2_defaults_form.tools2_cfill_group.rb_thickness_entry,
  432. "tools_copper_thieving_mask_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_ppm_entry,
  433. # Fiducials Tool
  434. "tools_fiducials_dia": self.ui.tools2_defaults_form.tools2_fiducials_group.dia_entry,
  435. "tools_fiducials_margin": self.ui.tools2_defaults_form.tools2_fiducials_group.margin_entry,
  436. "tools_fiducials_mode": self.ui.tools2_defaults_form.tools2_fiducials_group.mode_radio,
  437. "tools_fiducials_second_pos": self.ui.tools2_defaults_form.tools2_fiducials_group.pos_radio,
  438. "tools_fiducials_type": self.ui.tools2_defaults_form.tools2_fiducials_group.fid_type_radio,
  439. "tools_fiducials_line_thickness": self.ui.tools2_defaults_form.tools2_fiducials_group.line_thickness_entry,
  440. # Calibration Tool
  441. "tools_cal_calsource": self.ui.tools2_defaults_form.tools2_cal_group.cal_source_radio,
  442. "tools_cal_travelz": self.ui.tools2_defaults_form.tools2_cal_group.travelz_entry,
  443. "tools_cal_verz": self.ui.tools2_defaults_form.tools2_cal_group.verz_entry,
  444. "tools_cal_zeroz": self.ui.tools2_defaults_form.tools2_cal_group.zeroz_cb,
  445. "tools_cal_toolchangez": self.ui.tools2_defaults_form.tools2_cal_group.toolchangez_entry,
  446. "tools_cal_toolchange_xy": self.ui.tools2_defaults_form.tools2_cal_group.toolchange_xy_entry,
  447. "tools_cal_sec_point": self.ui.tools2_defaults_form.tools2_cal_group.second_point_radio,
  448. # Extract Drills Tool
  449. "tools_edrills_hole_type": self.ui.tools2_defaults_form.tools2_edrills_group.hole_size_radio,
  450. "tools_edrills_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_edrills_group.dia_entry,
  451. "tools_edrills_hole_prop_factor": self.ui.tools2_defaults_form.tools2_edrills_group.factor_entry,
  452. "tools_edrills_circular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.circular_ring_entry,
  453. "tools_edrills_oblong_ring": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_ring_entry,
  454. "tools_edrills_square_ring": self.ui.tools2_defaults_form.tools2_edrills_group.square_ring_entry,
  455. "tools_edrills_rectangular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_ring_entry,
  456. "tools_edrills_others_ring": self.ui.tools2_defaults_form.tools2_edrills_group.other_ring_entry,
  457. "tools_edrills_circular": self.ui.tools2_defaults_form.tools2_edrills_group.circular_cb,
  458. "tools_edrills_oblong": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_cb,
  459. "tools_edrills_square": self.ui.tools2_defaults_form.tools2_edrills_group.square_cb,
  460. "tools_edrills_rectangular": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_cb,
  461. "tools_edrills_others": self.ui.tools2_defaults_form.tools2_edrills_group.other_cb,
  462. # Punch Gerber Tool
  463. "tools_punch_hole_type": self.ui.tools2_defaults_form.tools2_punch_group.hole_size_radio,
  464. "tools_punch_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_punch_group.dia_entry,
  465. "tools_punch_hole_prop_factor": self.ui.tools2_defaults_form.tools2_punch_group.factor_entry,
  466. "tools_punch_circular_ring": self.ui.tools2_defaults_form.tools2_punch_group.circular_ring_entry,
  467. "tools_punch_oblong_ring": self.ui.tools2_defaults_form.tools2_punch_group.oblong_ring_entry,
  468. "tools_punch_square_ring": self.ui.tools2_defaults_form.tools2_punch_group.square_ring_entry,
  469. "tools_punch_rectangular_ring": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_ring_entry,
  470. "tools_punch_others_ring": self.ui.tools2_defaults_form.tools2_punch_group.other_ring_entry,
  471. "tools_punch_circular": self.ui.tools2_defaults_form.tools2_punch_group.circular_cb,
  472. "tools_punch_oblong": self.ui.tools2_defaults_form.tools2_punch_group.oblong_cb,
  473. "tools_punch_square": self.ui.tools2_defaults_form.tools2_punch_group.square_cb,
  474. "tools_punch_rectangular": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_cb,
  475. "tools_punch_others": self.ui.tools2_defaults_form.tools2_punch_group.other_cb,
  476. # Invert Gerber Tool
  477. "tools_invert_margin": self.ui.tools2_defaults_form.tools2_invert_group.margin_entry,
  478. "tools_invert_join_style": self.ui.tools2_defaults_form.tools2_invert_group.join_radio,
  479. # Utilities
  480. # File associations
  481. "fa_excellon": self.ui.util_defaults_form.fa_excellon_group.exc_list_text,
  482. "fa_gcode": self.ui.util_defaults_form.fa_gcode_group.gco_list_text,
  483. # "fa_geometry": self.ui.util_defaults_form.fa_geometry_group.close_paths_cb,
  484. "fa_gerber": self.ui.util_defaults_form.fa_gerber_group.grb_list_text,
  485. "util_autocomplete_keywords": self.ui.util_defaults_form.kw_group.kw_list_text,
  486. }
  487. self.child_forms = {
  488. "general": ui.general_defaults_form,
  489. "gerber": ui.gerber_defaults_form,
  490. "excellon": ui.excellon_defaults_form,
  491. "geometry": ui.geometry_defaults_form,
  492. "cncjob": ui.cncjob_defaults_form,
  493. "tools": ui.tools_defaults_form,
  494. "tools2": ui.tools2_defaults_form,
  495. "util": ui.util_defaults_form
  496. }
  497. self.child_scroll_areas = {
  498. "general": ui.general_scroll_area,
  499. "gerber": ui.gerber_scroll_area,
  500. "excellon": ui.excellon_scroll_area,
  501. "geometry": ui.geometry_scroll_area,
  502. "cncjob": ui.cncjob_scroll_area,
  503. "tools": ui.tools_scroll_area,
  504. "tools2": ui.tools2_scroll_area,
  505. "util": ui.fa_scroll_area
  506. }
  507. self.sections = [
  508. # FIXME!
  509. ui.general_defaults_form
  510. ]
  511. def get_form_fields(self) -> Dict[str, Any]:
  512. result = {}
  513. result.update(self.defaults_form_fields)
  514. result.update(self._option_field_dict())
  515. return result
  516. def get_form_field(self, option: str) -> Any:
  517. return self.get_form_fields()[option]
  518. def option_dict(self) -> Dict[str, OptionUI]:
  519. result = {}
  520. for section in self.sections:
  521. sectionoptions = section.option_dict()
  522. result.update(sectionoptions)
  523. return result
  524. def _option_field_dict(self):
  525. result = {k: v.get_field() for k, v in self.option_dict().items()}
  526. return result
  527. def defaults_read_form(self):
  528. """
  529. Will read all the values in the Preferences GUI and update the defaults dictionary.
  530. :return: None
  531. """
  532. for option in self.get_form_fields():
  533. if option in self.defaults:
  534. try:
  535. self.defaults[option] = self.get_form_field(option=option).get_value()
  536. except Exception as e:
  537. log.debug("App.defaults_read_form() --> %s" % str(e))
  538. def defaults_write_form(self, factor=None, fl_units=None, source_dict=None):
  539. """
  540. Will set the values for all the GUI elements in Preferences GUI based on the values found in the
  541. self.defaults dictionary.
  542. :param factor: will apply a factor to the values that written in the GUI elements
  543. :param fl_units: current measuring units in FlatCAM: Metric or Inch
  544. :param source_dict: the repository of options, usually is the self.defaults
  545. :return: None
  546. """
  547. options_storage = self.defaults if source_dict is None else source_dict
  548. for option in options_storage:
  549. if source_dict:
  550. self.defaults_write_form_field(option, factor=factor, units=fl_units, defaults_dict=source_dict)
  551. else:
  552. self.defaults_write_form_field(option, factor=factor, units=fl_units)
  553. def defaults_write_form_field(self, field, factor=None, units=None, defaults_dict=None):
  554. """
  555. Basically it is the worker in the self.defaults_write_form()
  556. :param field: the GUI element in Preferences GUI to be updated
  557. :param factor: factor to be applied to the field parameter
  558. :param units: current FlatCAM measuring units
  559. :param defaults_dict: the defaults storage
  560. :return: None, it updates GUI elements
  561. """
  562. def_dict = self.defaults if defaults_dict is None else defaults_dict
  563. try:
  564. value = def_dict[field]
  565. log.debug("value is " + str(value) + " and factor is "+str(factor))
  566. if factor is not None:
  567. value *= factor
  568. form_field = self.get_form_field(option=field)
  569. if units is None:
  570. form_field.set_value(value)
  571. elif (units == 'IN' or units == 'MM') and (field == 'global_gridx' or field == 'global_gridy'):
  572. form_field.set_value(value)
  573. except KeyError:
  574. pass
  575. except AttributeError:
  576. log.debug(field)
  577. def show_preferences_gui(self):
  578. """
  579. Called to initialize and show the Preferences GUI
  580. :return: None
  581. """
  582. for section in self.child_scroll_areas:
  583. scroll_area = self.child_scroll_areas[section]
  584. form = self.child_forms[section]
  585. try:
  586. scroll_area.takeWidget()
  587. except Exception:
  588. log.debug("Nothing to remove for section "+section)
  589. scroll_area.setWidget(form)
  590. form.show()
  591. # Initialize the color box's color in Preferences -> Global -> Colo
  592. self.__init_color_pickers()
  593. # Button handlers
  594. self.ui.pref_save_button.clicked.connect(lambda: self.on_save_button(save_to_file=True))
  595. self.ui.pref_apply_button.clicked.connect(lambda: self.on_save_button(save_to_file=False))
  596. self.ui.pref_close_button.clicked.connect(self.on_pref_close_button)
  597. self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
  598. log.debug("Finished Preferences GUI form initialization.")
  599. def __init_color_pickers(self):
  600. # Init Gerber Plot Colors
  601. self.ui.gerber_defaults_form.gerber_gen_group.pf_color_entry.set_value(self.defaults['gerber_plot_fill'])
  602. self.ui.gerber_defaults_form.gerber_gen_group.pf_color_button.setStyleSheet(
  603. "background-color:%s;"
  604. "border-color: dimgray" % str(self.defaults['gerber_plot_fill'])[:7])
  605. self.ui.gerber_defaults_form.gerber_gen_group.pf_color_alpha_spinner.set_value(
  606. int(self.defaults['gerber_plot_fill'][7:9], 16))
  607. self.ui.gerber_defaults_form.gerber_gen_group.pf_color_alpha_slider.setValue(
  608. int(self.defaults['gerber_plot_fill'][7:9], 16))
  609. self.ui.gerber_defaults_form.gerber_gen_group.pl_color_entry.set_value(self.defaults['gerber_plot_line'])
  610. self.ui.gerber_defaults_form.gerber_gen_group.pl_color_button.setStyleSheet(
  611. "background-color:%s;"
  612. "border-color: dimgray" % str(self.defaults['gerber_plot_line'])[:7])
  613. # Init Excellon Plot Colors
  614. self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry.set_value(
  615. self.defaults['excellon_plot_fill'])
  616. self.ui.excellon_defaults_form.excellon_gen_group.fill_color_button.setStyleSheet(
  617. "background-color:%s;"
  618. "border-color: dimgray" % str(self.defaults['excellon_plot_fill'])[:7])
  619. self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_spinner.set_value(
  620. int(self.defaults['excellon_plot_fill'][7:9], 16))
  621. self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_slider.setValue(
  622. int(self.defaults['excellon_plot_fill'][7:9], 16))
  623. self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry.set_value(
  624. self.defaults['excellon_plot_line'])
  625. self.ui.excellon_defaults_form.excellon_gen_group.line_color_button.setStyleSheet(
  626. "background-color:%s;"
  627. "border-color: dimgray" % str(self.defaults['excellon_plot_line'])[:7])
  628. # Init Geometry Plot Colors
  629. self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry.set_value(
  630. self.defaults['geometry_plot_line'])
  631. self.ui.geometry_defaults_form.geometry_gen_group.line_color_button.setStyleSheet(
  632. "background-color:%s;"
  633. "border-color: dimgray" % str(self.defaults['geometry_plot_line'])[:7])
  634. # Init CNCJob Travel Line Colors
  635. self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_entry.set_value(
  636. self.defaults['cncjob_travel_fill'])
  637. self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_button.setStyleSheet(
  638. "background-color:%s;"
  639. "border-color: dimgray" % str(self.defaults['cncjob_travel_fill'])[:7])
  640. self.ui.cncjob_defaults_form.cncjob_gen_group.tcolor_alpha_spinner.set_value(
  641. int(self.defaults['cncjob_travel_fill'][7:9], 16))
  642. self.ui.cncjob_defaults_form.cncjob_gen_group.tcolor_alpha_slider.setValue(
  643. int(self.defaults['cncjob_travel_fill'][7:9], 16))
  644. self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry.set_value(
  645. self.defaults['cncjob_travel_line'])
  646. self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_button.setStyleSheet(
  647. "background-color:%s;"
  648. "border-color: dimgray" % str(self.defaults['cncjob_travel_line'])[:7])
  649. # Init CNCJob Plot Colors
  650. self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry.set_value(
  651. self.defaults['cncjob_plot_fill'])
  652. self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_button.setStyleSheet(
  653. "background-color:%s;"
  654. "border-color: dimgray" % str(self.defaults['cncjob_plot_fill'])[:7])
  655. self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry.set_value(
  656. self.defaults['cncjob_plot_line'])
  657. self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_button.setStyleSheet(
  658. "background-color:%s;"
  659. "border-color: dimgray" % str(self.defaults['cncjob_plot_line'])[:7])
  660. # Init the Annotation CNC Job color
  661. self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry.set_value(
  662. self.defaults['cncjob_annotation_fontcolor'])
  663. self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_button.setStyleSheet(
  664. "background-color:%s;"
  665. "border-color: dimgray" % str(self.defaults['cncjob_annotation_fontcolor'])[:7])
  666. # Init the Tool Film color
  667. self.ui.tools_defaults_form.tools_film_group.film_color_entry.set_value(
  668. self.defaults['tools_film_color'])
  669. self.ui.tools_defaults_form.tools_film_group.film_color_button.setStyleSheet(
  670. "background-color:%s;"
  671. "border-color: dimgray" % str(self.defaults['tools_film_color'])[:7]
  672. )
  673. # Init the Tool QRCode colors
  674. self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry.set_value(
  675. self.defaults['tools_qrcode_fill_color'])
  676. self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_button.setStyleSheet(
  677. "background-color:%s;"
  678. "border-color: dimgray" % str(self.defaults['tools_qrcode_fill_color'])[:7])
  679. self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry.set_value(
  680. self.defaults['tools_qrcode_back_color'])
  681. self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_button.setStyleSheet(
  682. "background-color:%s;"
  683. "border-color: dimgray" % str(self.defaults['tools_qrcode_back_color'])[:7])
  684. def on_save_button(self, save_to_file=True):
  685. log.debug("on_save_button() --> Applying preferences to file.")
  686. # Preferences saved, update flag
  687. self.preferences_changed_flag = False
  688. # Preferences save, update the color of the Preferences Tab text
  689. for idx in range(self.ui.plot_tab_area.count()):
  690. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  691. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  692. # restore the default stylesheet by setting a blank one
  693. self.ui.pref_apply_button.setStyleSheet("")
  694. self.inform.emit('%s' % _("Preferences applied."))
  695. # make sure we update the self.current_defaults dict used to undo changes to self.defaults
  696. self.defaults.current_defaults.update(self.defaults)
  697. if save_to_file:
  698. self.save_defaults(silent=False)
  699. # load the defaults so they are updated into the app
  700. self.defaults.load(filename=os.path.join(self.data_path, 'current_defaults.FlatConfig'))
  701. # Re-fresh project options
  702. self.ui.app.on_options_app2project()
  703. settgs = QSettings("Open Source", "FlatCAM")
  704. # save the notebook font size
  705. fsize = self.get_form_field("notebook_font_size").get_value()
  706. settgs.setValue('notebook_font_size', fsize)
  707. # save the axis font size
  708. g_fsize = self.get_form_field("axis_font_size").get_value()
  709. settgs.setValue('axis_font_size', g_fsize)
  710. # save the textbox font size
  711. tb_fsize = self.get_form_field("textbox_font_size").get_value()
  712. settgs.setValue('textbox_font_size', tb_fsize)
  713. settgs.setValue(
  714. 'machinist',
  715. 1 if self.get_form_field("global_machinist_setting").get_value() else 0
  716. )
  717. # This will write the setting to the platform specific storage.
  718. del settgs
  719. if save_to_file:
  720. # close the tab and delete it
  721. for idx in range(self.ui.plot_tab_area.count()):
  722. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  723. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  724. self.ui.plot_tab_area.closeTab(idx)
  725. break
  726. def on_pref_close_button(self):
  727. # Preferences saved, update flag
  728. self.preferences_changed_flag = False
  729. self.ignore_tab_close_event = True
  730. try:
  731. self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.disconnect()
  732. except (TypeError, AttributeError):
  733. pass
  734. self.defaults_write_form(source_dict=self.defaults.current_defaults)
  735. self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
  736. lambda: self.ui.app.on_toggle_units(no_pref=False))
  737. self.defaults.update(self.defaults.current_defaults)
  738. # Preferences save, update the color of the Preferences Tab text
  739. for idx in range(self.ui.plot_tab_area.count()):
  740. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  741. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  742. self.ui.plot_tab_area.closeTab(idx)
  743. break
  744. self.inform.emit('%s' % _("Preferences closed without saving."))
  745. self.ignore_tab_close_event = False
  746. def on_restore_defaults_preferences(self):
  747. """
  748. Loads the application's factory default settings into ``self.defaults``.
  749. :return: None
  750. """
  751. log.debug("on_restore_defaults_preferences()")
  752. self.defaults.reset_to_factory_defaults()
  753. self.on_preferences_edited()
  754. self.inform.emit('[success] %s' % _("Preferences default values are restored."))
  755. def save_defaults(self, silent=False, data_path=None, first_time=False):
  756. """
  757. Saves application default options
  758. ``self.defaults`` to current_defaults.FlatConfig file.
  759. Save the toolbars visibility status to the preferences file (current_defaults.FlatConfig) to be
  760. used at the next launch of the application.
  761. :param silent: Whether to display a message in status bar or not; boolean
  762. :param data_path: The path where to save the preferences file (current_defaults.FlatConfig)
  763. When the application is portable it should be a mobile location.
  764. :param first_time: Boolean. If True will execute some code when the app is run first time
  765. :return: None
  766. """
  767. self.defaults.report_usage("save_defaults")
  768. if data_path is None:
  769. data_path = self.data_path
  770. self.defaults.propagate_defaults()
  771. if first_time is False:
  772. self.save_toolbar_view()
  773. # Save the options to disk
  774. filename = os.path.join(data_path, "current_defaults.FlatConfig")
  775. try:
  776. self.defaults.write(filename=filename)
  777. except Exception as e:
  778. log.error("save_defaults() --> Failed to write defaults to file %s" % str(e))
  779. self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
  780. return
  781. if not silent:
  782. self.inform.emit('[success] %s' % _("Preferences saved."))
  783. # update the autosave timer
  784. self.ui.app.save_project_auto_update()
  785. def save_toolbar_view(self):
  786. """
  787. Will save the toolbar view state to the defaults
  788. :return: None
  789. """
  790. # Save the toolbar view
  791. tb_status = 0
  792. if self.ui.toolbarfile.isVisible():
  793. tb_status += 1
  794. if self.ui.toolbargeo.isVisible():
  795. tb_status += 2
  796. if self.ui.toolbarview.isVisible():
  797. tb_status += 4
  798. if self.ui.toolbartools.isVisible():
  799. tb_status += 8
  800. if self.ui.exc_edit_toolbar.isVisible():
  801. tb_status += 16
  802. if self.ui.geo_edit_toolbar.isVisible():
  803. tb_status += 32
  804. if self.ui.grb_edit_toolbar.isVisible():
  805. tb_status += 64
  806. if self.ui.snap_toolbar.isVisible():
  807. tb_status += 128
  808. if self.ui.toolbarshell.isVisible():
  809. tb_status += 256
  810. self.defaults["global_toolbar_view"] = tb_status
  811. def on_preferences_edited(self):
  812. """
  813. Executed when a preference was changed in the Edit -> Preferences tab.
  814. Will color the Preferences tab text to Red color.
  815. :return:
  816. """
  817. if self.preferences_changed_flag is False:
  818. self.inform.emit('[WARNING_NOTCL] %s' % _("Preferences edited but not saved."))
  819. for idx in range(self.ui.plot_tab_area.count()):
  820. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  821. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('red'))
  822. self.ui.pref_apply_button.setStyleSheet("QPushButton {color: red;}")
  823. self.preferences_changed_flag = True
  824. def on_close_preferences_tab(self):
  825. if self.ignore_tab_close_event:
  826. return
  827. # disconnect
  828. for idx in range(self.ui.pref_tab_area.count()):
  829. for tb in self.ui.pref_tab_area.widget(idx).findChildren(QtCore.QObject):
  830. try:
  831. tb.textEdited.disconnect(self.on_preferences_edited)
  832. except (TypeError, AttributeError):
  833. pass
  834. try:
  835. tb.modificationChanged.disconnect(self.on_preferences_edited)
  836. except (TypeError, AttributeError):
  837. pass
  838. try:
  839. tb.toggled.disconnect(self.on_preferences_edited)
  840. except (TypeError, AttributeError):
  841. pass
  842. try:
  843. tb.valueChanged.disconnect(self.on_preferences_edited)
  844. except (TypeError, AttributeError):
  845. pass
  846. try:
  847. tb.currentIndexChanged.disconnect(self.on_preferences_edited)
  848. except (TypeError, AttributeError):
  849. pass
  850. # Prompt user to save
  851. if self.preferences_changed_flag is True:
  852. msgbox = QtWidgets.QMessageBox()
  853. msgbox.setText(_("One or more values are changed.\n"
  854. "Do you want to save the Preferences?"))
  855. msgbox.setWindowTitle(_("Save Preferences"))
  856. msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/save_as.png'))
  857. bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
  858. msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
  859. msgbox.setDefaultButton(bt_yes)
  860. msgbox.exec_()
  861. response = msgbox.clickedButton()
  862. if response == bt_yes:
  863. self.on_save_button(save_to_file=True)
  864. self.inform.emit('[success] %s' % _("Preferences saved."))
  865. else:
  866. self.preferences_changed_flag = False
  867. self.inform.emit('')
  868. return