Added PrintJob handling to ClusterUM3

CL-541
This commit is contained in:
Jaime van Kessel 2017-11-21 11:01:19 +01:00
parent 152f3462ce
commit b1649f2d38
4 changed files with 68 additions and 5 deletions

View file

@ -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):

View file

@ -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()

View file

@ -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")

View file

@ -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: