Преглед изворни кода

- some GUI elements changes

Marius Stanciu пре 7 година
родитељ
комит
2843810ab3

+ 134 - 140
FlatCAMApp.py

@@ -776,127 +776,121 @@ class App(QtCore.QObject):
         #     QtCore.QTimer.singleShot(self.defaults["global_defaults_save_period_ms"], auto_save_defaults)
         #     QtCore.QTimer.singleShot(self.defaults["global_defaults_save_period_ms"], auto_save_defaults)
 
 
         # self.options_form = PreferencesUI()
         # self.options_form = PreferencesUI()
-        self.general_options_form = GeneralPreferencesUI()
-        self.gerber_options_form = GerberPreferencesUI()
-        self.excellon_options_form = ExcellonPreferencesUI()
-        self.geometry_options_form = GeometryPreferencesUI()
-        self.cncjob_options_form = CNCJobPreferencesUI()
-        self.tools_options_form = ToolsPreferencesUI()
 
 
         self.options_form_fields = {
         self.options_form_fields = {
-            "units": self.general_options_form.general_app_group.units_radio,
-            "global_gridx": self.general_options_form.general_gui_group.gridx_entry,
-            "global_gridy": self.general_options_form.general_gui_group.gridy_entry,
-            "global_snap_max": self.general_options_form.general_gui_group.snap_max_dist_entry,
-
-            "gerber_plot": self.gerber_options_form.gerber_gen_group.plot_cb,
-            "gerber_solid": self.gerber_options_form.gerber_gen_group.solid_cb,
-            "gerber_multicolored": self.gerber_options_form.gerber_gen_group.multicolored_cb,
-
-            "gerber_isotooldia": self.gerber_options_form.gerber_opt_group.iso_tool_dia_entry,
-            "gerber_isopasses": self.gerber_options_form.gerber_opt_group.iso_width_entry,
-            "gerber_isooverlap": self.gerber_options_form.gerber_opt_group.iso_overlap_entry,
-            "gerber_combine_passes": self.gerber_options_form.gerber_opt_group.combine_passes_cb,
-            "gerber_noncoppermargin": self.gerber_options_form.gerber_opt_group.noncopper_margin_entry,
-            "gerber_noncopperrounded": self.gerber_options_form.gerber_opt_group.noncopper_rounded_cb,
-            "gerber_bboxmargin": self.gerber_options_form.gerber_opt_group.bbmargin_entry,
-            "gerber_bboxrounded": self.gerber_options_form.gerber_opt_group.bbrounded_cb,
-
-            "excellon_plot": self.excellon_options_form.excellon_gen_group.plot_cb,
-            "excellon_solid": self.excellon_options_form.excellon_gen_group.solid_cb,
-            "excellon_format_upper_in": self.excellon_options_form.excellon_gen_group.excellon_format_upper_in_entry,
-            "excellon_format_lower_in": self.excellon_options_form.excellon_gen_group.excellon_format_lower_in_entry,
-            "excellon_format_upper_mm": self.excellon_options_form.excellon_gen_group.excellon_format_upper_mm_entry,
-            "excellon_format_lower_mm": self.excellon_options_form.excellon_gen_group.excellon_format_lower_mm_entry,
-            "excellon_zeros": self.excellon_options_form.excellon_gen_group.excellon_zeros_radio,
-            "excellon_units": self.excellon_options_form.excellon_gen_group.excellon_units_radio,
-            "excellon_optimization_type": self.excellon_options_form.excellon_gen_group.excellon_optimization_radio,
-            "excellon_feedrate_rapid": self.excellon_options_form.excellon_gen_group.feedrate_rapid_entry,
-            "excellon_toolchangexy": self.excellon_options_form.excellon_gen_group.toolchangexy_entry,
-            "excellon_f_plunge": self.excellon_options_form.excellon_gen_group.fplunge_cb,
-            "excellon_startz": self.excellon_options_form.excellon_gen_group.estartz_entry,
-            "excellon_endz": self.excellon_options_form.excellon_gen_group.eendz_entry,
-
-            "excellon_drillz": self.excellon_options_form.excellon_opt_group.cutz_entry,
-            "excellon_travelz": self.excellon_options_form.excellon_opt_group.travelz_entry,
-            "excellon_feedrate": self.excellon_options_form.excellon_opt_group.feedrate_entry,
-            "excellon_spindlespeed": self.excellon_options_form.excellon_opt_group.spindlespeed_entry,
-            "excellon_dwell": self.excellon_options_form.excellon_opt_group.dwell_cb,
-            "excellon_dwelltime": self.excellon_options_form.excellon_opt_group.dwelltime_entry,
-            "excellon_toolchange": self.excellon_options_form.excellon_opt_group.toolchange_cb,
-            "excellon_toolchangez": self.excellon_options_form.excellon_opt_group.toolchangez_entry,
-            "excellon_tooldia": self.excellon_options_form.excellon_opt_group.tooldia_entry,
-            "excellon_ppname_e": self.excellon_options_form.excellon_opt_group.pp_excellon_name_cb,
-
-            "geometry_plot": self.geometry_options_form.geometry_gen_group.plot_cb,
-            "geometry_cnctooldia": self.geometry_options_form.geometry_gen_group.cnctooldia_entry,
-            "geometry_segx": self.geometry_options_form.geometry_gen_group.segx_entry,
-            "geometry_segy": self.geometry_options_form.geometry_gen_group.segy_entry,
-            "geometry_feedrate_rapid": self.geometry_options_form.geometry_gen_group.cncfeedrate_rapid_entry,
-            "geometry_f_plunge": self.geometry_options_form.geometry_gen_group.fplunge_cb,
-            "geometry_toolchangexy": self.geometry_options_form.geometry_gen_group.toolchangexy_entry,
-            "geometry_startz": self.geometry_options_form.geometry_gen_group.gstartz_entry,
-            "geometry_endz": self.geometry_options_form.geometry_gen_group.gendz_entry,
-            "geometry_extracut": self.geometry_options_form.geometry_gen_group.extracut_cb,
-
-            "geometry_cutz": self.geometry_options_form.geometry_opt_group.cutz_entry,
-            "geometry_travelz": self.geometry_options_form.geometry_opt_group.travelz_entry,
-            "geometry_feedrate": self.geometry_options_form.geometry_opt_group.cncfeedrate_entry,
-            "geometry_feedrate_z": self.geometry_options_form.geometry_opt_group.cncplunge_entry,
-            "geometry_spindlespeed": self.geometry_options_form.geometry_opt_group.cncspindlespeed_entry,
-            "geometry_dwell": self.geometry_options_form.geometry_opt_group.dwell_cb,
-            "geometry_dwelltime": self.geometry_options_form.geometry_opt_group.dwelltime_entry,
-            "geometry_ppname_g": self.geometry_options_form.geometry_opt_group.pp_geometry_name_cb,
-            "geometry_toolchange": self.geometry_options_form.geometry_opt_group.toolchange_cb,
-            "geometry_toolchangez": self.geometry_options_form.geometry_opt_group.toolchangez_entry,
-            "geometry_depthperpass": self.geometry_options_form.geometry_opt_group.depthperpass_entry,
-            "geometry_multidepth": self.geometry_options_form.geometry_opt_group.multidepth_cb,
-
-            "cncjob_plot": self.cncjob_options_form.cncjob_gen_group.plot_cb,
-            "cncjob_tooldia": self.cncjob_options_form.cncjob_gen_group.tooldia_entry,
-
-            "cncjob_prepend": self.cncjob_options_form.cncjob_opt_group.prepend_text,
-            "cncjob_append": self.cncjob_options_form.cncjob_opt_group.append_text,
-
-            "tools_ncctools": self.tools_options_form.tools_ncc_group.ncc_tool_dia_entry,
-            "tools_nccoverlap": self.tools_options_form.tools_ncc_group.ncc_overlap_entry,
-            "tools_nccmargin": self.tools_options_form.tools_ncc_group.ncc_margin_entry,
-
-            "tools_cutouttooldia": self.tools_options_form.tools_cutout_group.cutout_tooldia_entry,
-            "tools_cutoutmargin": self.tools_options_form.tools_cutout_group.cutout_margin_entry,
-            "tools_cutoutgapsize": self.tools_options_form.tools_cutout_group.cutout_gap_entry,
-            "tools_gaps_rect": self.tools_options_form.tools_cutout_group.gaps_radio,
-            "tools_gaps_ff": self.tools_options_form.tools_cutout_group.gaps_combo,
-
-            "tools_painttooldia": self.tools_options_form.tools_paint_group.painttooldia_entry,
-            "tools_paintoverlap": self.tools_options_form.tools_paint_group.paintoverlap_entry,
-            "tools_paintmargin": self.tools_options_form.tools_paint_group.paintmargin_entry,
-            "tools_paintmethod": self.tools_options_form.tools_paint_group.paintmethod_combo,
-            "tools_selectmethod": self.tools_options_form.tools_paint_group.selectmethod_combo,
-            "tools_pathconnect": self.tools_options_form.tools_paint_group.pathconnect_cb,
-            "tools_paintcontour": self.tools_options_form.tools_paint_group.contour_cb,
-
-            "tools_2sided_mirror_axis": self.tools_options_form.tools_2sided_group.mirror_axis_radio,
-            "tools_2sided_axis_loc": self.tools_options_form.tools_2sided_group.axis_location_radio,
-            "tools_2sided_drilldia": self.tools_options_form.tools_2sided_group.drill_dia_entry,
-
-            "tools_film_type": self.tools_options_form.tools_film_group.film_type_radio,
-            "tools_film_boundary": self.tools_options_form.tools_film_group.film_boundary_entry,
-            "tools_film_scale": self.tools_options_form.tools_film_group.film_scale_entry,
-
-            "tools_panelize_spacing_columns": self.tools_options_form.tools_panelize_group.pspacing_columns,
-            "tools_panelize_spacing_rows": self.tools_options_form.tools_panelize_group.pspacing_rows,
-            "tools_panelize_columns": self.tools_options_form.tools_panelize_group.pcolumns,
-            "tools_panelize_rows": self.tools_options_form.tools_panelize_group.prows,
-            "tools_panelize_constrain": self.tools_options_form.tools_panelize_group.pconstrain_cb,
-            "tools_panelize_constrainx": self.tools_options_form.tools_panelize_group.px_width_entry,
-            "tools_panelize_constrainy": self.tools_options_form.tools_panelize_group.py_height_entry
+            "units": self.ui.general_options_form.general_app_group.units_radio,
+            "global_gridx": self.ui.general_options_form.general_gui_group.gridx_entry,
+            "global_gridy": self.ui.general_options_form.general_gui_group.gridy_entry,
+            "global_snap_max": self.ui.general_options_form.general_gui_group.snap_max_dist_entry,
+
+            "gerber_plot": self.ui.gerber_options_form.gerber_gen_group.plot_cb,
+            "gerber_solid": self.ui.gerber_options_form.gerber_gen_group.solid_cb,
+            "gerber_multicolored": self.ui.gerber_options_form.gerber_gen_group.multicolored_cb,
+
+            "gerber_isotooldia": self.ui.gerber_options_form.gerber_opt_group.iso_tool_dia_entry,
+            "gerber_isopasses": self.ui.gerber_options_form.gerber_opt_group.iso_width_entry,
+            "gerber_isooverlap": self.ui.gerber_options_form.gerber_opt_group.iso_overlap_entry,
+            "gerber_combine_passes": self.ui.gerber_options_form.gerber_opt_group.combine_passes_cb,
+            "gerber_noncoppermargin": self.ui.gerber_options_form.gerber_opt_group.noncopper_margin_entry,
+            "gerber_noncopperrounded": self.ui.gerber_options_form.gerber_opt_group.noncopper_rounded_cb,
+            "gerber_bboxmargin": self.ui.gerber_options_form.gerber_opt_group.bbmargin_entry,
+            "gerber_bboxrounded": self.ui.gerber_options_form.gerber_opt_group.bbrounded_cb,
+
+            "excellon_plot": self.ui.excellon_options_form.excellon_gen_group.plot_cb,
+            "excellon_solid": self.ui.excellon_options_form.excellon_gen_group.solid_cb,
+            "excellon_format_upper_in": self.ui.excellon_options_form.excellon_gen_group.excellon_format_upper_in_entry,
+            "excellon_format_lower_in": self.ui.excellon_options_form.excellon_gen_group.excellon_format_lower_in_entry,
+            "excellon_format_upper_mm": self.ui.excellon_options_form.excellon_gen_group.excellon_format_upper_mm_entry,
+            "excellon_format_lower_mm": self.ui.excellon_options_form.excellon_gen_group.excellon_format_lower_mm_entry,
+            "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,
+            "excellon_feedrate": self.ui.excellon_options_form.excellon_opt_group.feedrate_entry,
+            "excellon_spindlespeed": self.ui.excellon_options_form.excellon_opt_group.spindlespeed_entry,
+            "excellon_dwell": self.ui.excellon_options_form.excellon_opt_group.dwell_cb,
+            "excellon_dwelltime": self.ui.excellon_options_form.excellon_opt_group.dwelltime_entry,
+            "excellon_toolchange": self.ui.excellon_options_form.excellon_opt_group.toolchange_cb,
+            "excellon_toolchangez": self.ui.excellon_options_form.excellon_opt_group.toolchangez_entry,
+            "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,
+
+            "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,
+            "geometry_feedrate": self.ui.geometry_options_form.geometry_opt_group.cncfeedrate_entry,
+            "geometry_feedrate_z": self.ui.geometry_options_form.geometry_opt_group.cncplunge_entry,
+            "geometry_spindlespeed": self.ui.geometry_options_form.geometry_opt_group.cncspindlespeed_entry,
+            "geometry_dwell": self.ui.geometry_options_form.geometry_opt_group.dwell_cb,
+            "geometry_dwelltime": self.ui.geometry_options_form.geometry_opt_group.dwelltime_entry,
+            "geometry_ppname_g": self.ui.geometry_options_form.geometry_opt_group.pp_geometry_name_cb,
+            "geometry_toolchange": self.ui.geometry_options_form.geometry_opt_group.toolchange_cb,
+            "geometry_toolchangez": self.ui.geometry_options_form.geometry_opt_group.toolchangez_entry,
+            "geometry_depthperpass": self.ui.geometry_options_form.geometry_opt_group.depthperpass_entry,
+            "geometry_multidepth": self.ui.geometry_options_form.geometry_opt_group.multidepth_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,
+
+            "cncjob_prepend": self.ui.cncjob_options_form.cncjob_opt_group.prepend_text,
+            "cncjob_append": self.ui.cncjob_options_form.cncjob_opt_group.append_text,
+
+            "tools_ncctools": self.ui.tools_options_form.tools_ncc_group.ncc_tool_dia_entry,
+            "tools_nccoverlap": self.ui.tools_options_form.tools_ncc_group.ncc_overlap_entry,
+            "tools_nccmargin": self.ui.tools_options_form.tools_ncc_group.ncc_margin_entry,
+
+            "tools_cutouttooldia": self.ui.tools_options_form.tools_cutout_group.cutout_tooldia_entry,
+            "tools_cutoutmargin": self.ui.tools_options_form.tools_cutout_group.cutout_margin_entry,
+            "tools_cutoutgapsize": self.ui.tools_options_form.tools_cutout_group.cutout_gap_entry,
+            "tools_gaps_rect": self.ui.tools_options_form.tools_cutout_group.gaps_radio,
+            "tools_gaps_ff": self.ui.tools_options_form.tools_cutout_group.gaps_combo,
+
+            "tools_painttooldia": self.ui.tools_options_form.tools_paint_group.painttooldia_entry,
+            "tools_paintoverlap": self.ui.tools_options_form.tools_paint_group.paintoverlap_entry,
+            "tools_paintmargin": self.ui.tools_options_form.tools_paint_group.paintmargin_entry,
+            "tools_paintmethod": self.ui.tools_options_form.tools_paint_group.paintmethod_combo,
+            "tools_selectmethod": self.ui.tools_options_form.tools_paint_group.selectmethod_combo,
+            "tools_pathconnect": self.ui.tools_options_form.tools_paint_group.pathconnect_cb,
+            "tools_paintcontour": self.ui.tools_options_form.tools_paint_group.contour_cb,
+
+            "tools_2sided_mirror_axis": self.ui.tools_options_form.tools_2sided_group.mirror_axis_radio,
+            "tools_2sided_axis_loc": self.ui.tools_options_form.tools_2sided_group.axis_location_radio,
+            "tools_2sided_drilldia": self.ui.tools_options_form.tools_2sided_group.drill_dia_entry,
+
+            "tools_film_type": self.ui.tools_options_form.tools_film_group.film_type_radio,
+            "tools_film_boundary": self.ui.tools_options_form.tools_film_group.film_boundary_entry,
+            "tools_film_scale": self.ui.tools_options_form.tools_film_group.film_scale_entry,
+
+            "tools_panelize_spacing_columns": self.ui.tools_options_form.tools_panelize_group.pspacing_columns,
+            "tools_panelize_spacing_rows": self.ui.tools_options_form.tools_panelize_group.pspacing_rows,
+            "tools_panelize_columns": self.ui.tools_options_form.tools_panelize_group.pcolumns,
+            "tools_panelize_rows": self.ui.tools_options_form.tools_panelize_group.prows,
+            "tools_panelize_constrain": self.ui.tools_options_form.tools_panelize_group.pconstrain_cb,
+            "tools_panelize_constrainx": self.ui.tools_options_form.tools_panelize_group.px_width_entry,
+            "tools_panelize_constrainy": self.ui.tools_options_form.tools_panelize_group.py_height_entry
 
 
         }
         }
 
 
         for name in list(self.postprocessors.keys()):
         for name in list(self.postprocessors.keys()):
