mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Added PrintJob handling to ClusterUM3
CL-541
This commit is contained in:
parent
152f3462ce
commit
b1649f2d38
4 changed files with 68 additions and 5 deletions
|
@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant
|
||||||
MYPY = False
|
MYPY = False
|
||||||
if MYPY:
|
if MYPY:
|
||||||
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
|
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
|
||||||
|
from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
|
||||||
|
|
||||||
|
|
||||||
class PrintJobOutputModel(QObject):
|
class PrintJobOutputModel(QObject):
|
||||||
|
@ -13,15 +14,26 @@ class PrintJobOutputModel(QObject):
|
||||||
timeElapsedChanged = pyqtSignal()
|
timeElapsedChanged = pyqtSignal()
|
||||||
nameChanged = pyqtSignal()
|
nameChanged = pyqtSignal()
|
||||||
keyChanged = 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)
|
super().__init__(parent)
|
||||||
self._output_controller = output_controller
|
self._output_controller = output_controller
|
||||||
self._state = ""
|
self._state = ""
|
||||||
self._time_total = 0
|
self._time_total = 0
|
||||||
self._time_elapsed = 0
|
self._time_elapsed = 0
|
||||||
self._name = "" # Human readable name
|
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)
|
@pyqtProperty(str, notify=keyChanged)
|
||||||
def key(self):
|
def key(self):
|
||||||
|
|
|
@ -145,6 +145,10 @@ class PrinterOutputModel(QObject):
|
||||||
|
|
||||||
def updateActivePrintJob(self, print_job):
|
def updateActivePrintJob(self, print_job):
|
||||||
if self._active_print_job != 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._active_print_job = print_job
|
||||||
self.activePrintJobChanged.emit()
|
self.activePrintJobChanged.emit()
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,13 @@ class PrinterOutputDevice(QObject, OutputDevice):
|
||||||
def _update(self):
|
def _update(self):
|
||||||
pass
|
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):
|
def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None):
|
||||||
raise NotImplementedError("requestWrite needs to be implemented")
|
raise NotImplementedError("requestWrite needs to be implemented")
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from PyQt5.QtNetwork import QNetworkRequest
|
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
|
||||||
|
|
||||||
class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
def __init__(self, device_id, address, properties, parent = None):
|
def __init__(self, device_id, address, properties, parent = None):
|
||||||
|
@ -16,17 +16,57 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
||||||
|
|
||||||
self._number_of_extruders = 2
|
self._number_of_extruders = 2
|
||||||
|
|
||||||
|
self._print_jobs = []
|
||||||
|
|
||||||
def _update(self):
|
def _update(self):
|
||||||
super()._update()
|
super()._update()
|
||||||
self._get("printers/", onFinished=self._onGetPrintersDataFinished)
|
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)
|
status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
|
||||||
if status_code == 200:
|
if status_code == 200:
|
||||||
try:
|
try:
|
||||||
result = json.loads(bytes(reply.readAll()).decode("utf-8"))
|
result = json.loads(bytes(reply.readAll()).decode("utf-8"))
|
||||||
except json.decoder.JSONDecodeError:
|
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
|
return
|
||||||
|
|
||||||
for printer_data in result:
|
for printer_data in result:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue