diff --git a/AppGUI/preferences/PreferencesUIManager.py b/AppGUI/preferences/PreferencesUIManager.py index 70115d03..187e0a58 100644 --- a/AppGUI/preferences/PreferencesUIManager.py +++ b/AppGUI/preferences/PreferencesUIManager.py @@ -138,6 +138,7 @@ class PreferencesUIManager: # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry, "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb, "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio, + "gerber_delayed_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.delayed_buffer_cb, "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb, "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner, diff --git a/AppGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py b/AppGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py index 7080b81d..e68fe32f 100644 --- a/AppGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py +++ b/AppGUI/preferences/gerber/GerberAdvOptPrefGroupUI.py @@ -76,6 +76,13 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): grid0.addWidget(buffering_label, 9, 0) grid0.addWidget(self.buffering_radio, 9, 1) + # Delayed Buffering + self.delayed_buffer_cb = FCCheckBox(label=_('Delayed Buffering')) + self.delayed_buffer_cb.setToolTip( + _("When checked it will do the buffering in background.") + ) + grid0.addWidget(self.delayed_buffer_cb, 10, 0, 1, 2) + # Simplification self.simplify_cb = FCCheckBox(label=_('Simplify')) self.simplify_cb.setToolTip( @@ -83,7 +90,7 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): "loaded with simplification having a set tolerance.\n" "<>: Don't change this unless you know what you are doing !!!") ) - grid0.addWidget(self.simplify_cb, 10, 0, 1, 2) + grid0.addWidget(self.simplify_cb, 11, 0, 1, 2) # Simplification tolerance self.simplification_tol_label = QtWidgets.QLabel(_('Tolerance')) @@ -95,8 +102,8 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): self.simplification_tol_spinner.setRange(0.00000, 0.01000) self.simplification_tol_spinner.setSingleStep(0.0001) - grid0.addWidget(self.simplification_tol_label, 11, 0) - grid0.addWidget(self.simplification_tol_spinner, 11, 1) + grid0.addWidget(self.simplification_tol_label, 12, 0) + grid0.addWidget(self.simplification_tol_spinner, 12, 1) self.ois_simplif = OptionalInputSection( self.simplify_cb, [ @@ -105,3 +112,12 @@ class GerberAdvOptPrefGroupUI(OptionsGroupUI): logic=True) self.layout.addStretch() + + # signals + self.buffering_radio.activated_custom.connect(self.on_buffering_change) + + def on_buffering_change(self, val): + if val == 'no': + self.delayed_buffer_cb.setDisabled(False) + else: + self.delayed_buffer_cb.setDisabled(True) \ No newline at end of file diff --git a/AppObjects/AppObject.py b/AppObjects/AppObject.py index 05fcbfa0..cafc964d 100644 --- a/AppObjects/AppObject.py +++ b/AppObjects/AppObject.py @@ -356,6 +356,10 @@ class AppObject(QtCore.QObject): log.debug("%f seconds adding object and plotting." % (t1 - t0)) self.object_plotted.emit(t_obj) + if t_obj.kind == 'gerber' and self.app.defaults["gerber_delayed_buffering"] != 'full' and \ + self.app.defaults["gerber_delayed_buffering"]: + t_obj.do_buffer_signal.emit() + # Send to worker # self.worker.add_task(worker_task, [self]) if plot is True: diff --git a/AppObjects/FlatCAMGerber.py b/AppObjects/FlatCAMGerber.py index b2a56112..ed68dcc7 100644 --- a/AppObjects/FlatCAMGerber.py +++ b/AppObjects/FlatCAMGerber.py @@ -37,6 +37,8 @@ class GerberObject(FlatCAMObj, Gerber): optionChanged = QtCore.pyqtSignal(str) replotApertures = QtCore.pyqtSignal() + do_buffer_signal = QtCore.pyqtSignal() + ui_type = GerberObjectUI @staticmethod @@ -214,6 +216,8 @@ class GerberObject(FlatCAMObj, Gerber): self.ui.aperture_table_visibility_cb.stateChanged.connect(self.on_aperture_table_visibility_change) self.ui.follow_cb.stateChanged.connect(self.on_follow_cb_click) + self.do_buffer_signal.connect(self.on_generate_buffer) + # Show/Hide Advanced Options if self.app.defaults["global_app_level"] == 'b': self.ui.level.setText('%s' % _('Basic')) @@ -1490,7 +1494,7 @@ class GerberObject(FlatCAMObj, Gerber): Gerber.skew(self, angle_x=angle_x, angle_y=angle_y, point=point) self.replotApertures.emit() - def buffer(self, distance, join, factor=None): + def buffer(self, distance, join=2, factor=None): Gerber.buffer(self, distance=distance, join=join, factor=factor) self.replotApertures.emit() diff --git a/AppParsers/ParseGerber.py b/AppParsers/ParseGerber.py index 73e0b939..385a042b 100644 --- a/AppParsers/ParseGerber.py +++ b/AppParsers/ParseGerber.py @@ -1493,7 +1493,8 @@ class Gerber(Geometry): if self.app.defaults["gerber_buffering"] == 'full': new_poly = new_poly.buffer(0.00000001) new_poly = new_poly.buffer(-0.00000001) - log.warning("Union(buffer) done.") + log.warning("Union(buffer) done.") + else: log.debug("Union by union()...") new_poly = cascaded_union(poly_buffer) @@ -2260,7 +2261,7 @@ class Gerber(Geometry): self.app.inform.emit('[success] %s' % _("Gerber Rotate done.")) self.app.proc_container.new_text = '' - def buffer(self, distance, join, factor=None): + def buffer(self, distance, join=2, factor=None): """ :param distance: If 'factor' is True then distance is the factor diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ebaebf7..e12674b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ CHANGELOG for FlatCAM beta - updated Transform Tool to have a selection of possible references for the transformations that are now selectable in the GUI - Transform Tool - compacted the UI - minor issue in Paint Tool +- added a new feature for Gerber parsing: if the NO buffering is chosen in the Gerber Advanced Preferences there is now a checkbox to activate delayed buffering which will do the buffering in background allowing the user to work in between. I hope that this can be useful in case of large Gerber files. 2.06.2020 diff --git a/camlib.py b/camlib.py index 10e7d49f..5f304dfe 100644 --- a/camlib.py +++ b/camlib.py @@ -10,7 +10,6 @@ from PyQt5 import QtWidgets, QtCore from io import StringIO -import numpy as np from numpy.linalg import solve, norm import platform diff --git a/defaults.py b/defaults.py index d35c6c4f..15c7824a 100644 --- a/defaults.py +++ b/defaults.py @@ -183,6 +183,7 @@ class FlatCAMDefaults: "gerber_aperture_buffer_factor": 0.0, "gerber_follow": False, "gerber_buffering": "full", + "gerber_delayed_buffering": True, "gerber_simplification": False, "gerber_simp_tolerance": 0.0005,