-            self.geometry_options_form.geometry_opt_group.pp_geometry_name_cb.addItem(name)
-            self.excellon_options_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
+            self.ui.geometry_options_form.geometry_opt_group.pp_geometry_name_cb.addItem(name)
+            self.ui.excellon_options_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
 
 
         self.options = LoudDict()
         self.options = LoudDict()
         self.options.set_change_callback(self.on_options_dict_change)
         self.options.set_change_callback(self.on_options_dict_change)
@@ -1298,7 +1292,7 @@ class App(QtCore.QObject):
         ###############################
         ###############################
         ### GUI PREFERENCES SIGNALS ###
         ### GUI PREFERENCES SIGNALS ###
         ###############################
         ###############################
-        self.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units
+        self.ui.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units
         self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(self.on_language_apply)
         self.ui.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(self.on_language_apply)
 
 
         ###############################
         ###############################
@@ -1360,7 +1354,7 @@ class App(QtCore.QObject):
             self.on_excellon_defaults_button)
             self.on_excellon_defaults_button)
 
 
         # Load the defaults values into the Excellon Format and Excellon Zeros fields
         # Load the defaults values into the Excellon Format and Excellon Zeros fields
-        self.excellon_options_form.excellon_opt_group.excellon_defaults_button.clicked.connect(
+        self.ui.excellon_options_form.excellon_opt_group.excellon_defaults_button.clicked.connect(
             self.on_excellon_options_button)
             self.on_excellon_options_button)
 
 
         # this is a flag to signal to other tools that the ui tooltab is locked and not accessible
         # this is a flag to signal to other tools that the ui tooltab is locked and not accessible
