diff --git a/AppGUI/preferences/PreferencesUIManager.py b/AppGUI/preferences/PreferencesUIManager.py index 33a3cec4..38c61e70 100644 --- a/AppGUI/preferences/PreferencesUIManager.py +++ b/AppGUI/preferences/PreferencesUIManager.py @@ -127,12 +127,6 @@ class PreferencesUIManager: "gerber_plot_line": self.ui.gerber_defaults_form.gerber_gen_group.pl_color_entry, # Gerber Options - "gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry, - "gerber_isopasses": self.ui.gerber_defaults_form.gerber_opt_group.iso_width_entry, - "gerber_isooverlap": self.ui.gerber_defaults_form.gerber_opt_group.iso_overlap_entry, - "gerber_combine_passes": self.ui.gerber_defaults_form.gerber_opt_group.combine_passes_cb, - "gerber_iso_scope": self.ui.gerber_defaults_form.gerber_opt_group.select_combo, - "gerber_milling_type": self.ui.gerber_defaults_form.gerber_opt_group.milling_type_radio, "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry, "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb, "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry, @@ -143,12 +137,6 @@ class PreferencesUIManager: # "gerber_aperture_scale_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.scale_aperture_entry, # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry, "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb, - "gerber_tool_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.tool_type_radio, - "gerber_vtipdia": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipdia_spinner, - "gerber_vtipangle": self.ui.gerber_defaults_form.gerber_adv_opt_group.tipangle_spinner, - "gerber_vcutz": self.ui.gerber_defaults_form.gerber_adv_opt_group.cutz_spinner, - "gerber_iso_type": self.ui.gerber_defaults_form.gerber_adv_opt_group.iso_type_radio, - "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio, "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb, "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner, @@ -221,31 +209,31 @@ class PreferencesUIManager: "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_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_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_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, @@ -270,94 +258,115 @@ class PreferencesUIManager: self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry, # Geometry General - "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb, - "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry, - "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry, - "geometry_plot_line": self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry, + "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb, + "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry, + "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry, + "geometry_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_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_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_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, + "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_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, + "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, + "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_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_spinner, + "tools_iso_tool_vtipangle": self.ui.tools_defaults_form.tools_iso_group.tipangle_spinner, + "tools_iso_tool_cutz": self.ui.tools_defaults_form.tools_iso_group.cutz_spinner, + "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, + # 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_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio, - "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio, - "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio, - "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry, - "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry, - "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry, - "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry, + "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_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio, + "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio, + "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio, + "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry, + "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry, + "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry, + "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry, # CutOut Tool "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry, diff --git a/AppGUI/preferences/tools/ToolsISOPrefGroupUI.py b/AppGUI/preferences/tools/ToolsISOPrefGroupUI.py new file mode 100644 index 00000000..3a73b4ec --- /dev/null +++ b/AppGUI/preferences/tools/ToolsISOPrefGroupUI.py @@ -0,0 +1,319 @@ +from PyQt5 import QtWidgets +from PyQt5.QtCore import QSettings + +from AppGUI.GUIElements import FCEntry, RadioSet, FCDoubleSpinner, FCComboBox, FCCheckBox, FCSpinner +from AppGUI.preferences.OptionsGroupUI import OptionsGroupUI + +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 + + +class ToolsISOPrefGroupUI(OptionsGroupUI): + def __init__(self, decimals=4, parent=None): + super(ToolsISOPrefGroupUI, self).__init__(self, parent=parent) + + self.setTitle(str(_("Isolation Tool Options"))) + self.decimals = decimals + + # ## Clear non-copper regions + self.iso_label = QtWidgets.QLabel("%s:" % _("Parameters")) + self.iso_label.setToolTip( + _("Create a Geometry object with\n" + "toolpaths to cut around polygons.") + ) + self.layout.addWidget(self.clearcopper_label) + + grid0 = QtWidgets.QGridLayout() + self.layout.addLayout(grid0) + + # Tool Dias + isotdlabel = QtWidgets.QLabel('%s:' % _('Tools Dia')) + isotdlabel.setToolTip( + _("Diameters of the tools, separated by comma.\n" + "The value of the diameter has to use the dot decimals separator.\n" + "Valid values: 0.3, 1.0") + ) + self.tool_dia_entry = FCEntry(border_color='#0069A9') + self.tool_dia_entry.setPlaceholderText(_("Comma separated values")) + + grid0.addWidget(isotdlabel, 0, 0) + grid0.addWidget(self.tool_dia_entry, 0, 1) + + # Tool order Radio Button + self.order_label = QtWidgets.QLabel('%s:' % _('Tool order')) + self.order_label.setToolTip(_("This set the way that the tools in the tools table are used.\n" + "'No' --> means that the used order is the one in the tool table\n" + "'Forward' --> means that the tools will be ordered from small to big\n" + "'Reverse' --> means that the tools will ordered from big to small\n\n" + "WARNING: using rest machining will automatically set the order\n" + "in reverse and disable this control.")) + + self.order_radio = RadioSet([{'label': _('No'), 'value': 'no'}, + {'label': _('Forward'), 'value': 'fwd'}, + {'label': _('Reverse'), 'value': 'rev'}]) + + grid0.addWidget(self.order_label, 1, 0) + grid0.addWidget(self.order_radio, 1, 1) + + # Tool Type Radio Button + self.tool_type_label = QtWidgets.QLabel('%s:' % _('Tool Type')) + self.tool_type_label.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + + self.tool_type_radio = RadioSet([{'label': _('V-shape'), 'value': 'V'}, + {'label': _('Circular'), 'value': 'C1'}]) + self.tool_type_radio.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + + grid0.addWidget(self.tool_type_label, 2, 0) + grid0.addWidget(self.tool_type_radio, 2, 1) + + # Tip Dia + self.tipdialabel = QtWidgets.QLabel('%s:' % _('V-Tip Dia')) + self.tipdialabel.setToolTip( + _("The tip diameter for V-Shape Tool")) + self.tipdia_entry = FCDoubleSpinner() + self.tipdia_entry.set_precision(self.decimals) + self.tipdia_entry.set_range(0, 1000) + self.tipdia_entry.setSingleStep(0.1) + + grid0.addWidget(self.tipdialabel, 3, 0) + grid0.addWidget(self.tipdia_entry, 3, 1) + + # Tip Angle + self.tipanglelabel = QtWidgets.QLabel('%s:' % _('V-Tip Angle')) + self.tipanglelabel.setToolTip( + _("The tip angle for V-Shape Tool.\n" + "In degrees.")) + self.tipangle_entry = FCDoubleSpinner() + self.tipangle_entry.set_precision(self.decimals) + self.tipangle_entry.set_range(1, 180) + self.tipangle_entry.setSingleStep(5) + self.tipangle_entry.setWrapping(True) + + grid0.addWidget(self.tipanglelabel, 4, 0) + grid0.addWidget(self.tipangle_entry, 4, 1) + + # Cut Z entry + cutzlabel = QtWidgets.QLabel('%s:' % _('Cut Z')) + cutzlabel.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + self.cutz_entry = FCDoubleSpinner() + self.cutz_entry.set_precision(self.decimals) + self.cutz_entry.set_range(-9999.9999, 0.0000) + self.cutz_entry.setSingleStep(0.1) + + self.cutz_entry.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + + grid0.addWidget(cutzlabel, 5, 0) + grid0.addWidget(self.cutz_entry, 5, 1) + + # New Diameter + self.newdialabel = QtWidgets.QLabel('%s:' % _('New Dia')) + self.newdialabel.setToolTip( + _("Diameter for the new tool to add in the Tool Table.\n" + "If the tool is V-shape type then this value is automatically\n" + "calculated from the other parameters.") + ) + self.newdia_entry = FCDoubleSpinner() + self.newdia_entry.set_precision(self.decimals) + self.newdia_entry.set_range(0.0001, 9999.9999) + self.newdia_entry.setSingleStep(0.1) + + grid0.addWidget(self.newdialabel, 6, 0) + grid0.addWidget(self.newdia_entry, 6, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid0.addWidget(separator_line, 7, 0, 1, 2) + + # Passes + passlabel = QtWidgets.QLabel('%s:' % _('Passes')) + passlabel.setToolTip( + _("Width of the isolation gap in\n" + "number (integer) of tool widths.") + ) + self.passes_entry = FCSpinner() + self.passes_entry.set_range(1, 999) + self.passes_entry.setObjectName("i_passes") + + grid0.addWidget(passlabel, 8, 0) + grid0.addWidget(self.passes_entry, 8, 1) + + # Overlap Entry + overlabel = QtWidgets.QLabel('%s:' % _('Overlap')) + overlabel.setToolTip( + _("How much (percentage) of the tool width to overlap each tool pass.") + ) + self.overlap_entry = FCDoubleSpinner(suffix='%') + self.overlap_entry.set_precision(self.decimals) + self.overlap_entry.setWrapping(True) + self.overlap_entry.set_range(0.0000, 99.9999) + self.overlap_entry.setSingleStep(0.1) + self.overlap_entry.setObjectName("i_overlap") + + grid0.addWidget(overlabel, 9, 0) + grid0.addWidget(self.overlap_entry, 9, 1) + + # Milling Type Radio Button + self.milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type')) + self.milling_type_label.setToolTip( + _("Milling type when the selected tool is of type: 'iso_op':\n" + "- climb / best for precision milling and to reduce tool usage\n" + "- conventional / useful when there is no backlash compensation") + ) + + self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'}, + {'label': _('Conventional'), 'value': 'cv'}]) + self.milling_type_radio.setToolTip( + _("Milling type when the selected tool is of type: 'iso_op':\n" + "- climb / best for precision milling and to reduce tool usage\n" + "- conventional / useful when there is no backlash compensation") + ) + + grid0.addWidget(self.milling_type_label, 10, 0) + grid0.addWidget(self.milling_type_radio, 10, 1) + + # Follow + self.follow_label = QtWidgets.QLabel('%s:' % _('Follow')) + self.follow_label.setToolTip( + _("Generate a 'Follow' geometry.\n" + "This means that it will cut through\n" + "the middle of the trace.") + ) + + self.follow_cb = FCCheckBox() + self.follow_cb.setToolTip(_("Generate a 'Follow' geometry.\n" + "This means that it will cut through\n" + "the middle of the trace.")) + self.follow_cb.setObjectName("i_follow") + + grid0.addWidget(self.follow_label, 11, 0) + grid0.addWidget(self.follow_cb, 11, 1) + + # Isolation Type + self.iso_type_label = QtWidgets.QLabel('%s:' % _('Isolation Type')) + self.iso_type_label.setToolTip( + _("Choose how the isolation will be executed:\n" + "- 'Full' -> complete isolation of polygons\n" + "- 'Ext' -> will isolate only on the outside\n" + "- 'Int' -> will isolate only on the inside\n" + "'Exterior' isolation is almost always possible\n" + "(with the right tool) but 'Interior'\n" + "isolation can be done only when there is an opening\n" + "inside of the polygon (e.g polygon is a 'doughnut' shape).") + ) + self.iso_type_radio = RadioSet([{'label': _('Full'), 'value': 'full'}, + {'label': _('Ext'), 'value': 'ext'}, + {'label': _('Int'), 'value': 'int'}]) + self.iso_type_radio.setObjectName("i_type") + + grid0.addWidget(self.iso_type_label, 12, 0) + grid0.addWidget(self.iso_type_radio, 12, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid0.addWidget(separator_line, 13, 0, 1, 2) + + # Rest machining CheckBox + self.rest_cb = FCCheckBox('%s' % _("Rest Machining")) + self.rest_cb.setObjectName("i_rest_machining") + self.rest_cb.setToolTip( + _("If checked, use 'rest machining'.\n" + "Basically it will isolate outside PCB features,\n" + "using the biggest tool and continue with the next tools,\n" + "from bigger to smaller, to isolate the copper features that\n" + "could not be cleared by previous tool, until there is\n" + "no more copper features to isolate or there are no more tools.\n" + "If not checked, use the standard algorithm.") + ) + + grid0.addWidget(self.ncc_rest_cb, 17, 0, 1, 2) + + # Combine All Passes + self.combine_passes_cb = FCCheckBox(label=_('Combine')) + self.combine_passes_cb.setToolTip( + _("Combine all passes into one object") + ) + self.combine_passes_cb.setObjectName("i_combine") + + grid0.addWidget(self.combine_passes_cb, 18, 0, 1, 2) + + # Exception Areas + self.except_cb = FCCheckBox(label=_('Except')) + self.except_cb.setToolTip(_("When the isolation geometry is generated,\n" + "by checking this, the area of the object below\n" + "will be subtracted from the isolation geometry.")) + self.except_cb.setObjectName("i_except") + grid0.addWidget(self.except_cb, 19, 0, 1, 2) + + # Isolation Scope + self.select_label = QtWidgets.QLabel('%s:' % _("Selection")) + self.select_label.setToolTip( + _("Isolation scope. Choose what to isolate:\n" + "- 'All' -> Isolate all the polygons in the object\n" + "- 'Selection' -> Isolate a selection of polygons.\n" + "- 'Reference Object' - will process the area specified by another object.") + ) + self.select_combo = FCComboBox() + self.select_combo.addItems( + [_("All"), _("Area Selection"), _("Reference Object")] + ) + self.select_combo.setObjectName("i_selection") + + grid0.addWidget(self.select_label, 20, 0) + grid0.addWidget(self.select_combo, 20, 1) + + # Area Shape + self.area_shape_label = QtWidgets.QLabel('%s:' % _("Shape")) + self.area_shape_label.setToolTip( + _("The kind of selection shape used for area selection.") + ) + + self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, + {'label': _("Polygon"), 'value': 'polygon'}]) + + grid0.addWidget(self.area_shape_label, 21, 0) + grid0.addWidget(self.area_shape_radio, 21, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid0.addWidget(separator_line, 22, 0, 1, 2) + + # ## Plotting type + self.ncc_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'}, + {"label": _("Progressive"), "value": "progressive"}]) + plotting_label = QtWidgets.QLabel('%s:' % _("ISO Plotting")) + plotting_label.setToolTip( + _("- 'Normal' - normal plotting, done at the end of the job\n" + "- 'Progressive' - each shape is plotted after it is generated") + ) + grid0.addWidget(plotting_label, 21, 0) + grid0.addWidget(self.ncc_plotting_radio, 21, 1) + + self.layout.addStretch() diff --git a/AppGUI/preferences/tools/ToolsNCCPrefGroupUI.py b/AppGUI/preferences/tools/ToolsNCCPrefGroupUI.py index bc64f83a..a1d7598f 100644 --- a/AppGUI/preferences/tools/ToolsNCCPrefGroupUI.py +++ b/AppGUI/preferences/tools/ToolsNCCPrefGroupUI.py @@ -340,8 +340,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): {"label": _("Progressive"), "value": "progressive"}]) plotting_label = QtWidgets.QLabel('%s:' % _("NCC Plotting")) plotting_label.setToolTip( - _("- 'Normal' - normal plotting, done at the end of the NCC job\n" - "- 'Progressive' - after each shape is generated it will be plotted.") + _("- 'Normal' - normal plotting, done at the end of the job\n" + "- 'Progressive' - each shape is plotted after it is generated") ) grid0.addWidget(plotting_label, 21, 0) grid0.addWidget(self.ncc_plotting_radio, 21, 1) diff --git a/AppGUI/preferences/tools/ToolsPaintPrefGroupUI.py b/AppGUI/preferences/tools/ToolsPaintPrefGroupUI.py index bac073df..9557c5b5 100644 --- a/AppGUI/preferences/tools/ToolsPaintPrefGroupUI.py +++ b/AppGUI/preferences/tools/ToolsPaintPrefGroupUI.py @@ -277,7 +277,7 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI): # ) self.selectmethod_combo = FCComboBox() self.selectmethod_combo.addItems( - [_("Polygon Selection"), _("Area Selection"), _("All Polygons"), _("Reference Object")] + [_("Polygon Selection"), _("Area Selection"), _("All"), _("Reference Object")] ) grid0.addWidget(selectlabel, 15, 0) @@ -304,8 +304,8 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI): {"label": _("Progressive"), "value": "progressive"}]) plotting_label = QtWidgets.QLabel('%s:' % _("Paint Plotting")) plotting_label.setToolTip( - _("- 'Normal' - normal plotting, done at the end of the Paint job\n" - "- 'Progressive' - after each shape is generated it will be plotted.") + _("- 'Normal' - normal plotting, done at the end of the job\n" + "- 'Progressive' - each shape is plotted after it is generated") ) grid0.addWidget(plotting_label, 20, 0) grid0.addWidget(self.paint_plotting_radio, 20, 1) diff --git a/AppGUI/preferences/tools/ToolsPreferencesUI.py b/AppGUI/preferences/tools/ToolsPreferencesUI.py index ec445df8..9d30c9b9 100644 --- a/AppGUI/preferences/tools/ToolsPreferencesUI.py +++ b/AppGUI/preferences/tools/ToolsPreferencesUI.py @@ -8,10 +8,12 @@ from AppGUI.preferences.tools.ToolsTransformPrefGroupUI import ToolsTransformPre from AppGUI.preferences.tools.ToolsCalculatorsPrefGroupUI import ToolsCalculatorsPrefGroupUI from AppGUI.preferences.tools.ToolsPanelizePrefGroupUI import ToolsPanelizePrefGroupUI from AppGUI.preferences.tools.ToolsFilmPrefGroupUI import ToolsFilmPrefGroupUI -from AppGUI.preferences.tools.ToolsPaintPrefGroupUI import ToolsPaintPrefGroupUI from AppGUI.preferences.tools.Tools2sidedPrefGroupUI import Tools2sidedPrefGroupUI + from AppGUI.preferences.tools.ToolsCutoutPrefGroupUI import ToolsCutoutPrefGroupUI from AppGUI.preferences.tools.ToolsNCCPrefGroupUI import ToolsNCCPrefGroupUI +from AppGUI.preferences.tools.ToolsPaintPrefGroupUI import ToolsPaintPrefGroupUI +from AppGUI.preferences.tools.ToolsISOPrefGroupUI import ToolsISOPrefGroupUI import gettext import AppTranslation as fcTranslate @@ -36,6 +38,9 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.setLayout(self.layout) self.decimals = decimals + self.tools_iso_group = ToolsISOPrefGroupUI(decimals=self.decimals) + self.tools_iso_group.setMinimumWidth(220) + self.tools_ncc_group = ToolsNCCPrefGroupUI(decimals=self.decimals) self.tools_ncc_group.setMinimumWidth(220) @@ -75,7 +80,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay1 = QtWidgets.QVBoxLayout() self.vlay1.addWidget(self.tools_paint_group) - self.vlay1.addWidget(self.tools_panelize_group) + self.vlay1.addWidget(self.tools_iso_group) self.vlay2 = QtWidgets.QVBoxLayout() self.vlay2.addWidget(self.tools_transform_group) @@ -89,6 +94,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay4 = QtWidgets.QVBoxLayout() self.vlay4.addWidget(self.tools_solderpaste_group) self.vlay4.addWidget(self.tools_corners_group) + self.vlay4.addWidget(self.tools_panelize_group) self.layout.addLayout(self.vlay) self.layout.addLayout(self.vlay1) diff --git a/AppTools/ToolIsolation.py b/AppTools/ToolIsolation.py index d12a3e9f..d64cf016 100644 --- a/AppTools/ToolIsolation.py +++ b/AppTools/ToolIsolation.py @@ -436,11 +436,11 @@ class ToolIsolation(AppTool, Gerber): self.rest_cb.setObjectName("i_rest_machining") self.rest_cb.setToolTip( _("If checked, use 'rest machining'.\n" - "Basically it will clear copper outside PCB features,\n" + "Basically it will isolate outside PCB features,\n" "using the biggest tool and continue with the next tools,\n" - "from bigger to smaller, to clear areas of copper that\n" + "from bigger to smaller, to isolate the copper features that\n" "could not be cleared by previous tool, until there is\n" - "no more copper to clear or there are no more tools.\n" + "no more copper features to isolate or there are no more tools.\n" "If not checked, use the standard algorithm.") ) @@ -628,7 +628,7 @@ class ToolIsolation(AppTool, Gerber): # ########################## VARIABLES ######################################## # ############################################################################# self.units = '' - self.ncc_tools = {} + self.iso_tools = {} self.tooluid = 0 # store here the default data for Geometry Data @@ -682,7 +682,7 @@ class ToolIsolation(AppTool, Gerber): "tools_iso_milling_type": self.milling_type_radio, "tools_iso_combine": self.combine_passes_cb, "tools_iso_follow": self.follow_cb, - "tools_iso_type": self.iso_type_radio + "tools_iso_isotype": self.iso_type_radio } self.name2option = { @@ -691,7 +691,7 @@ class ToolIsolation(AppTool, Gerber): "i_milling_type": "tools_iso_milling_type", "i_combine": "tools_iso_combine", "i_follow": "tools_iso_follow", - "i_type": "tools_iso_type" + "i_type": "tools_iso_isotype" } self.old_tool_dia = None @@ -742,7 +742,7 @@ class ToolIsolation(AppTool, Gerber): current_row = self.tools_table.currentRow() try: current_uid = int(self.tools_table.item(current_row, 3).text()) - self.ncc_tools[current_uid]['data']['tools_nccoperation'] = val + self.iso_tools[current_uid]['data']['tools_nccoperation'] = val except AttributeError: return @@ -775,7 +775,7 @@ class ToolIsolation(AppTool, Gerber): ) try: # set the form with data from the newly selected tool - for tooluid_key, tooluid_value in list(self.ncc_tools.items()): + for tooluid_key, tooluid_value in list(self.iso_tools.items()): if int(tooluid_key) == tooluid: for key, value in tooluid_value.items(): if key == 'data': @@ -818,7 +818,7 @@ class ToolIsolation(AppTool, Gerber): row = 0 tooluid_item = int(self.tools_table.item(row, 3).text()) - for tooluid_key, tooluid_val in self.ncc_tools.items(): + for tooluid_key, tooluid_val in self.iso_tools.items(): if int(tooluid_key) == tooluid_item: new_option_value = self.form_fields[option_changed].get_value() if option_changed in tooluid_val: @@ -843,14 +843,14 @@ class ToolIsolation(AppTool, Gerber): tooluid_item = int(self.tools_table.item(row, 3).text()) temp_tool_data = {} - for tooluid_key, tooluid_val in self.ncc_tools.items(): + for tooluid_key, tooluid_val in self.iso_tools.items(): if int(tooluid_key) == tooluid_item: # this will hold the 'data' key of the self.tools[tool] dictionary that corresponds to # the current row in the tool table temp_tool_data = tooluid_val['data'] break - for tooluid_key, tooluid_val in self.ncc_tools.items(): + for tooluid_key, tooluid_val in self.iso_tools.items(): tooluid_val['data'] = deepcopy(temp_tool_data) # store all the data associated with the row parameter to the self.tools storage @@ -866,7 +866,7 @@ class ToolIsolation(AppTool, Gerber): # temp_dia = {} # temp_data = {} # - # for tooluid_key, tooluid_value in self.ncc_tools.items(): + # for tooluid_key, tooluid_value in self.iso_tools.items(): # for key, value in tooluid_value.items(): # if key == 'data': # # update the 'data' section @@ -888,8 +888,8 @@ class ToolIsolation(AppTool, Gerber): # # temp_tools[tooluid_key] = deepcopy(temp_dia) # - # self.ncc_tools.clear() - # self.ncc_tools = deepcopy(temp_tools) + # self.iso_tools.clear() + # self.iso_tools = deepcopy(temp_tools) # temp_tools.clear() self.app.inform.emit('[success] %s' % _("Current Tool parameters were applied to all tools.")) @@ -952,7 +952,7 @@ class ToolIsolation(AppTool, Gerber): def set_tool_ui(self): self.units = self.app.defaults['units'].upper() - self.old_tool_dia = self.app.defaults["tools_nccnewdia"] + self.old_tool_dia = self.app.defaults["tools_iso_newdia"] # try to select in the Gerber combobox the active object try: @@ -982,10 +982,13 @@ class ToolIsolation(AppTool, Gerber): self.follow_cb.setChecked(False) self.follow_cb.hide() self.follow_label.hide() + self.rest_cb.setChecked(False) self.rest_cb.hide() + self.except_cb.setChecked(False) self.except_cb.hide() + self.select_combo.setCurrentIndex(0) self.select_combo.hide() self.select_label.hide() @@ -993,7 +996,7 @@ class ToolIsolation(AppTool, Gerber): self.level.setText('%s' % _('Advanced')) # TODO remember to set the GUI elements to values from app.defaults dict - self.tool_type_radio.set_value(self.app.defaults["gerber_tool_type"]) + self.tool_type_radio.set_value(self.app.defaults["tools_iso_tool_type"]) self.tool_type_label.show() self.tool_type_radio.show() @@ -1001,17 +1004,20 @@ class ToolIsolation(AppTool, Gerber): self.milling_type_radio.show() self.iso_type_label.show() - self.iso_type_radio.set_value(self.app.defaults["gerber_iso_type"]) + self.iso_type_radio.set_value(self.app.defaults["tools_iso_isotype"]) self.iso_type_radio.show() - self.follow_cb.setChecked(False) + self.follow_cb.setChecked(self.app.defaults["tools_iso_follow"]) self.follow_cb.show() self.follow_label.show() - self.rest_cb.setChecked(False) + + self.rest_cb.setChecked(self.app.defaults["tools_iso_rest"]) self.rest_cb.show() - self.except_cb.setChecked(False) + + self.except_cb.setChecked(self.app.defaults["tools_iso_isoexcept"]) self.except_cb.show() - self.select_combo.setCurrentIndex(0) + + self.select_combo.setCurrentIndex(self.app.defaults["tools_iso_selection"]) self.select_combo.show() self.select_label.show() @@ -1034,25 +1040,18 @@ class ToolIsolation(AppTool, Gerber): self.on_type_excobj_index_changed(val="gerber") self.on_reference_combo_changed() - self.order_radio.set_value(self.app.defaults["tools_nccorder"]) - self.passes_entry.set_value(self.app.defaults["gerber_isopasses"]) - self.iso_overlap_entry.set_value(self.app.defaults["gerber_isooverlap"]) - self.milling_type_radio.set_value(self.app.defaults["gerber_milling_type"]) - self.combine_passes_cb.set_value(self.app.defaults["gerber_combine_passes"]) - self.follow_cb.set_value(self.app.defaults["gerber_follow"]) - self.except_cb.set_value(False) - self.iso_type_radio.set_value(self.app.defaults["gerber_iso_type"]) - self.rest_cb.set_value(False) - self.select_combo.set_value(self.app.defaults["gerber_iso_scope"]) - self.area_shape_radio.set_value('square') + self.order_radio.set_value(self.app.defaults["tools_iso_order"]) + self.passes_entry.set_value(self.app.defaults["tools_iso_passes"]) + self.iso_overlap_entry.set_value(self.app.defaults["tools_iso_overlap"]) + self.milling_type_radio.set_value(self.app.defaults["tools_iso_milling_type"]) + self.combine_passes_cb.set_value(self.app.defaults["tools_iso_combine_passes"]) + self.area_shape_radio.set_value(self.app.defaults["tools_iso_combine_passes"]) - self.cutz_entry.set_value(self.app.defaults["tools_ncccutz"]) - self.tool_type_radio.set_value(self.app.defaults["tools_ncctool_type"]) - self.tipdia_entry.set_value(self.app.defaults["tools_ncctipdia"]) - self.tipangle_entry.set_value(self.app.defaults["tools_ncctipangle"]) - self.addtool_entry.set_value(self.app.defaults["tools_nccnewdia"]) - - self.old_tool_dia = self.app.defaults["tools_nccnewdia"] + self.cutz_entry.set_value(self.app.defaults["tools_iso_tool_cutz"]) + self.tool_type_radio.set_value(self.app.defaults["tools_iso_tool_type"]) + self.tipdia_entry.set_value(self.app.defaults["tools_iso_tool_vtipdia"]) + self.tipangle_entry.set_value(self.app.defaults["tools_iso_tool_vtipangle"]) + self.addtool_entry.set_value(self.app.defaults["tools_iso_newdia"]) self.on_tool_type(val=self.tool_type_radio.get_value()) @@ -1089,24 +1088,23 @@ class ToolIsolation(AppTool, Gerber): "area_strategy": self.app.defaults["geometry_area_strategy"], "area_overz": float(self.app.defaults["geometry_area_overz"]), - "tools_iso_passes": self.app.defaults["gerber_isopasses"], - "tools_iso_overlap": self.app.defaults["gerber_isooverlap"], - "tools_iso_milling_type": self.app.defaults["gerber_milling_type"], - "tools_iso_combine": self.app.defaults["gerber_combine_passes"], - "tools_iso_follow": self.app.defaults["gerber_follow"], - "tools_iso_type": self.app.defaults["gerber_iso_type"], - - "nccrest": self.app.defaults["tools_nccrest"], - "nccref": self.app.defaults["gerber_iso_scope"], - - "tools_iso_exclusion": True, + "tools_iso_passes": self.app.defaults["tools_iso_passes"], + "tools_iso_overlap": self.app.defaults["tools_iso_overlap"], + "tools_iso_milling_type": self.app.defaults["tools_iso_milling_type"], + "tools_iso_follow": self.app.defaults["tools_iso_follow"], + "tools_iso_isotype": self.app.defaults["tools_iso_isotype"], + "tools_iso_rest": self.app.defaults["tools_iso_rest"], + "tools_iso_combine_passes": self.app.defaults["tools_iso_combine_passes"], + "tools_iso_isoexcept": self.app.defaults["tools_iso_isoexcept"], + "tools_iso_selection": self.app.defaults["tools_iso_selection"], + "tools_iso_area_shape": self.app.defaults["tools_iso_area_shape"] } try: - dias = [float(self.app.defaults["gerber_isotooldia"])] + dias = [float(self.app.defaults["tools_iso_tooldia"])] except (ValueError, TypeError): - dias = [float(eval(dia)) for dia in self.app.defaults["gerber_isotooldia"].split(",") if dia != ''] + dias = [float(eval(dia)) for dia in self.app.defaults["tools_iso_tooldia"].split(",") if dia != ''] if not dias: log.error("At least one tool diameter needed. Verify in Edit -> Preferences -> TOOLS -> Isolation Tools.") @@ -1114,10 +1112,10 @@ class ToolIsolation(AppTool, Gerber): self.tooluid = 0 - self.ncc_tools.clear() + self.iso_tools.clear() for tool_dia in dias: self.tooluid += 1 - self.ncc_tools.update({ + self.iso_tools.update({ int(self.tooluid): { 'tooldia': float('%.*f' % (self.decimals, tool_dia)), 'offset': 'Path', @@ -1144,7 +1142,7 @@ class ToolIsolation(AppTool, Gerber): self.units = self.app.defaults['units'].upper() sorted_tools = [] - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): if self.units == "IN": sorted_tools.append(float('%.*f' % (self.decimals, float(v['tooldia'])))) else: @@ -1163,7 +1161,7 @@ class ToolIsolation(AppTool, Gerber): tool_id = 0 for tool_sorted in sorted_tools: - for tooluid_key, tooluid_value in self.ncc_tools.items(): + for tooluid_key, tooluid_value in self.iso_tools.items(): if float('%.*f' % (self.decimals, tooluid_value['tooldia'])) == tool_sorted: tool_id += 1 id_ = QtWidgets.QTableWidgetItem('%d' % int(tool_id)) @@ -1410,7 +1408,7 @@ class ToolIsolation(AppTool, Gerber): tt = cw.currentText() typ = 'Iso' if tt == 'V' else "Rough" - self.ncc_tools[current_uid].update({ + self.iso_tools[current_uid].update({ 'type': typ, 'tool_type': tt, }) @@ -1445,7 +1443,7 @@ class ToolIsolation(AppTool, Gerber): # calculated tool diameter so the cut_z parameter is obeyed tool_dia = tip_dia + (2 * cut_z * math.tan(math.radians(tip_angle))) - # update the default_data so it is used in the ncc_tools dict + # update the default_data so it is used in the iso_tools dict self.default_data.update({ "vtipdia": tip_dia, "vtipangle": (tip_angle * 2), @@ -1480,7 +1478,7 @@ class ToolIsolation(AppTool, Gerber): # construct a list of all 'tooluid' in the self.tools tool_uid_list = [] - for tooluid_key in self.ncc_tools: + for tooluid_key in self.iso_tools: tool_uid_item = int(tooluid_key) tool_uid_list.append(tool_uid_item) @@ -1492,7 +1490,7 @@ class ToolIsolation(AppTool, Gerber): self.tooluid = int(max_uid + 1) tool_dias = [] - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): for tool_v in v.keys(): if tool_v == 'tooldia': tool_dias.append(float('%.*f' % (self.decimals, (v[tool_v])))) @@ -1507,7 +1505,7 @@ class ToolIsolation(AppTool, Gerber): else: if muted is None: self.app.inform.emit('[success] %s' % _("New tool added to Tool Table.")) - self.ncc_tools.update({ + self.iso_tools.update({ int(self.tooluid): { 'tooldia': float('%.*f' % (self.decimals, tool_dia)), 'offset': 'Path', @@ -1527,7 +1525,7 @@ class ToolIsolation(AppTool, Gerber): old_tool_dia = '' tool_dias = [] - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): for tool_v in v.keys(): if tool_v == 'tooldia': tool_dias.append(float('%.*f' % (self.decimals, v[tool_v]))) @@ -1549,14 +1547,14 @@ class ToolIsolation(AppTool, Gerber): # identify the tool that was edited and get it's tooluid if new_tool_dia not in tool_dias: - self.ncc_tools[tooluid]['tooldia'] = new_tool_dia + self.iso_tools[tooluid]['tooldia'] = new_tool_dia self.app.inform.emit('[success] %s' % _("Tool from Tool Table was edited.")) self.blockSignals(False) self.build_ui() return else: # identify the old tool_dia and restore the text in tool table - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): if k == tooluid: old_tool_dia = v['tooldia'] break @@ -1580,7 +1578,7 @@ class ToolIsolation(AppTool, Gerber): deleted_tools_list = [] if all_tools: - self.ncc_tools.clear() + self.iso_tools.clear() self.blockSignals(False) self.build_ui() return @@ -1595,7 +1593,7 @@ class ToolIsolation(AppTool, Gerber): deleted_tools_list.append(tooluid_del) for t in deleted_tools_list: - self.ncc_tools.pop(t, None) + self.iso_tools.pop(t, None) self.blockSignals(False) self.build_ui() @@ -1611,7 +1609,7 @@ class ToolIsolation(AppTool, Gerber): deleted_tools_list.append(tooluid_del) for t in deleted_tools_list: - self.ncc_tools.pop(t, None) + self.iso_tools.pop(t, None) except AttributeError: self.app.inform.emit('[WARNING_NOTCL] %s' % _("Delete failed. Select a tool to delete.")) @@ -2140,7 +2138,7 @@ class ToolIsolation(AppTool, Gerber): :param isotooldia: a tuple or single element made out of diameters of the tools to be used for isolation :param outname: name of the resulting object :param order: Tools order - :param tools_storage: whether to use the current tools_storage self.ncc_tools or a different one. + :param tools_storage: whether to use the current tools_storage self.iso_tools or a different one. Usage of the different one is related to when this function is called from a TcL command. @@ -2167,7 +2165,7 @@ class ToolIsolation(AppTool, Gerber): # determine if to use the progressive plotting prog_plot = True if self.app.defaults["tools_ncc_plotting"] == 'progressive' else False - tools_storage = tools_storage if tools_storage is not None else self.ncc_tools + tools_storage = tools_storage if tools_storage is not None else self.iso_tools # ###################################################################################################### # # Read the tooldia parameter and create a sorted list out them - they may be more than one diameter ## @@ -2185,9 +2183,9 @@ class ToolIsolation(AppTool, Gerber): # for row in range(self.tools_table.rowCount()): # if self.tools_table.cellWidget(row, 1).currentText() == 'clear_op': # sorted_clear_tools.append(float(self.tools_table.item(row, 1).text())) - for tooluid in self.ncc_tools: - if self.ncc_tools[tooluid]['data']['tools_nccoperation'] == 'clear': - sorted_clear_tools.append(self.ncc_tools[tooluid]['tooldia']) + for tooluid in self.iso_tools: + if self.iso_tools[tooluid]['data']['tools_nccoperation'] == 'clear': + sorted_clear_tools.append(self.iso_tools[tooluid]['tooldia']) # ######################################################################################################## # set the name for the future Geometry object @@ -2256,19 +2254,19 @@ class ToolIsolation(AppTool, Gerber): app_obj.proc_container.update_view_text(' %d%%' % 0) tool_uid = 0 # find the current tool_uid - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): if float('%.*f' % (self.decimals, v['tooldia'])) == float('%.*f' % (self.decimals, tool)): tool_uid = int(k) break # parameters that are particular to the current tool - ncc_overlap = float(self.ncc_tools[tool_uid]["data"]["tools_nccoverlap"]) / 100.0 - ncc_margin = float(self.ncc_tools[tool_uid]["data"]["tools_nccmargin"]) - ncc_method = self.ncc_tools[tool_uid]["data"]["tools_nccmethod"] - ncc_connect = self.ncc_tools[tool_uid]["data"]["tools_nccconnect"] - ncc_contour = self.ncc_tools[tool_uid]["data"]["tools_ncccontour"] - has_offset = self.ncc_tools[tool_uid]["data"]["tools_ncc_offset_choice"] - ncc_offset = float(self.ncc_tools[tool_uid]["data"]["tools_ncc_offset_value"]) + ncc_overlap = float(self.iso_tools[tool_uid]["data"]["tools_nccoverlap"]) / 100.0 + ncc_margin = float(self.iso_tools[tool_uid]["data"]["tools_nccmargin"]) + ncc_method = self.iso_tools[tool_uid]["data"]["tools_nccmethod"] + ncc_connect = self.iso_tools[tool_uid]["data"]["tools_nccconnect"] + ncc_contour = self.iso_tools[tool_uid]["data"]["tools_ncccontour"] + has_offset = self.iso_tools[tool_uid]["data"]["tools_ncc_offset_choice"] + ncc_offset = float(self.iso_tools[tool_uid]["data"]["tools_ncc_offset_value"]) # Get remaining tools offset offset -= (tool - 1e-12) @@ -2508,18 +2506,18 @@ class ToolIsolation(AppTool, Gerber): tool = sorted_clear_tools.pop(0) tool_uid = 0 - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): if float('%.*f' % (self.decimals, v['tooldia'])) == float('%.*f' % (self.decimals, tool)): tool_uid = int(k) break - ncc_overlap = float(self.ncc_tools[tool_uid]["data"]["tools_nccoverlap"]) / 100.0 - ncc_margin = float(self.ncc_tools[tool_uid]["data"]["tools_nccmargin"]) - ncc_method = self.ncc_tools[tool_uid]["data"]["tools_nccmethod"] - ncc_connect = self.ncc_tools[tool_uid]["data"]["tools_nccconnect"] - ncc_contour = self.ncc_tools[tool_uid]["data"]["tools_ncccontour"] - has_offset = self.ncc_tools[tool_uid]["data"]["tools_ncc_offset_choice"] - ncc_offset = float(self.ncc_tools[tool_uid]["data"]["tools_ncc_offset_value"]) + ncc_overlap = float(self.iso_tools[tool_uid]["data"]["tools_nccoverlap"]) / 100.0 + ncc_margin = float(self.iso_tools[tool_uid]["data"]["tools_nccmargin"]) + ncc_method = self.iso_tools[tool_uid]["data"]["tools_nccmethod"] + ncc_connect = self.iso_tools[tool_uid]["data"]["tools_nccconnect"] + ncc_contour = self.iso_tools[tool_uid]["data"]["tools_ncccontour"] + has_offset = self.iso_tools[tool_uid]["data"]["tools_ncc_offset_choice"] + ncc_offset = float(self.iso_tools[tool_uid]["data"]["tools_ncc_offset_value"]) tool_used = tool - 1e-12 cleared_geo[:] = [] @@ -2844,7 +2842,7 @@ class ToolIsolation(AppTool, Gerber): # construct a list of all 'tooluid' in the self.tools tool_uid_list = [] - for tooluid_key in self.ncc_tools: + for tooluid_key in self.iso_tools: tool_uid_item = int(tooluid_key) tool_uid_list.append(tool_uid_item) @@ -2858,7 +2856,7 @@ class ToolIsolation(AppTool, Gerber): tooldia = float('%.*f' % (self.decimals, tooldia)) tool_dias = [] - for k, v in self.ncc_tools.items(): + for k, v in self.iso_tools.items(): for tool_v in v.keys(): if tool_v == 'tooldia': tool_dias.append(float('%.*f' % (self.decimals, (v[tool_v])))) @@ -2868,7 +2866,7 @@ class ToolIsolation(AppTool, Gerber): self.ui_connect() return 'fail' - self.ncc_tools.update({ + self.iso_tools.update({ tooluid: { 'tooldia': float('%.*f' % (self.decimals, tooldia)), 'offset': tool['offset'], @@ -2879,7 +2877,7 @@ class ToolIsolation(AppTool, Gerber): 'solid_geometry': [] } }) - self.ncc_tools[tooluid]['data']['name'] = '_ncc' + self.iso_tools[tooluid]['data']['name'] = '_ncc' self.app.inform.emit('[success] %s' % _("New tool added to Tool Table.")) diff --git a/AppTools/ToolPaint.py b/AppTools/ToolPaint.py index 7673acc8..9f929533 100644 --- a/AppTools/ToolPaint.py +++ b/AppTools/ToolPaint.py @@ -482,7 +482,7 @@ class ToolPaint(AppTool, Gerber): self.selectmethod_combo = FCComboBox() self.selectmethod_combo.addItems( - [_("Polygon Selection"), _("Area Selection"), _("All Polygons"), _("Reference Object")] + [_("Polygon Selection"), _("Area Selection"), _("All"), _("Reference Object")] ) self.selectmethod_combo.setObjectName('p_selection') @@ -1423,7 +1423,7 @@ class ToolPaint(AppTool, Gerber): self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) return - if self.select_method == _("All Polygons"): + if self.select_method == _("All"): self.paint_poly_all(self.paint_obj, tooldia=self.tooldia_list, outname=self.o_name) diff --git a/App_Main.py b/App_Main.py index d5b129f0..99f4f21d 100644 --- a/App_Main.py +++ b/App_Main.py @@ -3855,9 +3855,9 @@ class App(QtCore.QObject): return # Keys in self.defaults for which to scale their values - dimensions = ['gerber_isotooldia', 'gerber_noncoppermargin', 'gerber_bboxmargin', - "gerber_editor_newsize", "gerber_editor_lin_pitch", "gerber_editor_buff_f", "gerber_vtipdia", - "gerber_vcutz", "gerber_editor_newdim", "gerber_editor_ma_low", + dimensions = ['tools_iso_tooldia', 'gerber_noncoppermargin', 'gerber_bboxmargin', + "gerber_editor_newsize", "gerber_editor_lin_pitch", "gerber_editor_buff_f", "tools_iso_tool_vtipdia", + "tools_iso_tool_cutz", "gerber_editor_newdim", "gerber_editor_ma_low", "gerber_editor_ma_high", 'excellon_cutz', 'excellon_travelz', "excellon_toolchangexy", 'excellon_offset', diff --git a/CHANGELOG.md b/CHANGELOG.md index fce0dc98..95ba27d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ CHANGELOG for FlatCAM beta - Isolation Tool: reworked the GUI - if there is a Gerber object selected then in Isolation Tool the Gerber object combobox will show that object name as current - made the Project Tree items not editable by clicking on selected Tree items (the object rename can still be done in the Selected tab) +- working on Isolation Tool: added a Preferences section in Edit -> Preferences and updated their usage within the Isolation tool 25.05.2020 diff --git a/defaults.py b/defaults.py index 5f6178fd..4e7ba01a 100644 --- a/defaults.py +++ b/defaults.py @@ -172,12 +172,6 @@ class FlatCAMDefaults: "All Files (*.*)", # Gerber Options - "gerber_isotooldia": 0.1, - "gerber_isopasses": 1, - "gerber_isooverlap": 10, - "gerber_milling_type": "cl", - "gerber_combine_passes": False, - "gerber_iso_scope": _("All"), "gerber_noncoppermargin": 0.1, "gerber_noncopperrounded": False, "gerber_bboxmargin": 0.1, @@ -188,11 +182,6 @@ class FlatCAMDefaults: "gerber_aperture_scale_factor": 1.0, "gerber_aperture_buffer_factor": 0.0, "gerber_follow": False, - "gerber_tool_type": 'C1', - "gerber_vtipdia": 0.1, - "gerber_vtipangle": 30, - "gerber_vcutz": -0.05, - "gerber_iso_type": "full", "gerber_buffering": "full", "gerber_simplification": False, "gerber_simp_tolerance": 0.0005, @@ -391,6 +380,27 @@ class FlatCAMDefaults: "cncjob_annotation_fontsize": 9, "cncjob_annotation_fontcolor": '#990000', + # Isolation Routing Tool + "tools_iso_tooldia": "0.1", + "tools_iso_order": 'rev', + "tools_iso_tool_type": 'C1', + "tools_iso_tool_vtipdia": 0.1, + "tools_iso_tool_vtipangle": 30, + "tools_iso_tool_cutz": -0.05, + "tools_iso_newdia": 0.1, + + "tools_iso_passes": 1, + "tools_iso_overlap": 10, + "tools_iso_milling_type": "cl", + "tools_iso_follow": False, + "tools_iso_isotype": "full", + + "tools_iso_rest": False, + "tools_iso_combine_passes": False, + "tools_iso_isoexcept": False, + "tools_iso_selection": _("All"), + "tools_iso_area_shape": "square", + # NCC Tool "tools_ncctools": "1.0, 0.5", "tools_nccorder": 'rev', @@ -430,7 +440,7 @@ class FlatCAMDefaults: "tools_paintoverlap": 20, "tools_paintmargin": 0.0, "tools_paintmethod": _("Seed"), - "tools_selectmethod": _("All Polygons"), + "tools_selectmethod": _("All"), "tools_paint_area_shape": "square", "tools_pathconnect": True, "tools_paintcontour": True, diff --git a/tclCommands/TclCommandIsolate.py b/tclCommands/TclCommandIsolate.py index 1385f860..248ace37 100644 --- a/tclCommands/TclCommandIsolate.py +++ b/tclCommands/TclCommandIsolate.py @@ -89,7 +89,7 @@ class TclCommandIsolate(TclCommandSignaled): par = args['combine'] args['combine'] = bool(eval(par)) else: - args['combine'] = bool(eval(self.app.defaults["gerber_combine_passes"])) + args['combine'] = bool(eval(self.app.defaults["tools_iso_combine_passes"])) obj = self.app.collection.get_by_name(name) if obj is None: diff --git a/tclCommands/TclCommandPaint.py b/tclCommands/TclCommandPaint.py index d6b0916c..617057b0 100644 --- a/tclCommands/TclCommandPaint.py +++ b/tclCommands/TclCommandPaint.py @@ -159,7 +159,7 @@ class TclCommandPaint(TclCommand): # used only to have correct information's in the obj.tools[tool]['data'] dict if "all" in args: - select = _("All Polygons") + select = _("All") elif "single" in args: select = _("Polygon Selection") else: