From 3bad47b3beab5f0879419d26d1b111b1e75e0e1a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 23 Feb 2019 16:02:45 +0200 Subject: [PATCH] - updated the Properties Tool to include more information's, also details if a Geometry is of type MultiGeo or SingleGeo - remade the Preferences GUI to include the Advanced Options in a separate way so it is obvious which are displayed when App Level is Advanced. --- FlatCAMApp.py | 133 ++++++---- FlatCAMGUI.py | 471 +++++++++++++++++---------------- FlatCAMObj.py | 2 +- README.md | 3 +- camlib.py | 1 + flatcamTools/ToolProperties.py | 70 ++++- 6 files changed, 405 insertions(+), 275 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 26e6abbc..14031adc 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -300,6 +300,7 @@ class App(QtCore.QObject): # when adding entries here read the comments in the method found bellow named: # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True) self.defaults_form_fields = { + # General App "units": self.ui.general_defaults_form.general_app_group.units_radio, "global_shell_at_startup": self.ui.general_defaults_form.general_app_group.shell_startup_cb, "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb, @@ -311,6 +312,7 @@ class App(QtCore.QObject): "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb, "global_toggle_tooltips": self.ui.general_defaults_form.general_app_group.toggle_tooltips_cb, + # General GUI "global_gridx": self.ui.general_defaults_form.general_gui_group.gridx_entry, "global_gridy": self.ui.general_defaults_form.general_gui_group.gridy_entry, "global_snap_max": self.ui.general_defaults_form.general_gui_group.snap_max_dist_entry, @@ -343,6 +345,7 @@ class App(QtCore.QObject): "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry, "gerber_bboxrounded": self.ui.gerber_defaults_form.gerber_opt_group.bbrounded_cb, + # Excellon General "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb, "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb, "excellon_format_upper_in": self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry, @@ -353,16 +356,8 @@ class App(QtCore.QObject): "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio, "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio, "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry, - "excellon_offset": self.ui.excellon_defaults_form.excellon_gen_group.offset_entry, - "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_gen_group.toolchangexy_entry, - "excellon_startz": self.ui.excellon_defaults_form.excellon_gen_group.estartz_entry, - "excellon_endz": self.ui.excellon_defaults_form.excellon_gen_group.eendz_entry, - "excellon_feedrate_rapid": self.ui.excellon_defaults_form.excellon_gen_group.feedrate_rapid_entry, - "excellon_z_pdepth": self.ui.excellon_defaults_form.excellon_gen_group.pdepth_entry, - "excellon_feedrate_probe": self.ui.excellon_defaults_form.excellon_gen_group.feedrate_probe_entry, - "excellon_f_plunge": self.ui.excellon_defaults_form.excellon_gen_group.fplunge_cb, - "excellon_f_retract": self.ui.excellon_defaults_form.excellon_gen_group.fretract_cb, + # Excellon Options "excellon_drillz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry, "excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry, "excellon_feedrate": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_entry, @@ -376,26 +371,30 @@ class App(QtCore.QObject): "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry, "excellon_gcode_type": self.ui.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio, + # Excellon Advanced Options + "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry, + "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry, + "excellon_startz": self.ui.excellon_defaults_form.excellon_adv_opt_group.estartz_entry, + "excellon_endz": self.ui.excellon_defaults_form.excellon_adv_opt_group.eendz_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_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, + # Geometry General "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb, - "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry, "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry, - "geometry_segx": self.ui.geometry_defaults_form.geometry_gen_group.segx_entry, - "geometry_segy": self.ui.geometry_defaults_form.geometry_gen_group.segy_entry, - "geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_gen_group.cncfeedrate_rapid_entry, - "geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_gen_group.feedrate_probe_entry, - "geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_gen_group.pdepth_entry, - "geometry_f_plunge": self.ui.geometry_defaults_form.geometry_gen_group.fplunge_cb, - "geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_gen_group.toolchangexy_entry, - "geometry_startz": self.ui.geometry_defaults_form.geometry_gen_group.gstartz_entry, - "geometry_endz": self.ui.geometry_defaults_form.geometry_gen_group.gendz_entry, - "geometry_extracut": self.ui.geometry_defaults_form.geometry_gen_group.extracut_cb, + "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry, + # Geometry Options "geometry_cutz": self.ui.geometry_defaults_form.geometry_opt_group.cutz_entry, "geometry_travelz": self.ui.geometry_defaults_form.geometry_opt_group.travelz_entry, "geometry_feedrate": self.ui.geometry_defaults_form.geometry_opt_group.cncfeedrate_entry, @@ -409,6 +408,19 @@ class App(QtCore.QObject): "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_endz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gendz_entry, + "geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.cncfeedrate_rapid_entry, + "geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb, + "geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry, + "geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry, + "geometry_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, + + # 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_tooldia": self.ui.cncjob_defaults_form.cncjob_gen_group.tooldia_entry, @@ -419,6 +431,7 @@ class App(QtCore.QObject): "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_opt_group.prepend_text, "cncjob_append": self.ui.cncjob_defaults_form.cncjob_opt_group.append_text, + # NCC Tool "tools_ncctools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry, "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, @@ -427,12 +440,14 @@ class App(QtCore.QObject): "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, + # CutOut Tool "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry, "tools_cutoutmargin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry, "tools_cutoutgapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry, "tools_gaps_rect": self.ui.tools_defaults_form.tools_cutout_group.gaps_radio, "tools_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo, + # Paint Area Tool "tools_painttooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry, "tools_paintoverlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry, "tools_paintmargin": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry, @@ -441,14 +456,17 @@ class App(QtCore.QObject): "tools_pathconnect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb, "tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb, + # 2-sided Tool "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio, "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio, "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry, + # Film Tool "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio, "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry, "tools_film_scale": self.ui.tools_defaults_form.tools_film_group.film_scale_entry, + # Panelize Tool "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns, "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows, "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns, @@ -458,6 +476,7 @@ class App(QtCore.QObject): "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry, "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio, + # Calculators Tool "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry, "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry, "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry, @@ -466,6 +485,7 @@ class App(QtCore.QObject): "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry, "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry, + # Transformations Tool "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry, "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry, "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry, @@ -478,6 +498,7 @@ class App(QtCore.QObject): "tools_transform_mirror_reference": self.ui.tools_defaults_form.tools_transform_group.mirror_reference_cb, "tools_transform_mirror_point": self.ui.tools_defaults_form.tools_transform_group.flip_ref_entry, + # SolderPaste Dispensing Tool "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry, "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry, "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry, @@ -600,6 +621,7 @@ class App(QtCore.QObject): "gerber_circle_steps": 64, "gerber_use_buffer_for_union": True, + # Excellon General "excellon_plot": True, "excellon_solid": True, "excellon_format_upper_in": 2, @@ -611,59 +633,68 @@ class App(QtCore.QObject): "excellon_optimization_type": 'B', "excellon_search_time": 3, + # Excellon Options "excellon_drillz": -0.1, "excellon_travelz": 0.1, "excellon_feedrate": 3.0, - "excellon_feedrate_rapid": 3.0, "excellon_feedrate_probe": 3.0, "excellon_spindlespeed": None, "excellon_dwell": False, "excellon_dwelltime": 1, "excellon_toolchange": False, "excellon_toolchangez": 1.0, - "excellon_toolchangexy": "0.0, 0.0", + "excellon_ppname_e": 'default', "excellon_tooldia": 0.016, - "excellon_offset": 0.0, "excellon_slot_tooldia": 0.016, + "excellon_gcode_type": "drills", + + # Excellon Advanced Options + "excellon_offset": 0.0, + "excellon_toolchangexy": "0.0, 0.0", "excellon_startz": None, "excellon_endz": 2.0, - "excellon_ppname_e": 'default', + "excellon_feedrate_rapid": 3.0, "excellon_z_pdepth": -0.02, "excellon_f_plunge": False, "excellon_f_retract": False, - "excellon_gcode_type": "drills", + # Excellon Export "excellon_exp_units": 'INCH', "excellon_exp_format": 'ndec', "excellon_exp_integer": 2, "excellon_exp_decimals": 4, "excellon_exp_zeros": 'LZ', + # Geometry General "geometry_plot": True, - "geometry_segx": 0.0, - "geometry_segy": 0.0, + "geometry_circle_steps": 64, + "geometry_cnctooldia": 0.016, + + # Geometry Options "geometry_cutz": -0.002, + "geometry_multidepth": False, + "geometry_depthperpass": 0.002, "geometry_travelz": 0.1, "geometry_toolchange": False, "geometry_toolchangez": 1.0, - "geometry_toolchangexy": "0.0, 0.0", - "geometry_startz": None, - "geometry_endz": 2.0, "geometry_feedrate": 3.0, "geometry_feedrate_z": 3.0, - "geometry_feedrate_rapid": 3.0, - "geometry_feedrate_probe": 3.0, - "geometry_cnctooldia": 0.016, "geometry_spindlespeed": None, "geometry_dwell": False, "geometry_dwelltime": 1, "geometry_ppname_g": 'default', + + # Geometry Advanced Options + "geometry_toolchangexy": "0.0, 0.0", + "geometry_startz": None, + "geometry_endz": 2.0, + "geometry_feedrate_rapid": 3.0, + "geometry_extracut": False, "geometry_z_pdepth": -0.02, "geometry_f_plunge": False, - "geometry_depthperpass": 0.002, - "geometry_multidepth": False, - "geometry_extracut": False, - "geometry_circle_steps": 64, + "geometry_feedrate_probe": 3.0, + "geometry_segx": 0.0, + "geometry_segy": 0.0, "cncjob_plot": True, "cncjob_plot_kind": 'all', @@ -805,11 +836,6 @@ class App(QtCore.QObject): "excellon_zeros": self.ui.excellon_options_form.excellon_gen_group.excellon_zeros_radio, "excellon_units": self.ui.excellon_options_form.excellon_gen_group.excellon_units_radio, "excellon_optimization_type": self.ui.excellon_options_form.excellon_gen_group.excellon_optimization_radio, - "excellon_feedrate_rapid": self.ui.excellon_options_form.excellon_gen_group.feedrate_rapid_entry, - "excellon_toolchangexy": self.ui.excellon_options_form.excellon_gen_group.toolchangexy_entry, - "excellon_f_plunge": self.ui.excellon_options_form.excellon_gen_group.fplunge_cb, - "excellon_startz": self.ui.excellon_options_form.excellon_gen_group.estartz_entry, - "excellon_endz": self.ui.excellon_options_form.excellon_gen_group.eendz_entry, "excellon_drillz": self.ui.excellon_options_form.excellon_opt_group.cutz_entry, "excellon_travelz": self.ui.excellon_options_form.excellon_opt_group.travelz_entry, @@ -822,16 +848,14 @@ class App(QtCore.QObject): "excellon_tooldia": self.ui.excellon_options_form.excellon_opt_group.tooldia_entry, "excellon_ppname_e": self.ui.excellon_options_form.excellon_opt_group.pp_excellon_name_cb, + "excellon_feedrate_rapid": self.ui.excellon_options_form.excellon_adv_opt_group.feedrate_rapid_entry, + "excellon_toolchangexy": self.ui.excellon_options_form.excellon_adv_opt_group.toolchangexy_entry, + "excellon_f_plunge": self.ui.excellon_options_form.excellon_adv_opt_group.fplunge_cb, + "excellon_startz": self.ui.excellon_options_form.excellon_adv_opt_group.estartz_entry, + "excellon_endz": self.ui.excellon_options_form.excellon_adv_opt_group.eendz_entry, + "geometry_plot": self.ui.geometry_options_form.geometry_gen_group.plot_cb, "geometry_cnctooldia": self.ui.geometry_options_form.geometry_gen_group.cnctooldia_entry, - "geometry_segx": self.ui.geometry_options_form.geometry_gen_group.segx_entry, - "geometry_segy": self.ui.geometry_options_form.geometry_gen_group.segy_entry, - "geometry_feedrate_rapid": self.ui.geometry_options_form.geometry_gen_group.cncfeedrate_rapid_entry, - "geometry_f_plunge": self.ui.geometry_options_form.geometry_gen_group.fplunge_cb, - "geometry_toolchangexy": self.ui.geometry_options_form.geometry_gen_group.toolchangexy_entry, - "geometry_startz": self.ui.geometry_options_form.geometry_gen_group.gstartz_entry, - "geometry_endz": self.ui.geometry_options_form.geometry_gen_group.gendz_entry, - "geometry_extracut": self.ui.geometry_options_form.geometry_gen_group.extracut_cb, "geometry_cutz": self.ui.geometry_options_form.geometry_opt_group.cutz_entry, "geometry_travelz": self.ui.geometry_options_form.geometry_opt_group.travelz_entry, @@ -846,6 +870,15 @@ class App(QtCore.QObject): "geometry_depthperpass": self.ui.geometry_options_form.geometry_opt_group.depthperpass_entry, "geometry_multidepth": self.ui.geometry_options_form.geometry_opt_group.multidepth_cb, + "geometry_segx": self.ui.geometry_options_form.geometry_adv_opt_group.segx_entry, + "geometry_segy": self.ui.geometry_options_form.geometry_adv_opt_group.segy_entry, + "geometry_feedrate_rapid": self.ui.geometry_options_form.geometry_adv_opt_group.cncfeedrate_rapid_entry, + "geometry_f_plunge": self.ui.geometry_options_form.geometry_adv_opt_group.fplunge_cb, + "geometry_toolchangexy": self.ui.geometry_options_form.geometry_adv_opt_group.toolchangexy_entry, + "geometry_startz": self.ui.geometry_options_form.geometry_adv_opt_group.gstartz_entry, + "geometry_endz": self.ui.geometry_options_form.geometry_adv_opt_group.gendz_entry, + "geometry_extracut": self.ui.geometry_options_form.geometry_adv_opt_group.extracut_cb, + "cncjob_plot": self.ui.cncjob_options_form.cncjob_gen_group.plot_cb, "cncjob_tooldia": self.ui.cncjob_options_form.cncjob_gen_group.tooldia_entry, diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index e2a34c19..ffacd647 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -2535,10 +2535,16 @@ class ExcellonPreferencesUI(QtWidgets.QWidget): self.excellon_opt_group.setFixedWidth(250) self.excellon_exp_group = ExcellonExpPrefGroupUI() self.excellon_exp_group.setFixedWidth(250) + self.excellon_adv_opt_group = ExcellonAdvOptPrefGroupUI() + self.excellon_adv_opt_group.setFixedWidth(250) + + self.vlay = QtWidgets.QVBoxLayout() + self.vlay.addWidget(self.excellon_opt_group) + self.vlay.addWidget(self.excellon_exp_group) self.layout.addWidget(self.excellon_gen_group) - self.layout.addWidget(self.excellon_opt_group) - self.layout.addWidget(self.excellon_exp_group) + self.layout.addLayout(self.vlay) + self.layout.addWidget(self.excellon_adv_opt_group) self.layout.addStretch() @@ -2554,9 +2560,13 @@ class GeometryPreferencesUI(QtWidgets.QWidget): self.geometry_gen_group.setFixedWidth(220) self.geometry_opt_group = GeometryOptPrefGroupUI() self.geometry_opt_group.setFixedWidth(250) + self.geometry_adv_opt_group = GeometryAdvOptPrefGroupUI() + self.geometry_adv_opt_group.setFixedWidth(250) self.layout.addWidget(self.geometry_gen_group) self.layout.addWidget(self.geometry_opt_group) + self.layout.addWidget(self.geometry_adv_opt_group) + self.layout.addStretch() @@ -3618,109 +3628,6 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI): self.optimization_time_label.setDisabled(True) self.optimization_time_entry.setDisabled(True) - ###################### - ## ADVANCED OPTIONS ## - ###################### - - self.cncjob_label = QtWidgets.QLabel('Advanced Options:') - self.cncjob_label.setToolTip( - "Parameters used to create a CNC Job object\n" - "for this drill object that are not changed very often." - ) - self.layout.addWidget(self.cncjob_label) - - grid1 = QtWidgets.QGridLayout() - self.layout.addLayout(grid1) - - offsetlabel = QtWidgets.QLabel('Offset Z:') - offsetlabel.setToolTip( - "Some drill bits (the larger ones) need to drill deeper\n" - "to create the desired exit hole diameter due of the tip shape.\n" - "The value here can compensate the Cut Z parameter.") - grid1.addWidget(offsetlabel, 0, 0) - self.offset_entry = LengthEntry() - grid1.addWidget(self.offset_entry, 0, 1) - - toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') - toolchange_xy_label.setToolTip( - "Toolchange X,Y position." - ) - grid1.addWidget(toolchange_xy_label, 1, 0) - self.toolchangexy_entry = FCEntry() - grid1.addWidget(self.toolchangexy_entry, 1, 1) - - startzlabel = QtWidgets.QLabel('Start move Z:') - startzlabel.setToolTip( - "Height of the tool just after start.\n" - "Delete the value if you don't need this feature." - ) - grid1.addWidget(startzlabel, 2, 0) - self.estartz_entry = FloatEntry() - grid1.addWidget(self.estartz_entry, 2, 1) - - endzlabel = QtWidgets.QLabel('End move Z:') - endzlabel.setToolTip( - "Height of the tool after\n" - "the last move at the end of the job." - ) - grid1.addWidget(endzlabel, 3, 0) - self.eendz_entry = LengthEntry() - grid1.addWidget(self.eendz_entry, 3, 1) - - - fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') - fr_rapid_label.setToolTip( - "Tool speed while drilling\n" - "with rapid move\n" - "(in units per minute)." - ) - grid1.addWidget(fr_rapid_label, 4, 0) - self.feedrate_rapid_entry = LengthEntry() - grid1.addWidget(self.feedrate_rapid_entry, 4, 1) - - # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") - self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." - ) - grid1.addWidget(self.pdepth_label, 5, 0) - self.pdepth_entry = FCEntry() - grid1.addWidget(self.pdepth_entry, 5, 1) - - # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") - self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." - ) - grid1.addWidget(self.feedrate_probe_label, 6, 0) - self.feedrate_probe_entry = FCEntry() - grid1.addWidget(self.feedrate_probe_entry, 6, 1) - - fplungelabel = QtWidgets.QLabel('Fast Plunge:') - fplungelabel.setToolTip( - "By checking this, the vertical move from\n" - "Z_Toolchange to Z_move is done with G0,\n" - "meaning the fastest speed available.\n" - "WARNING: the move is done at Toolchange X,Y coords." - ) - self.fplunge_cb = FCCheckBox() - grid1.addWidget(fplungelabel, 7, 0) - grid1.addWidget(self.fplunge_cb, 7, 1) - - fretractlabel = QtWidgets.QLabel('Fast Retract:') - fretractlabel.setToolTip( - "Exit hole strategy.\n" - " - When uncheked, while exiting the drilled hole the drill bit\n" - "will travel slow, with set feedrate (G1), up to zero depth and then\n" - "travel as fast as possible (G0) to the Z Move (travel height).\n" - " - When checked the travel from Z cut (cut depth) to Z_move\n" - "(travel height) is done as fast as possible (G0) in one move." - ) - self.fretract_cb = FCCheckBox() - grid1.addWidget(fretractlabel, 8, 0) - grid1.addWidget(self.fretract_cb, 8, 1) - self.layout.addStretch() def optimization_selection(self): @@ -3892,6 +3799,119 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI): self.layout.addStretch() +class ExcellonAdvOptPrefGroupUI(OptionsGroupUI): + + def __init__(self, parent=None): + # OptionsGroupUI.__init__(self, "Excellon Advanced Options", parent=parent) + super(ExcellonAdvOptPrefGroupUI, self).__init__(self) + + self.setTitle(str("Excellon Adv. Options")) + + ###################### + ## ADVANCED OPTIONS ## + ###################### + + self.cncjob_label = QtWidgets.QLabel('Advanced Options:') + self.cncjob_label.setToolTip( + "Parameters used to create a CNC Job object\n" + "for this drill object that are shown when App Level is Advanced." + ) + self.layout.addWidget(self.cncjob_label) + + grid1 = QtWidgets.QGridLayout() + self.layout.addLayout(grid1) + + offsetlabel = QtWidgets.QLabel('Offset Z:') + offsetlabel.setToolTip( + "Some drill bits (the larger ones) need to drill deeper\n" + "to create the desired exit hole diameter due of the tip shape.\n" + "The value here can compensate the Cut Z parameter.") + grid1.addWidget(offsetlabel, 0, 0) + self.offset_entry = LengthEntry() + grid1.addWidget(self.offset_entry, 0, 1) + + toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') + toolchange_xy_label.setToolTip( + "Toolchange X,Y position." + ) + grid1.addWidget(toolchange_xy_label, 1, 0) + self.toolchangexy_entry = FCEntry() + grid1.addWidget(self.toolchangexy_entry, 1, 1) + + startzlabel = QtWidgets.QLabel('Start move Z:') + startzlabel.setToolTip( + "Height of the tool just after start.\n" + "Delete the value if you don't need this feature." + ) + grid1.addWidget(startzlabel, 2, 0) + self.estartz_entry = FloatEntry() + grid1.addWidget(self.estartz_entry, 2, 1) + + endzlabel = QtWidgets.QLabel('End move Z:') + endzlabel.setToolTip( + "Height of the tool after\n" + "the last move at the end of the job." + ) + grid1.addWidget(endzlabel, 3, 0) + self.eendz_entry = LengthEntry() + grid1.addWidget(self.eendz_entry, 3, 1) + + fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + fr_rapid_label.setToolTip( + "Tool speed while drilling\n" + "with rapid move\n" + "(in units per minute)." + ) + grid1.addWidget(fr_rapid_label, 4, 0) + self.feedrate_rapid_entry = LengthEntry() + grid1.addWidget(self.feedrate_rapid_entry, 4, 1) + + # Probe depth + self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label.setToolTip( + "The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units." + ) + grid1.addWidget(self.pdepth_label, 5, 0) + self.pdepth_entry = FCEntry() + grid1.addWidget(self.pdepth_entry, 5, 1) + + # Probe feedrate + self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label.setToolTip( + "The feedrate used while the probe is probing." + ) + grid1.addWidget(self.feedrate_probe_label, 6, 0) + self.feedrate_probe_entry = FCEntry() + grid1.addWidget(self.feedrate_probe_entry, 6, 1) + + fplungelabel = QtWidgets.QLabel('Fast Plunge:') + fplungelabel.setToolTip( + "By checking this, the vertical move from\n" + "Z_Toolchange to Z_move is done with G0,\n" + "meaning the fastest speed available.\n" + "WARNING: the move is done at Toolchange X,Y coords." + ) + self.fplunge_cb = FCCheckBox() + grid1.addWidget(fplungelabel, 7, 0) + grid1.addWidget(self.fplunge_cb, 7, 1) + + fretractlabel = QtWidgets.QLabel('Fast Retract:') + fretractlabel.setToolTip( + "Exit hole strategy.\n" + " - When uncheked, while exiting the drilled hole the drill bit\n" + "will travel slow, with set feedrate (G1), up to zero depth and then\n" + "travel as fast as possible (G0) to the Z Move (travel height).\n" + " - When checked the travel from Z cut (cut depth) to Z_move\n" + "(travel height) is done as fast as possible (G0) in one move." + ) + self.fretract_cb = FCCheckBox() + grid1.addWidget(fretractlabel, 8, 0) + grid1.addWidget(self.fretract_cb, 8, 1) + + self.layout.addStretch() + + class ExcellonExpPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): @@ -4065,122 +4085,6 @@ class GeometryGenPrefGroupUI(OptionsGroupUI): self.cnctooldia_entry = LengthEntry() grid0_b.addWidget(self.cnctooldia_entry, 0, 1) - - # ------------------------------ - ## Advanced Options - # ------------------------------ - self.cncjob_label = QtWidgets.QLabel('Advanced Options:') - self.cncjob_label.setToolTip( - "Parameters to create a CNC Job object\n" - "tracing the contours of a Geometry object." - ) - self.layout.addWidget(self.cncjob_label) - - grid1 = QtWidgets.QGridLayout() - self.layout.addLayout(grid1) - - # Toolchange X,Y - toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') - toolchange_xy_label.setToolTip( - "Toolchange X,Y position." - ) - grid1.addWidget(toolchange_xy_label, 1, 0) - self.toolchangexy_entry = FCEntry() - grid1.addWidget(self.toolchangexy_entry, 1, 1) - - # Start move Z - startzlabel = QtWidgets.QLabel('Start move Z:') - startzlabel.setToolTip( - "Height of the tool just after starting the work.\n" - "Delete the value if you don't need this feature." - ) - grid1.addWidget(startzlabel, 2, 0) - self.gstartz_entry = FloatEntry() - grid1.addWidget(self.gstartz_entry, 2, 1) - - # End move Z - endzlabel = QtWidgets.QLabel('End move Z:') - endzlabel.setToolTip( - "Height of the tool after\n" - "the last move at the end of the job." - ) - grid1.addWidget(endzlabel, 3, 0) - self.gendz_entry = LengthEntry() - grid1.addWidget(self.gendz_entry, 3, 1) - - # Feedrate rapids - fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') - fr_rapid_label.setToolTip( - "Cutting speed in the XY\n" - "plane in units per minute" - ) - grid1.addWidget(fr_rapid_label, 4, 0) - self.cncfeedrate_rapid_entry = LengthEntry() - grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1) - - # End move extra cut - self.extracut_cb = FCCheckBox(label='Re-cut 1st pt.') - self.extracut_cb.setToolTip( - "In order to remove possible\n" - "copper leftovers where first cut\n" - "meet with last cut, we generate an\n" - "extended cut over the first cut section." - ) - grid1.addWidget(self.extracut_cb, 5, 0) - - # Probe depth - self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") - self.pdepth_label.setToolTip( - "The maximum depth that the probe is allowed\n" - "to probe. Negative value, in current units." - ) - grid1.addWidget(self.pdepth_label, 6, 0) - self.pdepth_entry = FCEntry() - grid1.addWidget(self.pdepth_entry, 6, 1) - - # Probe feedrate - self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") - self.feedrate_probe_label.setToolTip( - "The feedrate used while the probe is probing." - ) - grid1.addWidget(self.feedrate_probe_label, 7, 0) - self.feedrate_probe_entry = FCEntry() - grid1.addWidget(self.feedrate_probe_entry, 7, 1) - - # Fast Move from Z Toolchange - fplungelabel = QtWidgets.QLabel('Fast Plunge:') - fplungelabel.setToolTip( - "By checking this, the vertical move from\n" - "Z_Toolchange to Z_move is done with G0,\n" - "meaning the fastest speed available.\n" - "WARNING: the move is done at Toolchange X,Y coords." - ) - self.fplunge_cb = FCCheckBox() - grid1.addWidget(fplungelabel, 8, 0) - grid1.addWidget(self.fplunge_cb, 8, 1) - - # Size of trace segment on X axis - segx_label = QtWidgets.QLabel("Seg. X size:") - segx_label.setToolTip( - "The size of the trace segment on the X axis.\n" - "Useful for auto-leveling.\n" - "A value of 0 means no segmentation on the X axis." - ) - grid1.addWidget(segx_label, 9, 0) - self.segx_entry = FCEntry() - grid1.addWidget(self.segx_entry, 9, 1) - - # Size of trace segment on Y axis - segy_label = QtWidgets.QLabel("Seg. Y size:") - segy_label.setToolTip( - "The size of the trace segment on the Y axis.\n" - "Useful for auto-leveling.\n" - "A value of 0 means no segmentation on the Y axis." - ) - grid1.addWidget(segy_label, 10, 0) - self.segy_entry = FCEntry() - grid1.addWidget(self.segy_entry, 10, 1) - self.layout.addStretch() @@ -4329,6 +4233,131 @@ class GeometryOptPrefGroupUI(OptionsGroupUI): self.layout.addStretch() +class GeometryAdvOptPrefGroupUI(OptionsGroupUI): + def __init__(self, parent=None): + # OptionsGroupUI.__init__(self, "Geometry Advanced Options Preferences", parent=parent) + super(GeometryAdvOptPrefGroupUI, self).__init__(self) + + self.setTitle(str("Geometry Adv. Options")) + + # ------------------------------ + ## Advanced Options + # ------------------------------ + self.cncjob_label = QtWidgets.QLabel('Advanced Options:') + self.cncjob_label.setToolTip( + "Parameters to create a CNC Job object\n" + "tracing the contours of a Geometry object." + ) + self.layout.addWidget(self.cncjob_label) + + grid1 = QtWidgets.QGridLayout() + self.layout.addLayout(grid1) + + # Toolchange X,Y + toolchange_xy_label = QtWidgets.QLabel('Toolchange X,Y:') + toolchange_xy_label.setToolTip( + "Toolchange X,Y position." + ) + grid1.addWidget(toolchange_xy_label, 1, 0) + self.toolchangexy_entry = FCEntry() + grid1.addWidget(self.toolchangexy_entry, 1, 1) + + # Start move Z + startzlabel = QtWidgets.QLabel('Start move Z:') + startzlabel.setToolTip( + "Height of the tool just after starting the work.\n" + "Delete the value if you don't need this feature." + ) + grid1.addWidget(startzlabel, 2, 0) + self.gstartz_entry = FloatEntry() + grid1.addWidget(self.gstartz_entry, 2, 1) + + # End move Z + endzlabel = QtWidgets.QLabel('End move Z:') + endzlabel.setToolTip( + "Height of the tool after\n" + "the last move at the end of the job." + ) + grid1.addWidget(endzlabel, 3, 0) + self.gendz_entry = LengthEntry() + grid1.addWidget(self.gendz_entry, 3, 1) + + # Feedrate rapids + fr_rapid_label = QtWidgets.QLabel('Feedrate Rapids:') + fr_rapid_label.setToolTip( + "Cutting speed in the XY\n" + "plane in units per minute" + ) + grid1.addWidget(fr_rapid_label, 4, 0) + self.cncfeedrate_rapid_entry = LengthEntry() + grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1) + + # End move extra cut + self.extracut_cb = FCCheckBox(label='Re-cut 1st pt.') + self.extracut_cb.setToolTip( + "In order to remove possible\n" + "copper leftovers where first cut\n" + "meet with last cut, we generate an\n" + "extended cut over the first cut section." + ) + grid1.addWidget(self.extracut_cb, 5, 0) + + # Probe depth + self.pdepth_label = QtWidgets.QLabel("Probe Z depth:") + self.pdepth_label.setToolTip( + "The maximum depth that the probe is allowed\n" + "to probe. Negative value, in current units." + ) + grid1.addWidget(self.pdepth_label, 6, 0) + self.pdepth_entry = FCEntry() + grid1.addWidget(self.pdepth_entry, 6, 1) + + # Probe feedrate + self.feedrate_probe_label = QtWidgets.QLabel("Feedrate Probe:") + self.feedrate_probe_label.setToolTip( + "The feedrate used while the probe is probing." + ) + grid1.addWidget(self.feedrate_probe_label, 7, 0) + self.feedrate_probe_entry = FCEntry() + grid1.addWidget(self.feedrate_probe_entry, 7, 1) + + # Fast Move from Z Toolchange + fplungelabel = QtWidgets.QLabel('Fast Plunge:') + fplungelabel.setToolTip( + "By checking this, the vertical move from\n" + "Z_Toolchange to Z_move is done with G0,\n" + "meaning the fastest speed available.\n" + "WARNING: the move is done at Toolchange X,Y coords." + ) + self.fplunge_cb = FCCheckBox() + grid1.addWidget(fplungelabel, 8, 0) + grid1.addWidget(self.fplunge_cb, 8, 1) + + # Size of trace segment on X axis + segx_label = QtWidgets.QLabel("Seg. X size:") + segx_label.setToolTip( + "The size of the trace segment on the X axis.\n" + "Useful for auto-leveling.\n" + "A value of 0 means no segmentation on the X axis." + ) + grid1.addWidget(segx_label, 9, 0) + self.segx_entry = FCEntry() + grid1.addWidget(self.segx_entry, 9, 1) + + # Size of trace segment on Y axis + segy_label = QtWidgets.QLabel("Seg. Y size:") + segy_label.setToolTip( + "The size of the trace segment on the Y axis.\n" + "Useful for auto-leveling.\n" + "A value of 0 means no segmentation on the Y axis." + ) + grid1.addWidget(segy_label, 10, 0) + self.segy_entry = FCEntry() + grid1.addWidget(self.segy_entry, 10, 1) + + self.layout.addStretch() + + class CNCJobGenPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): # OptionsGroupUI.__init__(self, "CNC Job General Preferences", parent=None) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 730ea4cb..e80361f1 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1135,7 +1135,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # store the source file here self.source_file = "" - self.multigeo = False + self.multigeo = True # Attributes to be included in serialization # Always append to it because it carries contents diff --git a/README.md b/README.md index c76521ae..39422c70 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ CAD program, and create G-Code for Isolation routing. 23.02.2019 - remade the SolderPaste geometry generation function in ToolSoderPaste to work in certain scenarios where the Gerber pads in the SolderPaste mask Gerber may be just pads outlines -- +- updated the Properties Tool to include more information's, also details if a Geometry is of type MultiGeo or SingleGeo +- remade the Preferences GUI to include the Advanced Options in a separate way so it is obvious which are displayed when App Level is Advanced. 22.02.2019 diff --git a/camlib.py b/camlib.py index 409cc021..06655b23 100644 --- a/camlib.py +++ b/camlib.py @@ -3281,6 +3281,7 @@ class Excellon(Geometry): Key Value ================ ==================================== C Diameter of the tool + solid_geometry Geometry list for each tool Others Not supported (Ignored). ================ ==================================== diff --git a/flatcamTools/ToolProperties.py b/flatcamTools/ToolProperties.py index 3fe0cadd..a6f9437c 100644 --- a/flatcamTools/ToolProperties.py +++ b/flatcamTools/ToolProperties.py @@ -91,14 +91,31 @@ class Properties(FlatCAMTool): obj_type = self.addParent(parent, 'TYPE', expanded=True, color=QtGui.QColor("#000000"), font=font) obj_name = self.addParent(parent, 'NAME', expanded=True, color=QtGui.QColor("#000000"), font=font) dims = self.addParent(parent, 'Dimensions', expanded=True, color=QtGui.QColor("#000000"), font=font) + units = self.addParent(parent, 'Units', expanded=True, color=QtGui.QColor("#000000"), font=font) + options = self.addParent(parent, 'Options', color=QtGui.QColor("#000000"), font=font) + if obj.kind.lower() == 'gerber': + apertures = self.addParent(parent, 'Apertures', expanded=True, color=QtGui.QColor("#000000"), font=font) + else: + tools = self.addParent(parent, 'Tools', expanded=True, color=QtGui.QColor("#000000"), font=font) + separator = self.addParent(parent, '') - self.addChild(obj_type, [obj.kind.upper()]) + self.addChild(obj_type, ['Object Type:', ('%s' % (obj.kind.capitalize()))], True) + try: + self.addChild(obj_type, ['Geo Type:', ('%s' % ({False: "Single-Geo", True: "Multi-Geo"}[obj.multigeo]))], True) + except Exception as e: + pass + self.addChild(obj_name, [obj.options['name']]) # calculate physical dimensions - xmin, ymin, xmax, ymax = obj.bounds() + try: + xmin, ymin, xmax, ymax = obj.bounds() + except Exception as e: + log.debug("PropertiesTool.addItems() --> %s" % str(e)) + return + length = abs(xmax - xmin) width = abs(ymax - ymin) @@ -113,11 +130,60 @@ class Properties(FlatCAMTool): area = length * width self.addChild(dims, ['Box Area:', '%.4f %s' % (area, 'in2')], True) + self.addChild(units, + ['FlatCAM units:', + { + 'in': 'Inch', + 'mm': 'Metric' + } + [str(self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower())]], True) + for option in obj.options: if option is 'name': continue self.addChild(options, [str(option), str(obj.options[option])], True) + if obj.kind.lower() == 'gerber': + for ap in obj.apertures: + self.addChild(apertures, [str(ap), str(obj.apertures[ap])], True) + elif obj.kind.lower() == 'excellon': + for tool, value in obj.tools.items(): + self.addChild(tools, [str(tool), str(value['C'])], True) + elif obj.kind.lower() == 'geometry': + for tool, value in obj.tools.items(): + geo_tool = self.addParent(tools, str(tool), expanded=True, color=QtGui.QColor("#000000"), font=font) + for k, v in value.items(): + if k == 'solid_geometry': + printed_value = 'Present' if v else 'None' + self.addChild(geo_tool, [str(k), printed_value], True) + elif k == 'data': + tool_data = self.addParent(geo_tool, str(k).capilalize(), + color=QtGui.QColor("#000000"), font=font) + for data_k, data_v in v.items(): + self.addChild(tool_data, [str(data_k), str(data_v)], True) + else: + self.addChild(geo_tool, [str(k), str(v)], True) + elif obj.kind.lower() == 'cncjob': + for tool, value in obj.cnc_tools.items(): + geo_tool = self.addParent(tools, str(tool), expanded=True, color=QtGui.QColor("#000000"), font=font) + for k, v in value.items(): + if k == 'solid_geometry': + printed_value = 'Present' if v else 'None' + self.addChild(geo_tool, [str(k), printed_value], True) + elif k == 'gcode': + printed_value = 'Present' if v != '' else 'None' + self.addChild(geo_tool, [str(k), printed_value], True) + elif k == 'gcode_parsed': + printed_value = 'Present' if v else 'None' + self.addChild(geo_tool, [str(k), printed_value], True) + elif k == 'data': + tool_data = self.addParent(geo_tool, str(k).capitalize(), + color=QtGui.QColor("#000000"), font=font) + for data_k, data_v in v.items(): + self.addChild(tool_data, [str(data_k), str(data_v)], True) + else: + self.addChild(geo_tool, [str(k), str(v)], True) + self.addChild(separator, ['']) def addParent(self, parent, title, expanded=False, color=None, font=None):