@@ -2946,7 +2940,7 @@ class App(QtCore.QObject):
             return
             return
 
 
         # If option is the same, then ignore
         # If option is the same, then ignore
-        if self.general_options_form.general_app_group.units_radio.get_value().upper() == self.options["units"].upper():
+        if self.ui.general_options_form.general_app_group.units_radio.get_value().upper() == self.options["units"].upper():
             self.log.debug("on_toggle_units(): Same as options, so ignoring.")
             self.log.debug("on_toggle_units(): Same as options, so ignoring.")
             return
             return
 
 
@@ -2980,7 +2974,7 @@ class App(QtCore.QObject):
 
 
         # The scaling factor depending on choice of units.
         # The scaling factor depending on choice of units.
         factor = 1/25.4
         factor = 1/25.4
-        if self.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
+        if self.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
             factor = 25.4
             factor = 25.4
 
 
 
 
@@ -3010,7 +3004,7 @@ class App(QtCore.QObject):
             self.ui.grid_gap_y_entry.set_value(float(self.ui.grid_gap_y_entry.get_value()) * factor)
             self.ui.grid_gap_y_entry.set_value(float(self.ui.grid_gap_y_entry.get_value()) * factor)
 
 
             for obj in self.collection.get_list():
             for obj in self.collection.get_list():
