From 14afd9eab7687a26a49d730c0aef1883b51eb570 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 21 Nov 2016 21:36:08 +0100 Subject: [PATCH] Heaps to changes to get the Cura code through the type checker (with minimal checking). CURA-2917 --- CMakeLists.txt | 2 +- cura/CuraApplication.py | 58 +++++---- cura/PrintInformation.py | 4 +- cura/Settings/ContainerManager.py | 44 +++---- cura/Settings/ExtruderManager.py | 114 +++++++++--------- cura/Settings/ExtrudersModel.py | 4 +- cura/Settings/MachineManager.py | 113 ++++++++--------- .../MaterialSettingsVisibilityHandler.py | 4 +- cura/Settings/QualitySettingsModel.py | 23 ++-- cura/Settings/__init__.py | 11 -- cura_app.py | 3 - .../CuraEngineBackend/CuraEngineBackend.py | 4 +- .../MachineSettingsAction.py | 18 +-- .../PerObjectSettingVisibilityHandler.py | 4 +- plugins/SolidView/SolidView.py | 3 +- .../VersionUpgrade21to22/Profile.py | 2 +- .../XmlMaterialProfile/XmlMaterialProfile.py | 34 +++--- 17 files changed, 228 insertions(+), 217 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40fac2ca2f..9c6c64fce1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,7 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "") endif() endif() -find_package(PythonInterp 3.4.0 REQUIRED) +find_package(PythonInterp 3.5.0 REQUIRED) install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 80bd4eb9a9..c9c72ceed7 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -42,7 +42,14 @@ from . import CuraSplashScreen from . import CameraImageProvider from . import MachineActionManager -import cura.Settings +from cura.Settings.MachineManager import MachineManager +from cura.Settings.ExtruderManager import ExtruderManager +from cura.Settings.CuraContainerRegistry import CuraContainerRegistry +from cura.Settings.ExtrudersModel import ExtrudersModel +from cura.Settings.ContainerSettingsModel import ContainerSettingsModel +from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler +from cura.Settings.QualitySettingsModel import QualitySettingsModel +from cura.Settings.ContainerManager import ContainerManager from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtGui import QColor, QIcon @@ -57,11 +64,13 @@ import urllib numpy.seterr(all="ignore") -try: - from cura.CuraVersion import CuraVersion, CuraBuildType -except ImportError: - CuraVersion = "master" # [CodeStyle: Reflecting imported value] - CuraBuildType = "" +MYPY = False +if not MYPY: + try: + from cura.CuraVersion import CuraVersion, CuraBuildType + except ImportError: + CuraVersion = "master" # [CodeStyle: Reflecting imported value] + CuraBuildType = "" class CuraApplication(QtApplication): class ResourceTypes: @@ -77,6 +86,8 @@ class CuraApplication(QtApplication): Q_ENUMS(ResourceTypes) def __init__(self): + super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) + Resources.addSearchPath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) @@ -92,8 +103,8 @@ class CuraApplication(QtApplication): SettingDefinition.addSupportedProperty("resolve", DefinitionPropertyType.Function, default = None) SettingDefinition.addSettingType("extruder", None, str, Validator) - SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) - SettingFunction.registerOperator("extruderValue", cura.Settings.ExtruderManager.getExtruderValue) + SettingFunction.registerOperator("extruderValues", ExtruderManager.getExtruderValues) + SettingFunction.registerOperator("extruderValue", ExtruderManager.getExtruderValue) ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") @@ -112,11 +123,12 @@ class CuraApplication(QtApplication): ## Initialise the version upgrade manager with Cura's storage paths. import UM.VersionUpgradeManager #Needs to be here to prevent circular dependencies. - self._version_upgrade_manager = UM.VersionUpgradeManager.VersionUpgradeManager( + + UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions( { - ("quality", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), - ("machine_stack", UM.Settings.ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), - ("preferences", UM.Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences") + ("quality", UM.Settings.InstanceContainer.InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), + ("machine_stack", UM.Settings.ContainerStack.ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), + ("preferences", Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences") } ) @@ -125,7 +137,6 @@ class CuraApplication(QtApplication): self._additional_components = {} # Components to add to certain areas in the interface - super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) @@ -267,6 +278,9 @@ class CuraApplication(QtApplication): self._recent_files.append(QUrl.fromLocalFile(f)) + def getContainerRegistry(self): + return CuraContainerRegistry.getInstance() + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -418,8 +432,8 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) # 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", self.getMachineManager) + ExtruderManager.getInstance() + qmlRegisterSingletonType(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")) @@ -440,7 +454,7 @@ class CuraApplication(QtApplication): def getMachineManager(self, *args): if self._machine_manager is None: - self._machine_manager = cura.Settings.MachineManager.createMachineManager() + self._machine_manager = MachineManager.createMachineManager() return self._machine_manager ## Get the machine action manager @@ -476,17 +490,17 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") - qmlRegisterType(cura.Settings.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") + qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") - qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") - qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") - qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") + qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") + qmlRegisterType(MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") + qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") - qmlRegisterSingletonType(cura.Settings.ContainerManager, "Cura", 1, 0, "ContainerManager", cura.Settings.ContainerManager.createContainerManager) + qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) qmlRegisterSingletonType(QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")), "Cura", 1, 0, "Actions") - engine.rootContext().setContextProperty("ExtruderManager", cura.Settings.ExtruderManager.getInstance()) + engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.getInstance()) for path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.QmlFiles): type_name = os.path.splitext(os.path.basename(path))[0] diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 096170ba22..b4be3aa924 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -7,7 +7,7 @@ from UM.Application import Application from UM.Qt.Duration import Duration from UM.Preferences import Preferences -import cura.Settings.ExtruderManager +from cura.Settings.ExtruderManager import ExtruderManager import math import os.path @@ -85,7 +85,7 @@ class PrintInformation(QObject): r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2 self._material_lengths = [] self._material_weights = [] - extruder_stacks = list(cura.Settings.ExtruderManager.getInstance().getMachineExtruders(Application.getInstance().getGlobalContainerStack().getId())) + extruder_stacks = list(ExtruderManager.getInstance().getMachineExtruders(Application.getInstance().getGlobalContainerStack().getId())) for index, amount in enumerate(material_amounts): ## Find the right extruder stack. As the list isn't sorted because it's a annoying generator, we do some # list comprehension filtering to solve this for us. diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 8957f386fc..c25a881b57 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -8,17 +8,19 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl from PyQt5.QtWidgets import QMessageBox import UM.PluginRegistry -import UM.Settings import UM.SaveFile import UM.Platform import UM.MimeTypeDatabase import UM.Logger -import cura.Settings - +from UM.Application import Application from UM.MimeTypeDatabase import MimeTypeNotFoundError +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog + +from cura.Settings.ExtruderManager import ExtruderManager + catalog = i18nCatalog("cura") ## Manager class that contains common actions to deal with containers in Cura. @@ -30,7 +32,7 @@ class ContainerManager(QObject): def __init__(self, parent = None): super().__init__(parent) - self._registry = UM.Settings.ContainerRegistry.getInstance() + self._registry = ContainerRegistry.getInstance() self._container_name_filters = {} ## Create a duplicate of the specified container @@ -246,7 +248,7 @@ class ContainerManager(QObject): @pyqtSlot(str, result = bool) def isContainerUsed(self, container_id): UM.Logger.log("d", "Checking if container %s is currently used in the active stacks", container_id) - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): if container_id in [child.getId() for child in stack.getContainers()]: UM.Logger.log("d", "The container is in use by %s", stack.getId()) return True @@ -357,12 +359,12 @@ class ContainerManager(QObject): except MimeTypeNotFoundError: return { "status": "error", "message": "Could not determine mime type of file" } - container_type = UM.Settings.ContainerRegistry.getContainerForMimeType(mime_type) + container_type = ContainerRegistry.getContainerForMimeType(mime_type) if not container_type: return { "status": "error", "message": "Could not find a container to handle the specified file."} container_id = urllib.parse.unquote_plus(mime_type.stripExtension(os.path.basename(file_url))) - container_id = UM.Settings.ContainerRegistry.getInstance().uniqueName(container_id) + container_id = ContainerRegistry.getInstance().uniqueName(container_id) container = container_type(container_id) @@ -374,7 +376,7 @@ class ContainerManager(QObject): container.setName(container_id) - UM.Settings.ContainerRegistry.getInstance().addContainer(container) + ContainerRegistry.getInstance().addContainer(container) return { "status": "success", "message": "Successfully imported container {0}".format(container.getName()) } @@ -386,13 +388,13 @@ class ContainerManager(QObject): # \return \type{bool} True if successful, False if not. @pyqtSlot(result = bool) def updateQualityChanges(self): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return False - UM.Application.getInstance().getMachineManager().blurSettings.emit() + Application.getInstance().getMachineManager().blurSettings.emit() - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): # Find the quality_changes container for this stack and merge the contents of the top container into it. quality_changes = stack.findContainer(type = "quality_changes") if not quality_changes or quality_changes.isReadOnly(): @@ -401,17 +403,17 @@ class ContainerManager(QObject): self._performMerge(quality_changes, stack.getTop()) - UM.Application.getInstance().getMachineManager().activeQualityChanged.emit() + Application.getInstance().getMachineManager().activeQualityChanged.emit() return True ## Clear the top-most (user) containers of the active stacks. @pyqtSlot() def clearUserContainers(self): - UM.Application.getInstance().getMachineManager().blurSettings.emit() + Application.getInstance().getMachineManager().blurSettings.emit() # Go through global and extruder stacks and clear their topmost container (the user settings). - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): stack.getTop().clear() ## Create quality changes containers from the user containers in the active stacks. @@ -423,7 +425,7 @@ class ContainerManager(QObject): # \return \type{bool} True if the operation was successfully, False if not. @pyqtSlot(result = bool) def createQualityChanges(self): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return False @@ -432,12 +434,12 @@ class ContainerManager(QObject): UM.Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId()) return False - UM.Application.getInstance().getMachineManager().blurSettings.emit() + Application.getInstance().getMachineManager().blurSettings.emit() - unique_name = UM.Settings.ContainerRegistry.getInstance().uniqueName(quality_container.getName()) + unique_name = ContainerRegistry.getInstance().uniqueName(quality_container.getName()) # Go through the active stacks and create quality_changes containers from the user containers. - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): user_container = stack.getTop() quality_container = stack.findContainer(type = "quality") quality_changes_container = stack.findContainer(type = "quality_changes") @@ -541,7 +543,7 @@ class ContainerManager(QObject): container_type = containers[0].getMetaDataEntry("type") if container_type == "quality": for container in self._getFilteredContainers(name = quality_name, type = "quality"): - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): new_changes = self._createQualityChanges(container, new_name, stack.getId()) UM.Settings.ContainerRegistry.getInstance().addContainer(new_changes) elif container_type == "quality_changes": @@ -620,7 +622,7 @@ class ContainerManager(QObject): # # \return A generator that iterates over the list of containers matching the search criteria. def _getFilteredContainers(self, **kwargs): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return False @@ -635,7 +637,7 @@ class ContainerManager(QObject): material_ids = [] if filter_by_material: - for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): + for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): material_ids.append(stack.findContainer(type = "material").getId()) containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 1359ab77b6..adb0b38e8e 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -3,11 +3,14 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant #For communicating data and events to Qt. -import UM.Application #To get the global container stack to find the current machine. -import UM.Logger -import UM.Settings.ContainerRegistry #Finding containers by ID. -import UM.Settings.SettingFunction - +from UM.Application import Application #To get the global container stack to find the current machine. +from UM.Logger import Logger +from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers by ID. +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.SettingFunction import SettingFunction +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.DefinitionContainer import DefinitionContainer +from typing import Optional ## Manages all existing extruder stacks. # @@ -22,9 +25,12 @@ class ExtruderManager(QObject): ## Registers listeners and such to listen to changes to the extruders. def __init__(self, parent = None): super().__init__(parent) - self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. - self._active_extruder_index = 0 - UM.Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) + + # Per machine, a dictionary of extruder container stack IDs. + self._extruder_trains = {} # type: Dict[str, Dict[str, ContainerStack]] + + self._active_extruder_index = 0 # type: int + Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) self._addCurrentMachineExtruders() ## Gets the unique identifier of the currently active extruder stack. @@ -34,31 +40,31 @@ class ExtruderManager(QObject): # # \return The unique ID of the currently active extruder stack. @pyqtProperty(str, notify = activeExtruderChanged) - def activeExtruderStackId(self): - if not UM.Application.getInstance().getGlobalContainerStack(): + def activeExtruderStackId(self) -> Optional[str]: + if not Application.getInstance().getGlobalContainerStack(): return None # No active machine, so no active extruder. try: - return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()][str(self._active_extruder_index)].getId() + return self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][str(self._active_extruder_index)].getId() except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. return None @pyqtProperty(int, notify = extrudersChanged) - def extruderCount(self): - if not UM.Application.getInstance().getGlobalContainerStack(): + def extruderCount(self) -> int: + if not Application.getInstance().getGlobalContainerStack(): return 0 # No active machine, so no extruders. - return len(self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()]) + return len(self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()]) @pyqtProperty("QVariantMap", notify=extrudersChanged) def extruderIds(self): map = {} - for position in self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()]: - map[position] = self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()][position].getId() + for position in self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()]: + map[position] = self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][position].getId() return map @pyqtSlot(str, result = str) - def getQualityChangesIdByExtruderStackId(self, id): - for position in self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()]: - extruder = self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()][position] + def getQualityChangesIdByExtruderStackId(self, id: str) -> str: + for position in self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()]: + extruder = self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][position] if extruder.getId() == id: return extruder.findContainer(type = "quality_changes").getId() @@ -75,7 +81,7 @@ class ExtruderManager(QObject): # # \return The extruder manager. @classmethod - def getInstance(cls): + def getInstance(cls) -> 'ExtruderManager': if not cls.__instance: cls.__instance = ExtruderManager() return cls.__instance @@ -84,16 +90,16 @@ class ExtruderManager(QObject): # # \param index The index of the new active extruder. @pyqtSlot(int) - def setActiveExtruderIndex(self, index): + def setActiveExtruderIndex(self, index: int) -> None: self._active_extruder_index = index self.activeExtruderChanged.emit() @pyqtProperty(int, notify = activeExtruderChanged) - def activeExtruderIndex(self): + def activeExtruderIndex(self) -> int: return self._active_extruder_index - def getActiveExtruderStack(self): - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + def getActiveExtruderStack(self) -> ContainerStack: + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: if global_container_stack.getId() in self._extruder_trains: if str(self._active_extruder_index) in self._extruder_trains[global_container_stack.getId()]: @@ -102,7 +108,7 @@ class ExtruderManager(QObject): ## Get an extruder stack by index def getExtruderStack(self, index): - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: if global_container_stack.getId() in self._extruder_trains: if str(index) in self._extruder_trains[global_container_stack.getId()]: @@ -114,19 +120,19 @@ class ExtruderManager(QObject): # # \param machine_definition The machine definition to add the extruders for. # \param machine_id The machine_id to add the extruders for. - def addMachineExtruders(self, machine_definition, machine_id): + def addMachineExtruders(self, machine_definition: DefinitionContainer, machine_id: str) -> None: changed = False machine_definition_id = machine_definition.getId() if machine_id not in self._extruder_trains: self._extruder_trains[machine_id] = { } changed = True - container_registry = UM.Settings.ContainerRegistry.getInstance() + container_registry = ContainerRegistry.getInstance() if container_registry: # Add the extruder trains that don't exist yet. for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition_id): position = extruder_definition.getMetaDataEntry("position", None) if not position: - UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) + 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. self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) changed = True @@ -138,7 +144,7 @@ class ExtruderManager(QObject): # Make sure the next stack is a stack that contains only the machine definition if not extruder_train.getNextStack(): - shallow_stack = UM.Settings.ContainerStack(machine_id + "_shallow") + shallow_stack = ContainerStack(machine_id + "_shallow") shallow_stack.addContainer(machine_definition) extruder_train.setNextStack(shallow_stack) changed = True @@ -157,14 +163,15 @@ class ExtruderManager(QObject): # \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 machine_id The id of the "global" stack this extruder is linked to. - def createExtruderTrain(self, extruder_definition, machine_definition, position, machine_id): + def createExtruderTrain(self, extruder_definition: DefinitionContainer, machine_definition: DefinitionContainer, + position, machine_id: str) -> None: # Cache some things. - container_registry = UM.Settings.ContainerRegistry.getInstance() + container_registry = ContainerRegistry.getInstance() machine_definition_id = machine_definition.getId() # 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 = ContainerStack(extruder_stack_id) 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_id) @@ -184,7 +191,7 @@ class ExtruderManager(QObject): if len(preferred_variants) >= 1: 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) + 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. container_stack.addContainer(variant) @@ -213,7 +220,7 @@ class ExtruderManager(QObject): if len(preferred_materials) >= 1: 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) + 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. container_stack.addContainer(material) @@ -232,11 +239,11 @@ class ExtruderManager(QObject): if preferred_quality: search_criteria["id"] = preferred_quality - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if not containers and preferred_quality: - UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) + Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) search_criteria.pop("id", None) - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if containers: quality = containers[0] @@ -249,7 +256,7 @@ class ExtruderManager(QObject): 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 = 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) @@ -258,7 +265,7 @@ class ExtruderManager(QObject): # Make sure the next stack is a stack that contains only the machine definition if not container_stack.getNextStack(): - shallow_stack = UM.Settings.ContainerStack(machine_id + "_shallow") + shallow_stack = ContainerStack(machine_id + "_shallow") shallow_stack.addContainer(machine_definition) container_stack.setNextStack(shallow_stack) @@ -269,26 +276,25 @@ class ExtruderManager(QObject): # \param machine_id The machine to remove the extruders for. def removeMachineExtruders(self, machine_id): for extruder in self.getMachineExtruders(machine_id): - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "user", extruder = extruder.getId()) + containers = ContainerRegistry.getInstance().findInstanceContainers(type = "user", extruder = extruder.getId()) for container in containers: - UM.Settings.ContainerRegistry.getInstance().removeContainer(container.getId()) - UM.Settings.ContainerRegistry.getInstance().removeContainer(extruder.getId()) + ContainerRegistry.getInstance().removeContainer(container.getId()) + ContainerRegistry.getInstance().removeContainer(extruder.getId()) ## Returns extruders for a specific machine. # # \param machine_id The machine to get the extruders of. def getMachineExtruders(self, machine_id): if machine_id not in self._extruder_trains: - UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) - return - for name in self._extruder_trains[machine_id]: - yield self._extruder_trains[machine_id][name] + Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) + return [] + return [self._extruder_trains[machine_id][name] for name in self._extruder_trains[machine_id]] ## Returns a generator that will iterate over the global stack and per-extruder stacks. # # The first generated element is the global container stack. After that any extruder stacks are generated. def getActiveGlobalAndExtruderStacks(self): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return @@ -298,13 +304,13 @@ class ExtruderManager(QObject): for name in self._extruder_trains[global_id]: yield self._extruder_trains[global_id][name] - def __globalContainerStackChanged(self): + def __globalContainerStackChanged(self) -> None: self._addCurrentMachineExtruders() self.activeExtruderChanged.emit() ## Adds the extruders of the currently active machine. - def _addCurrentMachineExtruders(self): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + def _addCurrentMachineExtruders(self) -> None: + global_stack = Application.getInstance().getGlobalContainerStack() if global_stack and global_stack.getBottom(): self.addMachineExtruders(global_stack.getBottom(), global_stack.getId()) @@ -318,7 +324,7 @@ class ExtruderManager(QObject): # If no extruder has the value, the list will contain the global value. @staticmethod def getExtruderValues(key): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() result = [] for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): @@ -327,7 +333,7 @@ class ExtruderManager(QObject): if not value: continue - if isinstance(value, UM.Settings.SettingFunction): + if isinstance(value, SettingFunction): value = value(extruder) result.append(value) @@ -363,9 +369,9 @@ class ExtruderManager(QObject): if extruder: value = extruder.getRawProperty(key, "value") - if isinstance(value, UM.Settings.SettingFunction): + if isinstance(value, SettingFunction): value = value(extruder) else: #Just a value from global. - value = UM.Application.getInstance().getGlobalContainerStack().getProperty(key, "value") + value = Application.getInstance().getGlobalContainerStack().getProperty(key, "value") return value diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 155f1a0df1..4c5a755007 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -5,7 +5,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty import UM.Qt.ListModel -from . import ExtruderManager +from cura.Settings.ExtruderManager import ExtruderManager ## Model that holds extruders. # @@ -100,7 +100,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self.clear() changed = True - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + global_container_stack = UM.Application.Application.getInstance().getGlobalContainerStack() if global_container_stack: if self._add_global: material = global_container_stack.findContainer({ "type": "material" }) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 823e59b4b8..9165d49e15 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1,5 +1,6 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. +from typing import Union from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from PyQt5.QtWidgets import QMessageBox @@ -7,13 +8,14 @@ from PyQt5.QtWidgets import QMessageBox from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger - +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.SettingRelation import RelationType - -import UM.Settings +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.Validator import ValidatorState from cura.PrinterOutputDevice import PrinterOutputDevice -from . import ExtruderManager +from cura.Settings.ExtruderManager import ExtruderManager from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -24,8 +26,8 @@ class MachineManager(QObject): def __init__(self, parent = None): super().__init__(parent) - self._active_container_stack = None - self._global_container_stack = None + self._active_container_stack = None # type: ContainerStack + self._global_container_stack = None # type: ContainerStack Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) ## When the global container is changed, active material probably needs to be updated. @@ -47,10 +49,10 @@ class MachineManager(QObject): self.globalValueChanged.connect(self.activeStackChanged) ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeStackChanged) - self._empty_variant_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_variant")[0] - self._empty_material_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_material")[0] - self._empty_quality_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] - self._empty_quality_changes_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality_changes")[0] + self._empty_variant_container = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_variant")[0] + self._empty_material_container = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_material")[0] + self._empty_quality_container = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + self._empty_quality_changes_container = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality_changes")[0] Preferences.getInstance().addPreference("cura/active_machine", "") @@ -84,7 +86,7 @@ class MachineManager(QObject): outputDevicesChanged = pyqtSignal() - def _onOutputDevicesChanged(self): + def _onOutputDevicesChanged(self) -> None: for printer_output_device in self._printer_output_devices: printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged) @@ -103,14 +105,15 @@ class MachineManager(QObject): def printerOutputDevices(self): return self._printer_output_devices - def _onHotendIdChanged(self, index, hotend_id): + def _onHotendIdChanged(self, index: Union[str,int], hotend_id: str) -> None: if not self._global_container_stack: return - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type="variant", definition=self._global_container_stack.getBottom().getId(), name=hotend_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(type="variant", definition=self._global_container_stack.getBottom().getId(), name=hotend_id) if containers: # New material ID is known extruder_manager = ExtruderManager.getInstance() - extruders = list(extruder_manager.getMachineExtruders(self.activeMachineId)) + machine_id = self.activeMachineId + extruders = extruder_manager.getMachineExtruders(machine_id) matching_extruder = None for extruder in extruders: if str(index) == extruder.getMetaDataEntry("position"): @@ -147,7 +150,7 @@ class MachineManager(QObject): if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): definition_id = self._global_container_stack.getBottom().getId() extruder_manager = ExtruderManager.getInstance() - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition_id, GUID = material_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition_id, GUID = material_id) if containers: # New material ID is known extruders = list(extruder_manager.getMachineExtruders(self.activeMachineId)) matching_extruder = None @@ -262,7 +265,7 @@ class MachineManager(QObject): changed_validation_state = self._active_container_stack.getProperty(key, property_name) else: changed_validation_state = self._global_container_stack.getProperty(key, property_name) - if changed_validation_state in (UM.Settings.ValidatorState.Exception, UM.Settings.ValidatorState.MaximumError, UM.Settings.ValidatorState.MinimumError): + if changed_validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): self._active_stack_valid = False self.activeValidationChanged.emit() else: @@ -273,19 +276,19 @@ class MachineManager(QObject): self.activeStackChanged.emit() @pyqtSlot(str) - def setActiveMachine(self, stack_id): - containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + def setActiveMachine(self, stack_id: str) -> None: + containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) @pyqtSlot(str, str) - def addMachine(self, name, definition_id): - container_registry = UM.Settings.ContainerRegistry.getInstance() + def addMachine(self, name: str, definition_id: str) -> None: + container_registry = ContainerRegistry.getInstance() definitions = container_registry.findDefinitionContainers(id = definition_id) if definitions: definition = definitions[0] name = self._createUniqueName("machine", "", name, definition.getName()) - new_global_stack = UM.Settings.ContainerStack(name) + new_global_stack = ContainerStack(name) new_global_stack.addMetaDataEntry("type", "machine") container_registry.addContainer(new_global_stack) @@ -293,7 +296,7 @@ class MachineManager(QObject): material_instance_container = self._updateMaterialContainer(definition, variant_instance_container) quality_instance_container = self._updateQualityContainer(definition, variant_instance_container, material_instance_container) - current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") + current_settings_instance_container = InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) current_settings_instance_container.addMetaDataEntry("type", "user") current_settings_instance_container.setDefinition(definitions[0]) @@ -321,8 +324,9 @@ class MachineManager(QObject): # \param new_name \type{string} Base name, which may not be unique # \param fallback_name \type{string} Name to use when (stripped) new_name is empty # \return \type{string} Name that is unique for the specified type and name/id - def _createUniqueName(self, container_type, current_name, new_name, fallback_name): - return UM.Settings.ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name) + def _createUniqueName(self, container_type: str, current_name: str, new_name: str, fallback_name: str) -> str: + Logger.log('d', str(ContainerRegistry.getInstance())) + return ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name) ## Convenience function to check if a stack has errors. def _checkStackForErrors(self, stack): @@ -331,7 +335,7 @@ class MachineManager(QObject): for key in stack.getAllKeys(): validation_state = stack.getProperty(key, "validationState") - if validation_state in (UM.Settings.ValidatorState.Exception, UM.Settings.ValidatorState.MaximumError, UM.Settings.ValidatorState.MinimumError): + if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): return True return False @@ -364,39 +368,39 @@ class MachineManager(QObject): # Note that the _active_stack_valid is cached due to performance issues # Calling _checkStackForErrors on every change is simply too expensive @pyqtProperty(bool, notify = activeValidationChanged) - def isActiveStackValid(self): + def isActiveStackValid(self) -> bool: return bool(self._active_stack_valid) @pyqtProperty(str, notify = activeStackChanged) - def activeUserProfileId(self): + def activeUserProfileId(self) -> str: if self._active_container_stack: return self._active_container_stack.getTop().getId() return "" @pyqtProperty(str, notify = globalContainerChanged) - def activeMachineName(self): + def activeMachineName(self) -> str: if self._global_container_stack: return self._global_container_stack.getName() return "" @pyqtProperty(str, notify = globalContainerChanged) - def activeMachineId(self): + def activeMachineId(self) -> str: if self._global_container_stack: return self._global_container_stack.getId() return "" @pyqtProperty(str, notify = activeStackChanged) - def activeStackId(self): + def activeStackId(self) -> str: if self._active_container_stack: return self._active_container_stack.getId() return "" @pyqtProperty(str, notify = activeMaterialChanged) - def activeMaterialName(self): + def activeMaterialName(self) -> str: if self._active_container_stack: material = self._active_container_stack.findContainer({"type":"material"}) if material: @@ -405,7 +409,7 @@ class MachineManager(QObject): return "" @pyqtProperty(str, notify=activeMaterialChanged) - def activeMaterialId(self): + def activeMaterialId(self) -> str: if self._active_container_stack: material = self._active_container_stack.findContainer({"type": "material"}) if material: @@ -430,7 +434,7 @@ class MachineManager(QObject): return result @pyqtProperty(str, notify=activeQualityChanged) - def activeQualityMaterialId(self): + def activeQualityMaterialId(self) -> str: if self._active_container_stack: quality = self._active_container_stack.findContainer({"type": "quality"}) if quality: @@ -478,8 +482,8 @@ class MachineManager(QObject): ## Check if a container is read_only @pyqtSlot(str, result = bool) - def isReadOnly(self, container_id): - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id) + def isReadOnly(self, container_id) -> bool: + containers = ContainerRegistry.getInstance().findInstanceContainers(id = container_id) if not containers or not self._active_container_stack: return True return containers[0].isReadOnly() @@ -499,7 +503,7 @@ class MachineManager(QObject): @pyqtSlot(str) def setActiveMaterial(self, material_id): - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = material_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = material_id) if not containers or not self._active_container_stack: return @@ -532,7 +536,7 @@ class MachineManager(QObject): @pyqtSlot(str) def setActiveVariant(self, variant_id): - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = variant_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = variant_id) if not containers or not self._active_container_stack: return old_variant = self._active_container_stack.findContainer({"type": "variant"}) @@ -541,7 +545,6 @@ class MachineManager(QObject): variant_index = self._active_container_stack.getContainerIndex(old_variant) self._active_container_stack.replaceContainer(variant_index, containers[0]) - preferred_material = None if old_material: preferred_material_name = old_material.getName() self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), containers[0], preferred_material_name).id) @@ -550,7 +553,7 @@ class MachineManager(QObject): @pyqtSlot(str) def setActiveQuality(self, quality_id): - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) if not containers or not self._global_container_stack: return @@ -563,7 +566,7 @@ class MachineManager(QObject): quality_container = containers[0] elif container_type == "quality_changes": quality_changes_container = containers[0] - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers( + containers = ContainerRegistry.getInstance().findInstanceContainers( quality_type = quality_changes_container.getMetaDataEntry("quality")) if not containers: Logger.log("e", "Could not find quality %s for changes %s, not changing quality", quality_changes_container.getMetaDataEntry("quality"), quality_changes_container.getId()) @@ -591,10 +594,10 @@ class MachineManager(QObject): else: criteria["definition"] = "fdmprinter" - stack_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + stack_quality = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not stack_quality: criteria.pop("extruder") - stack_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + stack_quality = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not stack_quality: stack_quality = quality_container else: @@ -603,7 +606,7 @@ class MachineManager(QObject): stack_quality = stack_quality[0] if quality_changes_container != self._empty_quality_changes_container: - stack_quality_changes = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(name = quality_changes_container.getName(), extruder = extruder_id)[0] + stack_quality_changes = ContainerRegistry.getInstance().findInstanceContainers(name = quality_changes_container.getName(), extruder = extruder_id)[0] else: stack_quality_changes = self._empty_quality_changes_container @@ -683,7 +686,7 @@ class MachineManager(QObject): @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): - containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = machine_id) + containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) if containers: new_name = self._createUniqueName("machine", containers[0].getName(), new_name, containers[0].getBottom().getName()) containers[0].setName(new_name) @@ -696,13 +699,13 @@ class MachineManager(QObject): ExtruderManager.getInstance().removeMachineExtruders(machine_id) - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "user", machine = machine_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(type = "user", machine = machine_id) for container in containers: - UM.Settings.ContainerRegistry.getInstance().removeContainer(container.getId()) - UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) + ContainerRegistry.getInstance().removeContainer(container.getId()) + ContainerRegistry.getInstance().removeContainer(machine_id) if activate_new_machine: - stacks = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(type = "machine") + stacks = ContainerRegistry.getInstance().findContainerStacks(type = "machine") if stacks: Application.getInstance().setGlobalContainerStack(stacks[0]) @@ -743,7 +746,7 @@ class MachineManager(QObject): # \returns DefinitionID (string) if found, None otherwise @pyqtSlot(str, result = str) def getDefinitionByMachineId(self, machine_id): - containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id=machine_id) + containers = ContainerRegistry.getInstance().findContainerStacks(id=machine_id) if containers: return containers[0].getBottom().getId() @@ -758,10 +761,10 @@ class MachineManager(QObject): containers = [] preferred_variant = definition.getMetaDataEntry("preferred_variant") if preferred_variant: - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id, id = preferred_variant) + containers = ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id, id = preferred_variant) if not containers: - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id) + containers = ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id) if containers: return containers[0] @@ -789,7 +792,7 @@ class MachineManager(QObject): if preferred_material: search_criteria["id"] = preferred_material - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if containers: return containers[0] @@ -798,14 +801,14 @@ class MachineManager(QObject): search_criteria.pop("name", None) search_criteria.pop("id", None) - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if containers: return containers[0] return self._empty_material_container def _updateQualityContainer(self, definition, variant_container, material_container = None, preferred_quality_name = None): - container_registry = UM.Settings.ContainerRegistry.getInstance() + container_registry = ContainerRegistry.getInstance() search_criteria = { "type": "quality" } if definition.getMetaDataEntry("has_machine_quality"): @@ -870,7 +873,7 @@ class MachineManager(QObject): # \param preferred_quality_changes_name The name of the quality-changes to # pick, if any such quality-changes profile is available. def _updateQualityChangesContainer(self, quality_type, preferred_quality_changes_name = None): - container_registry = UM.Settings.ContainerRegistry.getInstance() # Cache. + container_registry = ContainerRegistry.getInstance() # Cache. search_criteria = { "type": "quality_changes" } search_criteria["quality"] = quality_type diff --git a/cura/Settings/MaterialSettingsVisibilityHandler.py b/cura/Settings/MaterialSettingsVisibilityHandler.py index 7286f509bf..8a16832f5e 100644 --- a/cura/Settings/MaterialSettingsVisibilityHandler.py +++ b/cura/Settings/MaterialSettingsVisibilityHandler.py @@ -1,9 +1,9 @@ # Copyright (c) 2016 Ultimaker B.V. # Uranium is released under the terms of the AGPLv3 or higher. -import UM.Settings.Models +from UM.Settings.Models.SettingVisibilityHandler import SettingVisibilityHandler -class MaterialSettingsVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler): +class MaterialSettingsVisibilityHandler(SettingVisibilityHandler): def __init__(self, parent = None, *args, **kwargs): super().__init__(parent = parent, *args, **kwargs) diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 4362dd51d8..589b0da7cb 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -5,11 +5,10 @@ import collections from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt -import UM.Application import UM.Logger import UM.Qt -import UM.Settings - +from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry class QualitySettingsModel(UM.Qt.ListModel.ListModel): KeyRole = Qt.UserRole + 1 @@ -75,7 +74,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): settings = collections.OrderedDict() definition_container = UM.Application.getInstance().getGlobalContainerStack().getBottom() - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = self._quality) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = self._quality) if not containers: UM.Logger.log("w", "Could not find a quality container with id %s", self._quality) return @@ -97,7 +96,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if self._material: criteria["material"] = self._material - quality_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + quality_container = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not quality_container: UM.Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) return @@ -113,22 +112,22 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): criteria["extruder"] = self._extruder_id - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not containers: # Try again, this time without extruder new_criteria = criteria.copy() new_criteria.pop("extruder") - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**new_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**new_criteria) if not containers: # Try again, this time without material criteria.pop("material") - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not containers: # Try again, this time without material or extruder criteria.pop("extruder") # "material" has already been popped - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if not containers: UM.Logger.log("Could not find any quality containers matching the search criteria %s" % str(criteria)) @@ -136,7 +135,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if quality_changes_container: criteria = {"type": "quality_changes", "quality": quality_type, "extruder": self._extruder_id, "definition": definition_id } - changes = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + changes = ContainerRegistry.getInstance().findInstanceContainers(**criteria) if changes: containers.extend(changes) @@ -154,9 +153,9 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): user_value = None if not self._extruder_id: - user_value = UM.Application.getInstance().getGlobalContainerStack().getTop().getProperty(definition.key, "value") + user_value = Application.getInstance().getGlobalContainerStack().getTop().getProperty(definition.key, "value") else: - extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_id) + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_id) if extruder_stack: user_value = extruder_stack[0].getTop().getProperty(definition.key, "value") diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py index 5daa00c84f..c00ee15ebf 100644 --- a/cura/Settings/__init__.py +++ b/cura/Settings/__init__.py @@ -1,13 +1,2 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. - -from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler -from .ContainerManager import ContainerManager -from .ContainerSettingsModel import ContainerSettingsModel -from .CuraContainerRegistry import CuraContainerRegistry -from .ExtruderManager import ExtruderManager -from .ExtrudersModel import ExtrudersModel -from .MachineManager import MachineManager -from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler -from .SettingOverrideDecorator import SettingOverrideDecorator -from .QualitySettingsModel import QualitySettingsModel diff --git a/cura_app.py b/cura_app.py index 5c3ea811b5..6c75e49fb7 100755 --- a/cura_app.py +++ b/cura_app.py @@ -55,8 +55,5 @@ if Platform.isWindows() and hasattr(sys, "frozen"): sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") -# Force an instance of CuraContainerRegistry to be created and reused later. -cura.Settings.CuraContainerRegistry.getInstance() - app = cura.CuraApplication.CuraApplication.getInstance() app.run() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9e6bec45e4..ff4a92a6e0 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -82,7 +82,7 @@ class CuraEngineBackend(Backend): self._onGlobalStackChanged() self._active_extruder_stack = None - cura.Settings.ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + cura.Settings.ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) self._onActiveExtruderChanged() # When you update a setting and other settings get changed through inheritance, many propertyChanged signals are fired. @@ -449,7 +449,7 @@ class CuraEngineBackend(Backend): if self._active_extruder_stack: self._active_extruder_stack.containersChanged.disconnect(self._onChanged) - self._active_extruder_stack = cura.Settings.ExtruderManager.getInstance().getActiveExtruderStack() + self._active_extruder_stack = cura.Settings.ExtruderManager.ExtruderManager.getInstance().getActiveExtruderStack() if self._active_extruder_stack: self._active_extruder_stack.containersChanged.connect(self._onChanged) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index a37aa9c5cb..56206e010f 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -9,7 +9,7 @@ import cura.Settings.CuraContainerRegistry import UM.Application import UM.Settings.InstanceContainer import UM.Settings.DefinitionContainer -import UM.Logger +from UM.Logger import Logger import UM.i18n catalog = UM.i18n.i18nCatalog("cura") @@ -19,10 +19,10 @@ class MachineSettingsAction(MachineAction): super().__init__("MachineSettingsAction", catalog.i18nc("@action", "Machine Settings")) self._qml_url = "MachineSettingsAction.qml" - cura.Settings.CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) def _reset(self): - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + global_container_stack = UM.Application.Application.getInstance().getGlobalContainerStack() if global_container_stack: variant = global_container_stack.findContainer({"type": "variant"}) if variant and variant.getId() == "empty_variant": @@ -39,28 +39,28 @@ class MachineSettingsAction(MachineAction): def _onContainerAdded(self, container): # Add this action as a supported action to all machine definitions - if isinstance(container, UM.Settings.DefinitionContainer) and container.getMetaDataEntry("type") == "machine": + if isinstance(container, UM.Settings.DefinitionContainer.DefinitionContainer) and container.getMetaDataEntry("type") == "machine": if container.getProperty("machine_extruder_count", "value") > 1: # Multiextruder printers are not currently supported - UM.Logger.log("d", "Not attaching MachineSettingsAction to %s; Multi-extrusion printers are not supported", container.getId()) + Logger.log("d", "Not attaching MachineSettingsAction to %s; Multi-extrusion printers are not supported", container.getId()) return if container.getMetaDataEntry("has_variants", False): # Machines that use variants are not currently supported - UM.Logger.log("d", "Not attaching MachineSettingsAction to %s; Machines that use variants are not supported", container.getId()) + Logger.log("d", "Not attaching MachineSettingsAction to %s; Machines that use variants are not supported", container.getId()) return - UM.Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + UM.Application.Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) @pyqtSlot() def forceUpdate(self): # Force rebuilding the build volume by reloading the global container stack. # This is a bit of a hack, but it seems quick enough. - UM.Application.getInstance().globalContainerStackChanged.emit() + UM.Application.Application.getInstance().globalContainerStackChanged.emit() @pyqtSlot() def updateHasMaterialsMetadata(self): # Updates the has_materials metadata flag after switching gcode flavor - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + global_container_stack = UM.Application.Application.getInstance().getGlobalContainerStack() if global_container_stack: definition = global_container_stack.getBottom() if definition.getProperty("machine_gcode_flavor", "value") == "UltiGCode" and not definition.getMetaDataEntry("has_materials", False): diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index b4086291ca..42b30969be 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -6,14 +6,14 @@ from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Settings.SettingInstance import SettingInstance from UM.Logger import Logger -import UM.Settings.Models +import UM.Settings.Models.SettingVisibilityHandler from cura.Settings.ExtruderManager import ExtruderManager #To get global-inherits-stack setting values from different extruders. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator ## The per object setting visibility handler ensures that only setting # definitions that have a matching instance Container are returned as visible. -class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler): +class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler.SettingVisibilityHandler): def __init__(self, parent = None, *args, **kwargs): super().__init__(parent = parent, *args, **kwargs) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 3e3501a83f..d5995a1390 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -13,6 +13,7 @@ from UM.Settings.Validator import ValidatorState from UM.View.GL.OpenGL import OpenGL import cura.Settings +import cura.Settings.ExtrudersModel import math @@ -26,7 +27,7 @@ class SolidView(View): self._enabled_shader = None self._disabled_shader = None - self._extruders_model = cura.Settings.ExtrudersModel() + self._extruders_model = cura.Settings.ExtrudersModel.ExtrudersModel() def beginRendering(self): scene = self.getController().getScene() diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py index 4ac86f9a1d..84cbc390a7 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py @@ -25,7 +25,7 @@ class Profile: # # \param serialised A string with the contents of a profile. # \param filename The supposed filename of the profile, without extension. - def __init__(self, serialised, filename): + def __init__(self, serialised: str, filename: str): self._filename = filename parser = configparser.ConfigParser(interpolation = None) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 77f775ee27..fabd84963a 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -11,11 +11,11 @@ from UM.Logger import Logger from UM.Util import parseBool import UM.Dictionary - -import UM.Settings +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry ## Handles serializing and deserializing material containers from an XML file -class XmlMaterialProfile(UM.Settings.InstanceContainer): +class XmlMaterialProfile(InstanceContainer): def __init__(self, container_id, *args, **kwargs): super().__init__(container_id, *args, **kwargs) @@ -24,7 +24,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): base_file = self.getMetaDataEntry("base_file", None) if base_file != self.id: - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = base_file) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = base_file) if containers: new_basefile = containers[0].duplicate(self.getMetaDataEntry("brand") + "_" + new_id, new_name) base_file = new_basefile.id @@ -33,14 +33,14 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): new_id = self.getMetaDataEntry("brand") + "_" + new_id + "_" + self.getDefinition().getId() variant = self.getMetaDataEntry("variant") if variant: - variant_containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = variant) + variant_containers = ContainerRegistry.getInstance().findInstanceContainers(id = variant) if variant_containers: new_id += "_" + variant_containers[0].getName().replace(" ", "_") has_base_file = True else: has_base_file = False - new_id = UM.Settings.ContainerRegistry.getInstance().createUniqueName("material", self._id, new_id, "") + new_id = ContainerRegistry.getInstance().createUniqueName("material", self._id, new_id, "") result = super().duplicate(new_id, new_name) if has_base_file: result.setMetaDataEntry("base_file", base_file) @@ -53,7 +53,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): super().setReadOnly(read_only) basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is none, this is a basefile. - for container in UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): + for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): container._read_only = read_only ## Overridden from InstanceContainer @@ -65,7 +65,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is none, this is a basefile. # Update all containers that share GUID and basefile - for container in UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): + for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): container.setMetaData(copy.deepcopy(self._metadata)) ## Overridden from InstanceContainer, similar to setMetaDataEntry. @@ -84,7 +84,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): basefile = self.getMetaDataEntry("base_file", self._id) # if basefile is none, this is a basefile. # Update the basefile as well, this is actually what we're trying to do # Update all containers that share GUID and basefile - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile) + containers = ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile) for container in containers: container.setName(new_name) @@ -96,12 +96,12 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): super().setProperty(key, property_name, property_value) basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is none, this is a basefile. - for container in UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): + for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): container._dirty = True ## Overridden from InstanceContainer def serialize(self): - registry = UM.Settings.ContainerRegistry.getInstance() + registry = ContainerRegistry.getInstance() base_file = self.getMetaDataEntry("base_file", "") if base_file and self.id != base_file: @@ -296,7 +296,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): self.addMetaDataEntry("properties", property_values) - self.setDefinition(UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) + self.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) global_compatibility = True global_setting_values = {} @@ -336,7 +336,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): Logger.log("w", "Cannot create material for unknown machine %s", identifier.get("product")) continue - definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) if not definitions: Logger.log("w", "No definition found for machine ID %s", machine_id) continue @@ -357,7 +357,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): new_material._dirty = False - UM.Settings.ContainerRegistry.getInstance().addContainer(new_material) + ContainerRegistry.getInstance().addContainer(new_material) hotends = machine.iterfind("./um:hotend", self.__namespaces) for hotend in hotends: @@ -365,10 +365,10 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): if hotend_id is None: continue - variant_containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainers(id = hotend_id) if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(definition = definition.id, name = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainers(definition = definition.id, name = hotend_id) if not variant_containers: Logger.log("d", "No variants found with ID or name %s for machine %s", hotend_id, definition.id) @@ -406,7 +406,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): new_hotend_material.setProperty(key, "value", value, definition) new_hotend_material._dirty = False - UM.Settings.ContainerRegistry.getInstance().addContainer(new_hotend_material) + ContainerRegistry.getInstance().addContainer(new_hotend_material) if not global_compatibility: # Change the type of this container so it is not shown as an option in menus.