This commit is contained in:
fieldOfView 2016-07-13 11:19:05 +02:00
commit 7eee1efa14
4 changed files with 50 additions and 30 deletions

View File

@ -126,6 +126,7 @@ class CuraApplication(QtApplication):
) )
self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_action_manager = MachineActionManager.MachineActionManager()
self._machine_manager = None # This is initialized on demand.
super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) 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. # Initialise extruder so as to listen to global container stack changes before the first global container stack is set.
cura.Settings.ExtruderManager.getInstance() cura.Settings.ExtruderManager.getInstance()
qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager)
cura.Settings.MachineManager.createMachineManager)
qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager)
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
@ -419,6 +419,11 @@ class CuraApplication(QtApplication):
self.exec_() 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 ## Get the machine action manager
# We ignore any *args given to this, as we also register the machine manager as qml singleton. # 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. # It wants to give this function an engine and script engine, but we don't care about that.

View File

@ -95,21 +95,21 @@ class ExtruderManager(QObject):
container_registry = UM.Settings.ContainerRegistry.getInstance() container_registry = UM.Settings.ContainerRegistry.getInstance()
if container_registry: 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()): for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition.getId()):
position = extruder_definition.getMetaDataEntry("position", None) position = extruder_definition.getMetaDataEntry("position", None)
if not position: if not position:
UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) 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) self.createExtruderTrain(extruder_definition, machine_definition, position)
changed = True 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()) extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId())
for extruder_train in extruder_trains: for extruder_train in extruder_trains:
self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train 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()) extruder_train.setNextStack(UM.Application.getInstance().getGlobalContainerStack())
changed = True changed = True
@ -124,30 +124,27 @@ class ExtruderManager(QObject):
# #
# The resulting container stack is added to the registry. # The resulting container stack is added to the registry.
# #
# \param extruder_definition The extruder to create the extruder train # \param extruder_definition The extruder to create the extruder train for.
# for. # \param machine_definition The machine that the extruder train belongs to.
# \param machine_definition The machine that the extruder train belongs # \param position The position of this extruder train in the extruder slots of the machine.
# to.
# \param position The position of this extruder train in the extruder
# slots of the machine.
def createExtruderTrain(self, extruder_definition, machine_definition, position): def createExtruderTrain(self, extruder_definition, machine_definition, position):
#Cache some things. # Cache some things.
container_registry = UM.Settings.ContainerRegistry.getInstance() container_registry = UM.Settings.ContainerRegistry.getInstance()
machine_id = machine_definition.getId() 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()) extruder_stack_id = container_registry.uniqueName(extruder_definition.getId())
container_stack = UM.Settings.ContainerStack(extruder_stack_id) 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("type", "extruder_train")
container_stack.addMetaDataEntry("machine", machine_definition.getId()) container_stack.addMetaDataEntry("machine", machine_definition.getId())
container_stack.addMetaDataEntry("position", position) container_stack.addMetaDataEntry("position", position)
container_stack.addContainer(extruder_definition) container_stack.addContainer(extruder_definition)
#Find the variant to use for this extruder. # Find the variant to use for this extruder.
variant = container_registry.findInstanceContainers(id = "empty_variant")[0] variant = container_registry.findInstanceContainers(id = "empty_variant")[0]
if machine_definition.getMetaDataEntry("has_variants"): 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") variants = container_registry.findInstanceContainers(definition = machine_id, type = "variant")
if len(variants) >= 1: if len(variants) >= 1:
variant = variants[0] variant = variants[0]
@ -158,13 +155,13 @@ class ExtruderManager(QObject):
variant = preferred_variants[0] variant = preferred_variants[0]
else: 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) 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) container_stack.addContainer(variant)
#Find a material to use for this variant. # Find a material to use for this variant.
material = container_registry.findInstanceContainers(id = "empty_material")[0] material = container_registry.findInstanceContainers(id = "empty_material")[0]
if machine_definition.getMetaDataEntry("has_materials"): 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": if machine_definition.getMetaDataEntry("has_variant_materials", default = "False") == "True":
materials = container_registry.findInstanceContainers(type = "material", definition = machine_id, variant = variant.getId()) materials = container_registry.findInstanceContainers(type = "material", definition = machine_id, variant = variant.getId())
else: else:
@ -187,13 +184,13 @@ class ExtruderManager(QObject):
material = preferred_materials[0] material = preferred_materials[0]
else: 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) 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) container_stack.addContainer(material)
#Find a quality to use for this extruder. # Find a quality to use for this extruder.
quality = container_registry.findInstanceContainers(id = "empty_quality")[0] 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") qualities = container_registry.findInstanceContainers(type = "quality")
if len(qualities) >= 1: if len(qualities) >= 1:
quality = qualities[0] quality = qualities[0]
@ -204,14 +201,14 @@ class ExtruderManager(QObject):
quality = preferred_quality[0] quality = preferred_quality[0]
else: 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) 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) container_stack.addContainer(quality)
user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) 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] user_profile = user_profile[0]
else: 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("type", "user")
user_profile.addMetaDataEntry("extruder", extruder_stack_id) user_profile.addMetaDataEntry("extruder", extruder_stack_id)
user_profile.setDefinition(machine_definition) user_profile.setDefinition(machine_definition)

View File

@ -692,7 +692,7 @@ class MachineManager(QObject):
return containers[0].getBottom().getId() return containers[0].getBottom().getId()
@staticmethod @staticmethod
def createMachineManager(engine, script_engine): def createMachineManager(engine=None, script_engine=None):
return MachineManager() return MachineManager()
def _updateVariantContainer(self, definition): def _updateVariantContainer(self, definition):

View File

@ -4,7 +4,9 @@
from UM.Mesh.MeshWriter import MeshWriter from UM.Mesh.MeshWriter import MeshWriter
from UM.Logger import Logger from UM.Logger import Logger
from UM.Application import Application from UM.Application import Application
import UM.Settings.ContainerRegistry
from cura.CuraApplication import CuraApplication
from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderManager import ExtruderManager
import re #For escaping characters in the settings. import re #For escaping characters in the settings.
@ -72,14 +74,30 @@ class GCodeWriter(MeshWriter):
prefix_length = len(prefix) prefix_length = len(prefix)
container_with_profile = stack.findContainer({"type": "quality"}) 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} data = {"global_quality": serialized}
manager = ExtruderManager.getInstance() manager = ExtruderManager.getInstance()
for extruder in manager.getMachineExtruders(stack.getBottom().getId()): for extruder in manager.getMachineExtruders(stack.getBottom().getId()):
extruder_quality = extruder.findContainer({"type": "quality"}) 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) data.setdefault("extruder_quality", []).append(extruder_serialized)
json_string = json.dumps(data) json_string = json.dumps(data)