-                units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+                units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
                 obj.convert_units(units)
                 obj.convert_units(units)
 
 
                 # make that the properties stored in the object are also updated
                 # make that the properties stored in the object are also updated
@@ -3030,10 +3024,10 @@ class App(QtCore.QObject):
         else:
         else:
             # Undo toggling
             # Undo toggling
             self.toggle_units_ignore = True
             self.toggle_units_ignore = True
-            if self.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
-                self.general_options_form.general_app_group.units_radio.set_value('IN')
+            if self.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
+                self.ui.general_options_form.general_app_group.units_radio.set_value('IN')
             else:
             else:
-                self.general_options_form.general_app_group.units_radio.set_value('MM')
+                self.ui.general_options_form.general_app_group.units_radio.set_value('MM')
             self.toggle_units_ignore = False
             self.toggle_units_ignore = False
             self.inform.emit("[WARNING_NOTCL]Units conversion cancelled.")
             self.inform.emit("[WARNING_NOTCL]Units conversion cancelled.")
 
 
@@ -3041,9 +3035,9 @@ class App(QtCore.QObject):
 
 
     def on_toggle_units_click(self):
     def on_toggle_units_click(self):
         if self.options["units"] == 'MM':
         if self.options["units"] == 'MM':
-            self.general_options_form.general_app_group.units_radio.set_value("IN")
+            self.ui.general_options_form.general_app_group.units_radio.set_value("IN")
         else:
         else:
-            self.general_options_form.general_app_group.units_radio.set_value("MM")
+            self.ui.general_options_form.general_app_group.units_radio.set_value("MM")
         self.on_toggle_units()
         self.on_toggle_units()
 
 
     def on_language_apply(self):
     def on_language_apply(self):
@@ -3138,12 +3132,12 @@ class App(QtCore.QObject):
             self.cnc_form = self.ui.cncjob_defaults_form
             self.cnc_form = self.ui.cncjob_defaults_form
             self.tools_form = self.ui.tools_defaults_form
             self.tools_form = self.ui.tools_defaults_form
         elif sel == 1:
         elif sel == 1:
-            self.gen_form = self.general_options_form
-            self.ger_form = self.gerber_options_form
-            self.exc_form = self.excellon_options_form
-            self.geo_form = self.geometry_options_form
-            self.cnc_form = self.cncjob_options_form
-            self.tools_form = self.tools_options_form
+            self.gen_form = self.ui.general_options_form
+            self.ger_form = self.ui.gerber_options_form
+            self.exc_form = self.ui.excellon_options_form
+            self.geo_form = self.ui.geometry_options_form
+            self.cnc_form = self.ui.cncjob_options_form
+            self.tools_form = self.ui.tools_options_form
         else:
         else:
             return
             return
 
 
@@ -3671,7 +3665,7 @@ class App(QtCore.QObject):
 
 
     def on_tool_add_keypress(self):
     def on_tool_add_keypress(self):
         ## Current application units in Upper Case
         ## Current application units in Upper Case
-        self.units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         notebook_widget_name = self.ui.notebook.currentWidget().objectName()
         notebook_widget_name = self.ui.notebook.currentWidget().objectName()
 
 
@@ -4262,7 +4256,7 @@ class App(QtCore.QObject):
             return 0
             return 0
 
 
     def populate_cmenu_grids(self):
     def populate_cmenu_grids(self):
-        units = self.general_options_form.general_app_group.units_radio.get_value().lower()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         self.ui.cmenu_gridmenu.clear()
         self.ui.cmenu_gridmenu.clear()
         sorted_list = sorted(self.defaults["global_grid_context_menu"][str(units)])
         sorted_list = sorted(self.defaults["global_grid_context_menu"][str(units)])
