Merge pull request #8335

Speed up disable extruder
This commit is contained in:
Jelle Spijker 2020-09-09 09:42:36 +02:00 committed by GitHub
commit 0725bdcd64
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 39 deletions

View file

@ -63,6 +63,7 @@ class MachineManager(QObject):
self._current_root_material_id = {} # type: Dict[str, str] 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._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 = QTimer() # type: QTimer
self._instance_container_timer.setInterval(250) self._instance_container_timer.setInterval(250)
@ -126,6 +127,8 @@ class MachineManager(QObject):
self.activeQualityGroupChanged.connect(self.activeQualityDisplayNameChanged) self.activeQualityGroupChanged.connect(self.activeQualityDisplayNameChanged)
self.activeQualityChangesGroupChanged.connect(self.activeQualityDisplayNameChanged) self.activeQualityChangesGroupChanged.connect(self.activeQualityDisplayNameChanged)
self.activeStackValueChanged.connect(self._reCalculateNumUserSettings)
activeQualityDisplayNameChanged = pyqtSignal() activeQualityDisplayNameChanged = pyqtSignal()
activeQualityGroupChanged = pyqtSignal() activeQualityGroupChanged = pyqtSignal()
@ -151,6 +154,22 @@ class MachineManager(QObject):
printerConnectedStatusChanged = pyqtSignal() # Emitted every time the active machine change or the outputdevices change printerConnectedStatusChanged = pyqtSignal() # Emitted every time the active machine change or the outputdevices change
rootMaterialChanged = pyqtSignal() 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: def setInitialActiveMachine(self) -> None:
active_machine_id = self._application.getPreferences().getValue("cura/active_machine") 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)) Logger.log("d", "Checking %s stacks for errors took %.2f s" % (count, time.time() - time_start))
return False return False
@pyqtProperty(bool, notify = activeStackValueChanged) @pyqtProperty(bool, notify = numUserSettingsChanged)
def hasUserSettings(self) -> bool: 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: @pyqtProperty(int, notify = numUserSettingsChanged)
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)
def numUserSettings(self) -> int: def numUserSettings(self) -> int:
if not self._global_container_stack: return self._num_user_settings
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
@pyqtSlot(str) @pyqtSlot(str)
def clearUserSettingAllCurrentStacks(self, key: str) -> None: def clearUserSettingAllCurrentStacks(self, key: str) -> None:
@ -967,11 +968,10 @@ class MachineManager(QObject):
if self._global_container_stack is None: if self._global_container_stack is None:
return return
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): property_names = ["value", "resolve", "validationState"]
property_names = ["value", "resolve", "validationState"] for container in [self._global_container_stack] + self._global_container_stack.extruderList:
for container in [self._global_container_stack] + self._global_container_stack.extruderList: for setting_key in container.getAllKeys():
for setting_key in container.getAllKeys(): container.propertiesChanged.emit(setting_key, property_names)
container.propertiesChanged.emit(setting_key, property_names)
@pyqtSlot(int, bool) @pyqtSlot(int, bool)
def setExtruderEnabled(self, position: int, enabled: bool) -> None: def setExtruderEnabled(self, position: int, enabled: bool) -> None:
@ -985,10 +985,6 @@ class MachineManager(QObject):
self.updateNumberExtrudersEnabled() self.updateNumberExtrudersEnabled()
self.correctExtruderSettings() 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 # Ensure that the quality profile is compatible with current combination, or choose a compatible one if available
self._updateQualityWithMaterial() self._updateQualityWithMaterial()
self.extruderChanged.emit() self.extruderChanged.emit()
@ -996,8 +992,7 @@ class MachineManager(QObject):
self.activeQualityGroupChanged.emit() self.activeQualityGroupChanged.emit()
# Update items in SettingExtruder # Update items in SettingExtruder
ExtruderManager.getInstance().extrudersChanged.emit(self._global_container_stack.getId()) 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 # Also trigger the build plate compatibility to update
self.activeMaterialChanged.emit() self.activeMaterialChanged.emit()
self.activeIntentChanged.emit() self.activeIntentChanged.emit()

View file

@ -222,11 +222,18 @@ Item
OldControls.CheckBox OldControls.CheckBox
{ {
id: enabledCheckbox 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. enabled: !checked || Cura.MachineManager.numberExtrudersEnabled > 1 //Disable if it's the last enabled extruder.
height: parent.height height: parent.height
style: UM.Theme.styles.checkbox 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. /* Use a MouseArea to process the click on this checkbox.
This is necessary because actually clicking the checkbox This is necessary because actually clicking the checkbox
causes the "checked" property to be overwritten. After causes the "checked" property to be overwritten. After
@ -235,8 +242,17 @@ Item
MouseArea MouseArea
{ {
anchors.fill: parent anchors.fill: parent
onClicked: Cura.MachineManager.setExtruderEnabled(Cura.ExtruderManager.activeExtruderIndex, !parent.checked) onClicked:
enabled: parent.enabled {
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)
}
} }
} }
} }

View file

@ -57,7 +57,7 @@ def test_hasUserSettings(machine_manager, application):
mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container = MagicMock(name="UserSettingContainer")
mocked_instance_container.getNumInstances = MagicMock(return_value = 12) mocked_instance_container.getNumInstances = MagicMock(return_value = 12)
mocked_stack.getTop = MagicMock(return_value = mocked_instance_container) mocked_stack.getTop = MagicMock(return_value = mocked_instance_container)
machine_manager._reCalculateNumUserSettings()
assert machine_manager.numUserSettings == 12 assert machine_manager.numUserSettings == 12
assert machine_manager.hasUserSettings assert machine_manager.hasUserSettings
@ -74,7 +74,7 @@ def test_hasUserSettingsExtruder(machine_manager, application):
mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container = MagicMock(name="UserSettingContainer")
mocked_instance_container.getNumInstances = MagicMock(return_value=200) mocked_instance_container.getNumInstances = MagicMock(return_value=200)
extruder.getTop = MagicMock(return_value = mocked_instance_container) extruder.getTop = MagicMock(return_value = mocked_instance_container)
machine_manager._reCalculateNumUserSettings()
assert machine_manager.hasUserSettings assert machine_manager.hasUserSettings
assert machine_manager.numUserSettings == 200 assert machine_manager.numUserSettings == 200
@ -91,7 +91,7 @@ def test_hasUserSettingsEmptyUserChanges(machine_manager, application):
mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container = MagicMock(name="UserSettingContainer")
mocked_instance_container.getNumInstances = MagicMock(return_value=0) mocked_instance_container.getNumInstances = MagicMock(return_value=0)
extruder.getTop = MagicMock(return_value = mocked_instance_container) extruder.getTop = MagicMock(return_value = mocked_instance_container)
machine_manager._reCalculateNumUserSettings()
assert not machine_manager.hasUserSettings assert not machine_manager.hasUserSettings