diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 603cda14d1..5fb2a82d36 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the AGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Scene.Platform import Platform from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator @@ -23,9 +24,6 @@ catalog = i18nCatalog("cura") import numpy import copy -import UM.Settings.ContainerRegistry - - # Setting for clearance around the prime PRIME_CLEARANCE = 6.5 @@ -663,7 +661,7 @@ class BuildVolume(SceneNode): return self._global_container_stack.getProperty(setting_key, property) extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] return stack.getProperty(setting_key, property) ## Convenience function to calculate the disallowed radius around the edge. diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index c4b2fe0337..65c799619a 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -1,13 +1,13 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Application import Application -from cura.Settings.ExtruderManager import ExtruderManager from UM.Math.Polygon import Polygon -from . import ConvexHullNode +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator +from UM.Settings.ContainerRegistry import ContainerRegistry -import UM.Settings.ContainerRegistry +from cura.Settings.ExtruderManager import ExtruderManager +from . import ConvexHullNode import numpy @@ -308,11 +308,11 @@ class ConvexHullDecorator(SceneNodeDecorator): extruder_stack_id = self._node.callDecoration("getActiveExtruder") if not extruder_stack_id: #Decoration doesn't exist. extruder_stack_id = ExtruderManager.getInstance().extruderIds["0"] - extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] return extruder_stack.getProperty(setting_key, property) else: #Limit_to_extruder is set. Use that one. extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] return stack.getProperty(setting_key, property) ## Returns true if node is a descendant or the same as the root node. diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0a121deeb4..5019519c53 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -124,7 +124,6 @@ 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"): @@ -187,6 +186,7 @@ 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"))) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 6eae259e1e..fc27b0a471 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -2,11 +2,11 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from PyQt5.QtWidgets import QMessageBox -import UM.Settings.ContainerRegistry + +from UM.Settings.ContainerRegistry import ContainerRegistry from enum import IntEnum # For the connection state tracking. from UM.Logger import Logger -from UM.Application import Application from UM.Signal import signalemitter i18n_catalog = i18nCatalog("cura") @@ -25,7 +25,7 @@ class PrinterOutputDevice(QObject, OutputDevice): def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) - self._container_registry = UM.Settings.ContainerRegistry.getInstance() + self._container_registry = ContainerRegistry.getInstance() self._target_bed_temperature = 0 self._bed_temperature = 0 self._num_extruders = 1 diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 5b4d743ae9..dc23b2bafa 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -1,12 +1,16 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -import UM.Application -import cura.Settings.ExtruderManager -import UM.Settings.ContainerRegistry - # This collects a lot of quality and quality changes related code which was split between ContainerManager # and the MachineManager and really needs to usable from both. +from typing import List + +from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.DefinitionContainer import DefinitionContainer +from UM.Settings.InstanceContainer import InstanceContainer +from cura.Settings.ExtruderManager import ExtruderManager + class QualityManager: @@ -121,14 +125,14 @@ class QualityManager: # # \param machine_definition \type{DefinitionContainer} the machine definition. # \return \type{List[InstanceContainer]} the list of quality changes - def findAllQualityChangesForMachine(self, machine_definition): + def findAllQualityChangesForMachine(self, machine_definition: DefinitionContainer) -> List[InstanceContainer]: if machine_definition.getMetaDataEntry("has_machine_quality"): definition_id = machine_definition.getId() else: definition_id = "fdmprinter" filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id } - quality_changes_list = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**filter_dict) + quality_changes_list = ContainerRegistry.getInstance().findInstanceContainers(**filter_dict) return quality_changes_list ## Find all usable qualities for a machine and extruders. @@ -177,7 +181,7 @@ class QualityManager: if base_material: # There is a basic material specified criteria = { "type": "material", "name": base_material, "definition": definition_id } - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) containers = [basic_material for basic_material in containers if basic_material.getMetaDataEntry("variant") == material_container.getMetaDataEntry( "variant")] @@ -191,13 +195,13 @@ class QualityManager: def _getFilteredContainersForStack(self, machine_definition=None, material_containers=None, **kwargs): # Fill in any default values. if machine_definition is None: - machine_definition = UM.Application.getInstance().getGlobalContainerStack().getBottom() + machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() quality_definition_id = machine_definition.getMetaDataEntry("quality_definition") if quality_definition_id is not None: - machine_definition = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition_id)[0] + machine_definition = ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition_id)[0] if material_containers is None: - active_stacks = cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() + active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() material_containers = [stack.findContainer(type="material") for stack in active_stacks] criteria = kwargs @@ -222,7 +226,7 @@ class QualityManager: if material_instance is not None: material_ids.add(material_instance.getId()) - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) result = [] for container in containers: @@ -238,8 +242,8 @@ class QualityManager: # an extruder definition. # \return \type{DefinitionContainer} the parent machine definition. If the given machine # definition doesn't have a parent then it is simply returned. - def getParentMachineDefinition(self, machine_definition): - container_registry = UM.Settings.ContainerRegistry.getInstance() + def getParentMachineDefinition(self, machine_definition: DefinitionContainer) -> DefinitionContainer: + container_registry = ContainerRegistry.getInstance() machine_entry = machine_definition.getMetaDataEntry("machine") if machine_entry is None: @@ -274,6 +278,6 @@ class QualityManager: # This already is a 'global' machine definition. return machine_definition else: - container_registry = UM.Settings.ContainerRegistry.getInstance() + container_registry = ContainerRegistry.getInstance() whole_machine = container_registry.findDefinitionContainers(id=machine_entry)[0] return whole_machine diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 3262f7cbb6..eec4e2da1c 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -7,13 +7,15 @@ import urllib from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl, QVariant from PyQt5.QtWidgets import QMessageBox -import UM.PluginRegistry +from UM.PluginRegistry import PluginRegistry import UM.SaveFile import UM.Platform import UM.MimeTypeDatabase -import UM.Logger +from UM.Logger import Logger from UM.Application import Application +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.InstanceContainer import InstanceContainer from cura.QualityManager import QualityManager @@ -35,7 +37,7 @@ class ContainerManager(QObject): def __init__(self, parent = None): super().__init__(parent) - self._registry = ContainerRegistry.getInstance() + self._container_registry = ContainerRegistry.getInstance() self._machine_manager = Application.getInstance().getMachineManager() self._container_name_filters = {} @@ -51,7 +53,7 @@ class ContainerManager(QObject): def duplicateContainer(self, container_id): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could duplicate container %s because it was not found.", container_id) + Logger.log("w", "Could duplicate container %s because it was not found.", container_id) return "" container = containers[0] @@ -83,7 +85,7 @@ class ContainerManager(QObject): def renameContainer(self, container_id, new_id, new_name): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could rename container %s because it was not found.", container_id) + Logger.log("w", "Could rename container %s because it was not found.", container_id) return False container = containers[0] @@ -111,7 +113,7 @@ class ContainerManager(QObject): def removeContainer(self, container_id): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could remove container %s because it was not found.", container_id) + Logger.log("w", "Could remove container %s because it was not found.", container_id) return False self._container_registry.removeContainer(containers[0].getId()) @@ -131,20 +133,20 @@ class ContainerManager(QObject): def mergeContainers(self, merge_into_id, merge_id): containers = self._container_registry.findContainers(None, id = merge_into_id) if not containers: - UM.Logger.log("w", "Could merge into container %s because it was not found.", merge_into_id) + Logger.log("w", "Could merge into container %s because it was not found.", merge_into_id) return False merge_into = containers[0] containers = self._container_registry.findContainers(None, id = merge_id) if not containers: - UM.Logger.log("w", "Could not merge container %s because it was not found", merge_id) + Logger.log("w", "Could not merge container %s because it was not found", merge_id) return False merge = containers[0] if not isinstance(merge, type(merge_into)): - UM.Logger.log("w", "Cannot merge two containers of different types") + Logger.log("w", "Cannot merge two containers of different types") return False self._performMerge(merge_into, merge) @@ -160,11 +162,11 @@ class ContainerManager(QObject): def clearContainer(self, container_id): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could clear container %s because it was not found.", container_id) + Logger.log("w", "Could clear container %s because it was not found.", container_id) return False if containers[0].isReadOnly(): - UM.Logger.log("w", "Cannot clear read-only container %s", container_id) + Logger.log("w", "Cannot clear read-only container %s", container_id) return False containers[0].clear() @@ -175,7 +177,7 @@ class ContainerManager(QObject): def getContainerMetaDataEntry(self, container_id, entry_name): containers = self._container_registry.findContainers(None, id=container_id) if not containers: - UM.Logger.log("w", "Could not get metadata of container %s because it was not found.", container_id) + Logger.log("w", "Could not get metadata of container %s because it was not found.", container_id) return "" result = containers[0].getMetaDataEntry(entry_name) @@ -200,13 +202,13 @@ class ContainerManager(QObject): def setContainerMetaDataEntry(self, container_id, entry_name, entry_value): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could not set metadata of container %s because it was not found.", container_id) + Logger.log("w", "Could not set metadata of container %s because it was not found.", container_id) return False container = containers[0] if container.isReadOnly(): - UM.Logger.log("w", "Cannot set metadata of read-only container %s.", container_id) + Logger.log("w", "Cannot set metadata of read-only container %s.", container_id) return False entries = entry_name.split("/") @@ -234,13 +236,13 @@ class ContainerManager(QObject): def setContainerName(self, container_id, new_name): containers = self._container_registry.findContainers(None, id = container_id) if not containers: - UM.Logger.log("w", "Could not set name of container %s because it was not found.", container_id) + Logger.log("w", "Could not set name of container %s because it was not found.", container_id) return False container = containers[0] if container.isReadOnly(): - UM.Logger.log("w", "Cannot set name of read-only container %s.", container_id) + Logger.log("w", "Cannot set name of read-only container %s.", container_id) return False container.setName(new_name) @@ -264,11 +266,11 @@ class ContainerManager(QObject): @pyqtSlot(str, result = bool) def isContainerUsed(self, container_id): - UM.Logger.log("d", "Checking if container %s is currently used", container_id) + Logger.log("d", "Checking if container %s is currently used", container_id) containers = self._container_registry.findContainerStacks() for stack in containers: if container_id in [child.getId() for child in stack.getContainers()]: - UM.Logger.log("d", "The container is in use by %s", stack.getId()) + Logger.log("d", "The container is in use by %s", stack.getId()) return True return False @@ -423,7 +425,7 @@ class ContainerManager(QObject): # 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(): - UM.Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId()) + Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId()) continue self._performMerge(quality_changes, stack.getTop()) @@ -457,13 +459,13 @@ class ContainerManager(QObject): # \return \type{bool} True if the operation was successfully, False if not. @pyqtSlot(str, result = bool) def createQualityChanges(self, base_name): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return False active_quality_name = self._machine_manager.activeQualityName if active_quality_name == "": - UM.Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId()) + Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId()) return False self._machine_manager.blurSettings.emit() @@ -477,12 +479,12 @@ class ContainerManager(QObject): quality_container = stack.findContainer(type = "quality") quality_changes_container = stack.findContainer(type = "quality_changes") if not quality_container or not quality_changes_container: - UM.Logger.log("w", "No quality or quality changes container found in stack %s, ignoring it", stack.getId()) + Logger.log("w", "No quality or quality changes container found in stack %s, ignoring it", stack.getId()) continue extruder_id = None if stack is global_stack else QualityManager.getInstance().getParentMachineDefinition(stack.getBottom()).getId() new_changes = self._createQualityChanges(quality_container, unique_name, - UM.Application.getInstance().getGlobalContainerStack().getBottom(), + Application.getInstance().getGlobalContainerStack().getBottom(), extruder_id) self._performMerge(new_changes, quality_changes_container, clear_settings = False) self._performMerge(new_changes, user_container) @@ -504,7 +506,7 @@ class ContainerManager(QObject): # \return \type{bool} True if successful, False if not. @pyqtSlot(str, result = bool) def removeQualityChanges(self, quality_name): - UM.Logger.log("d", "Attempting to remove the quality change containers with name %s", quality_name) + Logger.log("d", "Attempting to remove the quality change containers with name %s", quality_name) containers_found = False if not quality_name: @@ -514,7 +516,7 @@ class ContainerManager(QObject): activate_quality = quality_name == self._machine_manager.activeQualityName activate_quality_type = None - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack or not quality_name: return "" machine_definition = global_stack.getBottom() @@ -526,7 +528,7 @@ class ContainerManager(QObject): self._container_registry.removeContainer(container.getId()) if not containers_found: - UM.Logger.log("d", "Unable to remove quality containers, as we did not find any by the name of %s", quality_name) + Logger.log("d", "Unable to remove quality containers, as we did not find any by the name of %s", quality_name) elif activate_quality: definition_id = "fdmprinter" if not self._machine_manager.filterQualityByMachine else self._machine_manager.activeDefinitionId @@ -549,15 +551,15 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, result = bool) def renameQualityChanges(self, quality_name, new_name): - UM.Logger.log("d", "User requested QualityChanges container rename of %s to %s", quality_name, new_name) + Logger.log("d", "User requested QualityChanges container rename of %s to %s", quality_name, new_name) if not quality_name or not new_name: return False if quality_name == new_name: - UM.Logger.log("w", "Unable to rename %s to %s, because they are the same.", quality_name, new_name) + Logger.log("w", "Unable to rename %s to %s, because they are the same.", quality_name, new_name) return True - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return False @@ -574,7 +576,7 @@ class ContainerManager(QObject): container_registry.renameContainer(container.getId(), new_name, self._createUniqueId(stack_id, new_name)) if not containers_to_rename: - UM.Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name) + Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name) self._machine_manager.activeQualityChanged.emit() return True @@ -590,7 +592,7 @@ class ContainerManager(QObject): # \return A string containing the name of the duplicated containers, or an empty string if it failed. @pyqtSlot(str, str, result = str) def duplicateQualityOrQualityChanges(self, quality_name, base_name): - global_stack = UM.Application.getInstance().getGlobalContainerStack() + global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack or not quality_name: return "" machine_definition = global_stack.getBottom() @@ -611,16 +613,16 @@ class ContainerManager(QObject): # \param material_instances \type{List[InstanceContainer]} # \return \type{str} the name of the newly created container. def _duplicateQualityOrQualityChangesForMachineType(self, quality_name, base_name, machine_definition, material_instances): - UM.Logger.log("d", "Attempting to duplicate the quality %s", quality_name) + Logger.log("d", "Attempting to duplicate the quality %s", quality_name) if base_name is None: base_name = quality_name # Try to find a Quality with the name. container = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_instances) if container: - UM.Logger.log("d", "We found a quality to duplicate.") + Logger.log("d", "We found a quality to duplicate.") return self._duplicateQualityForMachineType(container, base_name, machine_definition) - UM.Logger.log("d", "We found a quality_changes to duplicate.") + Logger.log("d", "We found a quality_changes to duplicate.") # Assume it is a quality changes. return self._duplicateQualityChangesForMachineType(quality_name, base_name, machine_definition) @@ -667,11 +669,11 @@ class ContainerManager(QObject): def duplicateMaterial(self, material_id): containers = self._container_registry.findInstanceContainers(id=material_id) if not containers: - UM.Logger.log("d", "Unable to duplicate the material with id %s, because it doesn't exist.", material_id) + Logger.log("d", "Unable to duplicate the material with id %s, because it doesn't exist.", material_id) return "" # Ensure all settings are saved. - UM.Application.getInstance().saveSettings() + Application.getInstance().saveSettings() # Create a new ID & container to hold the data. new_id = self._container_registry.uniqueName(material_id) @@ -717,12 +719,12 @@ class ContainerManager(QObject): self._container_name_filters = {} for plugin_id, container_type in self._container_registry.getContainerTypes(): # Ignore default container types since those are not plugins - if container_type in (UM.Settings.InstanceContainer, UM.Settings.ContainerStack, UM.Settings.DefinitionContainer): + if container_type in (InstanceContainer, ContainerStack, DefinitionContainer): continue serialize_type = "" try: - plugin_metadata = UM.PluginRegistry.getInstance().getMetaData(plugin_id) + plugin_metadata = PluginRegistry.getInstance().getMetaData(plugin_id) if plugin_metadata: serialize_type = plugin_metadata["settings_container"]["type"] else: diff --git a/cura/Settings/MachineNameValidator.py b/cura/Settings/MachineNameValidator.py index 34b6351144..68782a2148 100644 --- a/cura/Settings/MachineNameValidator.py +++ b/cura/Settings/MachineNameValidator.py @@ -7,8 +7,8 @@ import os #For statvfs. import urllib #To escape machine names for how they're saved to file. import UM.Resources -import UM.Settings.ContainerRegistry -import UM.Settings.InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.InstanceContainer import InstanceContainer ## Are machine names valid? # @@ -22,7 +22,7 @@ class MachineNameValidator(QObject): filename_max_length = os.statvfs(UM.Resources.getDataStoragePath()).f_namemax except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system. filename_max_length = 255 #Assume it's Windows on NTFS. - machine_name_max_length = filename_max_length - len("_current_settings.") - len(UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix) + machine_name_max_length = filename_max_length - len("_current_settings.") - len(ContainerRegistry.getMimeTypeForContainer(InstanceContainer).preferredSuffix) # Characters that urllib.parse.quote_plus escapes count for 12! So now # we must devise a regex that allows only 12 normal characters or 1 # special character, and that up to [machine_name_max_length / 12] times. @@ -45,7 +45,7 @@ class MachineNameValidator(QObject): except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system. filename_max_length = 255 #Assume it's Windows on NTFS. escaped_name = urllib.parse.quote_plus(name) - current_settings_filename = escaped_name + "_current_settings." + UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix + current_settings_filename = escaped_name + "_current_settings." + ContainerRegistry.getMimeTypeForContainer(InstanceContainer).preferredSuffix if len(current_settings_filename) > filename_max_length: return QValidator.Invalid diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index a00b47c12b..085c0f054c 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -88,7 +88,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): items = [] settings = collections.OrderedDict() - definition_container = UM.Application.getInstance().getGlobalContainerStack().getBottom() + definition_container = Application.getInstance().getGlobalContainerStack().getBottom() containers = self._container_registry.findInstanceContainers(id = self._quality_id) if not containers: @@ -116,7 +116,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): quality_container = quality_container[0] quality_type = quality_container.getMetaDataEntry("quality_type") - definition_id = UM.Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) + definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 4d1e60a739..49a465c37d 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -2,9 +2,7 @@ # Cura is released under the terms of the AGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal -import UM.Settings from UM.Application import Application -import cura.Settings from UM.Logger import Logger @@ -13,6 +11,12 @@ from UM.Logger import Logger # because some profiles tend to have 'hardcoded' values that break our inheritance. A good example of that are the # speed settings. If all the children of print_speed have a single value override, changing the speed won't # actually do anything, as only the 'leaf' settings are used by the engine. +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.SettingFunction import SettingFunction +from UM.Settings.SettingInstance import InstanceState + +from cura.Settings.ExtruderManager import ExtruderManager + class SettingInheritanceManager(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -22,7 +26,7 @@ class SettingInheritanceManager(QObject): self._active_container_stack = None self._onGlobalContainerChanged() - cura.Settings.ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) self._onActiveExtruderChanged() settingsWithIntheritanceChanged = pyqtSignal() @@ -44,7 +48,7 @@ class SettingInheritanceManager(QObject): multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 if not multi_extrusion: return self._settings_with_inheritance_warning - extruder = cura.Settings.ExtruderManager.getInstance().getExtruderStack(extruder_index) + extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) if not extruder: Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) return [] @@ -70,7 +74,7 @@ class SettingInheritanceManager(QObject): self._update() def _onActiveExtruderChanged(self): - new_active_stack = cura.Settings.ExtruderManager.getInstance().getActiveExtruderStack() + new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack() if not new_active_stack: new_active_stack = self._global_container_stack @@ -136,14 +140,14 @@ class SettingInheritanceManager(QObject): return self._settings_with_inheritance_warning ## Check if a setting has an inheritance function that is overwritten - def _settingIsOverwritingInheritance(self, key, stack = None): + def _settingIsOverwritingInheritance(self, key: str, stack: ContainerStack = None) -> bool: has_setting_function = False if not stack: stack = self._active_container_stack containers = [] ## Check if the setting has a user state. If not, it is never overwritten. - has_user_state = stack.getProperty(key, "state") == UM.Settings.InstanceState.User + has_user_state = stack.getProperty(key, "state") == InstanceState.User if not has_user_state: return False @@ -152,7 +156,7 @@ class SettingInheritanceManager(QObject): return False ## Also check if the top container is not a setting function (this happens if the inheritance is restored). - if isinstance(stack.getTop().getProperty(key, "value"), UM.Settings.SettingFunction): + if isinstance(stack.getTop().getProperty(key, "value"), SettingFunction): return False ## Mash all containers for all the stacks together. @@ -167,7 +171,7 @@ class SettingInheritanceManager(QObject): continue if value is not None: # If a setting doesn't use any keys, it won't change it's value, so treat it as if it's a fixed value - has_setting_function = isinstance(value, UM.Settings.SettingFunction) and len(value.getUsedSettingKeys()) > 0 + has_setting_function = isinstance(value, SettingFunction) and len(value.getUsedSettingKeys()) > 0 if has_setting_function is False: has_non_function_value = True continue diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index d38dac565b..d5f4ef7b14 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -10,10 +10,10 @@ from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry import UM.Logger -import cura.Settings - from UM.Application import Application +from cura.Settings.ExtruderManager import ExtruderManager + ## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding # the linked node. The Stack in question will refer to the global stack (so that settings that are not defined by # this stack still resolve. @@ -29,8 +29,8 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer") self._stack.addContainer(self._instance) - if cura.Settings.ExtruderManager.getInstance().extruderCount > 1: - self._extruder_stack = cura.Settings.ExtruderManager.getInstance().getExtruderStack(0).getId() + if ExtruderManager.getInstance().extruderCount > 1: + self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() else: self._extruder_stack = None diff --git a/cura_app.py b/cura_app.py index 6c75e49fb7..c6f7e27065 100755 --- a/cura_app.py +++ b/cura_app.py @@ -55,5 +55,8 @@ 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.CuraContainerRegistry.getInstance() + app = cura.CuraApplication.CuraApplication.getInstance() app.run() diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 2aa719018d..cd263b210f 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -8,7 +8,6 @@ from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector from UM.Scene.SceneNode import SceneNode from UM.Scene.GroupDecorator import GroupDecorator -import UM.Application from UM.Job import Job from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Application import Application @@ -188,7 +187,7 @@ class ThreeMFReader(MeshReader): transform = build_item.get("transform") if transform is not None: build_item_node.setTransformation(self._createMatrixFromTransformationString(transform)) - global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + global_container_stack = Application.getInstance().getGlobalContainerStack() # Create a transformation Matrix to convert from 3mf worldspace into ours. # First step: flip the y and z axis. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index d7e1bce52b..6bf05b363c 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -13,12 +13,8 @@ from UM.Resources import Resources from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then. from UM.Platform import Platform -import cura.Settings - -from cura.OneAtATimeIterator import OneAtATimeIterator from cura.Settings.ExtruderManager import ExtruderManager from . import ProcessSlicedLayersJob -from . import ProcessGCodeJob from . import StartSliceJob import os @@ -82,7 +78,7 @@ class CuraEngineBackend(Backend): self._onGlobalStackChanged() self._active_extruder_stack = None - cura.Settings.ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + 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. @@ -484,7 +480,7 @@ class CuraEngineBackend(Backend): if self._active_extruder_stack: self._active_extruder_stack.containersChanged.disconnect(self._onChanged) - self._active_extruder_stack = cura.Settings.ExtruderManager.ExtruderManager.getInstance().getActiveExtruderStack() + self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() if self._active_extruder_stack: self._active_extruder_stack.containersChanged.connect(self._onChanged) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 0319186518..8efa50105f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -16,8 +16,7 @@ from UM.Settings.Validator import ValidatorState from UM.Settings.SettingRelation import RelationType from cura.OneAtATimeIterator import OneAtATimeIterator - -import cura.Settings +from cura.Settings.ExtruderManager import ExtruderManager class StartJobResult(IntEnum): Finished = 1 @@ -84,7 +83,7 @@ class StartSliceJob(Job): self.setResult(StartJobResult.BuildPlateError) return - for extruder_stack in cura.Settings.ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): material = extruder_stack.findContainer({"type": "material"}) if material: if material.getMetaDataEntry("compatible") == False: @@ -149,7 +148,7 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) - for extruder_stack in cura.Settings.ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): self._buildExtruderMessage(extruder_stack) for group in object_groups: diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index d503f547b0..162738f073 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -4,13 +4,10 @@ from UM.Mesh.MeshWriter import MeshWriter from UM.Logger import Logger from UM.Application import Application -import UM.Settings.ContainerRegistry - -from cura.CuraApplication import CuraApplication -from cura.Settings.ExtruderManager import ExtruderManager - from UM.Settings.InstanceContainer import InstanceContainer +from cura.Settings.ExtruderManager import ExtruderManager + import re #For escaping characters in the settings. import json import copy diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 56206e010f..13b00b2fd7 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -4,13 +4,15 @@ from PyQt5.QtCore import pyqtSlot from cura.MachineAction import MachineAction -import cura.Settings.CuraContainerRegistry -import UM.Application -import UM.Settings.InstanceContainer -import UM.Settings.DefinitionContainer +from UM.Application import Application +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Logger import Logger +from cura.Settings.CuraContainerRegistry import CuraContainerRegistry + import UM.i18n catalog = UM.i18n.i18nCatalog("cura") @@ -19,10 +21,10 @@ class MachineSettingsAction(MachineAction): super().__init__("MachineSettingsAction", catalog.i18nc("@action", "Machine Settings")) self._qml_url = "MachineSettingsAction.qml" - cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) def _reset(self): - global_container_stack = UM.Application.Application.getInstance().getGlobalContainerStack() + global_container_stack = Application.Application.getInstance().getGlobalContainerStack() if global_container_stack: variant = global_container_stack.findContainer({"type": "variant"}) if variant and variant.getId() == "empty_variant": @@ -31,10 +33,10 @@ class MachineSettingsAction(MachineAction): def _createVariant(self, global_container_stack, variant_index): # Create and switch to a variant to store the settings in - new_variant = UM.Settings.InstanceContainer(global_container_stack.getName() + "_variant") + new_variant = InstanceContainer(global_container_stack.getName() + "_variant") new_variant.addMetaDataEntry("type", "variant") new_variant.setDefinition(global_container_stack.getBottom()) - UM.Settings.ContainerRegistry.getInstance().addContainer(new_variant) + ContainerRegistry.getInstance().addContainer(new_variant) global_container_stack.replaceContainer(variant_index, new_variant) def _onContainerAdded(self, container): @@ -49,13 +51,13 @@ class MachineSettingsAction(MachineAction): Logger.log("d", "Not attaching MachineSettingsAction to %s; Machines that use variants are not supported", container.getId()) return - UM.Application.Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + 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.Application.getInstance().globalContainerStackChanged.emit() + Application.getInstance().globalContainerStackChanged.emit() @pyqtSlot() def updateHasMaterialsMetadata(self): @@ -78,7 +80,7 @@ class MachineSettingsAction(MachineAction): # Set the material container to a sane default if material_container.getId() == "empty_material": search_criteria = { "type": "material", "definition": "fdmprinter", "id": "*pla*" } - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if containers: global_container_stack.replaceContainer(material_index, containers[0]) else: @@ -87,7 +89,7 @@ class MachineSettingsAction(MachineAction): if "has_materials" in global_container_stack.getMetaData(): global_container_stack.removeMetaDataEntry("has_materials") - empty_material = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_material")[0] + empty_material = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_material")[0] global_container_stack.replaceContainer(material_index, empty_material) - UM.Application.getInstance().globalContainerStackChanged.emit() \ No newline at end of file + Application.getInstance().globalContainerStackChanged.emit() \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 08532ef61b..b283608cb0 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -4,6 +4,7 @@ from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingInstance import SettingInstance from UM.Logger import Logger import UM.Settings.Models.SettingVisibilityHandler @@ -72,7 +73,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Use the found stack number to get the right stack to copy the value from. if stack_nr in ExtruderManager.getInstance().extruderIds: - stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] + stack = ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] # Use the raw property to set the value (so the inheritance doesn't break) if stack is not None: diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py index b92dc30c68..87b2e42cd0 100644 --- a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py @@ -1,3 +1,5 @@ +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.InstanceContainer import InstanceContainer from cura.MachineAction import MachineAction from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty @@ -5,8 +7,6 @@ from UM.i18n import i18nCatalog from UM.Application import Application catalog = i18nCatalog("cura") -import UM.Settings.InstanceContainer - class UMOUpgradeSelection(MachineAction): def __init__(self): super().__init__("UMOUpgradeSelection", catalog.i18nc("@action", "Select upgrades")) @@ -37,9 +37,9 @@ class UMOUpgradeSelection(MachineAction): def _createVariant(self, global_container_stack, variant_index): # Create and switch to a variant to store the settings in - new_variant = UM.Settings.InstanceContainer(global_container_stack.getName() + "_variant") + new_variant = InstanceContainer(global_container_stack.getName() + "_variant") new_variant.addMetaDataEntry("type", "variant") new_variant.setDefinition(global_container_stack.getBottom()) - UM.Settings.ContainerRegistry.getInstance().addContainer(new_variant) + ContainerRegistry.getInstance().addContainer(new_variant) global_container_stack.replaceContainer(variant_index, new_variant) return new_variant \ No newline at end of file diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py index 71d3f0b55b..838285969a 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py @@ -1,17 +1,18 @@ +from UM.Application import Application +from UM.Settings.DefinitionContainer import DefinitionContainer from cura.MachineAction import MachineAction from UM.i18n import i18nCatalog -import cura.Settings.CuraContainerRegistry -import UM.Settings.DefinitionContainer -catalog = i18nCatalog("cura") +from UM.Settings.ContainerRegistry import ContainerRegistry +catalog = i18nCatalog("cura") class UpgradeFirmwareMachineAction(MachineAction): def __init__(self): super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) self._qml_url = "UpgradeFirmwareMachineAction.qml" - cura.Settings.CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) 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" and container.getMetaDataEntry("supports_usb_connection"): - UM.Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): + Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index d3a2b8deea..2ab9a58336 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -28,7 +28,7 @@ class XmlMaterialProfile(InstanceContainer): super().setReadOnly(read_only) basefile = self.getMetaDataEntry("base_file", self._id) # if basefile is self.id, 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 # prevent loop instead of calling setReadOnly ## Overridden from InstanceContainer @@ -44,7 +44,7 @@ class XmlMaterialProfile(InstanceContainer): basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is self.id, 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.setMetaDataEntry(key, value) ## Overridden from InstanceContainer, similar to setMetaDataEntry.