diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index f8618712a1..4c88e5c953 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -1,31 +1,33 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import math +import re +from typing import Dict, List, NamedTuple, Optional, Union + +import numpy + from UM.Backend import Backend from UM.Job import Job from UM.Logger import Logger from UM.Math.Vector import Vector from UM.Message import Message -from cura.Scene.CuraSceneNode import CuraSceneNode from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - from cura.CuraApplication import CuraApplication from cura.LayerDataBuilder import LayerDataBuilder from cura.LayerDataDecorator import LayerDataDecorator from cura.LayerPolygon import LayerPolygon +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Scene.GCodeListDecorator import GCodeListDecorator from cura.Settings.ExtruderManager import ExtruderManager -import numpy -import math -import re -from typing import Dict, List, NamedTuple, Optional, Union +catalog = i18nCatalog("cura") PositionOptional = NamedTuple("Position", [("x", Optional[float]), ("y", Optional[float]), ("z", Optional[float]), ("f", Optional[float]), ("e", Optional[float])]) Position = NamedTuple("Position", [("x", float), ("y", float), ("z", float), ("f", float), ("e", List[float])]) + ## This parser is intended to interpret the common firmware codes among all the # different flavors class FlavorParser: @@ -33,7 +35,7 @@ class FlavorParser: def __init__(self) -> None: CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage) self._cancelled = False - self._message = None + self._message = None # type: Optional[Message] self._layer_number = 0 self._extruder_number = 0 self._clearValues() @@ -425,7 +427,8 @@ class FlavorParser: if line.startswith("M"): M = self._getInt(line, "M") - self.processMCode(M, line, current_position, current_path) + if M is not None: + self.processMCode(M, line, current_position, current_path) # "Flush" leftovers. Last layer paths are still stored if len(current_path) > 1: @@ -463,7 +466,7 @@ class FlavorParser: Logger.log("w", "File doesn't contain any valid layers") settings = CuraApplication.getInstance().getGlobalContainerStack() - if not settings.getProperty("machine_center_is_zero", "value"): + if settings is not None and not settings.getProperty("machine_center_is_zero", "value"): machine_width = settings.getProperty("machine_width", "value") machine_depth = settings.getProperty("machine_depth", "value") scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index 78f9cc0516..123733b863 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -162,7 +162,7 @@ class PostProcessingPlugin(QObject, Extension): loaded_script = importlib.util.module_from_spec(spec) if spec.loader is None: continue - spec.loader.exec_module(loaded_script) + spec.loader.exec_module(loaded_script) # type: ignore sys.modules[script_name] = loaded_script #TODO: This could be a security risk. Overwrite any module with a user-provided name? loaded_class = getattr(loaded_script, script_name) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 0c044bbb56..5421de0f2f 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -85,10 +85,11 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # We use the Cura Connect monitor tab to get most functionality right away. if PluginRegistry.getInstance() is not None: - self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" - ) + plugin_path = PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting") + if plugin_path is None: + Logger.log("e", "Cloud not find plugin path for plugin UM3NetworkPrnting") + raise RuntimeError("Cloud not find plugin path for plugin UM3NetworkPrnting") + self._monitor_view_qml_path = os.path.join(plugin_path, "resources", "qml", "MonitorStage.qml") # Trigger the printersChanged signal when the private signal is triggered. self.printersChanged.connect(self._clusterPrintersChanged) @@ -149,7 +150,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # the host name should then be "ultimakersystem-aabbccdd0011" if network_key.startswith(self.clusterData.host_name): return True - + # However, for manually added printers, the local IP address is used in lieu of a proper # network key, so check for that as well if self.clusterData.host_internal_ip is not None and network_key.find(self.clusterData.host_internal_ip): diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index da63f11158..556ae5f61a 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -66,10 +66,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._received_print_jobs = False # type: bool if PluginRegistry.getInstance() is not None: - self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" - ) + plugin_path = PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting") + if plugin_path is None: + Logger.log("e", "Cloud not find plugin path for plugin UM3NetworkPrnting") + raise RuntimeError("Cloud not find plugin path for plugin UM3NetworkPrnting") + self._monitor_view_qml_path = os.path.join(plugin_path, "resources", "qml", "MonitorStage.qml") # Trigger the printersChanged signal when the private signal is triggered self.printersChanged.connect(self._clusterPrintersChanged)