mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-12 09:17:50 -06:00
Merge pull request #4436 from Ultimaker/clean_print_job_info_block
CL-897, CL-1051, CL-1111 Cura 3.6 Monitor Tab
This commit is contained in:
commit
be5c1c8596
28 changed files with 2070 additions and 1675 deletions
|
@ -21,12 +21,13 @@ from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
|
|||
from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
|
||||
from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState
|
||||
from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
|
||||
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
|
||||
from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
|
||||
from cura.PrinterOutput.NetworkCamera import NetworkCamera
|
||||
|
||||
from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController
|
||||
from .SendMaterialJob import SendMaterialJob
|
||||
from .ConfigurationChangeModel import ConfigurationChangeModel
|
||||
from .UM3PrintJobOutputModel import UM3PrintJobOutputModel
|
||||
|
||||
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
|
||||
from PyQt5.QtGui import QDesktopServices, QImage
|
||||
|
@ -47,6 +48,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
printJobsChanged = pyqtSignal()
|
||||
activePrinterChanged = pyqtSignal()
|
||||
activeCameraChanged = pyqtSignal()
|
||||
receivedPrintJobsChanged = pyqtSignal()
|
||||
|
||||
# This is a bit of a hack, as the notify can only use signals that are defined by the class that they are in.
|
||||
# Inheritance doesn't seem to work. Tying them together does work, but i'm open for better suggestions.
|
||||
|
@ -60,7 +62,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
|
||||
self._dummy_lambdas = ("", {}, io.BytesIO()) #type: Tuple[str, Dict, Union[io.StringIO, io.BytesIO]]
|
||||
|
||||
self._print_jobs = [] # type: List[PrintJobOutputModel]
|
||||
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
|
||||
self._received_print_jobs = False # type: bool
|
||||
|
||||
self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/ClusterMonitorItem.qml")
|
||||
self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/ClusterControlItem.qml")
|
||||
|
@ -90,7 +93,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
|
||||
self._printer_uuid_to_unique_name_mapping = {} # type: Dict[str, str]
|
||||
|
||||
self._finished_jobs = [] # type: List[PrintJobOutputModel]
|
||||
self._finished_jobs = [] # type: List[UM3PrintJobOutputModel]
|
||||
|
||||
self._cluster_size = int(properties.get(b"cluster_size", 0)) # type: int
|
||||
|
||||
|
@ -349,15 +352,19 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers"))
|
||||
|
||||
@pyqtProperty("QVariantList", notify = printJobsChanged)
|
||||
def printJobs(self)-> List[PrintJobOutputModel]:
|
||||
def printJobs(self)-> List[UM3PrintJobOutputModel]:
|
||||
return self._print_jobs
|
||||
|
||||
@pyqtProperty(bool, notify = receivedPrintJobsChanged)
|
||||
def receivedPrintJobs(self) -> bool:
|
||||
return self._received_print_jobs
|
||||
|
||||
@pyqtProperty("QVariantList", notify = printJobsChanged)
|
||||
def queuedPrintJobs(self) -> List[PrintJobOutputModel]:
|
||||
def queuedPrintJobs(self) -> List[UM3PrintJobOutputModel]:
|
||||
return [print_job for print_job in self._print_jobs if print_job.state == "queued" or print_job.state == "error"]
|
||||
|
||||
@pyqtProperty("QVariantList", notify = printJobsChanged)
|
||||
def activePrintJobs(self) -> List[PrintJobOutputModel]:
|
||||
def activePrintJobs(self) -> List[UM3PrintJobOutputModel]:
|
||||
return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None and print_job.state != "queued"]
|
||||
|
||||
@pyqtProperty("QVariantList", notify = clusterPrintersChanged)
|
||||
|
@ -406,6 +413,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
# is a modification of the cluster queue and not of the actual job.
|
||||
self.delete("print_jobs/{uuid}".format(uuid = print_job_uuid), on_finished=None)
|
||||
|
||||
@pyqtSlot(str)
|
||||
def forceSendJob(self, print_job_uuid: str) -> None:
|
||||
data = "{\"force\": true}"
|
||||
self.put("print_jobs/{uuid}".format(uuid=print_job_uuid), data, on_finished=None)
|
||||
|
||||
def _printJobStateChanged(self) -> None:
|
||||
username = self._getUserName()
|
||||
|
||||
|
@ -455,6 +467,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
self.get("print_jobs/{uuid}/preview_image".format(uuid=print_job.key), on_finished=self._onGetPreviewImageFinished)
|
||||
|
||||
def _onGetPrintJobsFinished(self, reply: QNetworkReply) -> None:
|
||||
self._received_print_jobs = True
|
||||
self.receivedPrintJobsChanged.emit()
|
||||
|
||||
if not checkValidGetReply(reply):
|
||||
return
|
||||
|
||||
|
@ -537,8 +552,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
self._printers.append(printer)
|
||||
return printer
|
||||
|
||||
def _createPrintJobModel(self, data: Dict[str, Any]) -> PrintJobOutputModel:
|
||||
print_job = PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self),
|
||||
def _createPrintJobModel(self, data: Dict[str, Any]) -> UM3PrintJobOutputModel:
|
||||
print_job = UM3PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self),
|
||||
key=data["uuid"], name= data["name"])
|
||||
|
||||
configuration = ConfigurationModel()
|
||||
|
@ -558,7 +573,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
print_job.stateChanged.connect(self._printJobStateChanged)
|
||||
return print_job
|
||||
|
||||
def _updatePrintJob(self, print_job: PrintJobOutputModel, data: Dict[str, Any]) -> None:
|
||||
def _updatePrintJob(self, print_job: UM3PrintJobOutputModel, data: Dict[str, Any]) -> None:
|
||||
print_job.updateTimeTotal(data["time_total"])
|
||||
print_job.updateTimeElapsed(data["time_elapsed"])
|
||||
impediments_to_printing = data.get("impediments_to_printing", [])
|
||||
|
@ -574,6 +589,16 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
if not status_set_by_impediment:
|
||||
print_job.updateState(data["status"])
|
||||
|
||||
print_job.updateConfigurationChanges(self._createConfigurationChanges(data["configuration_changes_required"]))
|
||||
|
||||
def _createConfigurationChanges(self, data: List[Dict[str, Any]]) -> List[ConfigurationChangeModel]:
|
||||
result = []
|
||||
for change in data:
|
||||
result.append(ConfigurationChangeModel(type_of_change=change["type_of_change"],
|
||||
index=change["index"],
|
||||
target_name=change["target_name"],
|
||||
origin_name=change["origin_name"]))
|
||||
return result
|
||||
|
||||
def _createMaterialOutputModel(self, material_data) -> MaterialOutputModel:
|
||||
containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", GUID=material_data["guid"])
|
||||
|
@ -631,7 +656,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||
material = self._createMaterialOutputModel(material_data)
|
||||
extruder.updateActiveMaterial(material)
|
||||
|
||||
def _removeJob(self, job: PrintJobOutputModel) -> bool:
|
||||
def _removeJob(self, job: UM3PrintJobOutputModel) -> bool:
|
||||
if job not in self._print_jobs:
|
||||
return False
|
||||
|
||||
|
@ -675,7 +700,7 @@ def checkValidGetReply(reply: QNetworkReply) -> bool:
|
|||
return True
|
||||
|
||||
|
||||
def findByKey(lst: List[Union[PrintJobOutputModel, PrinterOutputModel]], key: str) -> Optional[PrintJobOutputModel]:
|
||||
def findByKey(lst: List[Union[UM3PrintJobOutputModel, PrinterOutputModel]], key: str) -> Optional[UM3PrintJobOutputModel]:
|
||||
for item in lst:
|
||||
if item.key == key:
|
||||
return item
|
||||
|
|
29
plugins/UM3NetworkPrinting/src/ConfigurationChangeModel.py
Normal file
29
plugins/UM3NetworkPrinting/src/ConfigurationChangeModel.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
|
||||
|
||||
class ConfigurationChangeModel(QObject):
|
||||
def __init__(self, type_of_change: str, index: int, target_name: str, origin_name: str) -> None:
|
||||
super().__init__()
|
||||
self._type_of_change = type_of_change
|
||||
# enum = ["material", "print_core_change"]
|
||||
self._index = index
|
||||
self._target_name = target_name
|
||||
self._origin_name = origin_name
|
||||
|
||||
@pyqtProperty(int, constant = True)
|
||||
def index(self) -> int:
|
||||
return self._index
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def typeOfChange(self) -> str:
|
||||
return self._type_of_change
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def targetName(self) -> str:
|
||||
return self._target_name
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def originName(self) -> str:
|
||||
return self._origin_name
|
29
plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
Normal file
29
plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
|
||||
from typing import Optional, TYPE_CHECKING, List
|
||||
from PyQt5.QtCore import QUrl
|
||||
from PyQt5.QtGui import QImage
|
||||
|
||||
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
|
||||
|
||||
from .ConfigurationChangeModel import ConfigurationChangeModel
|
||||
|
||||
|
||||
class UM3PrintJobOutputModel(PrintJobOutputModel):
|
||||
configurationChangesChanged = pyqtSignal()
|
||||
|
||||
def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None) -> None:
|
||||
super().__init__(output_controller, key, name, parent)
|
||||
self._configuration_changes = [] # type: List[ConfigurationChangeModel]
|
||||
|
||||
@pyqtProperty("QVariantList", notify=configurationChangesChanged)
|
||||
def configurationChanges(self) -> List[ConfigurationChangeModel]:
|
||||
return self._configuration_changes
|
||||
|
||||
def updateConfigurationChanges(self, changes: List[ConfigurationChangeModel]) -> None:
|
||||
if len(self._configuration_changes) == 0 and len(changes) == 0:
|
||||
return
|
||||
self._configuration_changes = changes
|
||||
self.configurationChangesChanged.emit()
|
Loading…
Add table
Add a link
Reference in a new issue