From d34d398e9660060233024d338823567bd04a1444 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 18:40:42 +0200 Subject: [PATCH 1/4] Change the implementation of creating a profile from the current settings The newly created profile now combines the settings of the active quality profile and the current settings CURA-970, CURA-1585 --- cura/MachineManagerModel.py | 34 +++++----------------- resources/qml/Actions.qml | 2 +- resources/qml/Cura.qml | 2 +- resources/qml/Preferences/ProfilesPage.qml | 4 +-- 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e9a07f58f7..6768a357a5 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -269,38 +269,18 @@ class MachineManagerModel(QObject): return containers[0].isReadOnly() @pyqtSlot(result = str) - def convertUserContainerToQuality(self): - if not self._global_container_stack: + def newQualityContainerFromQualityAndUser(self): + new_container_id = self.duplicateContainer(self.activeQualityId) + if new_container_id == "": return + self.setActiveQuality(new_container_id) + self.updateQualityContainerFromUserContainer() - new_quality_container = InstanceContainer("") - name = self._createUniqueName("quality", "", self.activeQualityName, catalog.i18nc("@label", "Custom profile")) - user_settings = self._global_container_stack.getTop() - - ## Copy all values - new_quality_container.deserialize(user_settings.serialize()) - - ## If the currently active machine does not have quality profiles of its own, - # make the new quality profile available for all machines that don't have - # unique quality profiles (including the current machine) - if not self.filterQualityByMachine: - new_quality_container.setDefinition(UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) - - ## Change type / id / name - new_quality_container.setMetaDataEntry("type", "quality") - new_quality_container.setReadOnly(False) - new_quality_container.setName(name) - new_quality_container._id = name - - UM.Settings.ContainerRegistry.getInstance().addContainer(new_quality_container) - self.clearUserSettings() # As all users settings are now transfered to the new quality profile, remove them. - self.setActiveQuality(name) - return name @pyqtSlot(str, result=str) def duplicateContainer(self, container_id): if not self._global_container_stack: - return + return "" containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=container_id) if containers: new_name = self._createUniqueName("quality", "", containers[0].getName(), catalog.i18nc("@label", "Custom profile")) @@ -348,7 +328,7 @@ class MachineManagerModel(QObject): @pyqtSlot() - def updateUserContainerToQuality(self): + def updateQualityContainerFromUserContainer(self): if not self._global_container_stack: return user_settings = self._global_container_stack.getTop() diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index e09b6b5424..3ef40644d2 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -112,7 +112,7 @@ Item id: updateProfileAction; enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); - onTriggered: Cura.MachineManager.updateUserContainerToQuality() + onTriggered: Cura.MachineManager.updateQualityContainerFromUserContainer() } Action diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index a1023d8ef2..547f05d056 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -582,7 +582,7 @@ UM.MainWindow target: Cura.Actions.addProfile onTriggered: { - Cura.MachineManager.convertUserContainerToQuality(); + Cura.MachineManager.newQualityContainerFromQualityAndUser(); preferences.setPage(5); preferences.show(); diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index cd37df3cc5..71afdd98ac 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -65,7 +65,7 @@ UM.ManagementPage onAddObject: { var selectedContainer; if (objectList.currentItem.id == Cura.MachineManager.activeQualityId) { - selectedContainer = Cura.MachineManager.convertUserContainerToQuality(); + selectedContainer = Cura.MachineManager.newQualityContainerFromQualityAndUser(); } else { selectedContainer = Cura.MachineManager.duplicateContainer(base.currentItem.id); } @@ -121,7 +121,7 @@ UM.ManagementPage return catalog.i18nc("@action:button", "Update \"%1\"".arg(profileName)); } enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) - onClicked: Cura.MachineManager.updateUserContainerToQuality() + onClicked: Cura.MachineManager.updateQualityContainerFromUserContainer() } Button From f5f711b7dc38270860d2c54e3403fc647aae716c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 18:59:28 +0200 Subject: [PATCH 2/4] On extruder switch create OverrideDecorator if needed The SettingOverrideDecorator is only applied if the node has a per-object setting. Now it also creates a decorator also if you've ever switched the extruder, which was needed because the decorator contains the information which extruder to print with. Contributes to issue CURA-340. --- plugins/PerObjectSettingsTool/PerObjectSettingsTool.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 255277c3af..395dbdc594 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -5,7 +5,7 @@ from UM.Tool import Tool from UM.Scene.Selection import Selection from UM.Application import Application from UM.Preferences import Preferences - +from cura.SettingOverrideDecorator import SettingOverrideDecorator ## This tool allows the user to add & change settings per node in the scene. # The settings per object are kept in a ContainerStack, which is linked to a node by decorator. @@ -55,6 +55,9 @@ class PerObjectSettingsTool(Tool): # selected object with. def setSelectedActiveExtruder(self, extruder_stack_id): selected_object = Selection.getSelectedObject(0) + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + selected_object.addDecorator(SettingOverrideDecorator()) selected_object.callDecoration("setActiveExtruder", extruder_stack_id) def _onPreferenceChanged(self, preference): From 9e86cd5c85312d54d120a0d769560ae833055443 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 19:03:41 +0200 Subject: [PATCH 3/4] Fix call to findContainerStack[s] Was a typo. Now it also checks if the stack ID is correct here. Not because it went wrong, but for defensive programming. Contributes to issue CURA-340. --- cura/SettingOverrideDecorator.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py index 23730fee60..7417e47bf2 100644 --- a/cura/SettingOverrideDecorator.py +++ b/cura/SettingOverrideDecorator.py @@ -8,6 +8,7 @@ from UM.Signal import Signal, signalemitter from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry +import UM.Logger from UM.Application import Application @@ -58,7 +59,11 @@ class SettingOverrideDecorator(SceneNodeDecorator): # kept up to date. def _updateNextStack(self): if self._extruder_stack: - self._stack.setNextStack(ContainerRegistry.getInstance().findContainerStack(id = self._extruder_stack)) + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_stack) + if extruder_stack: + self._stack.setNextStack(extruder_stack) + else: + UM.Logger.log("e", "Extruder stack %s below per-object settings does not exist.", self._extruder_stack) else: self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) From 598ff1e398d662f2f4570417d1893f071f7bd31b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 19:05:52 +0200 Subject: [PATCH 4/4] Fix changing active extruder from per-object drop-down Apparently this is the way you do it. Contributes to issue CURA-340. --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 03158266f5..502e903416 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -101,7 +101,7 @@ Item { } } - onActivated: UM.ActiveTool.properties.setValue("SelectedActiveExtruder", extruders_model.getItem(index).id); + onActivated: UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(index).id); onModelChanged: updateCurrentIndex(); function updateCurrentIndex()