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