Просмотр исходного кода

- 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.

Marius Stanciu 7 лет назад
Родитель
Сommit
3bad47b3be
6 измененных файлов с 405 добавлено и 275 удалено
  1. 83 50
      FlatCAMApp.py
  2. 250 221
      FlatCAMGUI.py
  3. 1 1
      FlatCAMObj.py
  4. 2 1
      README.md
  5. 1 0
      camlib.py
  6. 68 2
      flatcamTools/ToolProperties.py

+ 83 - 50
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,
 

+ 250 - 221
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('<b>Advanced Options:</b>')
-        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('<b>Advanced Options:</b>')
+        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('<b>Advanced Options:</b>')
-        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('<b>Advanced Options:</b>')
+        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)

+ 1 - 1
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

+ 2 - 1
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
 

+ 1 - 0
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).
     ================  ====================================
 

+ 68 - 2
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):