From 84cd2143c3d4984fd81f8c586820c4538f2b87a9 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 29 Dec 2019 01:11:24 +0200 Subject: [PATCH] - the Gerber UI is built only once now so the process is lighter on CPU - the Gerber apertures marking shapes storage is now built only once because the more are built the more sluggish is the interface --- FlatCAMApp.py | 7 +- FlatCAMObj.py | 245 ++++++++++++++++++++++++++------------------------ README.md | 2 + 3 files changed, 134 insertions(+), 120 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 8941d117..7ce4cb51 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -3258,6 +3258,10 @@ class App(QtCore.QObject): # set call source to the Editor we go into self.call_source = 'grb_editor' + # reset the following variables so the UI is built again after edit + edited_object.ui_build = False + edited_object.build_aperture_storage = False + # make sure that we can't select another object while in Editor Mode: # self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) self.ui.project_frame.setDisabled(True) @@ -6828,7 +6832,8 @@ class App(QtCore.QObject): if self.ui.plot_tab_area.tabText(idx) == _("Preferences"): self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black')) - self.ui.pref_apply_button.setStyleSheet("QPushButton {color: black;}") + # restore the default stylesheet by setting a blank one + self.ui.pref_apply_button.setStyleSheet("") self.inform.emit('%s' % _("Preferences applied.")) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 4679fef7..7d22fe6a 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -662,6 +662,12 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.fill_color = self.app.defaults['gerber_plot_fill'] self.outline_color = self.app.defaults['gerber_plot_line'] + # keep track if the UI is built so we don't have to build it every time + self.ui_build = False + + # build only once the aperture storage (takes time) + self.build_aperture_storage = False + # Attributes to be included in serialization # Always append to it because it carries contents # from predecessors. @@ -834,121 +840,118 @@ class FlatCAMGerber(FlatCAMObj, Gerber): def build_ui(self): FlatCAMObj.build_ui(self) - try: - # if connected, disconnect the signal from the slot on item_changed as it creates issues - self.ui.apertures_table.itemChanged.disconnect() - except (TypeError, AttributeError): - pass - - self.apertures_row = 0 - aper_no = self.apertures_row + 1 - sort = [] - for k, v in list(self.apertures.items()): - sort.append(int(k)) - sorted_apertures = sorted(sort) - - # sort = [] - # for k, v in list(self.aperture_macros.items()): - # sort.append(k) - # sorted_macros = sorted(sort) - - # n = len(sorted_apertures) + len(sorted_macros) - n = len(sorted_apertures) - self.ui.apertures_table.setRowCount(n) - - for ap_code in sorted_apertures: - ap_code = str(ap_code) - - ap_id_item = QtWidgets.QTableWidgetItem('%d' % int(self.apertures_row + 1)) - ap_id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - self.ui.apertures_table.setItem(self.apertures_row, 0, ap_id_item) # Tool name/id - - ap_code_item = QtWidgets.QTableWidgetItem(ap_code) - ap_code_item.setFlags(QtCore.Qt.ItemIsEnabled) - - ap_type_item = QtWidgets.QTableWidgetItem(str(self.apertures[ap_code]['type'])) - ap_type_item.setFlags(QtCore.Qt.ItemIsEnabled) - - if str(self.apertures[ap_code]['type']) == 'R' or str(self.apertures[ap_code]['type']) == 'O': - ap_dim_item = QtWidgets.QTableWidgetItem( - '%.*f, %.*f' % (self.decimals, self.apertures[ap_code]['width'], - self.decimals, self.apertures[ap_code]['height'] - ) - ) - ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) - elif str(self.apertures[ap_code]['type']) == 'P': - ap_dim_item = QtWidgets.QTableWidgetItem( - '%.*f, %.*f' % (self.decimals, self.apertures[ap_code]['diam'], - self.decimals, self.apertures[ap_code]['nVertices']) - ) - ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) - else: - ap_dim_item = QtWidgets.QTableWidgetItem('') - ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) + if self.ui.aperture_table_visibility_cb.get_value() and self.ui_build is False: + self.ui_build = True try: - if self.apertures[ap_code]['size'] is not None: - ap_size_item = QtWidgets.QTableWidgetItem( - '%.*f' % (self.decimals, float(self.apertures[ap_code]['size']))) + # if connected, disconnect the signal from the slot on item_changed as it creates issues + self.ui.apertures_table.itemChanged.disconnect() + except (TypeError, AttributeError): + pass + + self.apertures_row = 0 + aper_no = self.apertures_row + 1 + sort = [] + for k, v in list(self.apertures.items()): + sort.append(int(k)) + sorted_apertures = sorted(sort) + + n = len(sorted_apertures) + self.ui.apertures_table.setRowCount(n) + + for ap_code in sorted_apertures: + ap_code = str(ap_code) + + ap_id_item = QtWidgets.QTableWidgetItem('%d' % int(self.apertures_row + 1)) + ap_id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + self.ui.apertures_table.setItem(self.apertures_row, 0, ap_id_item) # Tool name/id + + ap_code_item = QtWidgets.QTableWidgetItem(ap_code) + ap_code_item.setFlags(QtCore.Qt.ItemIsEnabled) + + ap_type_item = QtWidgets.QTableWidgetItem(str(self.apertures[ap_code]['type'])) + ap_type_item.setFlags(QtCore.Qt.ItemIsEnabled) + + if str(self.apertures[ap_code]['type']) == 'R' or str(self.apertures[ap_code]['type']) == 'O': + ap_dim_item = QtWidgets.QTableWidgetItem( + '%.*f, %.*f' % (self.decimals, self.apertures[ap_code]['width'], + self.decimals, self.apertures[ap_code]['height'] + ) + ) + ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) + elif str(self.apertures[ap_code]['type']) == 'P': + ap_dim_item = QtWidgets.QTableWidgetItem( + '%.*f, %.*f' % (self.decimals, self.apertures[ap_code]['diam'], + self.decimals, self.apertures[ap_code]['nVertices']) + ) + ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) else: - ap_size_item = QtWidgets.QTableWidgetItem('') - except KeyError: - ap_size_item = QtWidgets.QTableWidgetItem('') - ap_size_item.setFlags(QtCore.Qt.ItemIsEnabled) + ap_dim_item = QtWidgets.QTableWidgetItem('') + ap_dim_item.setFlags(QtCore.Qt.ItemIsEnabled) - mark_item = FCCheckBox() - mark_item.setLayoutDirection(QtCore.Qt.RightToLeft) - # if self.ui.aperture_table_visibility_cb.isChecked(): - # mark_item.setChecked(True) - - self.ui.apertures_table.setItem(self.apertures_row, 1, ap_code_item) # Aperture Code - self.ui.apertures_table.setItem(self.apertures_row, 2, ap_type_item) # Aperture Type - self.ui.apertures_table.setItem(self.apertures_row, 3, ap_size_item) # Aperture Dimensions - self.ui.apertures_table.setItem(self.apertures_row, 4, ap_dim_item) # Aperture Dimensions - - empty_plot_item = QtWidgets.QTableWidgetItem('') - empty_plot_item.setFlags(~QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - self.ui.apertures_table.setItem(self.apertures_row, 5, empty_plot_item) - self.ui.apertures_table.setCellWidget(self.apertures_row, 5, mark_item) - - self.apertures_row += 1 - - self.ui.apertures_table.selectColumn(0) - self.ui.apertures_table.resizeColumnsToContents() - self.ui.apertures_table.resizeRowsToContents() - - vertical_header = self.ui.apertures_table.verticalHeader() - # vertical_header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) - vertical_header.hide() - self.ui.apertures_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - - horizontal_header = self.ui.apertures_table.horizontalHeader() - horizontal_header.setMinimumSectionSize(10) - horizontal_header.setDefaultSectionSize(70) - horizontal_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed) - horizontal_header.resizeSection(0, 27) - horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) - horizontal_header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) - horizontal_header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents) - horizontal_header.setSectionResizeMode(4, QtWidgets.QHeaderView.Stretch) - horizontal_header.setSectionResizeMode(5, QtWidgets.QHeaderView.Fixed) - horizontal_header.resizeSection(5, 17) - self.ui.apertures_table.setColumnWidth(5, 17) - - self.ui.apertures_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.ui.apertures_table.setSortingEnabled(False) - 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()): try: - self.ui.apertures_table.cellWidget(row, 5).set_value(self.marked_rows[row]) - except IndexError: - pass + if self.apertures[ap_code]['size'] is not None: + ap_size_item = QtWidgets.QTableWidgetItem( + '%.*f' % (self.decimals, float(self.apertures[ap_code]['size']))) + else: + ap_size_item = QtWidgets.QTableWidgetItem('') + except KeyError: + ap_size_item = QtWidgets.QTableWidgetItem('') + ap_size_item.setFlags(QtCore.Qt.ItemIsEnabled) - self.ui_connect() + mark_item = FCCheckBox() + mark_item.setLayoutDirection(QtCore.Qt.RightToLeft) + # if self.ui.aperture_table_visibility_cb.isChecked(): + # mark_item.setChecked(True) + + self.ui.apertures_table.setItem(self.apertures_row, 1, ap_code_item) # Aperture Code + self.ui.apertures_table.setItem(self.apertures_row, 2, ap_type_item) # Aperture Type + self.ui.apertures_table.setItem(self.apertures_row, 3, ap_size_item) # Aperture Dimensions + self.ui.apertures_table.setItem(self.apertures_row, 4, ap_dim_item) # Aperture Dimensions + + empty_plot_item = QtWidgets.QTableWidgetItem('') + empty_plot_item.setFlags(~QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + self.ui.apertures_table.setItem(self.apertures_row, 5, empty_plot_item) + self.ui.apertures_table.setCellWidget(self.apertures_row, 5, mark_item) + + self.apertures_row += 1 + + self.ui.apertures_table.selectColumn(0) + self.ui.apertures_table.resizeColumnsToContents() + self.ui.apertures_table.resizeRowsToContents() + + vertical_header = self.ui.apertures_table.verticalHeader() + # vertical_header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) + vertical_header.hide() + self.ui.apertures_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + + horizontal_header = self.ui.apertures_table.horizontalHeader() + horizontal_header.setMinimumSectionSize(10) + horizontal_header.setDefaultSectionSize(70) + horizontal_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed) + horizontal_header.resizeSection(0, 27) + horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) + horizontal_header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) + horizontal_header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents) + horizontal_header.setSectionResizeMode(4, QtWidgets.QHeaderView.Stretch) + horizontal_header.setSectionResizeMode(5, QtWidgets.QHeaderView.Fixed) + horizontal_header.resizeSection(5, 17) + self.ui.apertures_table.setColumnWidth(5, 17) + + self.ui.apertures_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.ui.apertures_table.setSortingEnabled(False) + 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()): + try: + self.ui.apertures_table.cellWidget(row, 5).set_value(self.marked_rows[row]) + except IndexError: + pass + + self.ui_connect() def ui_connect(self): for row in range(self.ui.apertures_table.rowCount()): @@ -1615,13 +1618,16 @@ class FlatCAMGerber(FlatCAMObj, Gerber): def on_aperture_table_visibility_change(self): if self.ui.aperture_table_visibility_cb.isChecked(): # add the shapes storage for marking apertures - if self.app.is_legacy is False: - for ap_code in self.apertures: - self.mark_shapes[ap_code] = self.app.plotcanvas.new_shape_collection(layers=1) - else: - for ap_code in self.apertures: - self.mark_shapes[ap_code] = ShapeCollectionLegacy(obj=self, app=self.app, - name=self.options['name'] + str(ap_code)) + if self.build_aperture_storage is False: + self.build_aperture_storage = True + + if self.app.is_legacy is False: + for ap_code in self.apertures: + self.mark_shapes[ap_code] = self.app.plotcanvas.new_shape_collection(layers=1) + else: + for ap_code in self.apertures: + self.mark_shapes[ap_code] = ShapeCollectionLegacy(obj=self, app=self.app, + name=self.options['name'] + str(ap_code)) self.ui.apertures_table.setVisible(True) for ap in self.mark_shapes: @@ -1629,6 +1635,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.ui.mark_all_cb.setVisible(True) self.ui.mark_all_cb.setChecked(False) + self.build_ui() else: self.ui.apertures_table.setVisible(False) @@ -1640,9 +1647,9 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.ui.apertures_table.cellWidget(row, 5).set_value(False) self.clear_plot_apertures() - for ap in list(self.mark_shapes.keys()): - # self.mark_shapes[ap].enabled = False - del self.mark_shapes[ap] + # for ap in list(self.mark_shapes.keys()): + # # self.mark_shapes[ap].enabled = False + # del self.mark_shapes[ap] except Exception as e: log.debug(" FlatCAMGerber.on_aperture_visibility_changed() --> %s" % str(e)) diff --git a/README.md b/README.md index 000edb78..be8a7039 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ CAD program, and create G-Code for Isolation routing. 29.12.2019 - the Apply button text in Preferences is now made red when changes were made and require to be applied +- the Gerber UI is built only once now so the process is lighter on CPU +- the Gerber apertures marking shapes storage is now built only once because the more are built the more sluggish is the interface 28.12.2019