@@ -4283,7 +4277,7 @@ class App(QtCore.QObject):
 
 
     def on_grid_add(self):
     def on_grid_add(self):
         ## Current application units in lower Case
         ## Current application units in lower Case
-        units = self.general_options_form.general_app_group.units_radio.get_value().lower()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         grid_add_popup = FCInputDialog(title="New Grid ...",
         grid_add_popup = FCInputDialog(title="New Grid ...",
                                        text='Enter a Grid VAlue:',
                                        text='Enter a Grid VAlue:',
@@ -4310,7 +4304,7 @@ class App(QtCore.QObject):
 
 
     def on_grid_delete(self):
     def on_grid_delete(self):
         ## Current application units in lower Case
         ## Current application units in lower Case
-        units = self.general_options_form.general_app_group.units_radio.get_value().lower()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         grid_del_popup = FCInputDialog(title="Delete Grid ...",
         grid_del_popup = FCInputDialog(title="Delete Grid ...",
                                        text='Enter a Grid Value:',
                                        text='Enter a Grid Value:',
@@ -5754,7 +5748,7 @@ class App(QtCore.QObject):
         ezeros = self.defaults["excellon_exp_zeros"]
         ezeros = self.defaults["excellon_exp_zeros"]
         eformat = self.defaults[ "excellon_exp_format"]
         eformat = self.defaults[ "excellon_exp_format"]
 
 
-        fc_units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+        fc_units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
         if fc_units == 'MM':
         if fc_units == 'MM':
             factor = 1 if eunits == 'METRIC' else 0.03937
             factor = 1 if eunits == 'METRIC' else 0.03937
         else:
         else:
@@ -5872,7 +5866,7 @@ class App(QtCore.QObject):
             return "Could not retrieve object: %s" % obj_name
             return "Could not retrieve object: %s" % obj_name
 
 
         # updated units
         # updated units
-        units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
         if units == 'IN' or units == 'INCH':
         if units == 'IN' or units == 'INCH':
             units = 'INCH'
             units = 'INCH'
         elif units == 'MM' or units == 'METIRC':
         elif units == 'MM' or units == 'METIRC':
@@ -5927,7 +5921,7 @@ class App(QtCore.QObject):
                              "Only Geometry and Gerber are supported")
                              "Only Geometry and Gerber are supported")
             return
             return
 
 
-        units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         def obj_init(geo_obj, app_obj):
         def obj_init(geo_obj, app_obj):
             geo_obj.import_svg(filename, obj_type, units=units)
             geo_obj.import_svg(filename, obj_type, units=units)
@@ -5969,7 +5963,7 @@ class App(QtCore.QObject):
                              "Only Geometry and Gerber are supported")
                              "Only Geometry and Gerber are supported")
             return
             return
 
 
-        units = self.general_options_form.general_app_group.units_radio.get_value().upper()
+        units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         def obj_init(geo_obj, app_obj):
         def obj_init(geo_obj, app_obj):
             geo_obj.import_dxf(filename, obj_type, units=units)
             geo_obj.import_dxf(filename, obj_type, units=units)
@@ -6018,7 +6012,7 @@ class App(QtCore.QObject):
 
 
             # Object name
             # Object name
             name = outname or filename.split('/')[-1].split('\\')[-1]
             name = outname or filename.split('/')[-1].split('\\')[-1]
-            units = self.general_options_form.general_app_group.units_radio.get_value()
+            units = self.ui.general_options_form.general_app_group.units_radio.get_value()
 
 
             self.new_object(obj_type, name, obj_init)
             self.new_object(obj_type, name, obj_init)
             self.progress.emit(20)
             self.progress.emit(20)

+ 6 - 6
FlatCAMEditor.py

@@ -346,7 +346,7 @@ class TextInputTool(FlatCAMTool):
                     font_name=self.font_name,
                     font_name=self.font_name,
                     font_size=font_to_geo_size,
                     font_size=font_to_geo_size,
                     font_type=font_to_geo_type,
                     font_type=font_to_geo_type,
-                    units=self.app.general_options_form.general_app_group.units_radio.get_value().upper())
+                    units=self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper())
 
 
     def font_family(self, font):
     def font_family(self, font):
         self.text_input_entry.selectAll()
         self.text_input_entry.selectAll()
@@ -1483,7 +1483,7 @@ class TransformEditorTool(FlatCAMTool):
                 "[WARNING_NOTCL] Geometry shape rotate cancelled...")
                 "[WARNING_NOTCL] Geometry shape rotate cancelled...")
 
 
     def on_offx_key(self):
     def on_offx_key(self):
-        units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
+        units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         val_box = FCInputDialog(title="Offset on X axis ...",
         val_box = FCInputDialog(title="Offset on X axis ...",
                                 text=('Enter a distance Value (%s):' % str(units)),
                                 text=('Enter a distance Value (%s):' % str(units)),
@@ -1502,7 +1502,7 @@ class TransformEditorTool(FlatCAMTool):
                 "[WARNING_NOTCL] Geometry shape offset X cancelled...")
                 "[WARNING_NOTCL] Geometry shape offset X cancelled...")
 
 
     def on_offy_key(self):
     def on_offy_key(self):
