From 5d2d81089885a9521334c74221c18d1c15f5e062 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 10 Nov 2020 14:59:03 +0200 Subject: [PATCH] - fixed a bug in Extract Tool, when extracting drills some of the drills were lost; added a new UI control to select/deselect all apertures - updated the Extract Tool - Extract Soldermask functionality, such that the selection of apertures will control the final SolderMask Gerber content --- CHANGELOG.md | 4 +- appGUI/MainGUI.py | 2 +- appTools/ToolExtract.py | 88 +++++++++++++++++++++++++++++++++++------ 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d057f16..45c61837 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,13 @@ CHANGELOG for FlatCAM beta - updated the language strings files - changed the icon for Extract Tool - in Cutout Tool added the UI for a new feature: Cut by Drilling +- fixed a bug in Extract Tool, when extracting drills some of the drills were lost; added a new UI control to select/deselect all apertures +- updated the Extract Tool - Extract Soldermask functionality, such that the selection of apertures will control the final SolderMask Gerber content 9.11.2020 - some refactoring in signal connections in App.__init__() -- fixed issue with conenctiong twice the signals for the File Toolbar on the first execution of the program +- fixed issue with connecting twice the signals for the File Toolbar on the first execution of the program 8.11.2020 diff --git a/appGUI/MainGUI.py b/appGUI/MainGUI.py index 90b37fe3..13da5919 100644 --- a/appGUI/MainGUI.py +++ b/appGUI/MainGUI.py @@ -2620,7 +2620,7 @@ class MainGUI(QtWidgets.QMainWindow): # Extract Drills Tool if key == QtCore.Qt.Key_E: # self.app.cal_exc_tool.run(toggle=True) - self.app.edrills_tool.run(toggle=True) + self.app.extract_tool.run(toggle=True) return # Fiducials Tool diff --git a/appTools/ToolExtract.py b/appTools/ToolExtract.py index 4a09931f..87545b18 100644 --- a/appTools/ToolExtract.py +++ b/appTools/ToolExtract.py @@ -70,6 +70,8 @@ class ToolExtract(AppTool): self.ui.other_ring_entry.setDisabled(False) if state else self.ui.other_ring_entry.setDisabled(True) ) + self.ui.all_cb.stateChanged.connect(self.on_select_all) + def install(self, icon=None, separator=None, **kwargs): AppTool.install(self, icon, separator, shortcut='Alt+I', **kwargs) @@ -123,6 +125,21 @@ class ToolExtract(AppTool): self.ui.clearance_entry.set_value(float(self.app.defaults["tools_extract_sm_clearance"])) + def on_select_all(self, state): + + if state: + self.ui.circular_cb.setChecked(True) + self.ui.oblong_cb.setChecked(True) + self.ui.square_cb.setChecked(True) + self.ui.rectangular_cb.setChecked(True) + self.ui.other_cb.setChecked(True) + else: + self.ui.circular_cb.setChecked(False) + self.ui.oblong_cb.setChecked(False) + self.ui.square_cb.setChecked(False) + self.ui.rectangular_cb.setChecked(False) + self.ui.other_cb.setChecked(False) + def on_extract_drills_click(self): drill_dia = self.ui.dia_entry.get_value() @@ -186,7 +203,7 @@ class ToolExtract(AppTool): if 'follow' in geo_el and isinstance(geo_el['follow'], Point): tools[1]["drills"].append(geo_el['follow']) if 'solid_geometry' not in tools[1]: - tools[1]['solid_geometry'] = [] + tools[1]['solid_geometry'] = [geo_el['follow']] else: tools[1]['solid_geometry'].append(geo_el['follow']) @@ -270,7 +287,7 @@ class ToolExtract(AppTool): tools[tool_in_drills]['drills'].append(geo_el['follow']) if 'solid_geometry' not in tools[tool_in_drills]: - tools[tool_in_drills]['solid_geometry'] = [] + tools[tool_in_drills]['solid_geometry'] = [geo_el['follow']] else: tools[tool_in_drills]['solid_geometry'].append(geo_el['follow']) @@ -360,7 +377,7 @@ class ToolExtract(AppTool): tools[tool_in_drills]['drills'].append(geo_el['follow']) if 'solid_geometry' not in tools[tool_in_drills]: - tools[tool_in_drills]['solid_geometry'] = [] + tools[tool_in_drills]['solid_geometry'] = [geo_el['follow']] else: tools[tool_in_drills]['solid_geometry'].append(geo_el['follow']) @@ -390,8 +407,25 @@ class ToolExtract(AppTool): return def on_extract_soldermask_click(self): + clearance = self.ui.clearance_entry.get_value() + circ = self.ui.circular_cb.get_value() + oblong = self.ui.oblong_cb.get_value() + square = self.ui.square_cb.get_value() + rect = self.ui.rectangular_cb.get_value() + other = self.ui.other_cb.get_value() + + allowed_apertures = [] + if circ: + allowed_apertures.append('C') + if oblong: + allowed_apertures.append('O') + if square or rect: + allowed_apertures.append('R') + if other: + allowed_apertures.append('ELSE') + selection_index = self.ui.gerber_object_combo.currentIndex() model_index = self.app.collection.index(selection_index, 0, self.ui.gerber_object_combo.rootModelIndex()) @@ -408,6 +442,25 @@ class ToolExtract(AppTool): new_follow_geometry = [] for apid, apid_value in obj.apertures.items(): + ap_type = apid_value['type'] + + if ap_type not in allowed_apertures: + new_apertures.pop(apid, None) + continue + + if ap_type == 'R': + width = float(apid_value['width']) + height = float(apid_value['height']) + + # if the height == width (float numbers so the reason for the following) + if round(width, self.decimals) == round(height, self.decimals): + if square is False: + new_apertures.pop(apid, None) + continue + elif rect is False: + new_apertures.pop(apid, None) + continue + if 'geometry' in apid_value: new_aper_geo = [] for geo_el in apid_value['geometry']: @@ -535,7 +588,7 @@ class ExtractUI: # grid_lay.addRow("Bottom Layer:", self.object_combo) grid_lay.addWidget(self.grb_label, 0, 0, 1, 2) - grid_lay.addWidget(self.gerber_object_combo, 1, 0, 1, 2) + grid_lay.addWidget(self.gerber_object_combo, 2, 0, 1, 2) self.padt_label = FCLabel("%s" % _("Processed Pads Type")) self.padt_label.setToolTip( @@ -544,7 +597,7 @@ class ExtractUI: "disable the Rectangular aperture.") ) - grid_lay.addWidget(self.padt_label, 2, 0, 1, 2) + grid_lay.addWidget(self.padt_label, 4, 0, 1, 2) # Circular Aperture Selection self.circular_cb = FCCheckBox('%s' % _("Circular")) @@ -552,7 +605,7 @@ class ExtractUI: _("Process Circular Pads.") ) - grid_lay.addWidget(self.circular_cb, 3, 0, 1, 2) + grid_lay.addWidget(self.circular_cb, 6, 0, 1, 2) # Oblong Aperture Selection self.oblong_cb = FCCheckBox('%s' % _("Oblong")) @@ -560,7 +613,7 @@ class ExtractUI: _("Process Oblong Pads.") ) - grid_lay.addWidget(self.oblong_cb, 4, 0, 1, 2) + grid_lay.addWidget(self.oblong_cb, 8, 0, 1, 2) # Square Aperture Selection self.square_cb = FCCheckBox('%s' % _("Square")) @@ -568,7 +621,7 @@ class ExtractUI: _("Process Square Pads.") ) - grid_lay.addWidget(self.square_cb, 5, 0, 1, 2) + grid_lay.addWidget(self.square_cb, 10, 0, 1, 2) # Rectangular Aperture Selection self.rectangular_cb = FCCheckBox('%s' % _("Rectangular")) @@ -576,7 +629,7 @@ class ExtractUI: _("Process Rectangular Pads.") ) - grid_lay.addWidget(self.rectangular_cb, 6, 0, 1, 2) + grid_lay.addWidget(self.rectangular_cb, 12, 0, 1, 2) # Others type of Apertures Selection self.other_cb = FCCheckBox('%s' % _("Others")) @@ -584,12 +637,25 @@ class ExtractUI: _("Process pads not in the categories above.") ) - grid_lay.addWidget(self.other_cb, 7, 0, 1, 2) + grid_lay.addWidget(self.other_cb, 14, 0, 1, 2) separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - grid_lay.addWidget(separator_line, 8, 0, 1, 2) + grid_lay.addWidget(separator_line, 16, 0, 1, 2) + + # All Aperture Selection + self.all_cb = FCCheckBox('%s' % _("All")) + self.all_cb.setToolTip( + _("Process all Pads.") + ) + + grid_lay.addWidget(self.all_cb, 18, 0, 1, 2) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line, 20, 0, 1, 2) # ## Grid Layout grid1 = QtWidgets.QGridLayout()