diff --git a/cura/Arranging/Arrange.py b/cura/Arranging/Arrange.py index caa7aae910..8f7ba5ccfe 100644 --- a/cura/Arranging/Arrange.py +++ b/cura/Arranging/Arrange.py @@ -1,6 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List +from typing import List, Optional from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Logger import Logger @@ -8,6 +8,7 @@ from UM.Math.Polygon import Polygon from UM.Math.Vector import Vector from UM.Scene.SceneNode import SceneNode from cura.Arranging.ShapeArray import ShapeArray +from cura.BuildVolume import BuildVolume from cura.Scene import ZOffsetDecorator from collections import namedtuple @@ -27,7 +28,7 @@ LocationSuggestion = namedtuple("LocationSuggestion", ["x", "y", "penalty_points # # Note: Make sure the scale is the same between ShapeArray objects and the Arrange instance. class Arrange: - build_volume = None + build_volume = None # type: Optional[BuildVolume] def __init__(self, x, y, offset_x, offset_y, scale= 0.5): self._scale = scale # convert input coordinates to arrange coordinates diff --git a/cura/AutoSave.py b/cura/AutoSave.py index 3b42fdafdf..2c1dbe4a84 100644 --- a/cura/AutoSave.py +++ b/cura/AutoSave.py @@ -2,12 +2,16 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QTimer +from typing import Any, TYPE_CHECKING from UM.Logger import Logger +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + class AutoSave: - def __init__(self, application): + def __init__(self, application: "CuraApplication") -> None: self._application = application self._application.getPreferences().preferenceChanged.connect(self._triggerTimer) @@ -22,14 +26,14 @@ class AutoSave: self._enabled = True self._saving = False - def initialize(self): + def initialize(self) -> None: # only initialise if the application is created and has started self._change_timer.timeout.connect(self._onTimeout) self._application.globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() self._triggerTimer() - def _triggerTimer(self, *args): + def _triggerTimer(self, *args: Any) -> None: if not self._saving: self._change_timer.start() @@ -40,7 +44,7 @@ class AutoSave: else: self._change_timer.stop() - def _onGlobalStackChanged(self): + def _onGlobalStackChanged(self) -> None: if self._global_stack: self._global_stack.propertyChanged.disconnect(self._triggerTimer) self._global_stack.containersChanged.disconnect(self._triggerTimer) @@ -51,7 +55,7 @@ class AutoSave: self._global_stack.propertyChanged.connect(self._triggerTimer) self._global_stack.containersChanged.connect(self._triggerTimer) - def _onTimeout(self): + def _onTimeout(self) -> None: self._saving = True # To prevent the save process from triggering another autosave. Logger.log("d", "Autosaving preferences, instances and profiles") diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8dd49c74f1..c1c2448a4d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -4,7 +4,7 @@ import os import sys import time -from typing import cast, TYPE_CHECKING, Optional, Callable, List +from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any import numpy @@ -193,7 +193,7 @@ class CuraApplication(QtApplication): self._cura_package_manager = None - self._machine_action_manager = None + self._machine_action_manager = None # type: Optional[MachineActionManager.MachineActionManager] self.empty_container = None # type: EmptyInstanceContainer self.empty_definition_changes_container = None # type: EmptyInstanceContainer @@ -699,7 +699,7 @@ class CuraApplication(QtApplication): self._message_box_callback_arguments = [] # Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. - def saveSettings(self): + def saveSettings(self) -> None: if not self.started: # Do not do saving during application start or when data should not be saved on quit. return @@ -989,8 +989,8 @@ class CuraApplication(QtApplication): ## Get the machine action manager # We ignore any *args given to this, as we also register the machine manager as qml singleton. # It wants to give this function an engine and script engine, but we don't care about that. - def getMachineActionManager(self, *args): - return self._machine_action_manager + def getMachineActionManager(self, *args: Any) -> MachineActionManager.MachineActionManager: + return cast(MachineActionManager.MachineActionManager, self._machine_action_manager) @pyqtSlot(result = QObject) def getMaterialManagementModel(self) -> MaterialManagementModel: diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index 6422469bdf..99f2072644 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List, Tuple +from typing import List, Tuple, TYPE_CHECKING, Optional from cura.CuraApplication import CuraApplication #To find some resource types. from cura.Settings.GlobalStack import GlobalStack @@ -9,12 +9,16 @@ from cura.Settings.GlobalStack import GlobalStack from UM.PackageManager import PackageManager #The class we're extending. from UM.Resources import Resources #To find storage paths for some resource types. +if TYPE_CHECKING: + from UM.Qt.QtApplication import QtApplication + from PyQt5.QtCore import QObject + class CuraPackageManager(PackageManager): - def __init__(self, application, parent = None): + def __init__(self, application: "QtApplication", parent: Optional["QObject"] = None): super().__init__(application, parent) - def initialize(self): + def initialize(self) -> None: self._installation_dirs_dict["materials"] = Resources.getStoragePath(CuraApplication.ResourceTypes.MaterialInstanceContainer) self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer) diff --git a/cura/Layer.py b/cura/Layer.py index 73fda64a45..933d4436c9 100644 --- a/cura/Layer.py +++ b/cura/Layer.py @@ -33,10 +33,10 @@ class Layer: def elementCount(self): return self._element_count - def setHeight(self, height): + def setHeight(self, height: float) -> None: self._height = height - def setThickness(self, thickness): + def setThickness(self, thickness: float) -> None: self._thickness = thickness def lineMeshVertexCount(self) -> int: diff --git a/cura/LayerDataDecorator.py b/cura/LayerDataDecorator.py index ef82d8f5cc..36466cac72 100644 --- a/cura/LayerDataDecorator.py +++ b/cura/LayerDataDecorator.py @@ -9,7 +9,7 @@ from cura.LayerData import LayerData ## Simple decorator to indicate a scene node holds layer data. class LayerDataDecorator(SceneNodeDecorator): - def __init__(self): + def __init__(self) -> None: super().__init__() self._layer_data = None # type: Optional[LayerData] diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 0d6489aaa2..ca752e35ee 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -149,17 +149,17 @@ class LayerPolygon: def getColors(self): return self._colors - def mapLineTypeToColor(self, line_types): + def mapLineTypeToColor(self, line_types: numpy.ndarray) -> numpy.ndarray: return self._color_map[line_types] - def isInfillOrSkinType(self, line_types): + def isInfillOrSkinType(self, line_types: numpy.ndarray) -> numpy.ndarray: return self._isInfillOrSkinTypeMap[line_types] - def lineMeshVertexCount(self): - return (self._vertex_end - self._vertex_begin) + def lineMeshVertexCount(self) -> int: + return self._vertex_end - self._vertex_begin - def lineMeshElementCount(self): - return (self._index_end - self._index_begin) + def lineMeshElementCount(self) -> int: + return self._index_end - self._index_begin @property def extruder(self): @@ -202,7 +202,7 @@ class LayerPolygon: return self._jump_count # Calculate normals for the entire polygon using numpy. - def getNormals(self): + def getNormals(self) -> numpy.ndarray: normals = numpy.copy(self._data) normals[:, 1] = 0.0 # We are only interested in 2D normals @@ -226,11 +226,11 @@ class LayerPolygon: return normals - __color_map = None # type: numpy.ndarray[Any] + __color_map = None # type: numpy.ndarray ## Gets the instance of the VersionUpgradeManager, or creates one. @classmethod - def getColorMap(cls): + def getColorMap(cls) -> numpy.ndarray: if cls.__color_map is None: theme = QtApplication.getInstance().getTheme() cls.__color_map = numpy.array([ diff --git a/cura/Machines/ContainerNode.py b/cura/Machines/ContainerNode.py index a8bbf0a537..8a9ddcc39b 100644 --- a/cura/Machines/ContainerNode.py +++ b/cura/Machines/ContainerNode.py @@ -26,7 +26,7 @@ class ContainerNode: ## Gets the metadata of the container that this node represents. # Getting the metadata from the container directly is about 10x as fast. # \return The metadata of the container in this node. - def getMetadata(self): + def getMetadata(self) -> Dict[str, Any]: return ContainerRegistry.getInstance().findContainersMetadata(id = self.container_id)[0] ## Get an entry from the metadata of the container that this node contains. diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index c2bfabea2c..a7bb0610bd 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -30,7 +30,7 @@ if TYPE_CHECKING: # nodes that have children) but that child node may be a node representing the # empty instance container. class ContainerTree: - __instance = None + __instance = None # type: Optional["ContainerTree"] @classmethod def getInstance(cls): @@ -75,7 +75,7 @@ class ContainerTree: return self.machines[global_stack.definition.getId()].getQualityChangesGroups(variant_names, material_bases, extruder_enabled) ## Ran after completely starting up the application. - def _onStartupFinished(self): + def _onStartupFinished(self) -> None: currently_added = ContainerRegistry.getInstance().findContainerStacks() # Find all currently added global stacks. JobQueue.getInstance().add(self._MachineNodeLoadJob(self, currently_added)) @@ -137,7 +137,7 @@ class ContainerTree: # \param container_stacks All of the stacks to pre-load the container # trees for. This needs to be provided from here because the stacks # need to be constructed on the main thread because they are QObject. - def __init__(self, tree_root: "ContainerTree", container_stacks: List["ContainerStack"]): + def __init__(self, tree_root: "ContainerTree", container_stacks: List["ContainerStack"]) -> None: self.tree_root = tree_root self.container_stacks = container_stacks super().__init__() diff --git a/cura/Machines/MachineErrorChecker.py b/cura/Machines/MachineErrorChecker.py index 4c6ed891b1..9460578f45 100644 --- a/cura/Machines/MachineErrorChecker.py +++ b/cura/Machines/MachineErrorChecker.py @@ -6,6 +6,7 @@ import time from collections import deque from PyQt5.QtCore import QObject, QTimer, pyqtSignal, pyqtProperty +from typing import Optional, Any, Set from UM.Application import Application from UM.Logger import Logger @@ -24,16 +25,16 @@ from UM.Settings.Validator import ValidatorState # class MachineErrorChecker(QObject): - def __init__(self, parent = None): + def __init__(self, parent: Optional[QObject] = None) -> None: super().__init__(parent) self._global_stack = None self._has_errors = True # Result of the error check, indicating whether there are errors in the stack - self._error_keys = set() # A set of settings keys that have errors - self._error_keys_in_progress = set() # The variable that stores the results of the currently in progress check + self._error_keys = set() # type: Set[str] # A set of settings keys that have errors + self._error_keys_in_progress = set() # type: Set[str] # The variable that stores the results of the currently in progress check - self._stacks_and_keys_to_check = None # a FIFO queue of tuples (stack, key) to check for errors + self._stacks_and_keys_to_check = None # type: Optional[deque] # a FIFO queue of tuples (stack, key) to check for errors self._need_to_check = False # Whether we need to schedule a new check or not. This flag is set when a new # error check needs to take place while there is already one running at the moment. @@ -42,7 +43,7 @@ class MachineErrorChecker(QObject): self._application = Application.getInstance() self._machine_manager = self._application.getMachineManager() - self._start_time = 0 # measure checking time + self._start_time = 0. # measure checking time # This timer delays the starting of error check so we can react less frequently if the user is frequently # changing settings. @@ -94,13 +95,13 @@ class MachineErrorChecker(QObject): # Start the error check for property changed # this is seperate from the startErrorCheck because it ignores a number property types - def startErrorCheckPropertyChanged(self, key, property_name): + def startErrorCheckPropertyChanged(self, key: str, property_name: str) -> None: if property_name != "value": return self.startErrorCheck() # Starts the error check timer to schedule a new error check. - def startErrorCheck(self, *args) -> None: + def startErrorCheck(self, *args: Any) -> None: if not self._check_in_progress: self._need_to_check = True self.needToWaitForResultChanged.emit() diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index 5bcaf12bfb..dcd4adcfdb 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -14,6 +14,7 @@ if TYPE_CHECKING: from typing import Dict from cura.Machines.VariantNode import VariantNode + ## Represents a material in the container tree. # # Its subcontainers are quality profiles. diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index 468351c62b..dd935fef6e 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -1,10 +1,10 @@ # Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional +from typing import Optional, Dict, Any class BaseModel: - def __init__(self, **kwargs): + def __init__(self, **kwargs: Any) -> None: self.__dict__.update(kwargs) @@ -53,9 +53,10 @@ class ResponseData(BaseModel): redirect_uri = None # type: Optional[str] content_type = "text/html" # type: str + ## Possible HTTP responses. HTTP_STATUS = { "OK": ResponseStatus(code = 200, message = "OK"), "NOT_FOUND": ResponseStatus(code = 404, message = "NOT FOUND"), "REDIRECT": ResponseStatus(code = 302, message = "REDIRECT") -} +} # type: Dict[str, ResponseStatus] diff --git a/cura/Operations/PlatformPhysicsOperation.py b/cura/Operations/PlatformPhysicsOperation.py index 9571679c3c..5aaa2ad94f 100644 --- a/cura/Operations/PlatformPhysicsOperation.py +++ b/cura/Operations/PlatformPhysicsOperation.py @@ -1,26 +1,27 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +from UM.Math.Vector import Vector from UM.Operations.Operation import Operation from UM.Operations.GroupedOperation import GroupedOperation from UM.Scene.SceneNode import SceneNode + ## A specialised operation designed specifically to modify the previous operation. class PlatformPhysicsOperation(Operation): - def __init__(self, node, translation): + def __init__(self, node: SceneNode, translation: Vector): super().__init__() self._node = node self._old_transformation = node.getLocalTransformation() self._translation = translation self._always_merge = True - def undo(self): + def undo(self) -> None: self._node.setTransformation(self._old_transformation) - def redo(self): + def redo(self) -> None: self._node.translate(self._translation, SceneNode.TransformSpace.World) - def mergeWith(self, other): + def mergeWith(self, other: Operation) -> GroupedOperation: group = GroupedOperation() group.addOperation(other) @@ -28,5 +29,5 @@ class PlatformPhysicsOperation(Operation): return group - def __repr__(self): + def __repr__(self) -> str: return "PlatformPhysicsOp.(trans.={0})".format(self._translation) diff --git a/cura/Operations/SetBuildPlateNumberOperation.py b/cura/Operations/SetBuildPlateNumberOperation.py index 96230639f9..fd48cf47d9 100644 --- a/cura/Operations/SetBuildPlateNumberOperation.py +++ b/cura/Operations/SetBuildPlateNumberOperation.py @@ -6,9 +6,9 @@ from UM.Operations.Operation import Operation from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator + ## Simple operation to set the buildplate number of a scenenode. class SetBuildPlateNumberOperation(Operation): - def __init__(self, node: SceneNode, build_plate_nr: int) -> None: super().__init__() self._node = node @@ -16,11 +16,11 @@ class SetBuildPlateNumberOperation(Operation): self._previous_build_plate_nr = None self._decorator_added = False - def undo(self): + def undo(self) -> None: if self._previous_build_plate_nr: self._node.callDecoration("setBuildPlateNumber", self._previous_build_plate_nr) - def redo(self): + def redo(self) -> None: stack = self._node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. if not stack: self._node.addDecorator(SettingOverrideDecorator()) diff --git a/cura/Operations/SetParentOperation.py b/cura/Operations/SetParentOperation.py index 612c02f18d..7efe2618fd 100644 --- a/cura/Operations/SetParentOperation.py +++ b/cura/Operations/SetParentOperation.py @@ -1,36 +1,37 @@ # Copyright (c) 2016 Ultimaker B.V. # Uranium is released under the terms of the LGPLv3 or higher. +from typing import Optional from UM.Scene.SceneNode import SceneNode from UM.Operations import Operation from UM.Math.Vector import Vector -## An operation that parents a scene node to another scene node. +## An operation that parents a scene node to another scene node. class SetParentOperation(Operation.Operation): ## Initialises this SetParentOperation. # # \param node The node which will be reparented. # \param parent_node The node which will be the parent. - def __init__(self, node, parent_node): + def __init__(self, node: SceneNode, parent_node: Optional[SceneNode]): super().__init__() self._node = node self._parent = parent_node self._old_parent = node.getParent() # To restore the previous parent in case of an undo. ## Undoes the set-parent operation, restoring the old parent. - def undo(self): + def undo(self) -> None: self._set_parent(self._old_parent) ## Re-applies the set-parent operation. - def redo(self): + def redo(self) -> None: self._set_parent(self._parent) ## Sets the parent of the node while applying transformations to the world-transform of the node stays the same. # # \param new_parent The new parent. Note: this argument can be None, which would hide the node from the scene. - def _set_parent(self, new_parent): + def _set_parent(self, new_parent: Optional[SceneNode]) -> None: if new_parent: current_parent = self._node.getParent() if current_parent: @@ -59,5 +60,5 @@ class SetParentOperation(Operation.Operation): ## Returns a programmer-readable representation of this operation. # # \return A programmer-readable representation of this operation. - def __repr__(self): + def __repr__(self) -> str: return "SetParentOperation(node = {0}, parent_node={1})".format(self._node, self._parent) diff --git a/cura/PrinterOutput/Models/PrintJobOutputModel.py b/cura/PrinterOutput/Models/PrintJobOutputModel.py index b4296a5494..256999b96f 100644 --- a/cura/PrinterOutput/Models/PrintJobOutputModel.py +++ b/cura/PrinterOutput/Models/PrintJobOutputModel.py @@ -161,7 +161,7 @@ class PrintJobOutputModel(QObject): self._time_elapsed = new_time_elapsed self.timeElapsedChanged.emit() - def updateState(self, new_state): + def updateState(self, new_state: str) -> None: if self._state != new_state: self._state = new_state self.stateChanged.emit() diff --git a/cura/Scene/BlockSlicingDecorator.py b/cura/Scene/BlockSlicingDecorator.py index 0536e1635f..d9c9e0ac5e 100644 --- a/cura/Scene/BlockSlicingDecorator.py +++ b/cura/Scene/BlockSlicingDecorator.py @@ -9,4 +9,4 @@ class BlockSlicingDecorator(SceneNodeDecorator): super().__init__() def isBlockSlicing(self) -> bool: - return True + return True \ No newline at end of file diff --git a/cura/UI/MachineActionManager.py b/cura/UI/MachineActionManager.py index aa90e909e2..6efd3217a1 100644 --- a/cura/UI/MachineActionManager.py +++ b/cura/UI/MachineActionManager.py @@ -43,7 +43,7 @@ class MachineActionManager(QObject): # Dict of all actions that need to be done when first added by definition ID self._first_start_actions = {} # type: Dict[str, List[MachineAction]] - def initialize(self): + def initialize(self) -> None: # Add machine_action as plugin type PluginRegistry.addType("machine_action", self.addMachineAction)