Merge branch 'refactoring_machine_manager' of github.com:Ultimaker/Cura into refactoring_machine_manager

This commit is contained in:
Jack Ha 2018-02-20 11:36:59 +01:00
commit a2f3cdc0be
6 changed files with 43 additions and 35 deletions

View file

@ -1,16 +1,17 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM.Logger import Logger
from typing import Optional
from UM.Logger import Logger
from UM.Settings.Interfaces import DefinitionContainerInterface
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Util import parseBool
from cura.Machines.VariantManager import VariantType
from .GlobalStack import GlobalStack
from .ExtruderStack import ExtruderStack
from typing import Optional
## Contains helper functions to create new machines.
@ -37,18 +38,32 @@ class CuraStackBuilder:
machine_definition = definitions[0]
# get variant container for the global stack
global_variant_container = application.empty_variant_container
if parseBool(machine_definition.getMetaDataEntry("has_variant_buildplates", False)):
global_variant_name = machine_definition.getMetaDataEntry("preferred_variant_buildplate_name")
if global_variant_name:
variant_node = variant_manager.getVariantNode(definition_id, global_variant_name,
variant_type = VariantType.BUILD_PLATE)
if variant_node is None:
raise RuntimeError("Cannot find buildplate variant with definition [%s] and variant name [%s]" %
(definition_id, global_variant_name))
global_variant_container = variant_node.getContainer()
# get variant container for extruders
variant_container = application.empty_variant_container
extruder_variant_container = application.empty_variant_container
# Only look for the preferred variant if this machine has variants
variant_name = None
extruder_variant_name = None
if parseBool(machine_definition.getMetaDataEntry("has_variants", False)):
variant_name = machine_definition.getMetaDataEntry("preferred_variant_name")
if variant_name:
variant_node = variant_manager.getVariantNode(definition_id, variant_name)
extruder_variant_name = machine_definition.getMetaDataEntry("preferred_variant_name")
if extruder_variant_name:
variant_node = variant_manager.getVariantNode(definition_id, extruder_variant_name)
# Sanity check. If you see this error, the related definition files should be fixed.
if variant_node is None:
raise RuntimeError("Cannot find variant with definition [%s] and variant name [%s]" % (definition_id, variant_name))
variant_container = variant_node.getContainer()
raise RuntimeError("Cannot find extruder variant with definition [%s] and variant name [%s]" %
(definition_id, extruder_variant_name))
extruder_variant_container = variant_node.getContainer()
# get material container for extruders
material_container = application.empty_material_container
@ -58,11 +73,11 @@ class CuraStackBuilder:
approximate_material_diameter = str(round(material_diameter))
root_material_id = machine_definition.getMetaDataEntry("preferred_material")
root_material_id = material_manager.getRootMaterialIDForDiameter(root_material_id, approximate_material_diameter)
material_node = material_manager.getMaterialNode(definition_id, variant_name, material_diameter, root_material_id)
material_node = material_manager.getMaterialNode(definition_id, extruder_variant_name, material_diameter, root_material_id)
# Sanity check. If you see this error, the related definition files should be fixed.
if not material_node:
raise RuntimeError("Cannot find material with definition [%s], variant_name [%s], and root_material_id [%s]" %
(definition_id, variant_name, root_material_id))
raise RuntimeError("Cannot find material with definition [%s], extruder_variant_name [%s], and root_material_id [%s]" %
(definition_id, extruder_variant_name, root_material_id))
material_container = material_node.getContainer()
generated_name = registry.createUniqueName("machine", "", name, machine_definition.getName())
@ -75,7 +90,7 @@ class CuraStackBuilder:
new_global_stack = cls.createGlobalStack(
new_stack_id = generated_name,
definition = machine_definition,
variant_container = application.empty_variant_container, # TODO: fix for build plate
variant_container = global_variant_container,
material_container = application.empty_material_container,
quality_container = application.empty_quality_container,
)
@ -99,9 +114,10 @@ class CuraStackBuilder:
extruder_definition = extruder_definition,
machine_definition_id = definition_id,
position = position,
variant_container = variant_container,
variant_container = extruder_variant_container,
material_container = material_container,
quality_container = application.empty_quality_container,
global_stack = new_global_stack,
)
new_extruder.setNextStack(new_global_stack)
new_global_stack.addExtruder(new_extruder)
@ -133,11 +149,11 @@ class CuraStackBuilder:
@classmethod
def createExtruderStack(cls, new_stack_id: str, extruder_definition: DefinitionContainerInterface, machine_definition_id: str,
position: int,
variant_container, material_container, quality_container) -> ExtruderStack:
variant_container, material_container, quality_container, global_stack) -> ExtruderStack:
from cura.CuraApplication import CuraApplication
application = CuraApplication.getInstance()
stack = ExtruderStack(new_stack_id)
stack = ExtruderStack(new_stack_id, parent = global_stack)
stack.setName(extruder_definition.getName())
stack.setDefinition(extruder_definition)

