diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e21094..590a124c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ CHANGELOG for FlatCAM beta 11.02.2022 - a new feature that when selecting an object in the Project Tab, that object is redrawn over the other objects, in top position. Feature controlled from Preferences -> Gerber -> General. +- made sure that the new feature of redrawing Gerber on top is not activated when that Gerber object is disabled +- added ability to turn off the outline plotting for Gerber objects (will speed up the plotting but the plotting visual quality will degrade); controlled from Preferences -> Gerber -> General +- plotting visuals in 3d graphic mode will no longer create some unnecessary lists 10.02.2022 diff --git a/appGUI/VisPyVisuals.py b/appGUI/VisPyVisuals.py index 52953c81..727b8877 100644 --- a/appGUI/VisPyVisuals.py +++ b/appGUI/VisPyVisuals.py @@ -52,11 +52,11 @@ def _update_shape_buffers(data, triangulation='glu'): if type(geo) == LineString: # Prepare lines - pts = _linestring_to_segments(list(simplified_geo.coords)) + pts = _linestring_to_segments(simplified_geo.coords) elif type(geo) == LinearRing: # Prepare lines - pts = _linearring_to_segments(list(simplified_geo.coords)) + pts = _linearring_to_segments(simplified_geo.coords) elif type(geo) == Polygon: # Prepare polygon faces @@ -69,9 +69,9 @@ def _update_shape_buffers(data, triangulation='glu'): # Prepare polygon edges if color is not None: - pts = _linearring_to_segments(list(simplified_geo.exterior.coords)) + pts = _linearring_to_segments(simplified_geo.exterior.coords) for ints in simplified_geo.interiors: - pts += _linearring_to_segments(list(ints.coords)) + pts += _linearring_to_segments(ints.coords) # Appending data for mesh if len(tri_pts) > 0 and len(tri_tris) > 0: diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index 0d8e02b7..1436ccf0 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -126,6 +126,7 @@ class PreferencesUIManager: "gerber_plot_on_select": self.ui.gerber_pref_form.gerber_gen_group.gerber_plot_on_select_cb, "gerber_plot_fill": self.ui.gerber_pref_form.gerber_gen_group.fill_color_entry, "gerber_plot_line": self.ui.gerber_pref_form.gerber_gen_group.line_color_entry, + "gerber_plot_line_enable": self.ui.gerber_pref_form.gerber_gen_group.enable_line_cb, # Gerber Options "gerber_noncoppermargin": self.ui.gerber_pref_form.gerber_opt_group.noncopper_margin_entry, diff --git a/appGUI/preferences/gerber/GerberGenPrefGroupUI.py b/appGUI/preferences/gerber/GerberGenPrefGroupUI.py index caeab9fc..25f240d4 100644 --- a/appGUI/preferences/gerber/GerberGenPrefGroupUI.py +++ b/appGUI/preferences/gerber/GerberGenPrefGroupUI.py @@ -1,7 +1,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets -from appGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCButton, FCSliderWithSpinner, FCColorEntry, FCLabel, \ - FCGridLayout, FCFrame, FCTable, FCColorEntry +from appGUI.GUIElements import FCCheckBox, FCSpinner, RadioSet, FCButton, FCSliderWithSpinner, FCLabel, \ + FCGridLayout, FCFrame, FCTable, FCColorEntry, OptionalInputSection from appGUI.preferences.OptionsGroupUI import OptionsGroupUI from copy import deepcopy @@ -230,6 +230,14 @@ class GerberGenPrefGroupUI(OptionsGroupUI): obj_grid = FCGridLayout(v_spacing=5, h_spacing=3) obj_frame.setLayout(obj_grid) + # Enable Outline plotting + self.enable_line_cb = FCCheckBox(label='%s' % _('Outline')) + self.enable_line_cb.setToolTip( + _("If checked, the polygon outline will be plotted on canvas.\n" + "Plotting the outline require more processing power but looks nicer.") + ) + obj_grid.addWidget(self.enable_line_cb, 0, 0, 1, 2) + # Plot Line Color self.line_color_label = FCLabel('%s:' % _('Outline')) self.line_color_label.setToolTip( @@ -237,8 +245,10 @@ class GerberGenPrefGroupUI(OptionsGroupUI): ) self.line_color_entry = FCColorEntry(icon=QtGui.QIcon(self.app.resource_location + '/set_colors64.png')) - obj_grid.addWidget(self.line_color_label, 0, 0) - obj_grid.addWidget(self.line_color_entry, 0, 1, 1, 2) + obj_grid.addWidget(self.line_color_label, 2, 0) + obj_grid.addWidget(self.line_color_entry, 2, 1, 1, 2) + + self.outline_ois = OptionalInputSection(self.enable_line_cb, [self.line_color_label, self.line_color_entry]) # Plot Fill Color self.fill_color_label = FCLabel('%s:' % _('Fill')) @@ -249,8 +259,8 @@ class GerberGenPrefGroupUI(OptionsGroupUI): ) self.fill_color_entry = FCColorEntry(icon=QtGui.QIcon(self.app.resource_location + '/set_colors64.png')) - obj_grid.addWidget(self.fill_color_label, 2, 0) - obj_grid.addWidget(self.fill_color_entry, 2, 1, 1, 2) + obj_grid.addWidget(self.fill_color_label, 4, 0) + obj_grid.addWidget(self.fill_color_entry, 4, 1, 1, 2) # Plot Fill Transparency Level self.gerber_alpha_label = FCLabel('%s:' % _('Alpha')) @@ -259,8 +269,8 @@ class GerberGenPrefGroupUI(OptionsGroupUI): ) self.gerber_alpha_entry = FCSliderWithSpinner(0, 255, 1) - obj_grid.addWidget(self.gerber_alpha_label, 4, 0) - obj_grid.addWidget(self.gerber_alpha_entry, 4, 1, 1, 2) + obj_grid.addWidget(self.gerber_alpha_label, 6, 0) + obj_grid.addWidget(self.gerber_alpha_entry, 6, 1, 1, 2) FCGridLayout.set_common_column_size([plot_grid, param_grid, def_grid, obj_grid], 0) diff --git a/appObjects/FlatCAMGerber.py b/appObjects/FlatCAMGerber.py index 16934936..e79a28cc 100644 --- a/appObjects/FlatCAMGerber.py +++ b/appObjects/FlatCAMGerber.py @@ -973,6 +973,8 @@ class GerberObject(FlatCAMObj, Gerber): used_color = random_color() if self.options['multicolored'] else 'black' used_face_color = None + if self.app.defaults["gerber_plot_line_enable"] is False: + used_color = None if isinstance(g, (Polygon, LineString)): self.add_shape(shape=g, color=used_color, face_color=used_face_color, visible=visible) elif isinstance(g, LinearRing): @@ -986,6 +988,8 @@ class GerberObject(FlatCAMObj, Gerber): used_color = random_color() if self.options['multicolored'] else 'black' used_face_color = None + if self.app.defaults["gerber_plot_line_disable"] is True: + used_color = None if isinstance(plot_geometry, (Polygon, LineString)): self.add_shape(shape=plot_geometry, color=used_color, face_color=used_face_color, visible=visible) elif isinstance(plot_geometry, LinearRing): diff --git a/appObjects/ObjectCollection.py b/appObjects/ObjectCollection.py index 8d0a5080..2ebf2264 100644 --- a/appObjects/ObjectCollection.py +++ b/appObjects/ObjectCollection.py @@ -999,8 +999,9 @@ class ObjectCollection(QtCore.QAbstractItemModel): # make sure that if the Properties Tab is selected then the Object UI is updated (built) self.app.on_notebook_tab_changed() + # on Gerber object selection it will redrawn on top of the other Gerber objects if self.app.defaults["gerber_plot_on_select"] is True: - self.app.on_enable_sel_plots(silent=True) + self.app.gerber_redraw() # don't emit the signal if there is more than one objects selected # this signal is intended to be emitted for a single selection in the collection view diff --git a/app_Main.py b/app_Main.py index f576d10a..96bf1b09 100644 --- a/app_Main.py +++ b/app_Main.py @@ -8993,6 +8993,18 @@ class App(QtCore.QObject): # Clear pool to free memory self.clear_pool() + def gerber_redraw(self): + obj = self.collection.get_active() + if obj.options['plot'] is False or obj.kind != 'gerber': + # we don't replot something that is disabled or if it is not Gerber type + return + + def worker_task(plot_obj): + with self.proc_container.new(''): + plot_obj.plot(visible=True) + + self.worker_task.emit({'fcn': worker_task, 'params': [obj]}) + def on_set_color_action_triggered(self): """ This slot gets called by clicking on the menu entry in the Set Color submenu of the context menu in Project Tab diff --git a/defaults.py b/defaults.py index ac8f8dee..bbb6093a 100644 --- a/defaults.py +++ b/defaults.py @@ -172,6 +172,7 @@ class FlatCAMDefaults: "gerber_plot_on_select": True, "gerber_plot_fill": '#BBF268BF', + "gerber_plot_line_enable": True, "gerber_plot_line": '#006E20BF', "gerber_def_units": 'IN',