diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 407bffcbfe..ca04c546d3 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -12,6 +12,7 @@ class PrintJobOutputModel(QObject): timeTotalChanged = pyqtSignal() timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) @@ -19,7 +20,17 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 - self._name = "" + self._name = "" # Human readable name + self._key = "" # Unique identifier + + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() @pyqtProperty(str, notify = nameChanged) def name(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 7c10944cfd..ed20ef1755 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -20,12 +20,14 @@ class PrinterOutputModel(QObject): activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" + self._key = "" # Unique identifier self._controller = output_controller self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders @@ -40,6 +42,15 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() + @pyqtSlot() def homeHead(self): self._controller.homeHead(self) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8de14fe233..a1c4f48e13 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,9 +1,64 @@ -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from UM.Logger import Logger +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel +from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel + +import json + +from PyQt5.QtNetwork import QNetworkRequest class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) + self._api_prefix = "/cluster-api/v1/" + + self._number_of_extruders = 2 def _update(self): super()._update() + self._get("printers/", onFinished=self._onGetPrintersDataFinished) + + def _onGetPrintersDataFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + return + + for printer_data in result: + uuid = printer_data["uuid"] + + printer = None + for device in self._printers: + if device.key == uuid: + printer = device + break + + if printer is None: + printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) + self._printers.append(printer) + + printer.updateName(printer_data["friendly_name"]) + printer.updateKey(uuid) + + for index in range(0, self._number_of_extruders): + extruder = printer.extruders[index] + extruder_data = printer_data["configuration"][index] + try: + hotend_id = extruder_data["print_core_id"] + except KeyError: + hotend_id = "" + extruder.updateHotendID(hotend_id) + + material_data = extruder_data["material"] + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: + material = MaterialOutputModel(guid = material_data["guid"], type = material_data["material"], brand=material_data["brand"], color=material_data["color"]) + extruder.updateActiveMaterial(material) + + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index b4e7bdf1af..63ebd055ad 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -6,7 +6,6 @@ from UM.Logger import Logger from PyQt5.QtNetwork import QNetworkRequest - import json