From 642ea6791bcb25fccc9feec19531703326c477c1 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 13 Jul 2016 09:27:48 +0200 Subject: [PATCH 1/2] When saving the quality profile data, also incorporate any user settings/changes. Contributes to CURA-1727 GCode Profile reading/writing: Broken and needs update --- cura/CuraApplication.py | 9 +++++++-- cura/Settings/MachineManager.py | 2 +- plugins/GCodeWriter/GCodeWriter.py | 22 ++++++++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c96bea352b..850657c33f 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -126,6 +126,7 @@ class CuraApplication(QtApplication): ) self._machine_action_manager = MachineActionManager.MachineActionManager() + self._machine_manager = None # This is initialized on demand. super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) @@ -399,8 +400,7 @@ class CuraApplication(QtApplication): # Initialise extruder so as to listen to global container stack changes before the first global container stack is set. cura.Settings.ExtruderManager.getInstance() - qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", - cura.Settings.MachineManager.createMachineManager) + qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) @@ -419,6 +419,11 @@ class CuraApplication(QtApplication): self.exec_() + def getMachineManager(self, *args): + if self._machine_manager is None: + self._machine_manager = cura.Settings.MachineManager.createMachineManager() + return self._machine_manager + ## Get the machine action manager # We ignore any *args given to this, as we also register the machine manager as qml singleton. # It wants to give this function an engine and script engine, but we don't care about that. diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0a3e1fbaab..1d353729b1 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -692,7 +692,7 @@ class MachineManager(QObject): return containers[0].getBottom().getId() @staticmethod - def createMachineManager(engine, script_engine): + def createMachineManager(engine=None, script_engine=None): return MachineManager() def _updateVariantContainer(self, definition): diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ea21e33109..25d0a10c62 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -4,7 +4,9 @@ from UM.Mesh.MeshWriter import MeshWriter from UM.Logger import Logger from UM.Application import Application +import UM.Settings.ContainerRegistry +from cura.CuraApplication import CuraApplication from cura.Settings.ExtruderManager import ExtruderManager import re #For escaping characters in the settings. @@ -72,14 +74,30 @@ class GCodeWriter(MeshWriter): prefix_length = len(prefix) container_with_profile = stack.findContainer({"type": "quality"}) - serialized = container_with_profile.serialize() + machine_manager = CuraApplication.getInstance().getMachineManager() + + # Duplicate the current quality profile and update it with any user settings. + flat_quality_id = machine_manager.duplicateContainer(container_with_profile.getId()) + flat_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = flat_quality_id)[0] + user_settings = stack.getTop() + for key in user_settings.getAllKeys(): + flat_quality.setProperty(key, "value", user_settings.getProperty(key, "value")) + + serialized = flat_quality.serialize() data = {"global_quality": serialized} manager = ExtruderManager.getInstance() for extruder in manager.getMachineExtruders(stack.getBottom().getId()): extruder_quality = extruder.findContainer({"type": "quality"}) - extruder_serialized = extruder_quality.serialize() + + flat_extruder_quality_id = machine_manager.duplicateContainer(extruder_quality.getId()) + flat_extruder_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=flat_extruder_quality_id)[0] + extruder_user_settings = extruder.getTop() + for key in extruder_user_settings.getAllKeys(): + flat_extruder_quality.setProperty(key, "value", extruder_user_settings.getProperty(key, "value")) + + extruder_serialized = flat_extruder_quality.serialize() data.setdefault("extruder_quality", []).append(extruder_serialized) json_string = json.dumps(data) From b0137016f7baccc9d2956620f133e9788cb02e22 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 13 Jul 2016 09:46:23 +0200 Subject: [PATCH 2/2] Fixed formating of documentation CURA-1898 --- cura/Settings/ExtruderManager.py | 45 +++++++++++++++----------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 132608693f..dfc43f54b7 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -95,21 +95,21 @@ class ExtruderManager(QObject): container_registry = UM.Settings.ContainerRegistry.getInstance() if container_registry: - #Add the extruder trains that don't exist yet. + # Add the extruder trains that don't exist yet. for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition.getId()): position = extruder_definition.getMetaDataEntry("position", None) if not position: UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) - if not container_registry.findContainerStacks(machine = machine_id, position = position): #Doesn't exist yet. + if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. self.createExtruderTrain(extruder_definition, machine_definition, position) changed = True - #Gets the extruder trains that we just created as well as any that still existed. + # Gets the extruder trains that we just created as well as any that still existed. extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId()) for extruder_train in extruder_trains: self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train - #Ensure that the extruder train stacks are linked to global stack. + # Ensure that the extruder train stacks are linked to global stack. extruder_train.setNextStack(UM.Application.getInstance().getGlobalContainerStack()) changed = True @@ -124,30 +124,27 @@ class ExtruderManager(QObject): # # The resulting container stack is added to the registry. # - # \param extruder_definition The extruder to create the extruder train - # for. - # \param machine_definition The machine that the extruder train belongs - # to. - # \param position The position of this extruder train in the extruder - # slots of the machine. + # \param extruder_definition The extruder to create the extruder train for. + # \param machine_definition The machine that the extruder train belongs to. + # \param position The position of this extruder train in the extruder slots of the machine. def createExtruderTrain(self, extruder_definition, machine_definition, position): - #Cache some things. + # Cache some things. container_registry = UM.Settings.ContainerRegistry.getInstance() machine_id = machine_definition.getId() - #Create a container stack for this extruder. + # Create a container stack for this extruder. extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) container_stack = UM.Settings.ContainerStack(extruder_stack_id) - container_stack.setName(extruder_definition.getName()) #Take over the display name to display the stack with. + container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with. container_stack.addMetaDataEntry("type", "extruder_train") container_stack.addMetaDataEntry("machine", machine_definition.getId()) container_stack.addMetaDataEntry("position", position) container_stack.addContainer(extruder_definition) - #Find the variant to use for this extruder. + # Find the variant to use for this extruder. variant = container_registry.getEmptyInstanceContainer() if machine_definition.getMetaDataEntry("has_variants"): - #First add any variant. Later, overwrite with preference if the preference is valid. + # First add any variant. Later, overwrite with preference if the preference is valid. variants = container_registry.findInstanceContainers(definition = machine_id, type = "variant") if len(variants) >= 1: variant = variants[0] @@ -158,13 +155,13 @@ class ExtruderManager(QObject): variant = preferred_variants[0] else: UM.Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id) - #And leave it at the default variant. + # And leave it at the default variant. container_stack.addContainer(variant) - #Find a material to use for this variant. + # Find a material to use for this variant. material = container_registry.getEmptyInstanceContainer() if machine_definition.getMetaDataEntry("has_materials"): - #First add any material. Later, overwrite with preference if the preference is valid. + # First add any material. Later, overwrite with preference if the preference is valid. if machine_definition.getMetaDataEntry("has_variant_materials", default = "False") == "True": materials = container_registry.findInstanceContainers(type = "material", definition = machine_id, variant = variant.getId()) else: @@ -187,13 +184,13 @@ class ExtruderManager(QObject): material = preferred_materials[0] else: UM.Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) - #And leave it at the default material. + # And leave it at the default material. container_stack.addContainer(material) - #Find a quality to use for this extruder. + # Find a quality to use for this extruder. quality = container_registry.getEmptyInstanceContainer() - #First add any quality. Later, overwrite with preference if the preference is valid. + # First add any quality. Later, overwrite with preference if the preference is valid. qualities = container_registry.findInstanceContainers(type = "quality") if len(qualities) >= 1: quality = qualities[0] @@ -204,14 +201,14 @@ class ExtruderManager(QObject): quality = preferred_quality[0] else: UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality_id, machine_id) - #And leave it at the default quality. + # And leave it at the default quality. container_stack.addContainer(quality) user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) - if user_profile: #There was already a user profile, loaded from settings. + if user_profile: # There was already a user profile, loaded from settings. user_profile = user_profile[0] else: - user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings") #Add an empty user profile. + user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile. user_profile.addMetaDataEntry("type", "user") user_profile.addMetaDataEntry("extruder", extruder_stack_id) user_profile.setDefinition(machine_definition)