From 06fb48eb6a5c4c6937e8117a0ea504532bafdc48 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 4 Mar 2019 03:47:19 +0200 Subject: [PATCH] - minor UI changes for Gerber UI - ~~after an object move, the apertures plotted shapes are deleted from canvas and the 'mark all' button is deselected~~ - after move tool action or any other transform (rotate, skew, scale, mirror, offset), the plotted apertures are kept plotted. - changing units now will convert all the default values from one unit type to another - prettified the selection shape and the moving shape - initial work in object hovering shape --- FlatCAMApp.py | 302 ++++++++++++++++++++++------- FlatCAMEditor.py | 12 +- FlatCAMGUI.py | 7 +- FlatCAMObj.py | 169 +++++++++------- GUIElements.py | 9 +- ObjectUI.py | 7 +- PlotCanvas.py | 4 +- README.md | 6 +- camlib.py | 2 +- flatcamTools/ToolCalculators.py | 2 +- flatcamTools/ToolMeasurement.py | 6 +- flatcamTools/ToolMove.py | 9 +- flatcamTools/ToolNonCopperClear.py | 4 +- flatcamTools/ToolPaint.py | 4 +- flatcamTools/ToolProperties.py | 8 +- flatcamTools/ToolSolderPaste.py | 4 +- 16 files changed, 373 insertions(+), 182 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 9ee7fc18..30fae84d 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -562,9 +562,9 @@ class App(QtCore.QObject): "global_project_autohide": True, "global_app_level": 'b', - "global_gridx": 1.0, - "global_gridy": 1.0, - "global_snap_max": 0.05, + "global_gridx": 0.0393701, + "global_gridy": 0.0393701, + "global_snap_max": 0.001968504, "global_grid_context_menu": { 'in': [0.01, 0.02, 0.025, 0.05, 0.1], 'mm': [0.1, 0.2, 0.5, 1, 2.54] @@ -658,7 +658,6 @@ class App(QtCore.QObject): "excellon_drillz": -0.1, "excellon_travelz": 0.1, "excellon_feedrate": 3.0, - "excellon_feedrate_probe": 3.0, "excellon_spindlespeed": None, "excellon_dwell": False, "excellon_dwelltime": 1, @@ -676,6 +675,7 @@ class App(QtCore.QObject): "excellon_endz": 2.0, "excellon_feedrate_rapid": 3.0, "excellon_z_pdepth": -0.02, + "excellon_feedrate_probe": 3.0, "excellon_f_plunge": False, "excellon_f_retract": False, @@ -733,17 +733,17 @@ class App(QtCore.QObject): "cncjob_toolchange_macro": "", "cncjob_toolchange_macro_enable": False, - "tools_ncctools": "1.0, 0.5", - "tools_nccoverlap": 0.4, - "tools_nccmargin": 0.1, + "tools_ncctools": "0.0393701, 0.019685", + "tools_nccoverlap": 0.015748, + "tools_nccmargin": 0.00393701, "tools_nccmethod": "seed", "tools_nccconnect": True, "tools_ncccontour": True, "tools_nccrest": False, - "tools_cutouttooldia": 0.1, - "tools_cutoutmargin": 0.1, - "tools_cutoutgapsize": 0.15, + "tools_cutouttooldia": 0.00393701, + "tools_cutoutmargin": 0.00393701, + "tools_cutoutgapsize": 0.005905512, "tools_gaps_rect": "4", "tools_gaps_ff": "8", @@ -757,10 +757,10 @@ class App(QtCore.QObject): "tools_2sided_mirror_axis": "X", "tools_2sided_axis_loc": "point", - "tools_2sided_drilldia": 1, + "tools_2sided_drilldia": 0.0393701, "tools_film_type": 'neg', - "tools_film_boundary": 1, + "tools_film_boundary": 0.0393701, "tools_film_scale": 0, "tools_panelize_spacing_columns": 0, @@ -792,17 +792,17 @@ class App(QtCore.QObject): "tools_transform_mirror_reference": False, "tools_transform_mirror_point": (0, 0), - "tools_solderpaste_tools": "1.0, 0.3", - "tools_solderpaste_new": 0.3, - "tools_solderpaste_z_start": 0.005, - "tools_solderpaste_z_dispense": 0.01, - "tools_solderpaste_z_stop": 0.005, - "tools_solderpaste_z_travel": 0.1, - "tools_solderpaste_z_toolchange": 1.0, + "tools_solderpaste_tools": "0.0393701, 0.011811", + "tools_solderpaste_new": 0.011811, + "tools_solderpaste_z_start": 0.00019685039, + "tools_solderpaste_z_dispense": 0.00393701, + "tools_solderpaste_z_stop": 0.00019685039, + "tools_solderpaste_z_travel": 0.00393701, + "tools_solderpaste_z_toolchange": 0.0393701, "tools_solderpaste_xy_toolchange": "0.0, 0.0", "tools_solderpaste_frxy": 3.0, "tools_solderpaste_frz": 3.0, - "tools_solderpaste_frz_dispense": 1.0, + "tools_solderpaste_frz_dispense": 0.0393701, "tools_solderpaste_speedfwd": 20, "tools_solderpaste_dwellfwd": 1, "tools_solderpaste_speedrev": 10, @@ -1341,6 +1341,7 @@ class App(QtCore.QObject): ############################### 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.units_radio.activated_custom.connect(self.on_toggle_units) ############################### ### GUI PREFERENCES SIGNALS ### @@ -1583,6 +1584,11 @@ class App(QtCore.QObject): # flag for polygons not cleared self.poly_not_cleared = False + # VisPy visuals + self.hover_shapes = ShapeCollection(parent=self.plotcanvas.vispy_canvas.view.scene, layers=7) + self.isHovering = False + self.notHovering = True + ### Save defaults to factory_defaults.FlatConfig file ### ### It's done only once after install ############# factory_file = open(self.data_path + '/factory_defaults.FlatConfig') @@ -1645,9 +1651,9 @@ class App(QtCore.QObject): except: pass - def defaults_write_form(self): + def defaults_write_form(self, factor=None): for option in self.defaults: - self.defaults_write_form_field(option) + self.defaults_write_form_field(option, factor=factor) # try: # self.defaults_form_fields[option].set_value(self.defaults[option]) # except KeyError: @@ -1655,9 +1661,13 @@ class App(QtCore.QObject): # # TODO: Rethink this? # pass - def defaults_write_form_field(self, field): + def defaults_write_form_field(self, field, factor=None): try: - self.defaults_form_fields[field].set_value(self.defaults[field]) + if factor is None: + self.defaults_form_fields[field].set_value(self.defaults[field]) + else: + self.defaults_form_fields[field].set_value(self.defaults[field] * factor) + except KeyError: #self.log.debug("defaults_write_form(): No field for: %s" % option) # TODO: Rethink this? @@ -2456,10 +2466,7 @@ class App(QtCore.QObject): oname = option[len(kind) + 1:] obj.options[oname] = self.options[option] - # if kind == 'geometry': - # obj.tools = {} - # elif kind == 'cncjob': - # obj.cnc_tools = {} + obj.isHovering = False # Initialize as per user request # User must take care to implement initialize @@ -3034,8 +3041,11 @@ class App(QtCore.QObject): def on_defaults_dict_change(self, field): self.defaults_write_form_field(field) + if field == "units": + self.set_screen_units(self.defaults['units']) + def set_screen_units(self, units): - self.ui.units_label.setText("[" + self.options["units"].lower() + "]") + self.ui.units_label.setText("[" + self.defaults["units"].lower() + "]") def on_toggle_units(self): """ @@ -3053,22 +3063,41 @@ class App(QtCore.QObject): return # If option is the same, then ignore - 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.") + if self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == \ + self.defaults["units"].upper(): + self.log.debug("on_toggle_units(): Same as defaults, so ignoring.") return # Options to scale - dimensions = ['gerber_isotooldia', 'tools_cutoutmargin', 'tools_cutoutgapsize', - 'gerber_noncoppermargin', 'gerber_bboxmargin','gerber_isooverlap','tools_nccoverlap', - 'tools_nccmargin','tools_cutouttooldia','tools_cutoutgapsize', - 'gerber_noncoppermargin','gerber_bboxmargin', - 'excellon_drillz', "excellon_toolchangexy", - 'excellon_travelz', 'excellon_feedrate', 'excellon_feedrate_rapid', 'excellon_toolchangez', - 'excellon_tooldia', 'excellon_endz', 'cncjob_tooldia', - 'geometry_cutz', 'geometry_travelz', 'geometry_feedrate', 'geometry_feedrate_rapid', - 'geometry_cnctooldia', 'tools_painttooldia', 'tools_paintoverlap', 'geometry_toolchangexy', - 'geometry_toolchangez', - 'tools_paintmargin', 'geometry_endz', 'geometry_depthperpass', 'global_gridx', 'global_gridy'] + dimensions = ['gerber_isotooldia', 'gerber_noncoppermargin', 'gerber_bboxmargin', + + 'excellon_drillz', 'excellon_travelz', "excellon_toolchangexy", + 'excellon_feedrate', 'excellon_feedrate_rapid', 'excellon_toolchangez', + 'excellon_tooldia', 'excellon_slot_tooldia', 'excellon_endz', "excellon_feedrate_probe", + "excellon_z_pdepth", + + 'geometry_cutz', "geometry_depthperpass", 'geometry_travelz', 'geometry_feedrate', + 'geometry_feedrate_rapid', "geometry_toolchangez", "geometry_feedrate_z", + "geometry_toolchangexy", 'geometry_cnctooldia', 'geometry_endz', "geometry_z_pdepth", + "geometry_feedrate_probe", + + 'cncjob_tooldia', + + 'tools_paintmargin', 'tools_painttooldia', 'tools_paintoverlap', + "tools_ncctools", "tools_nccoverlap", "tools_nccmargin", + "tools_2sided_drilldia", "tools_film_boundary", + "tools_cutouttooldia", 'tools_cutoutmargin', 'tools_cutoutgapsize', + "tools_panelize_constrainx", "tools_panelize_constrainy", + "tools_calc_vshape_tip_dia", "tools_calc_vshape_cut_z", + "tools_transform_skew_x", "tools_transform_skew_y", "tools_transform_offset_x", + "tools_transform_offset_y", + + "tools_solderpaste_tools", "tools_solderpaste_new", "tools_solderpaste_z_start", + "tools_solderpaste_z_dispense", "tools_solderpaste_z_stop", "tools_solderpaste_z_travel", + "tools_solderpaste_z_toolchange", "tools_solderpaste_xy_toolchange", "tools_solderpaste_frxy", + "tools_solderpaste_frz", "tools_solderpaste_frz_dispense", + + 'global_gridx', 'global_gridy', 'global_snap_max'] def scale_options(sfactor): for dim in dimensions: @@ -3082,15 +3111,65 @@ class App(QtCore.QObject): coords_xy[0] *= sfactor coords_xy[1] *= sfactor self.options['geometry_toolchangexy'] = "%f, %f" % (coords_xy[0], coords_xy[1]) + elif dim == 'tools_ncctools': + ncctols = [float(eval(a)) for a in self.defaults["tools_ncctools"].split(",")] + ncctols[0] *= sfactor + ncctols[1] *= sfactor + self.options['tools_ncctools'] = "%f, %f" % (ncctols[0], ncctols[1]) + elif dim == 'tools_solderpaste_tools': + sp_tools = [float(eval(a)) for a in self.defaults["tools_solderpaste_tools"].split(",")] + sp_tools[0] *= sfactor + sp_tools[1] *= sfactor + self.options['tools_solderpaste_tools'] = "%f, %f" % (sp_tools[0], sp_tools[1]) + elif dim == 'tools_solderpaste_xy_toolchange': + sp_coords = [float(eval(a)) for a in self.defaults["tools_solderpaste_xy_toolchange"].split(",")] + sp_coords[0] *= sfactor + sp_coords[1] *= sfactor + self.options['tools_solderpaste_xy_toolchange'] = "%f, %f" % (sp_coords[0], sp_coords[1]) else: - self.options[dim] *= sfactor + try: + self.options[dim] = float(self.options[dim]) * sfactor + except Exception as e: + log.debug('App.on_toggle_units().scale_options() --> %s' % str(e)) + + def scale_defaults(sfactor): + for dim in dimensions: + if dim == 'excellon_toolchangexy': + coords_xy = [float(eval(a)) for a in self.defaults["excellon_toolchangexy"].split(",")] + coords_xy[0] *= sfactor + coords_xy[1] *= sfactor + self.defaults['excellon_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1]) + elif dim == 'geometry_toolchangexy': + coords_xy = [float(eval(a)) for a in self.defaults["geometry_toolchangexy"].split(",")] + coords_xy[0] *= sfactor + coords_xy[1] *= sfactor + self.defaults['geometry_toolchangexy'] = "%.4f, %.4f" % (coords_xy[0], coords_xy[1]) + elif dim == 'tools_ncctools': + ncctols = [float(eval(a)) for a in self.defaults["tools_ncctools"].split(",")] + ncctols[0] *= sfactor + ncctols[1] *= sfactor + self.defaults['tools_ncctools'] = "%.4f, %.4f" % (ncctols[0], ncctols[1]) + elif dim == 'tools_solderpaste_tools': + sp_tools = [float(eval(a)) for a in self.defaults["tools_solderpaste_tools"].split(",")] + sp_tools[0] *= sfactor + sp_tools[1] *= sfactor + self.defaults['tools_solderpaste_tools'] = "%.4f, %.4f" % (sp_tools[0], sp_tools[1]) + elif dim == 'tools_solderpaste_xy_toolchange': + sp_coords = [float(eval(a)) for a in self.defaults["tools_solderpaste_xy_toolchange"].split(",")] + sp_coords[0] *= sfactor + sp_coords[1] *= sfactor + self.defaults['tools_solderpaste_xy_toolchange'] = "%.4f, %.4f" % (sp_coords[0], sp_coords[1]) + else: + try: + self.defaults[dim] = float(self.defaults[dim]) * sfactor + except Exception as e: + log.debug('App.on_toggle_units().scale_defaults() --> %s' % str(e)) # The scaling factor depending on choice of units. factor = 1/25.4 - if self.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM': + if self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': factor = 25.4 - # Changing project units. Warn user. msgbox = QtWidgets.QMessageBox() msgbox.setText("Change project units ...") @@ -3106,6 +3185,10 @@ class App(QtCore.QObject): scale_options(factor) self.options_write_form() + self.defaults_read_form() + scale_defaults(factor) + self.defaults_write_form() + self.should_we_save = True # change this only if the workspace is active @@ -3117,7 +3200,7 @@ class App(QtCore.QObject): 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(): - units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() obj.convert_units(units) # make that the properties stored in the object are also updated @@ -3131,26 +3214,27 @@ class App(QtCore.QObject): current.to_form() self.plot_all() - self.inform.emit("[success]Converted units to %s" % self.options["units"]) + self.inform.emit("[success]Converted units to %s" % self.defaults["units"]) # self.ui.units_label.setText("[" + self.options["units"] + "]") - self.set_screen_units(self.options["units"]) + self.set_screen_units(self.defaults["units"]) else: # Undo toggling self.toggle_units_ignore = True - 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') + if self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + self.ui.general_defaults_form.general_app_group.units_radio.set_value('IN') else: - self.ui.general_options_form.general_app_group.units_radio.set_value('MM') + self.ui.general_defaults_form.general_app_group.units_radio.set_value('MM') self.toggle_units_ignore = False self.inform.emit("[WARNING_NOTCL]Units conversion cancelled.") self.options_read_form() + self.defaults_read_form() def on_toggle_units_click(self): if self.options["units"] == 'MM': - self.ui.general_options_form.general_app_group.units_radio.set_value("IN") + self.ui.general_defaults_form.general_app_group.units_radio.set_value("IN") else: - self.ui.general_options_form.general_app_group.units_radio.set_value("MM") + self.ui.general_defaults_form.general_app_group.units_radio.set_value("MM") self.on_toggle_units() def on_language_apply(self): @@ -3834,7 +3918,7 @@ class App(QtCore.QObject): def on_tool_add_keypress(self): ## Current application units in Upper Case - self.units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() notebook_widget_name = self.ui.notebook.currentWidget().objectName() @@ -4431,7 +4515,7 @@ class App(QtCore.QObject): return 0 def populate_cmenu_grids(self): - units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() self.ui.cmenu_gridmenu.clear() sorted_list = sorted(self.defaults["global_grid_context_menu"][str(units)]) @@ -4452,7 +4536,7 @@ class App(QtCore.QObject): def on_grid_add(self): ## Current application units in lower Case - units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() grid_add_popup = FCInputDialog(title="New Grid ...", text='Enter a Grid VAlue:', @@ -4479,7 +4563,7 @@ class App(QtCore.QObject): def on_grid_delete(self): ## Current application units in lower Case - units = self.ui.general_options_form.general_app_group.units_radio.get_value().lower() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() grid_del_popup = FCInputDialog(title="Delete Grid ...", text='Enter a Grid Value:', @@ -4651,8 +4735,34 @@ class App(QtCore.QObject): self.draw_moving_selection_shape(self.pos, pos) self.selection_type = True - # delete the status message on mouse move - # self.inform.emit("") + # hover effect + for obj in self.collection.get_list(): + try: + # select the object(s) only if it is enabled (plotted) + if obj.options['plot']: + if obj not in self.collection.get_selected(): + poly_obj = Polygon( + [(obj.options['xmin'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymin']), + (obj.options['xmax'], obj.options['ymax']), + (obj.options['xmin'], obj.options['ymax'])] + ) + if Point(pos).within(poly_obj): + if self.isHovering is False: + self.isHovering = True + self.notHovering = True + # create the selection box around the selected object + self.draw_hover_shape(obj, color='#d1e0e0') + else: + if self.notHovering is True: + self.notHovering = False + self.isHovering = False + self.delete_hover_shape() + except: + # the Exception here will happen if we try to select on screen and we have an newly (and empty) + # just created Geometry or Excellon object that do not have the xmin, xmax, ymin, ymax options. + # In this case poly_obj creation (see above) will fail + pass except: self.ui.position_label.setText("") @@ -4700,6 +4810,7 @@ class App(QtCore.QObject): # delete the selection shape(S) as it may be in the way self.delete_selection_shape() + self.delete_hover_shape() else: if self.selection_type is not None: @@ -4715,11 +4826,13 @@ class App(QtCore.QObject): # a object by checking the bounding limits against mouse click position if self.command_active is None: self.select_objects(key='CTRL') + self.delete_hover_shape() else: # If there is no active command (self.command_active is None) then we check if we clicked on a object by # checking the bounding limits against mouse click position if self.command_active is None: self.select_objects() + self.delete_hover_shape() except Exception as e: log.warning("Error: %s" % str(e)) @@ -4886,11 +4999,47 @@ class App(QtCore.QObject): log.error("[ERROR] Something went bad. %s" % str(e)) return + def delete_hover_shape(self): + self.hover_shapes.clear() + self.hover_shapes.redraw() + + def draw_hover_shape(self, sel_obj, color=None): + """ + + :param sel_obj: the object for which the hover shape must be drawn + :return: + """ + + pt1 = (float(sel_obj.options['xmin']), float(sel_obj.options['ymin'])) + pt2 = (float(sel_obj.options['xmax']), float(sel_obj.options['ymin'])) + pt3 = (float(sel_obj.options['xmax']), float(sel_obj.options['ymax'])) + pt4 = (float(sel_obj.options['xmin']), float(sel_obj.options['ymax'])) + + hover_rect = Polygon([pt1, pt2, pt3, pt4]) + if self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + hover_rect = hover_rect.buffer(-0.1) + hover_rect = hover_rect.buffer(0.2) + + else: + hover_rect = hover_rect.buffer(-0.00393) + hover_rect = hover_rect.buffer(0.00787) + + if color: + face = Color(color) + face.alpha = 0.3 + outline = Color(color, alpha=0.8) + else: + face = Color(self.defaults['global_sel_fill']) + face.alpha = 0.1 + outline = self.defaults['global_sel_line'] + + self.hover_shapes.add(hover_rect, color=outline, face_color=face, update=True, layer=0, tolerance=None) + def delete_selection_shape(self): self.move_tool.sel_shapes.clear() self.move_tool.sel_shapes.redraw() - def draw_selection_shape(self, sel_obj): + def draw_selection_shape(self, sel_obj, color=None): """ :param sel_obj: the object for which the selection shape must be drawn @@ -4901,13 +5050,24 @@ class App(QtCore.QObject): pt2 = (float(sel_obj.options['xmax']), float(sel_obj.options['ymin'])) pt3 = (float(sel_obj.options['xmax']), float(sel_obj.options['ymax'])) pt4 = (float(sel_obj.options['xmin']), float(sel_obj.options['ymax'])) - sel_rect = Polygon([pt1, pt2, pt3, pt4]) - #blue_t = Color('blue') - blue_t = Color(self.defaults['global_sel_fill']) - blue_t.alpha = 0.3 - self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect, color=self.defaults['global_sel_line'], - face_color=blue_t, update=True, layer=0, tolerance=None)) + sel_rect = Polygon([pt1, pt2, pt3, pt4]) + if self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + sel_rect = sel_rect.buffer(-0.1) + sel_rect = sel_rect.buffer(0.2) + else: + sel_rect = sel_rect.buffer(-0.00393) + sel_rect = sel_rect.buffer(0.00787) + + if color: + face = Color(color, alpha=0.1) + outline = Color(color, alpha=0.8) + else: + face = Color(self.defaults['global_sel_fill'], alpha=0.1) + outline = Color(self.defaults['global_sel_line'], alpha=0.8) + + self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect, color=outline, + face_color=face, update=True, layer=0, tolerance=None)) def draw_moving_selection_shape(self, old_coords, coords, **kwargs): """ @@ -6000,7 +6160,7 @@ class App(QtCore.QObject): ezeros = self.defaults["excellon_exp_zeros"] eformat = self.defaults[ "excellon_exp_format"] - fc_units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + fc_units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() if fc_units == 'MM': factor = 1 if eunits == 'METRIC' else 0.03937 else: @@ -6118,7 +6278,7 @@ class App(QtCore.QObject): return "Could not retrieve object: %s" % obj_name # updated units - units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() if units == 'IN' or units == 'INCH': units = 'INCH' elif units == 'MM' or units == 'METIRC': @@ -6172,7 +6332,7 @@ class App(QtCore.QObject): "Only Geometry and Gerber are supported") return - units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() def obj_init(geo_obj, app_obj): geo_obj.import_svg(filename, obj_type, units=units) @@ -6214,7 +6374,7 @@ class App(QtCore.QObject): "Only Geometry and Gerber are supported") return - units = self.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() def obj_init(geo_obj, app_obj): geo_obj.import_dxf(filename, obj_type, units=units) @@ -6263,7 +6423,7 @@ class App(QtCore.QObject): # Object name name = outname or filename.split('/')[-1].split('\\')[-1] - units = self.ui.general_options_form.general_app_group.units_radio.get_value() + units = self.ui.general_defaults_form.general_app_group.units_radio.get_value() self.new_object(obj_type, name, obj_init) self.progress.emit(20) diff --git a/FlatCAMEditor.py b/FlatCAMEditor.py index 1b737fdc..a81bd1bf 100644 --- a/FlatCAMEditor.py +++ b/FlatCAMEditor.py @@ -346,7 +346,7 @@ class TextInputTool(FlatCAMTool): font_name=self.font_name, font_size=font_to_geo_size, font_type=font_to_geo_type, - units=self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper()) + units=self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()) def font_family(self, font): self.text_input_entry.selectAll() @@ -1483,7 +1483,7 @@ class TransformEditorTool(FlatCAMTool): "[WARNING_NOTCL] Geometry shape rotate cancelled...") def on_offx_key(self): - units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() + units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() val_box = FCInputDialog(title="Offset on X axis ...", text=('Enter a distance Value (%s):' % str(units)), @@ -1502,7 +1502,7 @@ class TransformEditorTool(FlatCAMTool): "[WARNING_NOTCL] Geometry shape offset X cancelled...") def on_offy_key(self): - units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() + units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() val_box = FCInputDialog(title="Offset on Y axis ...", text=('Enter a distance Value (%s):' % str(units)), @@ -4985,7 +4985,7 @@ class FlatCAMExcEditor(QtCore.QObject): self.move_timer.setSingleShot(True) ## Current application units in Upper Case - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() self.key = None # Currently pressed key self.modifiers = None @@ -5059,7 +5059,7 @@ class FlatCAMExcEditor(QtCore.QObject): def set_ui(self): # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() self.olddia_newdia.clear() self.tool2tooldia.clear() @@ -5099,7 +5099,7 @@ class FlatCAMExcEditor(QtCore.QObject): pass # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() # make a new name for the new Excellon object (the one with edited content) self.edited_obj_name = self.exc_obj.options['name'] diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 221a7092..588ad270 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -1952,10 +1952,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Change Units if key == QtCore.Qt.Key_Q: - if self.app.options["units"] == 'MM': - self.app.ui.general_options_form.general_app_group.units_radio.set_value("IN") + if self.app.defaults["units"] == 'MM': + self.app.ui.general_defaults_form.general_app_group.units_radio.set_value("IN") else: - self.app.ui.general_options_form.general_app_group.units_radio.set_value("MM") + self.app.ui.general_defaults_form.general_app_group.units_radio.set_value("MM") self.app.on_toggle_units() # Rotate Object by 90 degree CW @@ -3096,6 +3096,7 @@ class GeneralGUISetGroupUI(OptionsGroupUI): del settings self.app.inform.emit("[success] GUI settings deleted ...") + class GeneralAppPrefGroupUI(OptionsGroupUI): def __init__(self, parent=None): super(GeneralAppPrefGroupUI, self).__init__(self) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 00fe02b3..e6e1fba0 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -79,6 +79,8 @@ class FlatCAMObj(QtCore.QObject): self._drawing_tolerance = 0.01 + self.isHovering = False + # assert isinstance(self.ui, ObjectUI) # self.ui.name_entry.returnPressed.connect(self.on_name_activate) # self.ui.offset_button.clicked.connect(self.on_offset_button_click) @@ -459,14 +461,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # store the source file here self.source_file = "" - # assert isinstance(self.ui, GerberObjectUI) - # self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) - # self.ui.solid_cb.stateChanged.connect(self.on_solid_cb_click) - # self.ui.multicolored_cb.stateChanged.connect(self.on_multicolored_cb_click) - # self.ui.generate_iso_button.clicked.connect(self.on_iso_button_click) - # self.ui.generate_cutout_button.clicked.connect(self.on_generatecutout_button_click) - # self.ui.generate_bb_button.clicked.connect(self.on_generatebb_button_click) - # self.ui.generate_noncopper_button.clicked.connect(self.on_generatenoncopper_button_click) + # list of rows with apertures plotted + self.marked_rows = [] # Attributes to be included in serialization # Always append to it because it carries contents @@ -485,7 +481,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): FlatCAMObj.set_ui(self, ui) FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()") - self.replotApertures.connect(self.on_replot_apertures) + self.replotApertures.connect(self.on_mark_cb_click_table) self.form_fields.update({ "plot": self.ui.plot_cb, @@ -648,7 +644,6 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.apertures_row += 1 self.ui.apertures_table.selectColumn(0) - # self.ui.apertures_table.resizeColumnsToContents() self.ui.apertures_table.resizeRowsToContents() @@ -675,6 +670,11 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.ui.apertures_table.setMinimumHeight(self.ui.apertures_table.getHeight()) self.ui.apertures_table.setMaximumHeight(self.ui.apertures_table.getHeight()) + # update the 'mark' checkboxes state according with what is stored in the self.marked_rows list + if self.marked_rows: + for row in range(self.ui.apertures_table.rowCount()): + self.ui.apertures_table.cellWidget(row, 5).set_value(self.marked_rows[row]) + self.ui_connect() def ui_connect(self): @@ -695,60 +695,6 @@ class FlatCAMGerber(FlatCAMObj, Gerber): except: pass - def on_mark_cb_click_table(self): - self.ui_disconnect() - # cw = self.sender() - # cw_index = self.ui.apertures_table.indexAt(cw.pos()) - # cw_row = cw_index.row() - check_row = 0 - - self.clear_plot_apertures() - for aperture in self.apertures: - # find the apertures_table row associated with the aperture - for row in range(self.ui.apertures_table.rowCount()): - if int(self.ui.apertures_table.item(row, 1).text()) == int(aperture): - check_row = row - break - - if self.ui.apertures_table.cellWidget(check_row, 5).isChecked(): - # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) - self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True) - - self.mark_shapes.redraw() - - # make sure that the Mark All is disabled if one of the row mark's are disabled and - # if all the row mark's are enabled also enable the Mark All checkbox - cb_cnt = 0 - total_row = self.ui.apertures_table.rowCount() - for row in range(total_row): - if self.ui.apertures_table.cellWidget(row, 5).isChecked(): - cb_cnt += 1 - else: - cb_cnt -= 1 - if cb_cnt < total_row: - self.ui.mark_all_cb.setChecked(False) - else: - self.ui.mark_all_cb.setChecked(True) - self.ui_connect() - - def on_mark_all_click(self, signal): - self.ui_disconnect() - mark_all = self.ui.mark_all_cb.isChecked() - for row in range(self.ui.apertures_table.rowCount()): - mark_cb = self.ui.apertures_table.cellWidget(row, 5) - if mark_all: - mark_cb.setChecked(True) - else: - mark_cb.setChecked(False) - for aperture in self.apertures: - if mark_all: - # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) - self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True) - else: - self.clear_plot_apertures() - - self.ui_connect() - def on_generatenoncopper_button_click(self, *args): self.app.report_usage("gerber_on_generatenoncopper_button") @@ -1303,18 +1249,14 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.app.progress.emit(30) def job_thread(app_obj): - geometry = {} - for ap in self.apertures: - geometry[int(ap)] = self.apertures[ap]['solid_geometry'] - try: - _ = iter(geometry[int(ap)]) - except TypeError: - geometry[int(ap)] = [geometry[int(ap)]] self.app.progress.emit(30) try: if aperture_to_plot_mark in self.apertures: - for geo in geometry[int(aperture_to_plot_mark)]: + if type(self.apertures[aperture_to_plot_mark]['solid_geometry']) is not list: + self.apertures[aperture_to_plot_mark]['solid_geometry'] = \ + [self.apertures[aperture_to_plot_mark]['solid_geometry']] + for geo in self.apertures[aperture_to_plot_mark]['solid_geometry']: if type(geo) == Polygon or type(geo) == LineString: self.add_mark_shape(shape=geo, color=color, face_color=color, visible=visibility) else: @@ -1334,9 +1276,86 @@ class FlatCAMGerber(FlatCAMObj, Gerber): def clear_mark_all(self): self.ui.mark_all_cb.set_value(False) + self.marked_rows[:] = [] - def on_replot_apertures(self): - pass + def on_mark_cb_click_table(self): + self.ui_disconnect() + # cw = self.sender() + # cw_index = self.ui.apertures_table.indexAt(cw.pos()) + # cw_row = cw_index.row() + check_row = 0 + + self.clear_plot_apertures() + self.marked_rows[:] = [] + + for row in range(self.ui.apertures_table.rowCount()): + if self.ui.apertures_table.cellWidget(row, 5).isChecked(): + self.marked_rows.append(True) + + aperture = self.ui.apertures_table.item(row, 1).text() + # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) + self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True) + else: + self.marked_rows.append(False) + + self.mark_shapes.redraw() + + # make sure that the Mark All is disabled if one of the row mark's are disabled and + # if all the row mark's are enabled also enable the Mark All checkbox + cb_cnt = 0 + total_row = self.ui.apertures_table.rowCount() + for row in range(total_row): + if self.ui.apertures_table.cellWidget(row, 5).isChecked(): + cb_cnt += 1 + else: + cb_cnt -= 1 + if cb_cnt < total_row: + self.ui.mark_all_cb.setChecked(False) + else: + self.ui.mark_all_cb.setChecked(True) + self.ui_connect() + + def on_mark_all_click(self, signal): + self.ui_disconnect() + mark_all = self.ui.mark_all_cb.isChecked() + for row in range(self.ui.apertures_table.rowCount()): + # update the mark_rows list + if mark_all: + self.marked_rows.append(True) + else: + self.marked_rows[:] = [] + + mark_cb = self.ui.apertures_table.cellWidget(row, 5) + mark_cb.setChecked(mark_all) + + if mark_all: + for aperture in self.apertures: + # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) + self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True) + else: + self.clear_plot_apertures() + + self.ui_connect() + + def mirror(self, axis, point): + Gerber.mirror(self, axis=axis, point=point) + self.replotApertures.emit() + + def offset(self, vect): + Gerber.offset(self, vect=vect) + self.replotApertures.emit() + + def rotate(self, angle, point): + Gerber.rotate(self, angle=angle, point=point) + self.replotApertures.emit() + + def scale(self, xfactor, yfactor=None, point=None): + Gerber.scale(self, xfactor=xfactor, yfactor=yfactor, point=point) + self.replotApertures.emit() + + def skew(self, angle_x, angle_y, point): + Gerber.skew(self, angle_x=angle_x, angle_y=angle_y, point=point) + self.replotApertures.emit() def serialize(self): return { @@ -3802,7 +3821,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.ui.geo_tools_table.setCurrentItem(self.ui.geo_tools_table.item(row, 0)) def export_dxf(self): - units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() dwg = None try: dwg = ezdxf.new('R2010') diff --git a/GUIElements.py b/GUIElements.py index 75ca4aac..0a8ab9f4 100644 --- a/GUIElements.py +++ b/GUIElements.py @@ -229,7 +229,7 @@ class FloatEntry(QtWidgets.QLineEdit): def set_value(self, val): if val is not None: - self.setText("%.6f" % val) + self.setText("%.4f" % val) else: self.setText("") @@ -267,7 +267,7 @@ class FloatEntry2(QtWidgets.QLineEdit): return float(evaled) def set_value(self, val): - self.setText("%.6f" % val) + self.setText("%.4f" % val) def sizeHint(self): default_hint_size = super(FloatEntry2, self).sizeHint() @@ -337,7 +337,10 @@ class FCEntry(QtWidgets.QLineEdit): return str(self.text()) def set_value(self, val): - self.setText(str(val)) + if type(val) is float: + self.setText('%.4f' % val) + else: + self.setText(str(val)) def sizeHint(self): default_hint_size = super(FCEntry, self).sizeHint() diff --git a/ObjectUI.py b/ObjectUI.py index 3ccda693..1c8f7835 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -244,7 +244,7 @@ class GerberObjectUI(ObjectUI): # Scale Button self.scale_aperture_button = QtWidgets.QPushButton('Scale') self.scale_aperture_button.setToolTip( - "Perform scaling operation." + "Perform scaling operation on the selected apertures." ) self.scale_aperture_button.setFixedWidth(50) self.transform_aperture_grid.addWidget(self.scale_aperture_button, 0, 2) @@ -265,7 +265,7 @@ class GerberObjectUI(ObjectUI): # Buffer Button self.buffer_aperture_button = QtWidgets.QPushButton('Buffer') self.buffer_aperture_button.setToolTip( - "Perform scaling operation." + "Perform buffer operation on the selected apertures." ) self.buffer_aperture_button.setFixedWidth(50) self.transform_aperture_grid.addWidget(self.buffer_aperture_button, 1, 2) @@ -275,8 +275,7 @@ class GerberObjectUI(ObjectUI): self.new_grb_label = QtWidgets.QLabel("Generate new Gerber Object:") self.new_grb_label.setToolTip( - "Will generate a new Gerber object from the changed apertures.\n" - "This new object can then be isolated etc." + "Will generate a new Gerber object from the changed apertures." ) new_hlay.addWidget(self.new_grb_label) diff --git a/PlotCanvas.py b/PlotCanvas.py index 41f43d79..67305a43 100644 --- a/PlotCanvas.py +++ b/PlotCanvas.py @@ -65,7 +65,7 @@ class PlotCanvas(QtCore.QObject): self.draw_workspace() # if self.app.defaults['global_workspace'] is True: - # if self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM': + # if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': # self.wkspace_t = Line(pos=) self.shape_collections = [] @@ -92,7 +92,7 @@ class PlotCanvas(QtCore.QObject): a3p_mm = np.array([(0, 0), (297, 0), (297, 420), (0, 420)]) a3l_mm = np.array([(0, 0), (420, 0), (420, 297), (0, 297)]) - if self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM': + if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': if self.app.defaults['global_workspaceT'] == 'A4P': a = a4p_mm elif self.app.defaults['global_workspaceT'] == 'A4L': diff --git a/README.md b/README.md index 7eb56532..3a07fa77 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,11 @@ CAD program, and create G-Code for Isolation routing. 3.03.2019 - minor UI changes for Gerber UI -- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected +- ~~after an object move, the apertures plotted shapes are deleted from canvas and the 'mark all' button is deselected~~ +- after move tool action or any other transform (rotate, skew, scale, mirror, offset), the plotted apertures are kept plotted. +- changing units now will convert all the default values from one unit type to another +- prettified the selection shape and the moving shape +- initial work in object hovering shape 02.03.2019 diff --git a/camlib.py b/camlib.py index ec254868..2b6ab7df 100644 --- a/camlib.py +++ b/camlib.py @@ -6492,7 +6492,7 @@ class CNCjob(Geometry): temp_gcode = '' header_start = False header_stop = False - units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() lines = StringIO(g) for line in lines: diff --git a/flatcamTools/ToolCalculators.py b/flatcamTools/ToolCalculators.py index 1c840c27..ee64019e 100644 --- a/flatcamTools/ToolCalculators.py +++ b/flatcamTools/ToolCalculators.py @@ -244,7 +244,7 @@ class ToolCalculator(FlatCAMTool): FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs) def set_tool_ui(self): - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() ## Initialize form self.mm_entry.set_value('0') diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index 4694178b..54eb3c1f 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -12,7 +12,7 @@ class Measurement(FlatCAMTool): def __init__(self, app): FlatCAMTool.__init__(self, app) - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() ## Title title_label = QtWidgets.QLabel("%s
" % self.toolName) @@ -173,7 +173,7 @@ class Measurement(FlatCAMTool): # Switch notebook to tool page self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab) - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() self.show() def toggle(self): @@ -210,7 +210,7 @@ class Measurement(FlatCAMTool): else: # ENABLE the Measuring TOOL self.active = True - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() # we disconnect the mouse/key handlers from wherever the measurement tool was called if self.app.call_source == 'app': diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py index 123a6517..9d83255d 100644 --- a/flatcamTools/ToolMove.py +++ b/flatcamTools/ToolMove.py @@ -125,8 +125,7 @@ class ToolMove(FlatCAMTool): # offset sel_obj.offset((dx, dy)) sel_obj.plot() - sel_obj.clear_plot_apertures() - sel_obj.clear_mark_all() + sel_obj.replotApertures.emit() # Update the object bounding box options a,b,c,d = sel_obj.bounds() @@ -237,6 +236,12 @@ class ToolMove(FlatCAMTool): def draw_shape(self, coords): self.sel_rect = Polygon(coords) + if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM': + self.sel_rect = self.sel_rect.buffer(-0.1) + self.sel_rect = self.sel_rect.buffer(0.2) + else: + self.sel_rect = self.sel_rect.buffer(-0.00393) + self.sel_rect = self.sel_rect.buffer(0.00787) blue_t = Color('blue') blue_t.alpha = 0.2 diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index e537e5b1..6ddbd465 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -345,13 +345,13 @@ class NonCopperClear(FlatCAMTool, Gerber): self.obj_name = "" self.ncc_obj = None self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"] - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() def build_ui(self): self.ui_disconnect() # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() if self.units == "IN": self.addtool_entry.set_value(0.039) diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py index d7db24ec..04427edf 100644 --- a/flatcamTools/ToolPaint.py +++ b/flatcamTools/ToolPaint.py @@ -353,7 +353,7 @@ class ToolPaint(FlatCAMTool, Gerber): self.paintoverlap_entry.set_value(self.default_data["paintoverlap"]) # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() if self.units == "IN": self.addtool_entry.set_value(0.039) @@ -421,7 +421,7 @@ class ToolPaint(FlatCAMTool, Gerber): pass # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() sorted_tools = [] for k, v in self.paint_tools.items(): diff --git a/flatcamTools/ToolProperties.py b/flatcamTools/ToolProperties.py index c440d72c..37f31ec4 100644 --- a/flatcamTools/ToolProperties.py +++ b/flatcamTools/ToolProperties.py @@ -126,10 +126,10 @@ class Properties(FlatCAMTool): width = abs(ymax - ymin) self.addChild(dims, ['Length:', '%.4f %s' % ( - length, self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower())], True) + length, self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower())], True) self.addChild(dims, ['Width:', '%.4f %s' % ( - 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': + width, self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower())], True) + if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower() == 'mm': area = (length * width) / 100 self.addChild(dims, ['Box Area:', '%.4f %s' % (area, 'cm2')], True) else: @@ -142,7 +142,7 @@ class Properties(FlatCAMTool): 'in': 'Inch', 'mm': 'Metric' } - [str(self.app.ui.general_options_form.general_app_group.units_radio.get_value().lower())]], True) + [str(self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower())]], True) for option in obj.options: if option is 'name': diff --git a/flatcamTools/ToolSolderPaste.py b/flatcamTools/ToolSolderPaste.py index 0c166719..17581a2a 100644 --- a/flatcamTools/ToolSolderPaste.py +++ b/flatcamTools/ToolSolderPaste.py @@ -484,7 +484,7 @@ class SolderPaste(FlatCAMTool): self.name = "" self.obj = None - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() for name in list(self.app.postprocessors.keys()): # populate only with postprocessor files that start with 'Paste_' @@ -502,7 +502,7 @@ class SolderPaste(FlatCAMTool): self.ui_disconnect() # updated units - self.units = self.app.ui.general_options_form.general_app_group.units_radio.get_value().upper() + self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() sorted_tools = [] for k, v in self.tooltable_tools.items():