-        units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
+        units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         val_box = FCInputDialog(title="Offset on Y axis ...",
         val_box = FCInputDialog(title="Offset on Y axis ...",
                                 text=('Enter a distance Value (%s):' % str(units)),
                                 text=('Enter a distance Value (%s):' % str(units)),
@@ -4985,7 +4985,7 @@ class FlatCAMExcEditor(QtCore.QObject):
         self.move_timer.setSingleShot(True)
         self.move_timer.setSingleShot(True)
 
 
         ## Current application units in Upper Case
         ## Current application units in Upper Case
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         self.key = None  # Currently pressed key
         self.key = None  # Currently pressed key
         self.modifiers = None
         self.modifiers = None
@@ -5059,7 +5059,7 @@ class FlatCAMExcEditor(QtCore.QObject):
 
 
     def set_ui(self):
     def set_ui(self):
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         self.olddia_newdia.clear()
         self.olddia_newdia.clear()
         self.tool2tooldia.clear()
         self.tool2tooldia.clear()
@@ -5099,7 +5099,7 @@ class FlatCAMExcEditor(QtCore.QObject):
             pass
             pass
 
 
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         # make a new name for the new Excellon object (the one with edited content)
         # make a new name for the new Excellon object (the one with edited content)
         self.edited_obj_name = self.exc_obj.options['name']
         self.edited_obj_name = self.exc_obj.options['name']

+ 10 - 3
FlatCAMGUI.py

@@ -1458,6 +1458,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.cncjob_defaults_form = CNCJobPreferencesUI()
         self.cncjob_defaults_form = CNCJobPreferencesUI()
         self.tools_defaults_form = ToolsPreferencesUI()
         self.tools_defaults_form = ToolsPreferencesUI()
 
 
+        self.general_options_form = GeneralPreferencesUI()
+        self.gerber_options_form = GerberPreferencesUI()
+        self.excellon_options_form = ExcellonPreferencesUI()
+        self.geometry_options_form = GeometryPreferencesUI()
+        self.cncjob_options_form = CNCJobPreferencesUI()
+        self.tools_options_form = ToolsPreferencesUI()
+
         QtWidgets.qApp.installEventFilter(self)
         QtWidgets.qApp.installEventFilter(self)
 
 
         # restore the Toolbar State from file
         # restore the Toolbar State from file
@@ -1885,9 +1892,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                 # Change Units
                 # Change Units
                 if key == QtCore.Qt.Key_Q:
                 if key == QtCore.Qt.Key_Q:
                     if self.app.options["units"] == 'MM':
                     if self.app.options["units"] == 'MM':
-                        self.app.general_options_form.general_app_group.units_radio.set_value("IN")
+                        self.app.ui.general_options_form.general_app_group.units_radio.set_value("IN")
                     else:
                     else:
-                        self.app.general_options_form.general_app_group.units_radio.set_value("MM")
+                        self.app.ui.general_options_form.general_app_group.units_radio.set_value("MM")
                     self.app.on_toggle_units()
                     self.app.on_toggle_units()
 
 
                 # Rotate Object by 90 degree CW
                 # Rotate Object by 90 degree CW
@@ -2354,7 +2361,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                 if key == QtCore.Qt.Key_T or key == 'T':
                 if key == QtCore.Qt.Key_T or key == 'T':
                     self.app.exc_editor.launched_from_shortcuts = True
                     self.app.exc_editor.launched_from_shortcuts = True
                     ## Current application units in Upper Case
                     ## Current application units in Upper Case
-                    self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+                    self.units = self.general_defaults_group.general_app_group.units_radio.get_value().upper()
                     tool_add_popup = FCInputDialog(title="New Tool ...",
                     tool_add_popup = FCInputDialog(title="New Tool ...",
                                                    text='Enter a Tool Diameter:',
                                                    text='Enter a Tool Diameter:',
                                                    min=0.0000, max=99.9999, decimals=4)
                                                    min=0.0000, max=99.9999, decimals=4)

+ 1 - 1
FlatCAMObj.py

@@ -3533,7 +3533,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             self.ui.geo_tools_table.setCurrentItem(self.ui.geo_tools_table.item(row, 0))
             self.ui.geo_tools_table.setCurrentItem(self.ui.geo_tools_table.item(row, 0))
 
 
     def export_dxf(self):
     def export_dxf(self):
-        units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
         dwg = None
         dwg = None
         try:
         try:
             dwg = ezdxf.new('R2010')
             dwg = ezdxf.new('R2010')

+ 2 - 2
ObjectCollection.py

@@ -451,9 +451,9 @@ class ObjectCollection(QtCore.QAbstractItemModel):
     #         # Change Units
     #         # Change Units
     #         if key == QtCore.Qt.Key_Q:
     #         if key == QtCore.Qt.Key_Q:
     #             if self.app.options["units"] == 'MM':
     #             if self.app.options["units"] == 'MM':
-    #                 self.app.general_options_form.general_app_group.units_radio.set_value("IN")
+    #                 self.app.ui.general_options_form.general_app_group.units_radio.set_value("IN")
     #             else:
     #             else:
-    #                 self.app.general_options_form.general_app_group.units_radio.set_value("MM")
+    #                 self.app.ui.general_options_form.general_app_group.units_radio.set_value("MM")
     #             self.app.on_toggle_units()
     #             self.app.on_toggle_units()
     #
     #
     #         # Rotate Object by 90 degree CW
     #         # Rotate Object by 90 degree CW

+ 2 - 2
PlotCanvas.py

@@ -65,7 +65,7 @@ class PlotCanvas(QtCore.QObject):
         self.draw_workspace()
         self.draw_workspace()
 
 
         # if self.app.defaults['global_workspace'] is True:
         # if self.app.defaults['global_workspace'] is True:
-        #     if self.app.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
+        #     if self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
         #         self.wkspace_t = Line(pos=)
         #         self.wkspace_t = Line(pos=)
 
 
         self.shape_collections = []
         self.shape_collections = []
@@ -92,7 +92,7 @@ class PlotCanvas(QtCore.QObject):
         a3p_mm = np.array([(0, 0), (297, 0), (297, 420), (0, 420)])
         a3p_mm = np.array([(0, 0), (297, 0), (297, 420), (0, 420)])
         a3l_mm = np.array([(0, 0), (420, 0), (420, 297), (0, 297)])
         a3l_mm = np.array([(0, 0), (420, 0), (420, 297), (0, 297)])
 
 
-        if self.app.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
+        if self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
             if self.app.defaults['global_workspaceT'] == 'A4P':
             if self.app.defaults['global_workspaceT'] == 'A4P':
                 a = a4p_mm
                 a = a4p_mm
             elif self.app.defaults['global_workspaceT'] == 'A4L':
             elif self.app.defaults['global_workspaceT'] == 'A4L':

+ 1 - 0
README.md

@@ -17,6 +17,7 @@ CAD program, and create G-Code for Isolation routing.
 - added true fullscreen support (for Windows OS)
 - added true fullscreen support (for Windows OS)
 - added the ability of context menu inside the GuiElements.FCCombobox() object.
 - added the ability of context menu inside the GuiElements.FCCombobox() object.
 - remade the UI for ToolSolderPaste. The object comboboxes now have context menu's that allow object deletion. Also the last object created is set as current item in comboboxes.
 - remade the UI for ToolSolderPaste. The object comboboxes now have context menu's that allow object deletion. Also the last object created is set as current item in comboboxes.
+- some GUI elements changes
 
 
 21.02.2019
 21.02.2019
 
 

+ 1 - 1
camlib.py

@@ -6314,7 +6314,7 @@ class CNCjob(Geometry):
             temp_gcode = ''
             temp_gcode = ''
             header_start = False
             header_start = False
             header_stop = False
             header_stop = False
-            units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+            units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
             lines = StringIO(g)
             lines = StringIO(g)
             for line in lines:
             for line in lines:

+ 1 - 1
flatcamTools/ToolCalculators.py

@@ -238,7 +238,7 @@ class ToolCalculator(FlatCAMTool):
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
 
 
     def set_tool_ui(self):
     def set_tool_ui(self):
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         ## Initialize form
         ## Initialize form
         self.mm_entry.set_value('0')
         self.mm_entry.set_value('0')

+ 3 - 3
flatcamTools/ToolMeasurement.py

@@ -12,7 +12,7 @@ class Measurement(FlatCAMTool):
     def __init__(self, app):
     def __init__(self, app):
         FlatCAMTool.__init__(self, app)
         FlatCAMTool.__init__(self, app)
 
 
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
         ## Title
         ## Title
         title_label = QtWidgets.QLabel("<font size=4><b>%s</b></font><br>" % self.toolName)
         title_label = QtWidgets.QLabel("<font size=4><b>%s</b></font><br>" % self.toolName)
@@ -173,7 +173,7 @@ class Measurement(FlatCAMTool):
 
 
         # Switch notebook to tool page
         # Switch notebook to tool page
         self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab)
         self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab)
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower()
         self.show()
         self.show()
 
 
     def toggle(self):
     def toggle(self):