View file

@ -36,22 +36,15 @@ class ExtruderManager(QObject):
self._global_container_stack_definition_id = None
self._addCurrentMachineExtruders()
Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged)
#Application.getInstance().globalContainerStackChanged.connect(self._globalContainerStackChanged)
Selection.selectionChanged.connect(self.resetSelectedObjectExtruders)
## Signal to notify other components when the list of extruders for a machine definition changes.
extrudersChanged = pyqtSignal(QVariant)
## Signal to notify other components when the global container stack is switched to a definition
# that has different extruders than the previous global container stack
globalContainerStackDefinitionChanged = pyqtSignal()
## Notify when the user switches the currently active extruder.
activeExtruderChanged = pyqtSignal()
## The signal notifies subscribers if extruders are added
extrudersAdded = pyqtSignal()
## Gets the unique identifier of the currently active extruder stack.
#
# The currently active extruder stack is the stack that is currently being
@ -371,11 +364,10 @@ class ExtruderManager(QObject):
return result[:machine_extruder_count]
def __globalContainerStackChanged(self) -> None:
def _globalContainerStackChanged(self) -> None:
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack and global_container_stack.getBottom() and global_container_stack.getBottom().getId() != self._global_container_stack_definition_id:
self._global_container_stack_definition_id = global_container_stack.getBottom().getId()
self.globalContainerStackDefinitionChanged.emit()
# If the global container changed, the machine changed and might have extruders that were not registered yet
self._addCurrentMachineExtruders()
@ -415,7 +407,6 @@ class ExtruderManager(QObject):
if extruders_changed:
self.extrudersChanged.emit(global_stack_id)
self.extrudersAdded.emit()
self.setActiveExtruderIndex(0)
## Get all extruder values for a certain setting.

View file

@ -3,7 +3,6 @@
from typing import Any, TYPE_CHECKING, Optional
from UM.Application import Application
from UM.Decorators import override
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
from UM.Settings.ContainerStack import ContainerStack
@ -34,7 +33,7 @@ class ExtruderStack(CuraContainerStack):
#
# This will set the next stack and ensure that we register this stack as an extruder.
@override(ContainerStack)
def setNextStack(self, stack: ContainerStack) -> None:
def setNextStack(self, stack: CuraContainerStack) -> None:
super().setNextStack(stack)
stack.addExtruder(self)
self.addMetaDataEntry("machine", stack.id)

View file

@ -283,6 +283,7 @@ class MachineManager(QObject):
containers = container_registry.findContainerStacks(id = stack_id)
if containers:
Application.getInstance().setGlobalContainerStack(containers[0])
ExtruderManager.getInstance()._globalContainerStackChanged()
self.__emitChangedSignals()
@ -877,9 +878,10 @@ class MachineManager(QObject):
@pyqtSlot(int, result = QObject)
def getExtruder(self, position: int):
extruder = None
if self._global_container_stack:
return self._global_container_stack.extruders.get(str(position))
return None
extruder = self._global_container_stack.extruders.get(str(position))
return extruder
def _onMachineNameChanged(self):
self.globalContainerChanged.emit()

View file

@ -88,7 +88,6 @@ class CuraEngineBackend(QObject, Backend):
#
self._global_container_stack = None
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged)
Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged)
self._onGlobalStackChanged()
Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished)

View file

@ -13,7 +13,8 @@ Menu
title: "Nozzle"
property int extruderIndex: 0
property var extruderStack: Cura.MachineManager.getExtruder(menu.extruderIndex)
property QtObject extruderStack: Cura.MachineManager.getExtruder(menu.extruderIndex)
property bool hasExtruderStack: extruderStack != null
Cura.NozzleModel
{
@ -24,7 +25,7 @@ Menu
{
target: Cura.MachineManager
onGlobalContainerChanged: {
menu.extruderStack = Cura.MachineManager.getExtruder(extruderIndex);
menu.extruderStack = Cura.MachineManager.getExtruder(menu.extruderIndex);
}
}
@ -36,7 +37,7 @@ Menu
{
text: model.hotend_name
checkable: true
checked: extruderStack.variant.name == model.hotend_name
checked: menu.hasExtruderStack && extruderStack.variant.name == model.hotend_name
exclusiveGroup: group
onTriggered: {
Cura.MachineManager.setVariantGroup(extruderIndex, model.container_node);