From b45d0916414b991cb6ef84bf2fba3fe29f80b72c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 3 Aug 2016 12:54:54 +0200 Subject: [PATCH 01/21] Make camera animation feel snappier It no longer eases into the animation, so it feels as if it reacts more immediately. --- cura/CameraAnimation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CameraAnimation.py b/cura/CameraAnimation.py index e31cbb93a4..a707053d87 100644 --- a/cura/CameraAnimation.py +++ b/cura/CameraAnimation.py @@ -11,8 +11,8 @@ class CameraAnimation(QVariantAnimation): def __init__(self, parent = None): super().__init__(parent) self._camera_tool = None - self.setDuration(500) - self.setEasingCurve(QEasingCurve.InOutQuad) + self.setDuration(300) + self.setEasingCurve(QEasingCurve.OutQuad) def setCameraTool(self, camera_tool): self._camera_tool = camera_tool From 85f2a7c3853cd3bfcf500897f4849bea997adca3 Mon Sep 17 00:00:00 2001 From: "A.Sasin" Date: Tue, 17 Oct 2017 15:01:49 +0200 Subject: [PATCH 02/21] Added update to for Instance container to re calculate values and validate CURA-4447 --- cura/CuraApplication.py | 14 ++++++++++++++ cura/Settings/MachineManager.py | 11 ++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 27451c745c..22fbbafab3 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -415,6 +415,20 @@ class CuraApplication(QtApplication): global_stack.getTop().clear() + # if the user decided to keep settings then the user settings should be re-calculated and validated for errors + # before slicing. To ensure that slicer uses right settings values + elif option == "keep": + global_stack = self.getGlobalContainerStack() + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + user_extruder_container = extruder.getTop() + + if user_extruder_container: + user_extruder_container.update() + + user_global_container = global_stack.getTop() + if user_global_container: + user_global_container.update() + @pyqtSlot(int) def messageBoxClosed(self, button): if self._message_box_callback: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 563965915a..e89e11898c 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -854,17 +854,18 @@ class MachineManager(QObject): self._replaceQualityOrQualityChangesInStack(stack, stack_quality, postpone_emit=True) self._replaceQualityOrQualityChangesInStack(stack, stack_quality_changes, postpone_emit=True) - # Send emits that are postponed in replaceContainer. - # Here the stacks are finished replacing and every value can be resolved based on the current state. - for setting_info in new_quality_settings_list: - setting_info["stack"].sendPostponedEmits() - # Connect to onQualityNameChanged for stack in name_changed_connect_stacks: stack.nameChanged.connect(self._onQualityNameChanged) if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: self._askUserToKeepOrClearCurrentSettings() + else: + # If the user doesn't have any of adjusted settings then slicing will be triggered by emit() + # Send emits that are postponed in replaceContainer. + # Here the stacks are finished replacing and every value can be resolved based on the current state. + for setting_info in new_quality_settings_list: + setting_info["stack"].sendPostponedEmits() self.activeQualityChanged.emit() From d735921d42aa9ee1fdc6a5c8f31e5aae89bbdfc4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 19 Oct 2017 08:32:26 +0200 Subject: [PATCH 03/21] Take into account the keep/discard interaction when emitting signals CURA-4248 When user switches to a different profile, the keep/discard dialog can show up. Don't emit signals immediately if this interaction takes place because it will trigger an unnecessary slice. --- cura/CuraApplication.py | 6 ++++-- cura/Settings/MachineManager.py | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 22fbbafab3..4b4f743a77 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -393,6 +393,7 @@ class CuraApplication(QtApplication): showDiscardOrKeepProfileChanges = pyqtSignal() def discardOrKeepProfileChanges(self): + has_user_interaction = False choice = Preferences.getInstance().getValue("cura/choice_on_profile_override") if choice == "always_discard": # don't show dialog and DISCARD the profile @@ -403,11 +404,12 @@ class CuraApplication(QtApplication): else: # ALWAYS ask whether to keep or discard the profile self.showDiscardOrKeepProfileChanges.emit() - - #sidebarSimpleDiscardOrKeepProfileChanges = pyqtSignal() + has_user_interaction = True + return has_user_interaction @pyqtSlot(str) def discardOrKeepProfileChangesClosed(self, option): + self.getMachineManager().activeQualityChanged.emit() if option == "discard": global_stack = self.getGlobalContainerStack() for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e89e11898c..0db07485aa 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -858,8 +858,10 @@ class MachineManager(QObject): for stack in name_changed_connect_stacks: stack.nameChanged.connect(self._onQualityNameChanged) + has_user_interaction = False if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: - self._askUserToKeepOrClearCurrentSettings() + # Show the keep/discard user settings dialog + has_user_interaction = Application.getInstance().discardOrKeepProfileChanges() else: # If the user doesn't have any of adjusted settings then slicing will be triggered by emit() # Send emits that are postponed in replaceContainer. @@ -867,7 +869,8 @@ class MachineManager(QObject): for setting_info in new_quality_settings_list: setting_info["stack"].sendPostponedEmits() - self.activeQualityChanged.emit() + if not has_user_interaction: + self.activeQualityChanged.emit() ## Determine the quality and quality changes settings for the current machine for a quality name. # @@ -986,9 +989,6 @@ class MachineManager(QObject): stack.qualityChanges.nameChanged.connect(self._onQualityNameChanged) self._onQualityNameChanged() - def _askUserToKeepOrClearCurrentSettings(self): - Application.getInstance().discardOrKeepProfileChanges() - @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self) -> str: if self._active_container_stack: From e9336b9b9e995f80190652ec00767f3d8f4b4e20 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 19 Oct 2017 14:39:32 +0200 Subject: [PATCH 04/21] Small cleanups for discard or keep behavior - CURA-4447 --- cura/CuraApplication.py | 6 +++--- cura/Settings/MachineManager.py | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4b4f743a77..ce09346a34 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -409,12 +409,10 @@ class CuraApplication(QtApplication): @pyqtSlot(str) def discardOrKeepProfileChangesClosed(self, option): - self.getMachineManager().activeQualityChanged.emit() if option == "discard": global_stack = self.getGlobalContainerStack() for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): extruder.getTop().clear() - global_stack.getTop().clear() # if the user decided to keep settings then the user settings should be re-calculated and validated for errors @@ -423,7 +421,6 @@ class CuraApplication(QtApplication): global_stack = self.getGlobalContainerStack() for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): user_extruder_container = extruder.getTop() - if user_extruder_container: user_extruder_container.update() @@ -431,6 +428,9 @@ class CuraApplication(QtApplication): if user_global_container: user_global_container.update() + # notify listeners that quality has changed (after user selected discard or keep) + self.getMachineManager().activeQualityChanged.emit() + @pyqtSlot(int) def messageBoxClosed(self, button): if self._message_box_callback: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0db07485aa..6438453043 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -815,6 +815,7 @@ class MachineManager(QObject): # \param quality_id The quality_id of either a quality or a quality_changes @pyqtSlot(str) def setActiveQuality(self, quality_id: str): + print("set active quality") with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.blurSettings.emit() @@ -858,10 +859,9 @@ class MachineManager(QObject): for stack in name_changed_connect_stacks: stack.nameChanged.connect(self._onQualityNameChanged) - has_user_interaction = False if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: # Show the keep/discard user settings dialog - has_user_interaction = Application.getInstance().discardOrKeepProfileChanges() + Application.getInstance().discardOrKeepProfileChanges() else: # If the user doesn't have any of adjusted settings then slicing will be triggered by emit() # Send emits that are postponed in replaceContainer. @@ -869,7 +869,6 @@ class MachineManager(QObject): for setting_info in new_quality_settings_list: setting_info["stack"].sendPostponedEmits() - if not has_user_interaction: self.activeQualityChanged.emit() ## Determine the quality and quality changes settings for the current machine for a quality name. From 70cf86c65b42b2fe22540cf5b0a0053081267e10 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 19 Oct 2017 14:40:56 +0200 Subject: [PATCH 05/21] Remove debug print - CURA-4447 --- cura/Settings/MachineManager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6438453043..442c61d9ce 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -815,7 +815,6 @@ class MachineManager(QObject): # \param quality_id The quality_id of either a quality or a quality_changes @pyqtSlot(str) def setActiveQuality(self, quality_id: str): - print("set active quality") with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.blurSettings.emit() From 31a04ed8dac85b2c536a4695659cb4d8496582e4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 20 Oct 2017 11:37:45 +0200 Subject: [PATCH 06/21] Also emit active quality changed when no dialog interaction occured - CURA-4447 --- cura/Settings/MachineManager.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 442c61d9ce..8cd793dfae 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -858,9 +858,11 @@ class MachineManager(QObject): for stack in name_changed_connect_stacks: stack.nameChanged.connect(self._onQualityNameChanged) + has_user_interaction = False + if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: # Show the keep/discard user settings dialog - Application.getInstance().discardOrKeepProfileChanges() + has_user_interaction = Application.getInstance().discardOrKeepProfileChanges() else: # If the user doesn't have any of adjusted settings then slicing will be triggered by emit() # Send emits that are postponed in replaceContainer. @@ -868,6 +870,7 @@ class MachineManager(QObject): for setting_info in new_quality_settings_list: setting_info["stack"].sendPostponedEmits() + if not has_user_interaction: self.activeQualityChanged.emit() ## Determine the quality and quality changes settings for the current machine for a quality name. From 95a2559607c0b3620c10689ef2ef97b14ba65d16 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 20 Oct 2017 12:34:35 +0200 Subject: [PATCH 07/21] indent --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8cd793dfae..f704378a8f 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -871,7 +871,7 @@ class MachineManager(QObject): setting_info["stack"].sendPostponedEmits() if not has_user_interaction: - self.activeQualityChanged.emit() + self.activeQualityChanged.emit() ## Determine the quality and quality changes settings for the current machine for a quality name. # From 2361e96e29941c366c4a3f07373ffb34a44c423c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 11:41:20 +0200 Subject: [PATCH 08/21] Wait with updating active stack variant and material until dialog was closed - CURA-4447 --- cura/CuraApplication.py | 3 +++ cura/Settings/MachineManager.py | 33 +++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ce09346a34..1680e7c6a6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -407,6 +407,8 @@ class CuraApplication(QtApplication): has_user_interaction = True return has_user_interaction + onDiscardOrKeepProfileChangesClosed = pyqtSignal() # Used to notify other managers that the dialog was closed + @pyqtSlot(str) def discardOrKeepProfileChangesClosed(self, option): if option == "discard": @@ -429,6 +431,7 @@ class CuraApplication(QtApplication): user_global_container.update() # notify listeners that quality has changed (after user selected discard or keep) + self.onDiscardOrKeepProfileChangesClosed.emit() self.getMachineManager().activeQualityChanged.emit() @pyqtSlot(int) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f704378a8f..d32e7dcb4d 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -47,6 +47,10 @@ class MachineManager(QObject): self._active_container_stack = None # type: CuraContainerStack self._global_container_stack = None # type: GlobalStack + # Used to store the new containers until after confirming the dialog + self._new_variant_container = None + self._new_material_container = None + self._error_check_timer = QTimer() self._error_check_timer.setInterval(250) self._error_check_timer.setSingleShot(True) @@ -58,6 +62,7 @@ class MachineManager(QObject): self._instance_container_timer.timeout.connect(self.__onInstanceContainersChanged) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + ## When the global container is changed, active material probably needs to be updated. self.globalContainerChanged.connect(self.activeMaterialChanged) self.globalContainerChanged.connect(self.activeVariantChanged) @@ -84,6 +89,9 @@ class MachineManager(QObject): ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeStackChanged) self.activeStackChanged.connect(self.activeStackValueChanged) + # when a user closed dialog check if any delayed material or variant changes need to be applied + Application.getInstance().onDiscardOrKeepProfileChangesClosed.connect(self._executeDelayedActiveContainerStackChanges) + Preferences.getInstance().addPreference("cura/active_machine", "") self._global_event_keys = set() @@ -109,7 +117,7 @@ class MachineManager(QObject): "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Incompatible Material")) - globalContainerChanged = pyqtSignal() # Emitted whenever the global stack is changed (ie: when changing between printers, changing a global profile, but not when changing a value) + globalContainerChanged = pyqtSignal() # Emitted whenever the global stack is changed (ie: when changing between printers, changing a global profile, but not when changing a value) activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() activeQualityChanged = pyqtSignal() @@ -747,7 +755,7 @@ class MachineManager(QObject): self.blurSettings.emit() old_material.nameChanged.disconnect(self._onMaterialNameChanged) - self._active_container_stack.material = material_container + self._new_material_container = material_container # self._active_container_stack will be updated with a delay Logger.log("d", "Active material changed") material_container.nameChanged.connect(self._onMaterialNameChanged) @@ -801,13 +809,13 @@ class MachineManager(QObject): old_material = self._active_container_stack.material if old_variant: self.blurSettings.emit() - self._active_container_stack.variant = containers[0] + self._new_variant_container = containers[0] # self._active_container_stack will be updated with a delay Logger.log("d", "Active variant changed to {active_variant_id}".format(active_variant_id = containers[0].getId())) preferred_material_name = None if old_material: preferred_material_name = old_material.getName() - - self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id) + preferred_material_id = self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id + self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") @@ -871,7 +879,20 @@ class MachineManager(QObject): setting_info["stack"].sendPostponedEmits() if not has_user_interaction: - self.activeQualityChanged.emit() + self.activeQualityChanged.emit() + + ## Used to update material and variant in the active container stack with a delay. + # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) + # before the user decided to keep or discard any of their changes using the dialog. + # The activeQualityChanged signal triggers this method. + def _executeDelayedActiveContainerStackChanges(self): + if self._new_material_container is not None: + self._active_container_stack.material = self._new_material_container + self._new_material_container = None + + if self._new_variant_container is not None: + self._active_container_stack.variant = self._new_variant_container + self._new_variant_container = None ## Determine the quality and quality changes settings for the current machine for a quality name. # From e63616ca419ca30a613a9f9d9840f3a55ac6b350 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 11:43:15 +0200 Subject: [PATCH 09/21] Update method description - CURA-4447 --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d32e7dcb4d..a4dd311bb4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -884,7 +884,7 @@ class MachineManager(QObject): ## Used to update material and variant in the active container stack with a delay. # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) # before the user decided to keep or discard any of their changes using the dialog. - # The activeQualityChanged signal triggers this method. + # The Application.onDiscardOrKeepProfileChangesClosed signal triggers this method. def _executeDelayedActiveContainerStackChanges(self): if self._new_material_container is not None: self._active_container_stack.material = self._new_material_container From 4cfd0de580120bc67250462ce37bf6bba43025b9 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 23 Oct 2017 14:20:10 +0200 Subject: [PATCH 10/21] CURA-4248 hide settings in UI for Surface Energy and Adhesion Tendency --- resources/definitions/fdmprinter.def.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e953d18865..826449afd9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1872,6 +1872,7 @@ "default_value": 10, "minimum_value": "0", "maximum_value": "10", + "enabled": false, "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1884,6 +1885,7 @@ "default_value": 100, "minimum_value": "0", "maximum_value": "100", + "enabled": false, "settable_per_mesh": false, "settable_per_extruder": true }, From d2ef373d19ae874bb6fbebf4a621ccf3c5f0db88 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 15:50:42 +0200 Subject: [PATCH 11/21] Also apply container changes when no user interaction is required - CURA-4447 --- cura/Settings/MachineManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a4dd311bb4..efc9515ef1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -879,6 +879,7 @@ class MachineManager(QObject): setting_info["stack"].sendPostponedEmits() if not has_user_interaction: + self._executeDelayedActiveContainerStackChanges() self.activeQualityChanged.emit() ## Used to update material and variant in the active container stack with a delay. From d8e1b5b9b40146b2d7c0c903c45c0a4393d87e8a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 24 Oct 2017 11:25:12 +0200 Subject: [PATCH 12/21] CURA-4481 add setting Remove Empty First Layers --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 1 + resources/definitions/fdmprinter.def.json | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index c9fac23d91..a352564bc2 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -240,3 +240,4 @@ class ProcessSlicedLayersJob(Job): else: if self._progress_message: self._progress_message.hide() + diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 826449afd9..baae3f7579 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3956,6 +3956,15 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true + }, + "remove_empty_first_layers": + { + "label": "Remove Empty First Layers", + "description": "Remove empty layers beneath the first printed layer if they are present.", + "type": "bool", + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": false } } }, From c1139c5c45b2a6e9b169af6cc17a580978445abc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 24 Oct 2017 13:38:14 +0200 Subject: [PATCH 13/21] Update stack error checking when switching matchines - CURA-4447 --- cura/Settings/MachineManager.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index efc9515ef1..fc5c415f87 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -341,6 +341,7 @@ class MachineManager(QObject): self.activeQualityChanged.emit() self.activeVariantChanged.emit() self.activeMaterialChanged.emit() + self._updateStacksHaveErrors() # Prevents unwanted re-slices after changing machine self._error_check_timer.start() def _onInstanceContainersChanged(self, container): @@ -357,6 +358,8 @@ class MachineManager(QObject): @pyqtSlot(str) def setActiveMachine(self, stack_id: str) -> None: self.blurSettings.emit() # Ensure no-one has focus. + self._cancelDelayedActiveContainerStackChanges() + containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) @@ -895,6 +898,12 @@ class MachineManager(QObject): self._active_container_stack.variant = self._new_variant_container self._new_variant_container = None + ## Cancel set changes for material and variant in the active container stack. + # Used for ignoring any changes when switching between printers (setActiveMachine) + def _cancelDelayedActiveContainerStackChanges(self): + self._new_material_container = None + self._new_variant_container = None + ## Determine the quality and quality changes settings for the current machine for a quality name. # # \param quality_name \type{str} the name of the quality. From 6dfd04928f764f6a4bd23501b32f579d3bc8d271 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 24 Oct 2017 14:51:35 +0200 Subject: [PATCH 14/21] CURA-4485 Activate configuration option disabled in printers within a cluster. Just allow when there is a cluster with just one printer. --- .../NetworkClusterPrinterOutputDevice.py | 4 +++- plugins/UM3NetworkPrinting/UM3InfoComponents.qml | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index cfa793996b..e482cbd4e3 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -220,7 +220,9 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self.setPrinters(json_data) def materialHotendChangedMessage(self, callback): - pass # Do nothing. + # When there is just one printer, the activate configuration option is enabled + if (self._cluster_size == 1): + super().materialHotendChangedMessage(callback = callback) def _startCameraStream(self): ## Request new image diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index 2c3902dcff..87b8b219b7 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -115,8 +115,16 @@ Item { tooltip: catalog.i18nc("@info:tooltip", "Load the configuration of the printer into Cura") text: catalog.i18nc("@action:button", "Activate Configuration") - visible: printerConnected + visible: printerConnected && !isClusterPrinter() onClicked: manager.loadConfigurationFromPrinter() + + function isClusterPrinter() { + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize + // This is a non cluster printer or the cluster it is just one printer + if (typeof clusterSize == "undefined" || clusterSize == 1) + return false + return true + } } } From a66d27e30e558395028fb032c86391b18a9410dc Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 24 Oct 2017 15:01:57 +0200 Subject: [PATCH 15/21] CURA-4176 reintroduced Wall Extruder. Added limit_to_extruder trick in wall_line_width as suggested in issue to evade inheritance problems. --- resources/definitions/fdmprinter.def.json | 49 +++++++++++++++-------- resources/definitions/ultimaker3.def.json | 2 +- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index baae3f7579..0ce59b942d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -682,6 +682,7 @@ "value": "line_width", "default_value": 0.4, "type": "float", + "limit_to_extruder": "wall_0_extruder_nr if wall_x_extruder_nr == wall_0_extruder_nr else -1", "settable_per_mesh": true, "children": { @@ -880,29 +881,45 @@ "type": "category", "children": { - "wall_0_extruder_nr": + "wall_extruder_nr": { - "label": "Outer Wall Extruder", - "description": "The extruder train used for printing the outer wall. This is used in multi-extrusion.", + "label": "Wall Extruder", + "description": "The extruder train used for printing the walls. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": true, "settable_globally": true, - "enabled": "machine_extruder_count > 1" - }, - "wall_x_extruder_nr": - { - "label": "Inner Walls Extruder", - "description": "The extruder train used for printing the inner walls. This is used in multi-extrusion.", - "type": "optional_extruder", - "default_value": "-1", - "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true, - "enabled": "machine_extruder_count > 1" + "enabled": "machine_extruder_count > 1", + "children": { + "wall_0_extruder_nr": + { + "label": "Outer Wall Extruder", + "description": "The extruder train used for printing the outer wall. This is used in multi-extrusion.", + "type": "optional_extruder", + "value": "wall_extruder_nr", + "default_value": "-1", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, + "enabled": "machine_extruder_count > 1" + }, + "wall_x_extruder_nr": + { + "label": "Inner Wall Extruder", + "description": "The extruder train used for printing the inner walls. This is used in multi-extrusion.", + "type": "optional_extruder", + "value": "wall_extruder_nr", + "default_value": "-1", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, + "enabled": "machine_extruder_count > 1" + } + } }, "wall_thickness": { diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 21f80e18fd..05e39e365c 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -150,7 +150,7 @@ "top_bottom_thickness": { "value": "1" }, "travel_avoid_distance": { "value": "3" }, "wall_0_inset": { "value": "0" }, - "wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" }, + "wall_line_width_x": { "value": "round(wall_line_width * 0.3 / 0.35, 2)" }, "wall_thickness": { "value": "1" } } } From 0eedfa5c1816b79d41a326a069af19f8b875fb9d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 24 Oct 2017 15:45:20 +0200 Subject: [PATCH 16/21] CURA-4485 Disabling automatic material and variant when connecting to a printer within a cluster of more than 1 printer. --- resources/qml/Menus/MaterialMenu.qml | 12 ++++++++++-- resources/qml/Menus/NozzleMenu.qml | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 1688bc228a..5422457140 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -14,6 +14,14 @@ Menu property int extruderIndex: 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool isClusterPrinter: + { + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize + // This is a non cluster printer or the cluster it is just one printer + if (typeof clusterSize == "undefined" || clusterSize == 1) + return false + return true + } UM.SettingPropertyProvider { @@ -29,14 +37,14 @@ Menu id: automaticMaterial text: { - if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex) + if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex && !isClusterPrinter) { var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex]; return catalog.i18nc("@title:menuitem %1 is the automatically selected material", "Automatic: %1").arg(materialName); } return ""; } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex && !isClusterPrinter onTriggered: { var materialId = Cura.MachineManager.printerOutputDevices[0].materialIds[extruderIndex]; diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index b51b3b1907..79bc105b58 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -14,20 +14,28 @@ Menu property int extruderIndex: 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool isClusterPrinter: + { + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize + // This is a non cluster printer or the cluster it is just one printer + if (typeof clusterSize == "undefined" || clusterSize == 1) + return false + return true + } MenuItem { id: automaticNozzle text: { - if(printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex) + if(printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter) { var nozzleName = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; return catalog.i18nc("@title:menuitem %1 is the nozzle currently loaded in the printer", "Automatic: %1").arg(nozzleName); } return ""; } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter onTriggered: { var activeExtruderIndex = ExtruderManager.activeExtruderIndex; From 7404df66ac30e61aa291cc3ac5e74165a656ac0b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 24 Oct 2017 16:46:45 +0200 Subject: [PATCH 17/21] CURA-4481 Disable "Remove empty layers" when support is enabled. When support is enabled then it doesn't matter if the user choose whether to remove or not the empty layers, because it's done after generating supports. In order to avoid confusion to the user, the setting is disabled. --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0ce59b942d..22bbe93b3f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3980,6 +3980,7 @@ "description": "Remove empty layers beneath the first printed layer if they are present.", "type": "bool", "default_value": true, + "enabled": "not support_enable", "settable_per_mesh": false, "settable_per_extruder": false } From 9ad0fd2b83ad2cd0637c935204cc8c99b4b3f088 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 25 Oct 2017 11:28:41 +0200 Subject: [PATCH 18/21] Remove dash if plug-in author is empty Contributes to issue CURA-4477. --- plugins/PluginBrowser/PluginBrowser.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 71e88c652b..13000d23ad 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -114,7 +114,7 @@ UM.Dialog anchors.rightMargin: UM.Theme.getSize("default_margin").width Label { - text: "" + model.name + " - " + model.author + text: "" + model.name + "" + ((model.author !== "") ? (" - " + model.author) : "") width: contentWidth height: contentHeight + UM.Theme.getSize("default_margin").height verticalAlignment: Text.AlignVCenter From 73e809b956ce79629cc70d47c94a4e8d3b14ee63 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 25 Oct 2017 13:20:05 +0200 Subject: [PATCH 19/21] Remove specialised start g-code from Creality CR-10 By request from Michael. This makes it the same as the start g-code for the Custom FDM Printer, which apparently works better. --- resources/definitions/creality_cr10.def.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/definitions/creality_cr10.def.json b/resources/definitions/creality_cr10.def.json index ced6f32b7b..bacae6e2e5 100644 --- a/resources/definitions/creality_cr10.def.json +++ b/resources/definitions/creality_cr10.def.json @@ -59,9 +59,6 @@ "skirt_gap": { "default_value": 5 }, - "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute Positioning\nG28 ; home all axes\nG1 Z5 F3000 ; lift\nG1 X20 Y2 F1500 ; avoid binder clips\nG1 Z0.2 F3000 ; get ready to prime\nG92 E0 ; reset extrusion distance\nG1 X120 E10 F600 ; prime nozzle\nG1 X150 F5000 ; quick wipe" - }, "machine_end_gcode": { "default_value": "G91\nG1 F1800 E-3\nG1 F3000 Z10\nG90\nG28 X0 Y0 ; home x and y axis\nM106 S0 ; turn off cooling fan\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors" }, From 87ba4056ee86682d78c31e4edacb7cdfd4bc710a Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 25 Oct 2017 13:55:30 +0200 Subject: [PATCH 20/21] CURA-4485 Minor changes --- plugins/UM3NetworkPrinting/UM3InfoComponents.qml | 2 +- resources/qml/Menus/MaterialMenu.qml | 2 +- resources/qml/Menus/NozzleMenu.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index 87b8b219b7..8d0d8a0754 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -121,7 +121,7 @@ Item function isClusterPrinter() { var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) + if (clusterSize == undefined || clusterSize == 1) return false return true } diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 5422457140..359f4f41d0 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -18,7 +18,7 @@ Menu { var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) + if (clusterSize == undefined || clusterSize == 1) return false return true } diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index 79bc105b58..1c75a346f3 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -18,7 +18,7 @@ Menu { var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) + if (clusterSize == undefined || clusterSize == 1) return false return true } From e4fec1f63d0406221422bc191d6043db1d16fb68 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 25 Oct 2017 16:34:41 +0200 Subject: [PATCH 21/21] Move SaveButton downwards CURA-4490 Move SaveButton downwards so it doesn't overlay with the estimated print time in some language. --- resources/qml/SaveButton.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 7423fc2368..acc97ebf11 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -91,8 +91,8 @@ Item { id: saveRow width: base.width height: saveToButton.height - anchors.top: progressBar.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height anchors.left: parent.left Row {