@@ -210,7 +210,7 @@ class Measurement(FlatCAMTool):
         else:
         else:
             # ENABLE the Measuring TOOL
             # ENABLE the Measuring TOOL
             self.active = True
             self.active = True
-            self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
+            self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower()
 
 
             # we disconnect the mouse/key handlers from wherever the measurement tool was called
             # we disconnect the mouse/key handlers from wherever the measurement tool was called
             if self.app.call_source == 'app':
             if self.app.call_source == 'app':

+ 2 - 2
flatcamTools/ToolNonCopperClear.py

@@ -339,13 +339,13 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.obj_name = ""
         self.obj_name = ""
         self.ncc_obj = None
         self.ncc_obj = None
         self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"]
         self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"]
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
     def build_ui(self):
     def build_ui(self):
         self.ui_disconnect()
         self.ui_disconnect()
 
 
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         if self.units == "IN":
         if self.units == "IN":
             self.addtool_entry.set_value(0.039)
             self.addtool_entry.set_value(0.039)

+ 2 - 2
flatcamTools/ToolPaint.py

@@ -347,7 +347,7 @@ class ToolPaint(FlatCAMTool, Gerber):
         self.paintoverlap_entry.set_value(self.default_data["paintoverlap"])
         self.paintoverlap_entry.set_value(self.default_data["paintoverlap"])
 
 
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         if self.units == "IN":
         if self.units == "IN":
             self.addtool_entry.set_value(0.039)
             self.addtool_entry.set_value(0.039)
@@ -415,7 +415,7 @@ class ToolPaint(FlatCAMTool, Gerber):
             pass
             pass
 
 
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         sorted_tools = []
         sorted_tools = []
         for k, v in self.paint_tools.items():
         for k, v in self.paint_tools.items():

+ 3 - 3
flatcamTools/ToolProperties.py

@@ -103,10 +103,10 @@ class Properties(FlatCAMTool):
         width = abs(ymax - ymin)
         width = abs(ymax - ymin)
 
 
         self.addChild(dims, ['Length:', '%.4f %s' % (
         self.addChild(dims, ['Length:', '%.4f %s' % (
-            length, self.app.general_options_form.general_app_group.units_radio.get_value().lower())], True)
+            length, self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower())], True)
         self.addChild(dims, ['Width:', '%.4f %s' % (
         self.addChild(dims, ['Width:', '%.4f %s' % (
-            width, self.app.general_options_form.general_app_group.units_radio.get_value().lower())], True)
-        if self.app.general_options_form.general_app_group.units_radio.get_value().lower() == 'mm':
+            width, self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower())], True)
+        if self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() == 'mm':
             area = (length * width) / 100
             area = (length * width) / 100
             self.addChild(dims, ['Box Area:', '%.4f %s' % (area, 'cm2')], True)
             self.addChild(dims, ['Box Area:', '%.4f %s' % (area, 'cm2')], True)
         else:
         else:

+ 40 - 36
flatcamTools/ToolSolderPaste.py

@@ -8,6 +8,8 @@ from FlatCAMObj import FlatCAMGeometry, FlatCAMExcellon, FlatCAMGerber
 from PyQt5 import QtGui, QtCore, QtWidgets
 from PyQt5 import QtGui, QtCore, QtWidgets
 from copy import copy,deepcopy
 from copy import copy,deepcopy
 
 
+from shapely.geometry import MultiPolygon, Polygon, LineString
+
 
 
 class SolderPaste(FlatCAMTool):
 class SolderPaste(FlatCAMTool):
 
 
@@ -466,7 +468,7 @@ class SolderPaste(FlatCAMTool):
         self.name = ""
         self.name = ""
         self.obj = None
         self.obj = None
 
 
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         for name in list(self.app.postprocessors.keys()):
         for name in list(self.app.postprocessors.keys()):
             # populate only with postprocessor files that start with 'Paste_'
             # populate only with postprocessor files that start with 'Paste_'
@@ -484,7 +486,7 @@ class SolderPaste(FlatCAMTool):
         self.ui_disconnect()
         self.ui_disconnect()
 
 
         # updated units
         # updated units
