From a573a598b01445d0f785e4b9256d6c66e96012ab Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 12:40:44 +0200 Subject: [PATCH] Add typing and appease MYPY --- cura/PrinterOutput/FirmwareUpdater.py | 23 +++-- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutput/PrinterOutputController.py | 31 +++--- cura/PrinterOutput/PrinterOutputModel.py | 97 ++++++++++--------- plugins/USBPrinting/AvrFirmwareUpdater.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 +- 6 files changed, 83 insertions(+), 76 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index e7ffc2a2b5..06e019c593 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -5,9 +5,11 @@ from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty from UM.Resources import Resources from cura.PrinterOutputDevice import PrinterOutputDevice +from cura.CuraApplication import CuraApplication from enum import IntEnum from threading import Thread +from typing import Any class FirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() @@ -19,11 +21,11 @@ class FirmwareUpdater(QObject): self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_view = None - self._firmware_location = None + self._firmware_location = "" self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle - def updateFirmware(self, file): + def updateFirmware(self, file: Any[str, QUrl]) -> None: # the file path could be url-encoded. if file.startswith("file://"): self._firmware_location = QUrl(file).toLocalFile() @@ -33,10 +35,10 @@ class FirmwareUpdater(QObject): self.setFirmwareUpdateState(FirmwareUpdateState.updating) self._update_firmware_thread.start() - def _updateFirmware(self): + def _updateFirmware(self) -> None: raise NotImplementedError("_updateFirmware needs to be implemented") - def cleanupAfterUpdate(self): + def cleanupAfterUpdate(self) -> None: # Clean up for next attempt. self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_location = "" @@ -45,28 +47,29 @@ class FirmwareUpdater(QObject): ## Show firmware interface. # This will create the view if its not already created. - def showFirmwareInterface(self): + def showFirmwareInterface(self) -> None: if self._firmware_view is None: path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - self._firmware_view.show() + if self._firmware_view: + self._firmware_view.show() @pyqtProperty(float, notify = firmwareProgressChanged) - def firmwareProgress(self): + def firmwareProgress(self) -> float: return self._firmware_progress @pyqtProperty(int, notify=firmwareUpdateStateChanged) - def firmwareUpdateState(self): + def firmwareUpdateState(self) -> FirmwareUpdateState: return self._firmware_update_state - def setFirmwareUpdateState(self, state): + def setFirmwareUpdateState(self, state) -> None: if self._firmware_update_state != state: self._firmware_update_state = state self.firmwareUpdateStateChanged.emit() # Callback function for firmware update progress. - def _onFirmwareProgress(self, progress, max_progress = 100): + def _onFirmwareProgress(self, progress, max_progress = 100) -> None: self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 self.firmwareProgressChanged.emit() diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 7366b95f86..5b8cc39ad8 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -91,7 +91,7 @@ class PrintJobOutputModel(QObject): def assignedPrinter(self): return self._assigned_printer - def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): + def updateAssignedPrinter(self, assigned_printer: Optional[PrinterOutputModel]): if self._assigned_printer != assigned_printer: old_printer = self._assigned_printer self._assigned_printer = assigned_printer diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index dd2276d771..9a29233f95 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -4,15 +4,18 @@ from UM.Logger import Logger from UM.Signal import Signal +from typing import Any + MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice class PrinterOutputController: - def __init__(self, output_device): + def __init__(self, output_device: PrinterOutputDevice) -> None: self.can_pause = True self.can_abort = True self.can_pre_heat_bed = True @@ -22,44 +25,44 @@ class PrinterOutputController: self.can_update_firmware = False self._output_device = output_device - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: int): + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: Any[int, float]) -> None: Logger.log("w", "Set target hotend temperature not implemented in controller") - def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int) -> None: Logger.log("w", "Set target bed temperature not implemented in controller") - def setJobState(self, job: "PrintJobOutputModel", state: str): + def setJobState(self, job: "PrintJobOutputModel", state: str) -> None: Logger.log("w", "Set job state not implemented in controller") - def cancelPreheatBed(self, printer: "PrinterOutputModel"): + def cancelPreheatBed(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Cancel preheat bed not implemented in controller") - def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration) -> None: Logger.log("w", "Preheat bed not implemented in controller") - def cancelPreheatHotend(self, extruder: "ExtruderOutputModel"): + def cancelPreheatHotend(self, extruder: "ExtruderOutputModel") -> None: Logger.log("w", "Cancel preheat hotend not implemented in controller") - def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration): + def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration) -> None: Logger.log("w", "Preheat hotend not implemented in controller") - def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): + def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: Logger.log("w", "Set head position not implemented in controller") - def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: Logger.log("w", "Move head not implemented in controller") - def homeBed(self, printer: "PrinterOutputModel"): + def homeBed(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Home bed not implemented in controller") - def homeHead(self, printer: "PrinterOutputModel"): + def homeHead(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Home head not implemented in controller") - def sendRawCommand(self, printer: "PrinterOutputModel", command: str): + def sendRawCommand(self, printer: "PrinterOutputModel", command: str) -> None: Logger.log("w", "Custom command not implemented in controller") canUpdateFirmwareChanged = Signal() - def setCanUpdateFirmware(self, can_update_firmware: bool): + def setCanUpdateFirmware(self, can_update_firmware: bool) -> None: if can_update_firmware != self.can_update_firmware: self.can_update_firmware = can_update_firmware self.canUpdateFirmwareChanged.emit() \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 859165aef3..96feef1b55 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot -from typing import Optional +from typing import List, Dict, Optional from UM.Math.Vector import Vector from cura.PrinterOutput.ConfigurationModel import ConfigurationModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel @@ -11,6 +11,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.NetworkCamera import NetworkCamera class PrinterOutputModel(QObject): @@ -44,7 +45,7 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" self._is_preheating = False self._printer_type = "" - self._buildplate_name = None + self._buildplate_name = "" self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in self._extruders] @@ -52,32 +53,32 @@ class PrinterOutputModel(QObject): self._camera = None @pyqtProperty(str, constant = True) - def firmwareVersion(self): + def firmwareVersion(self) -> str: return self._firmware_version - def setCamera(self, camera): + def setCamera(self, camera: Optional["NetworkCamera"]) -> None: if self._camera is not camera: self._camera = camera self.cameraChanged.emit() - def updateIsPreheating(self, pre_heating): + def updateIsPreheating(self, pre_heating: bool) -> None: if self._is_preheating != pre_heating: self._is_preheating = pre_heating self.isPreheatingChanged.emit() @pyqtProperty(bool, notify=isPreheatingChanged) - def isPreheating(self): + def isPreheating(self) -> bool: return self._is_preheating @pyqtProperty(QObject, notify=cameraChanged) - def camera(self): + def camera(self) -> Optional["NetworkCamera"]: return self._camera @pyqtProperty(str, notify = printerTypeChanged) - def type(self): + def type(self) -> str: return self._printer_type - def updateType(self, printer_type): + def updateType(self, printer_type: str) -> None: if self._printer_type != printer_type: self._printer_type = printer_type self._printer_configuration.printerType = self._printer_type @@ -85,10 +86,10 @@ class PrinterOutputModel(QObject): self.configurationChanged.emit() @pyqtProperty(str, notify = buildplateChanged) - def buildplate(self): + def buildplate(self) -> str: return self._buildplate_name - def updateBuildplateName(self, buildplate_name): + def updateBuildplateName(self, buildplate_name: str) -> None: if self._buildplate_name != buildplate_name: self._buildplate_name = buildplate_name self._printer_configuration.buildplateConfiguration = self._buildplate_name @@ -96,66 +97,66 @@ class PrinterOutputModel(QObject): self.configurationChanged.emit() @pyqtProperty(str, notify=keyChanged) - def key(self): + def key(self) -> str: return self._key - def updateKey(self, key: str): + def updateKey(self, key: str) -> None: if self._key != key: self._key = key self.keyChanged.emit() @pyqtSlot() - def homeHead(self): + def homeHead(self) -> None: self._controller.homeHead(self) @pyqtSlot() - def homeBed(self): + def homeBed(self) -> None: self._controller.homeBed(self) @pyqtSlot(str) - def sendRawCommand(self, command: str): + def sendRawCommand(self, command: str) -> None: self._controller.sendRawCommand(self, command) @pyqtProperty("QVariantList", constant = True) - def extruders(self): + def extruders(self) -> List["ExtruderOutputModel"]: return self._extruders @pyqtProperty(QVariant, notify = headPositionChanged) - def headPosition(self): + def headPosition(self) -> Dict[str, float]: return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z} - def updateHeadPosition(self, x, y, z): + def updateHeadPosition(self, x: float, y: float, z: float) -> None: if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: self._head_position = Vector(x, y, z) self.headPositionChanged.emit() @pyqtProperty(float, float, float) @pyqtProperty(float, float, float, float) - def setHeadPosition(self, x, y, z, speed = 3000): + def setHeadPosition(self, x: float, y: float, z: float, speed: float = 3000) -> None: self.updateHeadPosition(x, y, z) self._controller.setHeadPosition(self, x, y, z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadX(self, x, speed = 3000): + def setHeadX(self, x: float, speed: float = 3000) -> None: self.updateHeadPosition(x, self._head_position.y, self._head_position.z) self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadY(self, y, speed = 3000): + def setHeadY(self, y: float, speed: float = 3000) -> None: self.updateHeadPosition(self._head_position.x, y, self._head_position.z) self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadZ(self, z, speed = 3000): + def setHeadZ(self, z: float, speed:float = 3000) -> None: self.updateHeadPosition(self._head_position.x, self._head_position.y, z) self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) @pyqtSlot(float, float, float) @pyqtSlot(float, float, float, float) - def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): + def moveHead(self, x: float = 0, y: float = 0, z: float = 0, speed: float = 3000) -> None: self._controller.moveHead(self, x, y, z, speed) ## Pre-heats the heated bed of the printer. @@ -164,47 +165,47 @@ class PrinterOutputModel(QObject): # Celsius. # \param duration How long the bed should stay warm, in seconds. @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): + def preheatBed(self, temperature: float, duration: float) -> None: self._controller.preheatBed(self, temperature, duration) @pyqtSlot() - def cancelPreheatBed(self): + def cancelPreheatBed(self) -> None: self._controller.cancelPreheatBed(self) - def getController(self): + def getController(self) -> PrinterOutputController: return self._controller @pyqtProperty(str, notify=nameChanged) - def name(self): + def name(self) -> str: return self._name - def setName(self, name): + def setName(self, name: str) -> None: self._setName(name) self.updateName(name) - def updateName(self, name): + def updateName(self, name: str) -> None: if self._name != name: self._name = name self.nameChanged.emit() ## Update the bed temperature. This only changes it locally. - def updateBedTemperature(self, temperature): + def updateBedTemperature(self, temperature: int) -> None: if self._bed_temperature != temperature: self._bed_temperature = temperature self.bedTemperatureChanged.emit() - def updateTargetBedTemperature(self, temperature): + def updateTargetBedTemperature(self, temperature: int) -> None: if self._target_bed_temperature != temperature: self._target_bed_temperature = temperature self.targetBedTemperatureChanged.emit() ## Set the target bed temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) - def setTargetBedTemperature(self, temperature): + def setTargetBedTemperature(self, temperature: int) -> None: self._controller.setTargetBedTemperature(self, temperature) self.updateTargetBedTemperature(temperature) - def updateActivePrintJob(self, print_job): + def updateActivePrintJob(self, print_job: Optional[PrintJobOutputModel]) -> None: if self._active_print_job != print_job: old_print_job = self._active_print_job @@ -216,83 +217,83 @@ class PrinterOutputModel(QObject): old_print_job.updateAssignedPrinter(None) self.activePrintJobChanged.emit() - def updateState(self, printer_state): + def updateState(self, printer_state: str) -> None: if self._printer_state != printer_state: self._printer_state = printer_state self.stateChanged.emit() @pyqtProperty(QObject, notify = activePrintJobChanged) - def activePrintJob(self): + def activePrintJob(self) -> Optional[PrintJobOutputModel]: return self._active_print_job @pyqtProperty(str, notify=stateChanged) - def state(self): + def state(self) -> str: return self._printer_state @pyqtProperty(int, notify = bedTemperatureChanged) - def bedTemperature(self): + def bedTemperature(self) -> int: return self._bed_temperature @pyqtProperty(int, notify=targetBedTemperatureChanged) - def targetBedTemperature(self): + def targetBedTemperature(self) -> int: return self._target_bed_temperature # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) - def canPreHeatBed(self): + def canPreHeatBed(self) -> bool: if self._controller: return self._controller.can_pre_heat_bed return False # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) - def canPreHeatHotends(self): + def canPreHeatHotends(self) -> bool: if self._controller: return self._controller.can_pre_heat_hotends return False # Does the printer support sending raw G-code at all @pyqtProperty(bool, constant=True) - def canSendRawGcode(self): + def canSendRawGcode(self) -> bool: if self._controller: return self._controller.can_send_raw_gcode return False # Does the printer support pause at all @pyqtProperty(bool, constant=True) - def canPause(self): + def canPause(self) -> bool: if self._controller: return self._controller.can_pause return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) - def canAbort(self): + def canAbort(self) -> bool: if self._controller: return self._controller.can_abort return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) - def canControlManually(self): + def canControlManually(self) -> bool: if self._controller: return self._controller.can_control_manually return False # Does the printer support upgrading firmware @pyqtProperty(bool, notify = canUpdateFirmwareChanged) - def canUpdateFirmware(self): + def canUpdateFirmware(self) -> bool: if self._controller: return self._controller.can_update_firmware return False # Stub to connect UM.Signal to pyqtSignal - def _onControllerCanUpdateFirmwareChanged(self): + def _onControllerCanUpdateFirmwareChanged(self) -> None: self.canUpdateFirmwareChanged.emit() # Returns the configuration (material, variant and buildplate) of the current printer @pyqtProperty(QObject, notify = configurationChanged) - def printerConfiguration(self): + def printerConfiguration(self) -> Optional[ConfigurationModel]: if self._printer_configuration.isValid(): return self._printer_configuration return None \ No newline at end of file diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 171c81d557..c3852c46f6 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -10,7 +10,7 @@ class AvrFirmwareUpdater(FirmwareUpdater): def __init__(self, output_device: PrinterOutputDevice) -> None: super().__init__(output_device) - def _updateFirmware(self): + def _updateFirmware(self) -> None: try: hex_file = intelHex.readHex(self._firmware_location) assert len(hex_file) > 0 diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 4813696ffe..5e18e216bc 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -99,12 +99,12 @@ class USBPrinterOutputDevice(PrinterOutputDevice): application.triggerNextExitCheck() @pyqtSlot(str) - def updateFirmware(self, file): + def updateFirmware(self, file: Any[str, QUrl]) -> None: self._firmware_updater.updateFirmware(file) ## Reset USB device settings # - def resetDeviceSettings(self): + def resetDeviceSettings(self) -> None: self._firmware_name = None ## Request the current scene to be sent to a USB-connected printer.