From a49f54d63fedc56117a4755e0b74183799bcf675 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Fri, 19 May 2023 13:09:08 +0300 Subject: [PATCH] - the selection shapes are now moved from Move Plugin to AppMain - Fiducials Plugin: fixed errors due of changes in the Shapely module - Fiducials Plugin: fixed an error where in Basic mode the soldermask opening is added incorrectly --- CHANGELOG.md | 3 +++ appGUI/VisPyVisuals.py | 3 ++- appMain.py | 43 ++++++++++++++++++++++++------------- appPlugins/ToolDrilling.py | 5 ++--- appPlugins/ToolFiducials.py | 37 ++++++++++++++++--------------- appPlugins/ToolMarkers.py | 2 +- appPlugins/ToolMilling.py | 5 ++--- appPlugins/ToolMove.py | 7 +----- appPlugins/ToolQRCode.py | 2 +- appTool.py | 4 ++-- 10 files changed, 60 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 759d99c2..7b04c43e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ CHANGELOG for FlatCAM Evo beta 19.05.2023 - CutOut Plugin - fixed the manual adding of gaps +- the selection shapes are now moved from Move Plugin to AppMain +- Fiducials Plugin: fixed errors due of changes in the Shapely module +- Fiducials Plugin: fixed an error where in Basic mode the soldermask opening is added incorrectly 17.05.2023 diff --git a/appGUI/VisPyVisuals.py b/appGUI/VisPyVisuals.py index b2098f78..4b58b564 100644 --- a/appGUI/VisPyVisuals.py +++ b/appGUI/VisPyVisuals.py @@ -360,7 +360,8 @@ class ShapeCollectionVisual(CompoundVisual): self.results_lock.release() # Remove data - del self.data[key] + if key in self.data: + del self.data[key] if update: self.__update() diff --git a/appMain.py b/appMain.py index 026a2c9f..731c9c48 100644 --- a/appMain.py +++ b/appMain.py @@ -930,9 +930,13 @@ class App(QtCore.QObject): # add he PlotCanvas setup to the UI self.on_plotcanvas_add(self.plotcanvas, self.ui.right_layout) + # ############################################################################################################# + # ################ SHAPES STORAGE ######################################################################### + # ############################################################################################################# + # Storage for shapes, storage that can be used by FlatCAm tools for utility geometry - # VisPy visuals if self.use_3d_engine: + # VisPy visuals try: self.tool_shapes = ShapeCollection(parent=self.plotcanvas.view.scene, layers=1, pool=self.pool) except AttributeError: @@ -940,6 +944,9 @@ class App(QtCore.QObject): # Storage for Hover Shapes self.hover_shapes = ShapeCollection(parent=self.plotcanvas.view.scene, layers=1, pool=self.pool) + + # Storage for Selection shapes + self.sel_shapes = ShapeCollection(parent=self.plotcanvas.view.scene, layers=1, pool=self.pool) else: from appGUI.PlotCanvasLegacy import ShapeCollectionLegacy self.tool_shapes = ShapeCollectionLegacy(obj=self, app=self, name="tool") @@ -947,6 +954,10 @@ class App(QtCore.QObject): # Storage for Hover Shapes will use the default Matplotlib axes self.hover_shapes = ShapeCollectionLegacy(obj=self, app=self, name='hover') + # Storage for Selection shapes + self.sel_shapes = ShapeCollectionLegacy(obj=self, app=self.app, name="selection") + # ############################################################################################################# + end_plot_time = time.time() self.used_time = end_plot_time - start_plot_time self.log.debug("Finished Canvas initialization in %s seconds." % str(self.used_time)) @@ -6678,6 +6689,7 @@ class App(QtCore.QObject): ctrl_modifier_key = QtCore.Qt.KeyboardModifier.ControlModifier ctrl_shift_modifier_key = ctrl_modifier_key | shift_modifier_key + # this will do click release action for the Plugins if key_modifier == shift_modifier_key or key_modifier == ctrl_shift_modifier_key: self.on_mouse_and_key_modifiers(position=self.mouse_click_pos, modifiers=key_modifier) self.on_plugin_mouse_click_release(pos=pos) @@ -6691,6 +6703,7 @@ class App(QtCore.QObject): self.mouse_click_pos = [pos[0], pos[1]] return + # it was a double click if self.doubleclick is True: self.doubleclick = False if self.collection.get_selected(): @@ -6712,7 +6725,11 @@ class App(QtCore.QObject): if self.dx == 0 or self.dy == 0: self.selection_type = None + # End moving selection if self.selection_type is not None: + # delete previous selection shape + self.delete_selection_shape() + try: self.selection_area_handler(self.mouse_click_pos, pos, self.selection_type) self.selection_type = None @@ -6848,11 +6865,11 @@ class App(QtCore.QObject): :param sel_type: if True it's a left to right selection (enclosure), if False it's a 'touch' selection :return: None """ - poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])]) - # delete previous selection shape self.delete_selection_shape() + poly_selection = Polygon([start_pos, (end_pos[0], start_pos[1]), end_pos, (start_pos[0], end_pos[1])]) + # make all objects inactive self.collection.set_all_inactive() @@ -7163,8 +7180,8 @@ class App(QtCore.QObject): self.hover_shapes.redraw() def delete_selection_shape(self): - self.move_tool.sel_shapes.clear() - self.move_tool.sel_shapes.redraw() + self.sel_shapes.clear() + self.sel_shapes.redraw() def draw_selection_shape(self, sel_obj, color=None): """ @@ -7219,14 +7236,11 @@ class App(QtCore.QObject): face = self.options['global_sel_fill'][:-2] + str(hex(int(0.4 * 255)))[2:] outline = self.options['global_sel_line'][:-2] + str(hex(int(1.0 * 255)))[2:] - self.sel_objects_list.append(self.move_tool.sel_shapes.add(b_sel_rect, - color=outline, - face_color=face, - update=True, - layer=0, - tolerance=None)) + self.sel_objects_list.append( + self.sel_shapes.add(b_sel_rect,color=outline, face_color=face, update=True, layer=0, tolerance=None) + ) if self.use_3d_engine is False: - self.move_tool.sel_shapes.redraw() + self.sel_shapes.redraw() def draw_moving_selection_shape(self, old_coords, coords, **kwargs): """ @@ -7270,10 +7284,9 @@ class App(QtCore.QObject): color_t = face_color[:-2] + str(hex(int(face_alpha * 255)))[2:] - self.move_tool.sel_shapes.add(sel_rect, color=color, face_color=color_t, update=True, - layer=0, tolerance=None) + self.sel_shapes.add(sel_rect, color=color, face_color=color_t, update=True, layer=0, tolerance=None) if self.use_3d_engine is False: - self.move_tool.sel_shapes.redraw() + self.sel_shapes.redraw() def obj_properties(self): """ diff --git a/appPlugins/ToolDrilling.py b/appPlugins/ToolDrilling.py index d56ea5f4..c9353fc3 100644 --- a/appPlugins/ToolDrilling.py +++ b/appPlugins/ToolDrilling.py @@ -1754,10 +1754,9 @@ class ToolDrilling(AppTool, Excellon): for row in sel_rows: sel_rect = self.app.exc_areas.exclusion_areas_storage[row]['shape'] - self.app.move_tool.sel_shapes.add(sel_rect, color=outline, face_color=face, update=True, layer=0, - tolerance=None) + self.app.sel_shapes.add(sel_rect, color=outline, face_color=face, update=True, layer=0, tolerance=None) if self.app.use_3d_engine: - self.app.move_tool.sel_shapes.redraw() + self.app.sel_shapes.redraw() def clear_selection(self): self.app.delete_selection_shape() diff --git a/appPlugins/ToolFiducials.py b/appPlugins/ToolFiducials.py index f5803e0f..f7ce5f7b 100644 --- a/appPlugins/ToolFiducials.py +++ b/appPlugins/ToolFiducials.py @@ -23,6 +23,8 @@ import gettext import appTranslation as fcTranslate import builtins +from camlib import flatten_shapely_geometry + fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext @@ -84,7 +86,7 @@ class ToolFiducials(AppTool): self.handlers_connected = False # storage for temporary shapes when adding manual markers - self.temp_shapes = self.app.move_tool.sel_shapes + self.temp_shapes = self.app.sel_shapes def run(self, toggle=True): self.app.defaults.report_usage("ToolFiducials()") @@ -402,6 +404,8 @@ class ToolFiducials(AppTool): """ fid_size = self.ui.fid_size_entry.get_value() if fid_size is None else fid_size fid_type = 0 if fid_type is None else fid_type # default is 'circular' <=> 0 + if fid_type == "circular": + fid_type = 0 line_thickness = self.ui.line_thickness_entry.get_value() if line_size is None else line_size radius = fid_size / 2.0 @@ -439,12 +443,10 @@ class ToolFiducials(AppTool): new_apertures[new_apid]['geometry'].append(deepcopy(dict_el)) s_list = [] - if g_obj.solid_geometry: - try: - for poly in g_obj.solid_geometry: - s_list.append(poly) - except TypeError: - s_list.append(g_obj.solid_geometry) + flat_geo = flatten_shapely_geometry(g_obj.solid_geometry) + if flat_geo: + for poly in flat_geo: + s_list.append(poly) s_list += geo_list elif fid_type == 1: # 'cross' @@ -504,15 +506,14 @@ class ToolFiducials(AppTool): new_apertures[new_apid]['geometry'].append(deepcopy(dict_el)) s_list = [] - if g_obj.solid_geometry: - try: - for poly in g_obj.solid_geometry: - s_list.append(poly) - except TypeError: - s_list.append(g_obj.solid_geometry) + flat_geo = flatten_shapely_geometry(g_obj.solid_geometry) + if flat_geo: + for poly in flat_geo: + s_list.append(poly) geo_buff_list = MultiPolygon(geo_buff_list) geo_buff_list = geo_buff_list.buffer(0) + geo_buff_list = flatten_shapely_geometry(geo_buff_list) for poly in geo_buff_list: s_list.append(poly) else: @@ -583,12 +584,10 @@ class ToolFiducials(AppTool): new_apertures[new_apid]['geometry'].append(deepcopy(dict_el)) s_list = [] - if g_obj.solid_geometry: - try: - for poly in g_obj.solid_geometry: - s_list.append(poly) - except TypeError: - s_list.append(g_obj.solid_geometry) + flat_geo = flatten_shapely_geometry(g_obj.solid_geometry) + if flat_geo: + for poly in flat_geo: + s_list.append(poly) for poly in geo_buff_list: s_list.append(poly) diff --git a/appPlugins/ToolMarkers.py b/appPlugins/ToolMarkers.py index b415f85c..bf480c7a 100644 --- a/appPlugins/ToolMarkers.py +++ b/appPlugins/ToolMarkers.py @@ -71,7 +71,7 @@ class ToolMarkers(AppTool): self.handlers_connected = False # storage for temporary shapes when adding manual markers - self.temp_shapes = self.app.move_tool.sel_shapes + self.temp_shapes = self.app.sel_shapes def on_insert_type_changed(self, val): obj_type = 2 if val == 'geo' else 0 diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index aa2b3fa5..fcba89a2 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -3829,10 +3829,9 @@ class ToolMilling(AppTool, Excellon): for row in sel_rows: sel_rect = self.app.exc_areas.exclusion_areas_storage[row]['shape'] - self.app.move_tool.sel_shapes.add(sel_rect, color=outline, face_color=face, update=True, layer=0, - tolerance=None) + self.app.sel_shapes.add(sel_rect, color=outline, face_color=face, update=True, layer=0, tolerance=None) if self.app.use_3d_engine: - self.app.move_tool.sel_shapes.redraw() + self.app.sel_shapes.redraw() def clear_selection(self): self.app.delete_selection_shape() diff --git a/appPlugins/ToolMove.py b/appPlugins/ToolMove.py index bce0f424..388f7c92 100644 --- a/appPlugins/ToolMove.py +++ b/appPlugins/ToolMove.py @@ -49,12 +49,7 @@ class ToolMove(AppTool): self.sel_rect = None self.old_coords = [] - # VisPy visuals - if self.app.use_3d_engine: - self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.view.scene, layers=1, pool=self.app.pool) - else: - from appGUI.PlotCanvasLegacy import ShapeCollectionLegacy - self.sel_shapes = ShapeCollectionLegacy(obj=self, app=self.app, name="move") + self.sel_shapes = self.app.sel_shapes self.mm = None self.mp = None diff --git a/appPlugins/ToolQRCode.py b/appPlugins/ToolQRCode.py index a2020ee0..08c0c5ce 100644 --- a/appPlugins/ToolQRCode.py +++ b/appPlugins/ToolQRCode.py @@ -67,7 +67,7 @@ class QRCode(AppTool): self.mr = None self.kr = None - self.shapes = self.app.move_tool.sel_shapes + self.shapes = self.app.sel_shapes self.qrcode_geometry = MultiPolygon() self.qrcode_utility_geometry = MultiPolygon() diff --git a/appTool.py b/appTool.py index 215abcdf..fbb19da6 100644 --- a/appTool.py +++ b/appTool.py @@ -236,7 +236,7 @@ class AppTool(QtWidgets.QWidget): if 'shapes_storage' in kwargs: s_storage = kwargs['shapes_storage'] else: - s_storage = self.app.move_tool.sel_shapes + s_storage = self.app.sel_shapes if 'color' in kwargs: color = kwargs['color'] @@ -289,7 +289,7 @@ class AppTool(QtWidgets.QWidget): if 'shapes_storage' in kwargs: s_storage = kwargs['shapes_storage'] else: - s_storage = self.app.move_tool.sel_shapes + s_storage = self.app.sel_shapes s_storage.clear() s_storage.redraw()