-        self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
+        self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()
 
 
         sorted_tools = []
         sorted_tools = []
         for k, v in self.tooltable_tools.items():
         for k, v in self.tooltable_tools.items():
@@ -647,7 +649,6 @@ class SolderPaste(FlatCAMTool):
             idx = self.cnc_obj_combo.findText(obj_name)
             idx = self.cnc_obj_combo.findText(obj_name)
             if idx != -1:
             if idx != -1:
                 self.cnc_obj_combo.setCurrentIndex(idx)
                 self.cnc_obj_combo.setCurrentIndex(idx)
-            print(obj_name)
 
 
     def read_form_to_options(self):
     def read_form_to_options(self):
         """
         """
@@ -925,7 +926,7 @@ class SolderPaste(FlatCAMTool):
 
 
         self.on_create_geo(name=name, work_object=obj)
         self.on_create_geo(name=name, work_object=obj)
 
 
-    def on_create_geo(self, name, work_object):
+    def on_create_geo(self, name, work_object, use_thread=True):
         """
         """
         The actual work for creating solderpaste dispensing geometry is done here.
         The actual work for creating solderpaste dispensing geometry is done here.
 
 
@@ -958,47 +959,48 @@ class SolderPaste(FlatCAMTool):
             geo_obj.special_group = 'solder_paste_tool'
             geo_obj.special_group = 'solder_paste_tool'
 
 
             def solder_line(p, offset):
             def solder_line(p, offset):
-                xmin, ymin, xmax, ymax = p.bounds
+                x_min, y_min, x_max, y_max = p.bounds
 
 
-                min = [xmin, ymin]
-                max = [xmax, ymax]
-                min_r = [xmin, ymax]
-                max_r = [xmax, ymin]
+                diag_1_intersect = LineString([(x_min, y_min), (x_max, y_max)]).intersection(p)
+                diag_2_intersect = LineString([(x_min, y_max), (x_max, y_min)]).intersection(p)
 
 
-                diagonal_1 = LineString([min, max])
-                diagonal_2 = LineString([min_r, max_r])
                 if self.units == 'MM':
                 if self.units == 'MM':
-                    round_diag_1 = round(diagonal_1.intersection(p).length, 1)
-                    round_diag_2 = round(diagonal_2.intersection(p).length, 1)
+                    round_diag_1 = round(diag_1_intersect.length, 1)
+                    round_diag_2 = round(diag_2_intersect.length, 1)
                 else:
                 else:
-                    round_diag_1 = round(diagonal_1.intersection(p).length, 2)
-                    round_diag_2 = round(diagonal_2.intersection(p).length, 2)
+                    round_diag_1 = round(diag_1_intersect.length, 2)
+                    round_diag_2 = round(diag_2_intersect.length, 2)
 
 
                 if round_diag_1 == round_diag_2:
                 if round_diag_1 == round_diag_2:
-                    l = distance((xmin, ymin), (xmax, ymin))
-                    h = distance((xmin, ymin), (xmin, ymax))
+                    l = distance((x_min, y_min), (x_max, y_min))
+                    h = distance((x_min, y_min), (x_min, y_max))
 
 
                     if offset >= l /2 or offset >= h / 2:
                     if offset >= l /2 or offset >= h / 2:
                         return "fail"
                         return "fail"
                     if l > h:
                     if l > h:
                         h_half = h / 2
                         h_half = h / 2
-                        start = [xmin, (ymin + h_half)]
-                        stop = [(xmin + l), (ymin + h_half)]
+                        start = [x_min, (y_min + h_half)]
+                        stop = [(x_min + l), (y_min + h_half)]
                     else:
                     else:
                         l_half = l / 2
                         l_half = l / 2
-                        start = [(xmin + l_half), ymin]
-                        stop = [(xmin + l_half), (ymin + h)]
+                        start = [(x_min + l_half), y_min]
+                        stop = [(x_min + l_half), (y_min + h)]
                     geo = LineString([start, stop])
                     geo = LineString([start, stop])
                 elif round_diag_1 > round_diag_2:
                 elif round_diag_1 > round_diag_2:
-                    geo = diagonal_1.intersection(p)
+                    geo = round_diag_1
                 else:
                 else:
-                    geo = diagonal_2.intersection(p)
+                    geo = round_diag_2
 
 
                 offseted_poly = p.buffer(-offset)
                 offseted_poly = p.buffer(-offset)
                 geo = geo.intersection(offseted_poly)
                 geo = geo.intersection(offseted_poly)
                 return geo
                 return geo
 
 
             work_geo = obj.solid_geometry
             work_geo = obj.solid_geometry
+            try:
+                _ = iter(work_geo)
+            except TypeError:
+                work_geo = [work_geo]
+
             rest_geo = []
             rest_geo = []
             tooluid = 1
             tooluid = 1
 
 
@@ -1053,22 +1055,24 @@ class SolderPaste(FlatCAMTool):
                                     "due of inadequate nozzle diameters...")
                                     "due of inadequate nozzle diameters...")
                 return 'fail'
                 return 'fail'
 
 
-        def job_thread(app_obj):
-            try:
-                app_obj.new_object("geometry", name + "_solderpaste", geo_init)
-            except Exception as e:
-                log.error("SolderPaste.on_create_geo() --> %s" % str(e))
+        if use_thread:
+            def job_thread(app_obj):
+                try:
+                    app_obj.new_object("geometry", name + "_solderpaste", geo_init)
+                except Exception as e:
+                    log.error("SolderPaste.on_create_geo() --> %s" % str(e))
+                    proc.done()
+                    return
                 proc.done()
                 proc.done()
-                return
-            proc.done()
 
 
-        self.app.inform.emit("Generating Solder Paste dispensing geometry...")
-        # Promise object with the new name
-        self.app.collection.promise(name)
+            self.app.inform.emit("Generating Solder Paste dispensing geometry...")
+            # Promise object with the new name
+            self.app.collection.promise(name)
 
 
-        # Background
-        self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
-        # self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab)
+            # Background
+            self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
+        else:
+            self.app.new_object("geometry", name + "_solderpaste", geo_init)
 
 
     def on_create_gcode_click(self, signal):
     def on_create_gcode_click(self, signal):
         """
         """