From b09a88075eb10a36f9870866c0630651b51cae66 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 4 Sep 2020 14:48:55 +0200 Subject: [PATCH 1/6] Show a visual indication of enabled directly after click This doesn't actually speed up the process, but it does give some indication that something is going on while the changes are happening Contributes to #8250 --- .../ConfigurationMenu/CustomConfiguration.qml | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml index 010e2e77b0..b9b4d3261a 100644 --- a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml +++ b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml @@ -222,11 +222,18 @@ Item OldControls.CheckBox { id: enabledCheckbox - checked: Cura.MachineManager.activeStack != null ? Cura.MachineManager.activeStack.isEnabled : false enabled: !checked || Cura.MachineManager.numberExtrudersEnabled > 1 //Disable if it's the last enabled extruder. height: parent.height style: UM.Theme.styles.checkbox + Binding + { + target: enabledCheckbox + property: "checked" + value: Cura.MachineManager.activeStack.isEnabled + when: Cura.MachineManger.activeStack != null + } + /* Use a MouseArea to process the click on this checkbox. This is necessary because actually clicking the checkbox causes the "checked" property to be overwritten. After @@ -235,8 +242,17 @@ Item MouseArea { anchors.fill: parent - onClicked: Cura.MachineManager.setExtruderEnabled(Cura.ExtruderManager.activeExtruderIndex, !parent.checked) - enabled: parent.enabled + onClicked: + { + if(!parent.enabled) + { + return + } + // Already update the visual indication + parent.checked = !parent.checked + // Update the settings on the background! + Cura.MachineManager.setExtruderEnabled(Cura.ExtruderManager.activeExtruderIndex, parent.checked) + } } } } From 8ecdce3b260d6dc2acd06898070fa68391f68412 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 4 Sep 2020 16:38:15 +0200 Subject: [PATCH 2/6] Remove postponeEmit that didn't do anything The signals it was postponing weren't ever being triggered --- cura/Settings/MachineManager.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 5f540fec5c..687647c8e7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -967,11 +967,10 @@ class MachineManager(QObject): if self._global_container_stack is None: return - with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): - property_names = ["value", "resolve", "validationState"] - for container in [self._global_container_stack] + self._global_container_stack.extruderList: - for setting_key in container.getAllKeys(): - container.propertiesChanged.emit(setting_key, property_names) + property_names = ["value", "resolve", "validationState"] + for container in [self._global_container_stack] + self._global_container_stack.extruderList: + for setting_key in container.getAllKeys(): + container.propertiesChanged.emit(setting_key, property_names) @pyqtSlot(int, bool) def setExtruderEnabled(self, position: int, enabled: bool) -> None: From c383fe965664523311d75ce61f4d5fef0a836e8e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 4 Sep 2020 16:39:06 +0200 Subject: [PATCH 3/6] Don't force an update when disabling an extruder All the settings that are changed get a notification from the settingRelation. There should be no need to re-fire all of those settings again! Contributes to #8250 --- cura/Settings/MachineManager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 687647c8e7..3293b77103 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -995,8 +995,7 @@ class MachineManager(QObject): self.activeQualityGroupChanged.emit() # Update items in SettingExtruder ExtruderManager.getInstance().extrudersChanged.emit(self._global_container_stack.getId()) - # Make sure the front end reflects changes - self.forceUpdateAllSettings() + # Also trigger the build plate compatibility to update self.activeMaterialChanged.emit() self.activeIntentChanged.emit() From 6dbdee8d981f0e907a1cfd4e997e8961629650e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 4 Sep 2020 16:43:53 +0200 Subject: [PATCH 4/6] Don't switch away from disabled extruder In some situations this could cause a slowdown, since halfway through calculating the values the extruder switch would happen. If this is split up a bit, it's at least less noticeable Contributes to #8250 --- cura/Settings/MachineManager.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 3293b77103..8552feb4d8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -984,10 +984,6 @@ class MachineManager(QObject): self.updateNumberExtrudersEnabled() self.correctExtruderSettings() - # In case this extruder is being disabled and it's the currently selected one, switch to the default extruder - if not enabled and position == ExtruderManager.getInstance().activeExtruderIndex: - ExtruderManager.getInstance().setActiveExtruderIndex(int(self._default_extruder_position)) - # Ensure that the quality profile is compatible with current combination, or choose a compatible one if available self._updateQualityWithMaterial() self.extruderChanged.emit() @@ -995,7 +991,7 @@ class MachineManager(QObject): self.activeQualityGroupChanged.emit() # Update items in SettingExtruder ExtruderManager.getInstance().extrudersChanged.emit(self._global_container_stack.getId()) - + # Also trigger the build plate compatibility to update self.activeMaterialChanged.emit() self.activeIntentChanged.emit() From 175244fdc8faed9ea67d95be792c33fadc148faf Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 4 Sep 2020 17:23:52 +0200 Subject: [PATCH 5/6] No longer spam the GUI with hasUserSettingsUpdates The QML profiler showed me that it was causing a *lot* of issues when switching between extruders. More than 10% of the time in QML was spent on just updating ine property in the workspace summary dialog. There were other properties that were also being updated without there being a point. Contributes to #8250 --- cura/Settings/MachineManager.py | 45 +++++++++++++++++---------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8552feb4d8..181f846cac 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -63,6 +63,7 @@ class MachineManager(QObject): self._current_root_material_id = {} # type: Dict[str, str] self._default_extruder_position = "0" # to be updated when extruders are switched on and off + self._num_user_settings = 0 self._instance_container_timer = QTimer() # type: QTimer self._instance_container_timer.setInterval(250) @@ -126,6 +127,8 @@ class MachineManager(QObject): self.activeQualityGroupChanged.connect(self.activeQualityDisplayNameChanged) self.activeQualityChangesGroupChanged.connect(self.activeQualityDisplayNameChanged) + self.activeStackValueChanged.connect(self._reCalculateNumUserSettings) + activeQualityDisplayNameChanged = pyqtSignal() activeQualityGroupChanged = pyqtSignal() @@ -151,6 +154,22 @@ class MachineManager(QObject): printerConnectedStatusChanged = pyqtSignal() # Emitted every time the active machine change or the outputdevices change rootMaterialChanged = pyqtSignal() + numUserSettingsChanged = pyqtSignal() + + def _reCalculateNumUserSettings(self): + if not self._global_container_stack: + if self._num_user_settings != 0: + self.numUserSettingsChanged.emit() + self._num_user_settings = 0 + return + num_user_settings = self._global_container_stack.getTop().getNumInstances() + stacks = self._global_container_stack.extruderList + for stack in stacks: + num_user_settings += stack.getTop().getNumInstances() + + if self._num_user_settings != num_user_settings: + self._num_user_settings = num_user_settings + self.numUserSettingsChanged.emit() def setInitialActiveMachine(self) -> None: active_machine_id = self._application.getPreferences().getValue("cura/active_machine") @@ -415,31 +434,13 @@ class MachineManager(QObject): Logger.log("d", "Checking %s stacks for errors took %.2f s" % (count, time.time() - time_start)) return False - @pyqtProperty(bool, notify = activeStackValueChanged) + @pyqtProperty(bool, notify = numUserSettingsChanged) def hasUserSettings(self) -> bool: - """Check if the global_container has instances in the user container""" + return self._num_user_settings != 0 - if not self._global_container_stack: - return False - - if self._global_container_stack.getTop().getNumInstances() != 0: - return True - - for stack in self._global_container_stack.extruderList: - if stack.getTop().getNumInstances() != 0: - return True - - return False - - @pyqtProperty(int, notify = activeStackValueChanged) + @pyqtProperty(int, notify = numUserSettingsChanged) def numUserSettings(self) -> int: - if not self._global_container_stack: - return 0 - num_user_settings = self._global_container_stack.getTop().getNumInstances() - stacks = self._global_container_stack.extruderList - for stack in stacks: - num_user_settings += stack.getTop().getNumInstances() - return num_user_settings + return self._num_user_settings @pyqtSlot(str) def clearUserSettingAllCurrentStacks(self, key: str) -> None: From b35c8ba9bcb6e11b7bd1244c0c93a4babd416cb2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 7 Sep 2020 10:22:23 +0200 Subject: [PATCH 6/6] Add recalculate call to tests --- tests/TestMachineManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/TestMachineManager.py b/tests/TestMachineManager.py index 2d8337ecd5..4f15a0670c 100644 --- a/tests/TestMachineManager.py +++ b/tests/TestMachineManager.py @@ -57,7 +57,7 @@ def test_hasUserSettings(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value = 12) mocked_stack.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert machine_manager.numUserSettings == 12 assert machine_manager.hasUserSettings @@ -74,7 +74,7 @@ def test_hasUserSettingsExtruder(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value=200) extruder.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert machine_manager.hasUserSettings assert machine_manager.numUserSettings == 200 @@ -91,7 +91,7 @@ def test_hasUserSettingsEmptyUserChanges(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value=0) extruder.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert not machine_manager.hasUserSettings