diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index ca04c546d3..7c38782788 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel class PrintJobOutputModel(QObject): @@ -13,15 +14,26 @@ class PrintJobOutputModel(QObject): timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() keyChanged = pyqtSignal() + assignedPrinterChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", parent=None): + def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None): super().__init__(parent) self._output_controller = output_controller self._state = "" self._time_total = 0 self._time_elapsed = 0 self._name = "" # Human readable name - self._key = "" # Unique identifier + self._key = key # Unique identifier + self._assigned_printer = None + + @pyqtProperty(QObject, notify=assignedPrinterChanged) + def assignedPrinter(self): + return self._assigned_printer + + def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): + if self._assigned_printer != assigned_printer: + self._assigned_printer = assigned_printer + self.assignedPrinterChanged.emit() @pyqtProperty(str, notify=keyChanged) def key(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ed20ef1755..8a5a9b55be 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -145,6 +145,10 @@ class PrinterOutputModel(QObject): def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: + if self._active_print_job is not None: + self._active_print_job.updateAssignedPrinter(None) + if print_job is not None: + print_job.updateAssignedPrinter(self) self._active_print_job = print_job self.activePrintJobChanged.emit() diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f5afb0da6a..6de665b67f 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -60,6 +60,13 @@ class PrinterOutputDevice(QObject, OutputDevice): def _update(self): pass + def _getPrinterByKey(self, key): + for printer in self._printers: + if printer.key == key: + return printer + + return None + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index a1c4f48e13..6e564fef29 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -7,7 +7,7 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel import json -from PyQt5.QtNetwork import QNetworkRequest +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): @@ -16,17 +16,57 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._number_of_extruders = 2 + self._print_jobs = [] + def _update(self): super()._update() self._get("printers/", onFinished=self._onGetPrintersDataFinished) + self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) - def _onGetPrintersDataFinished(self, reply): + def _onGetPrintJobsFinished(self, reply: QNetworkReply): 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.") + Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") + return + print_jobs_seen = [] + for print_job_data in result: + print_job = None + for job in self._print_jobs: + if job.key == print_job_data["uuid"]: + print_job = job + break + + if print_job is None: + print_job = PrintJobOutputModel(output_controller = None, + key = print_job_data["uuid"], + name = print_job_data["name"]) + print_job.updateTimeTotal(print_job_data["time_total"]) + print_job.updateTimeElapsed(print_job_data["time_elapsed"]) + print_job.updateState(print_job_data["status"]) + if print_job.state == "printing": + # Print job should be assigned to a printer. + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + if printer: + printer.updateActivePrintJob(print_job) + + print_jobs_seen.append(print_job) + for old_job in self._print_jobs: + if old_job not in print_jobs_seen: + # Print job needs to be removed. + old_job.assignedPrinter.updateActivePrintJob(None) + + self._print_jobs = print_jobs_seen + + def _onGetPrintersDataFinished(self, reply: QNetworkReply): + 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 printers state message: Not valid JSON.") return for printer_data in result: