diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 01cabcfb90..41dadc2d84 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -959,6 +959,9 @@ class CuraApplication(QtApplication): qmlRegisterType(QualityManagementModel, "Cura", 1, 0, "QualityManagementModel") qmlRegisterType(MachineManagementModel, "Cura", 1, 0, "MachineManagementModel") + from cura.PrinterOutput.CameraView import CameraView + qmlRegisterType(CameraView, "Cura", 1, 0, "CameraView") + qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel", self.getQualityProfilesDropDownMenuModel) qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, diff --git a/cura/PrinterOutput/CameraView.py b/cura/PrinterOutput/CameraView.py new file mode 100644 index 0000000000..4a604b7abe --- /dev/null +++ b/cura/PrinterOutput/CameraView.py @@ -0,0 +1,41 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtProperty, pyqtSignal +from PyQt5.QtGui import QImage +from PyQt5.QtQuick import QQuickPaintedItem + + +# +# A custom camera view that uses QQuickPaintedItem to present (or "paint") the image frames from a printer's +# network camera feed. +# +class CameraView(QQuickPaintedItem): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + self._image = QImage() + + imageChanged = pyqtSignal() + + def setImage(self, image: "QImage") -> None: + self._image = image + self.imageChanged.emit() + self.update() + + def getImage(self) -> "QImage": + return self._image + + image = pyqtProperty(QImage, fget = getImage, fset = setImage, notify = imageChanged) + + @pyqtProperty(int, notify = imageChanged) + def imageWidth(self) -> int: + return self._image.width() + + @pyqtProperty(int, notify = imageChanged) + def imageHeight(self) -> int: + return self._image.height() + + def paint(self, painter): + painter.drawImage(self.contentsBoundingRect(), self._image) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index 5b28ffd30d..1fff9945c8 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -16,7 +16,6 @@ class NetworkCamera(QObject): self._image_request = None self._image_reply = None self._image = QImage() - self._image_id = 0 self._target = target self._started = False @@ -33,15 +32,9 @@ class NetworkCamera(QObject): if restart_required: self.start() - @pyqtProperty(QUrl, notify=newImage) + @pyqtProperty(QImage, notify=newImage) def latestImage(self): - self._image_id += 1 - # There is an image provider that is called "camera". In order to ensure that the image qml object, that - # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl - # as new (instead of relying on cached version and thus forces an update. - temp = "image://camera/" + str(self._image_id) - - return QUrl(temp, QUrl.TolerantMode) + return self._image @pyqtSlot() def start(self): @@ -116,4 +109,4 @@ class NetworkCamera(QObject): self._stream_buffer_start_index = -1 self._image.loadFromData(jpg_data) - self.newImage.emit() + self.newImage.emit() diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 5109aa05cb..e16ecf5492 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -405,12 +405,16 @@ Cura.MachineAction { if (settingsTabs.currentIndex > 0) { - manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1); + manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1) } } function setValueFunction(value) { - Cura.MachineManager.activeStack.compatibleMaterialDiameter = value + if (settingsTabs.currentIndex > 0) + { + var extruderIndex = (settingsTabs.currentIndex - 1).toString() + Cura.MachineManager.activeMachine.extruders[extruderIndex].compatibleMaterialDiameter = value + } } property bool isExtruderSetting: true } diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml index 4b863ff9ed..7aff32e424 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml @@ -10,7 +10,7 @@ Component { height: maximumHeight; width: maximumWidth; - Image { + Cura.CameraView { id: cameraImage; anchors { horizontalCenter: parent.horizontalCenter; @@ -21,7 +21,7 @@ Component { OutputDevice.activePrinter.camera.start(); } } - height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width); + height: Math.floor((imageHeight === 0 ? 600 * screenScaleFactor : imageHeight) * width / imageWidth); onVisibleChanged: { if (visible) { if (OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) { @@ -33,14 +33,20 @@ Component { } } } - source: { - if (OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) { - return OutputDevice.activePrinter.camera.latestImage; - } - return ""; - } - width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth); + width: Math.min(imageWidth === 0 ? 800 * screenScaleFactor : imageWidth, maximumWidth); z: 1; + + Connections + { + target: OutputDevice.activePrinter.camera; + onNewImage: + { + if (cameraImage.visible) { + cameraImage.image = OutputDevice.activePrinter.camera.latestImage; + cameraImage.update(); + } + } + } } } } \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/PrinterCard.qml index 79a915d0d1..76e3184f4f 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrinterCard.qml @@ -118,7 +118,10 @@ Item { Item { id: machineNameLabel; height: UM.Theme.getSize("monitor_text_line").height; - width: Math.round(parent.width * 0.3); + width: { + var percent = printer ? 0.75 : 0.3; + return Math.round(parent.width * percent); + } // Skeleton Rectangle { diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml index b9e2525dd5..71104872a1 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml @@ -5,6 +5,7 @@ import QtQuick 2.2 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import UM 1.3 as UM +import Cura 1.0 as Cura Item { property var camera: null; @@ -33,11 +34,11 @@ Item { z: 999; } - Image { + Cura.CameraView { id: cameraImage anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: parent.verticalCenter; - height: Math.round((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width); + height: Math.round((imageHeight === 0 ? 600 * screenScaleFactor : imageHeight) * width / imageWidth); onVisibleChanged: { if (visible) { if (camera != null) { @@ -49,13 +50,18 @@ Item { } } } - source: { - if (camera != null && camera.latestImage != null) { - return camera.latestImage; + + Connections + { + target: camera + onNewImage: { + if (cameraImage.visible) { + cameraImage.image = camera.latestImage; + cameraImage.update(); + } } - return ""; } - width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth); + width: Math.min(imageWidth === 0 ? 800 * screenScaleFactor : imageWidth, maximumWidth); z: 1 }