From 99449dbc344ac949358a77fbd04326dbab24e342 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 25 Feb 2022 13:25:35 +0100 Subject: [PATCH 1/5] Get rid of some errors first. Was using Qt5 still, even though we're dumping that. Need a bit of a level playing field for an update to the way we handle libArcus and libSavitar. part of CURA-7924 --- plugins/Marketplace/LocalPackageList.py | 6 +++--- plugins/Marketplace/Marketplace.py | 2 +- plugins/Marketplace/PackageList.py | 8 ++++---- plugins/Marketplace/PackageModel.py | 4 ++-- plugins/Marketplace/RemotePackageList.py | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/Marketplace/LocalPackageList.py b/plugins/Marketplace/LocalPackageList.py index a609e72d33..ae719b2699 100644 --- a/plugins/Marketplace/LocalPackageList.py +++ b/plugins/Marketplace/LocalPackageList.py @@ -3,7 +3,7 @@ from typing import Any, Dict, List, Optional, TYPE_CHECKING -from PyQt5.QtCore import pyqtSlot, QObject +from PyQt6.QtCore import pyqtSlot, QObject from UM.Version import Version from UM.i18n import i18nCatalog @@ -15,8 +15,8 @@ from .PackageModel import PackageModel from .Constants import PACKAGE_UPDATES_URL if TYPE_CHECKING: - from PyQt5.QtCore import QObject - from PyQt5.QtNetwork import QNetworkReply + from PyQt6.QtCore import QObject + from PyQt6.QtNetwork import QNetworkReply catalog = i18nCatalog("cura") diff --git a/plugins/Marketplace/Marketplace.py b/plugins/Marketplace/Marketplace.py index 2d98947572..46b20542c9 100644 --- a/plugins/Marketplace/Marketplace.py +++ b/plugins/Marketplace/Marketplace.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import os.path -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject +from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from typing import Optional, cast from cura.CuraApplication import CuraApplication # Creating QML objects and managing packages. diff --git a/plugins/Marketplace/PackageList.py b/plugins/Marketplace/PackageList.py index 04b602002c..30162afe6c 100644 --- a/plugins/Marketplace/PackageList.py +++ b/plugins/Marketplace/PackageList.py @@ -4,7 +4,7 @@ import tempfile import json import os.path -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, Qt +from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, Qt from typing import cast, Dict, Optional, Set, TYPE_CHECKING from UM.i18n import i18nCatalog @@ -22,8 +22,8 @@ from .PackageModel import PackageModel from .Constants import USER_PACKAGES_URL, PACKAGES_URL if TYPE_CHECKING: - from PyQt5.QtCore import QObject - from PyQt5.QtNetwork import QNetworkReply + from PyQt6.QtCore import QObject + from PyQt6.QtNetwork import QNetworkReply catalog = i18nCatalog("cura") @@ -32,7 +32,7 @@ class PackageList(ListModel): """ A List model for Packages, this class serves as parent class for more detailed implementations. such as Packages obtained from Remote or Local source """ - PackageRole = Qt.UserRole + 1 + PackageRole = Qt.ItemDataRole.UserRole + 1 DISK_WRITE_BUFFER_SIZE = 256 * 1024 # 256 KB def __init__(self, parent: Optional["QObject"] = None) -> None: diff --git a/plugins/Marketplace/PackageModel.py b/plugins/Marketplace/PackageModel.py index 7c2a5d9ae1..cbcc483c9d 100644 --- a/plugins/Marketplace/PackageModel.py +++ b/plugins/Marketplace/PackageModel.py @@ -5,8 +5,8 @@ import re from enum import Enum from typing import Any, cast, Dict, List, Optional -from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal, pyqtSlot -from PyQt5.QtQml import QQmlEngine +from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal, pyqtSlot +from PyQt6.QtQml import QQmlEngine from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager diff --git a/plugins/Marketplace/RemotePackageList.py b/plugins/Marketplace/RemotePackageList.py index 16b0e721ad..eb97f39606 100644 --- a/plugins/Marketplace/RemotePackageList.py +++ b/plugins/Marketplace/RemotePackageList.py @@ -1,8 +1,8 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot -from PyQt5.QtNetwork import QNetworkReply +from PyQt6.QtCore import pyqtProperty, pyqtSignal, pyqtSlot +from PyQt6.QtNetwork import QNetworkReply from typing import Optional, TYPE_CHECKING from UM.i18n import i18nCatalog @@ -14,7 +14,7 @@ from .PackageList import PackageList from .PackageModel import PackageModel # The contents of this list. if TYPE_CHECKING: - from PyQt5.QtCore import QObject + from PyQt6.QtCore import QObject catalog = i18nCatalog("cura") From 08c49c6c139eb4a2c34078c6365cd510aca42afa Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 25 Feb 2022 14:27:06 +0100 Subject: [PATCH 2/5] Changes needed wrt how we build Arcus with Sip 6. part of CURA-7924 --- .../CuraEngineBackend/CuraEngineBackend.py | 30 +++++++++---------- plugins/CuraEngineBackend/StartSliceJob.py | 10 +++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 55a9415899..8cfc4cff34 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -31,7 +31,7 @@ from cura.Utils.Threading import call_on_qt_thread from .ProcessSlicedLayersJob import ProcessSlicedLayersJob from .StartSliceJob import StartSliceJob, StartJobResult -import Arcus +import pyArcus if TYPE_CHECKING: from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel @@ -102,8 +102,8 @@ class CuraEngineBackend(QObject, Backend): self._layer_view_active = False #type: bool self._onActiveViewChanged() - self._stored_layer_data = [] # type: List[Arcus.PythonMessage] - self._stored_optimized_layer_data = {} # type: Dict[int, List[Arcus.PythonMessage]] # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob + self._stored_layer_data = [] # type: List[pyArcus.PythonMessage] + self._stored_optimized_layer_data = {} # type: Dict[int, List[pyArcus.PythonMessage]] # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob self._scene = application.getController().getScene() #type: Scene self._scene.sceneChanged.connect(self._onSceneChanged) @@ -607,7 +607,7 @@ class CuraEngineBackend(QObject, Backend): self._invokeSlice() - def _onSocketError(self, error: Arcus.Error) -> None: + def _onSocketError(self, error: pyArcus.Error) -> None: """Called when an error occurs in the socket connection towards the engine. :param error: The exception that occurred. @@ -617,18 +617,18 @@ class CuraEngineBackend(QObject, Backend): return super()._onSocketError(error) - if error.getErrorCode() == Arcus.ErrorCode.Debug: + if error.getErrorCode() == pyArcus.ErrorCode.Debug: return self._terminate() self._createSocket() - if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]: + if error.getErrorCode() not in [pyArcus.ErrorCode.BindFailedError, pyArcus.ErrorCode.ConnectionResetError, pyArcus.ErrorCode.Debug]: Logger.log("w", "A socket error caused the connection to be reset") # _terminate()' function sets the job status to 'cancel', after reconnecting to another Port the job status # needs to be updated. Otherwise backendState is "Unable To Slice" - if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None: + if error.getErrorCode() == pyArcus.ErrorCode.BindFailedError and self._start_slice_job is not None: self._start_slice_job.setIsCancelled(False) # Check if there's any slicable object in the scene. @@ -695,7 +695,7 @@ class CuraEngineBackend(QObject, Backend): self.needsSlicing() self._onChanged() - def _onLayerMessage(self, message: Arcus.PythonMessage) -> None: + def _onLayerMessage(self, message: pyArcus.PythonMessage) -> None: """Called when a sliced layer data message is received from the engine. :param message: The protobuf message containing sliced layer data. @@ -703,7 +703,7 @@ class CuraEngineBackend(QObject, Backend): self._stored_layer_data.append(message) - def _onOptimizedLayerMessage(self, message: Arcus.PythonMessage) -> None: + def _onOptimizedLayerMessage(self, message: pyArcus.PythonMessage) -> None: """Called when an optimized sliced layer data message is received from the engine. :param message: The protobuf message containing sliced layer data. @@ -714,7 +714,7 @@ class CuraEngineBackend(QObject, Backend): self._stored_optimized_layer_data[self._start_slice_job_build_plate] = [] self._stored_optimized_layer_data[self._start_slice_job_build_plate].append(message) - def _onProgressMessage(self, message: Arcus.PythonMessage) -> None: + def _onProgressMessage(self, message: pyArcus.PythonMessage) -> None: """Called when a progress message is received from the engine. :param message: The protobuf message containing the slicing progress. @@ -736,7 +736,7 @@ class CuraEngineBackend(QObject, Backend): else: self._change_timer.start() - def _onSlicingFinishedMessage(self, message: Arcus.PythonMessage) -> None: + def _onSlicingFinishedMessage(self, message: pyArcus.PythonMessage) -> None: """Called when the engine sends a message that slicing is finished. :param message: The protobuf message signalling that slicing is finished. @@ -784,7 +784,7 @@ class CuraEngineBackend(QObject, Backend): self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode self._invokeSlice() - def _onGCodeLayerMessage(self, message: Arcus.PythonMessage) -> None: + def _onGCodeLayerMessage(self, message: pyArcus.PythonMessage) -> None: """Called when a g-code message is received from the engine. :param message: The protobuf message containing g-code, encoded as UTF-8. @@ -795,7 +795,7 @@ class CuraEngineBackend(QObject, Backend): except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end. pass # Throw the message away. - def _onGCodePrefixMessage(self, message: Arcus.PythonMessage) -> None: + def _onGCodePrefixMessage(self, message: pyArcus.PythonMessage) -> None: """Called when a g-code prefix message is received from the engine. :param message: The protobuf message containing the g-code prefix, @@ -841,7 +841,7 @@ class CuraEngineBackend(QObject, Backend): else: self._change_timer.start() - def _onPrintTimeMaterialEstimates(self, message: Arcus.PythonMessage) -> None: + def _onPrintTimeMaterialEstimates(self, message: pyArcus.PythonMessage) -> None: """Called when a print time message is received from the engine. :param message: The protobuf message containing the print time per feature and @@ -855,7 +855,7 @@ class CuraEngineBackend(QObject, Backend): times = self._parseMessagePrintTimes(message) self.printDurationMessage.emit(self._start_slice_job_build_plate, times, material_amounts) - def _parseMessagePrintTimes(self, message: Arcus.PythonMessage) -> Dict[str, float]: + def _parseMessagePrintTimes(self, message: pyArcus.PythonMessage) -> Dict[str, float]: """Called for parsing message to retrieve estimated time per feature :param message: The protobuf message containing the print time per feature diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 0e592c8d20..4a83fcbc30 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -7,7 +7,7 @@ from enum import IntEnum import time from typing import Any, cast, Dict, List, Optional, Set import re -import Arcus #For typing. +import pyArcus #For typing. from PyQt6.QtCore import QCoreApplication from UM.Job import Job @@ -90,17 +90,17 @@ class GcodeStartEndFormatter(Formatter): class StartSliceJob(Job): """Job class that builds up the message of scene data to send to CuraEngine.""" - def __init__(self, slice_message: Arcus.PythonMessage) -> None: + def __init__(self, slice_message: pyArcus.PythonMessage) -> None: super().__init__() self._scene = CuraApplication.getInstance().getController().getScene() #type: Scene - self._slice_message = slice_message #type: Arcus.PythonMessage + self._slice_message = slice_message #type: pyArcus.PythonMessage self._is_cancelled = False #type: bool self._build_plate_number = None #type: Optional[int] self._all_extruders_settings = None #type: Optional[Dict[str, Any]] # cache for all setting values from all stacks (global & extruder) for the current machine - def getSliceMessage(self) -> Arcus.PythonMessage: + def getSliceMessage(self) -> pyArcus.PythonMessage: return self._slice_message def setBuildPlate(self, build_plate_number: int) -> None: @@ -502,7 +502,7 @@ class StartSliceJob(Job): setting_extruder.extruder = extruder_position Job.yieldThread() - def _handlePerObjectSettings(self, node: CuraSceneNode, message: Arcus.PythonMessage): + def _handlePerObjectSettings(self, node: CuraSceneNode, message: pyArcus.PythonMessage): """Check if a node has per object settings and ensure that they are set correctly in the message :param node: Node to check. From 7511ac843e1397dd2016399fdcc796d1de0636cd Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 25 Feb 2022 14:31:51 +0100 Subject: [PATCH 3/5] Changes needed wrt how we build Savitar with Sip 6. part of CURA-7924 --- plugins/3MFReader/ThreeMFReader.py | 6 +++--- plugins/3MFWriter/ThreeMFWriter.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 37ca1e98aa..1299b4181a 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -5,7 +5,7 @@ import os.path import zipfile from typing import List, Optional, Union, TYPE_CHECKING, cast -import Savitar +import pySavitar import numpy from UM.Logger import Logger @@ -90,7 +90,7 @@ class ThreeMFReader(MeshReader): return temp_mat - def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: + def _convertSavitarNodeToUMNode(self, savitar_node: pySavitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: """Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node. :returns: Scene node. @@ -206,7 +206,7 @@ class ThreeMFReader(MeshReader): try: archive = zipfile.ZipFile(file_name, "r") self._base_name = os.path.basename(file_name) - parser = Savitar.ThreeMFParser() + parser = pySavitar.ThreeMFParser() scene_3mf = parser.parse(archive.open("3D/3dmodel.model").read()) self._unit = scene_3mf.getUnit() diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 75401c7d94..57cbe25d9e 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -15,7 +15,7 @@ from cura.Snapshot import Snapshot from PyQt6.QtCore import QBuffer -import Savitar +import pySavitar import numpy import datetime @@ -85,7 +85,7 @@ class ThreeMFWriter(MeshWriter): if um_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: return - savitar_node = Savitar.SceneNode() + savitar_node = pySavitar.SceneNode() savitar_node.setName(um_node.getName()) node_matrix = um_node.getLocalTransformation() @@ -169,7 +169,7 @@ class ThreeMFWriter(MeshWriter): # Add thumbnail relation to _rels/.rels file thumbnail_relation_element = ET.SubElement(relations_element, "Relationship", Target = "/Metadata/thumbnail.png", Id = "rel1", Type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") - savitar_scene = Savitar.Scene() + savitar_scene = pySavitar.Scene() metadata_to_store = CuraApplication.getInstance().getController().getScene().getMetaData() @@ -215,7 +215,7 @@ class ThreeMFWriter(MeshWriter): if savitar_node: savitar_scene.addSceneNode(savitar_node) - parser = Savitar.ThreeMFParser() + parser = pySavitar.ThreeMFParser() scene_string = parser.sceneToString(savitar_scene) archive.writestr(model_file, scene_string) From 47588393e8acc71a1ce8d5244070232f3ca0ca7e Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 28 Feb 2022 10:41:24 +0100 Subject: [PATCH 4/5] Use Arcus as namespace Because we had to rename our Python bindings module from Arcus to pyArcus we also changed our import downstream (Cura and Uranium). But in order to limit the changes on our existing code we decided during the review that we should just import pyArcus as Arcus. Contributes to CURA-7924 --- .../CuraEngineBackend/CuraEngineBackend.py | 34 +++++++++---------- plugins/CuraEngineBackend/StartSliceJob.py | 14 ++++---- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 8cfc4cff34..d7ed5fac21 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -1,5 +1,5 @@ -# Copyright (c) 2021 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. +# Copyright (c) 2021-2022 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. import argparse #To run the engine in debug mode if the front-end is in debug mode. from collections import defaultdict @@ -31,7 +31,7 @@ from cura.Utils.Threading import call_on_qt_thread from .ProcessSlicedLayersJob import ProcessSlicedLayersJob from .StartSliceJob import StartSliceJob, StartJobResult -import pyArcus +import pyArcus as Arcus if TYPE_CHECKING: from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel @@ -102,8 +102,8 @@ class CuraEngineBackend(QObject, Backend): self._layer_view_active = False #type: bool self._onActiveViewChanged() - self._stored_layer_data = [] # type: List[pyArcus.PythonMessage] - self._stored_optimized_layer_data = {} # type: Dict[int, List[pyArcus.PythonMessage]] # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob + self._stored_layer_data = [] # type: List[Arcus.PythonMessage] + self._stored_optimized_layer_data = {} # type: Dict[int, List[Arcus.PythonMessage]] # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob self._scene = application.getController().getScene() #type: Scene self._scene.sceneChanged.connect(self._onSceneChanged) @@ -607,7 +607,7 @@ class CuraEngineBackend(QObject, Backend): self._invokeSlice() - def _onSocketError(self, error: pyArcus.Error) -> None: + def _onSocketError(self, error: Arcus.Error) -> None: """Called when an error occurs in the socket connection towards the engine. :param error: The exception that occurred. @@ -617,18 +617,18 @@ class CuraEngineBackend(QObject, Backend): return super()._onSocketError(error) - if error.getErrorCode() == pyArcus.ErrorCode.Debug: + if error.getErrorCode() == Arcus.ErrorCode.Debug: return self._terminate() self._createSocket() - if error.getErrorCode() not in [pyArcus.ErrorCode.BindFailedError, pyArcus.ErrorCode.ConnectionResetError, pyArcus.ErrorCode.Debug]: + if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]: Logger.log("w", "A socket error caused the connection to be reset") # _terminate()' function sets the job status to 'cancel', after reconnecting to another Port the job status # needs to be updated. Otherwise backendState is "Unable To Slice" - if error.getErrorCode() == pyArcus.ErrorCode.BindFailedError and self._start_slice_job is not None: + if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None: self._start_slice_job.setIsCancelled(False) # Check if there's any slicable object in the scene. @@ -695,7 +695,7 @@ class CuraEngineBackend(QObject, Backend): self.needsSlicing() self._onChanged() - def _onLayerMessage(self, message: pyArcus.PythonMessage) -> None: + def _onLayerMessage(self, message: Arcus.PythonMessage) -> None: """Called when a sliced layer data message is received from the engine. :param message: The protobuf message containing sliced layer data. @@ -703,7 +703,7 @@ class CuraEngineBackend(QObject, Backend): self._stored_layer_data.append(message) - def _onOptimizedLayerMessage(self, message: pyArcus.PythonMessage) -> None: + def _onOptimizedLayerMessage(self, message: Arcus.PythonMessage) -> None: """Called when an optimized sliced layer data message is received from the engine. :param message: The protobuf message containing sliced layer data. @@ -714,7 +714,7 @@ class CuraEngineBackend(QObject, Backend): self._stored_optimized_layer_data[self._start_slice_job_build_plate] = [] self._stored_optimized_layer_data[self._start_slice_job_build_plate].append(message) - def _onProgressMessage(self, message: pyArcus.PythonMessage) -> None: + def _onProgressMessage(self, message: Arcus.PythonMessage) -> None: """Called when a progress message is received from the engine. :param message: The protobuf message containing the slicing progress. @@ -736,7 +736,7 @@ class CuraEngineBackend(QObject, Backend): else: self._change_timer.start() - def _onSlicingFinishedMessage(self, message: pyArcus.PythonMessage) -> None: + def _onSlicingFinishedMessage(self, message: Arcus.PythonMessage) -> None: """Called when the engine sends a message that slicing is finished. :param message: The protobuf message signalling that slicing is finished. @@ -784,7 +784,7 @@ class CuraEngineBackend(QObject, Backend): self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode self._invokeSlice() - def _onGCodeLayerMessage(self, message: pyArcus.PythonMessage) -> None: + def _onGCodeLayerMessage(self, message: Arcus.PythonMessage) -> None: """Called when a g-code message is received from the engine. :param message: The protobuf message containing g-code, encoded as UTF-8. @@ -795,7 +795,7 @@ class CuraEngineBackend(QObject, Backend): except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end. pass # Throw the message away. - def _onGCodePrefixMessage(self, message: pyArcus.PythonMessage) -> None: + def _onGCodePrefixMessage(self, message: Arcus.PythonMessage) -> None: """Called when a g-code prefix message is received from the engine. :param message: The protobuf message containing the g-code prefix, @@ -841,7 +841,7 @@ class CuraEngineBackend(QObject, Backend): else: self._change_timer.start() - def _onPrintTimeMaterialEstimates(self, message: pyArcus.PythonMessage) -> None: + def _onPrintTimeMaterialEstimates(self, message: Arcus.PythonMessage) -> None: """Called when a print time message is received from the engine. :param message: The protobuf message containing the print time per feature and @@ -855,7 +855,7 @@ class CuraEngineBackend(QObject, Backend): times = self._parseMessagePrintTimes(message) self.printDurationMessage.emit(self._start_slice_job_build_plate, times, material_amounts) - def _parseMessagePrintTimes(self, message: pyArcus.PythonMessage) -> Dict[str, float]: + def _parseMessagePrintTimes(self, message: Arcus.PythonMessage) -> Dict[str, float]: """Called for parsing message to retrieve estimated time per feature :param message: The protobuf message containing the print time per feature diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 4a83fcbc30..4c38c16f28 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -1,5 +1,5 @@ -# Copyright (c) 2021 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. +# Copyright (c) 2021-2022 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. import numpy from string import Formatter @@ -7,7 +7,7 @@ from enum import IntEnum import time from typing import Any, cast, Dict, List, Optional, Set import re -import pyArcus #For typing. +import pyArcus as Arcus # For typing. from PyQt6.QtCore import QCoreApplication from UM.Job import Job @@ -90,17 +90,17 @@ class GcodeStartEndFormatter(Formatter): class StartSliceJob(Job): """Job class that builds up the message of scene data to send to CuraEngine.""" - def __init__(self, slice_message: pyArcus.PythonMessage) -> None: + def __init__(self, slice_message: Arcus.PythonMessage) -> None: super().__init__() self._scene = CuraApplication.getInstance().getController().getScene() #type: Scene - self._slice_message = slice_message #type: pyArcus.PythonMessage + self._slice_message: Arcus.PythonMessage = slice_message self._is_cancelled = False #type: bool self._build_plate_number = None #type: Optional[int] self._all_extruders_settings = None #type: Optional[Dict[str, Any]] # cache for all setting values from all stacks (global & extruder) for the current machine - def getSliceMessage(self) -> pyArcus.PythonMessage: + def getSliceMessage(self) -> Arcus.PythonMessage: return self._slice_message def setBuildPlate(self, build_plate_number: int) -> None: @@ -502,7 +502,7 @@ class StartSliceJob(Job): setting_extruder.extruder = extruder_position Job.yieldThread() - def _handlePerObjectSettings(self, node: CuraSceneNode, message: pyArcus.PythonMessage): + def _handlePerObjectSettings(self, node: CuraSceneNode, message: Arcus.PythonMessage): """Check if a node has per object settings and ensure that they are set correctly in the message :param node: Node to check. From ca430c80becc553c3b4a4e77c430623c82585df3 Mon Sep 17 00:00:00 2001 From: "j.spijker@ultimaker.com" Date: Mon, 28 Feb 2022 10:44:16 +0100 Subject: [PATCH 5/5] Change imported namespace pySavitar to Savitar Because we had to rename our Python bindings module from Savitar to pySavitar we also changed our import downstream (Cura and Uranium). But in order to limit the changes on our existing code we decided during the review that we should just import pySavitar as Savitar. Contributes to CURA-7924 --- plugins/3MFReader/ThreeMFReader.py | 12 ++++++------ plugins/3MFWriter/ThreeMFWriter.py | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 1299b4181a..e8b6a54e46 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -1,11 +1,11 @@ -# Copyright (c) 2021 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. +# Copyright (c) 2021-2022 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. import os.path import zipfile from typing import List, Optional, Union, TYPE_CHECKING, cast -import pySavitar +import pySavitar as Savitar import numpy from UM.Logger import Logger @@ -90,7 +90,7 @@ class ThreeMFReader(MeshReader): return temp_mat - def _convertSavitarNodeToUMNode(self, savitar_node: pySavitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: + def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: """Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node. :returns: Scene node. @@ -206,7 +206,7 @@ class ThreeMFReader(MeshReader): try: archive = zipfile.ZipFile(file_name, "r") self._base_name = os.path.basename(file_name) - parser = pySavitar.ThreeMFParser() + parser = Savitar.ThreeMFParser() scene_3mf = parser.parse(archive.open("3D/3dmodel.model").read()) self._unit = scene_3mf.getUnit() @@ -304,4 +304,4 @@ class ThreeMFReader(MeshReader): unit = "millimeter" scale = conversion_to_mm[unit] - return Vector(scale, scale, scale) \ No newline at end of file + return Vector(scale, scale, scale) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 57cbe25d9e..a1eb969338 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -1,5 +1,5 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Uranium is released under the terms of the LGPLv3 or higher. +# Copyright (c) 2015-2022 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. from typing import Optional from UM.Mesh.MeshWriter import MeshWriter @@ -15,7 +15,7 @@ from cura.Snapshot import Snapshot from PyQt6.QtCore import QBuffer -import pySavitar +import pySavitar as Savitar import numpy import datetime @@ -85,7 +85,7 @@ class ThreeMFWriter(MeshWriter): if um_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: return - savitar_node = pySavitar.SceneNode() + savitar_node = Savitar.SceneNode() savitar_node.setName(um_node.getName()) node_matrix = um_node.getLocalTransformation() @@ -169,7 +169,7 @@ class ThreeMFWriter(MeshWriter): # Add thumbnail relation to _rels/.rels file thumbnail_relation_element = ET.SubElement(relations_element, "Relationship", Target = "/Metadata/thumbnail.png", Id = "rel1", Type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") - savitar_scene = pySavitar.Scene() + savitar_scene = Savitar.Scene() metadata_to_store = CuraApplication.getInstance().getController().getScene().getMetaData() @@ -215,7 +215,7 @@ class ThreeMFWriter(MeshWriter): if savitar_node: savitar_scene.addSceneNode(savitar_node) - parser = pySavitar.ThreeMFParser() + parser = Savitar.ThreeMFParser() scene_string = parser.sceneToString(savitar_scene) archive.writestr(model_file, scene_string)