From f320000ce5e5019d8f96af20b29aa266b54856f6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 3 Dec 2018 17:23:44 +0100 Subject: [PATCH 1/6] Change default profile of Aurora and Alfawise printers Instead of the default layer height, we should change the default quality profile. This is necessary because the 'normal' quality profile doesn't define a layer height, so that should inherit from the 0.1mm default layer height. But if the printer turned the default into a 0.15mm layer height then that is wrong. Maybe we should let the normal quality profile overwrite it to 0.1mm, always? Contributes to issue CURA-5902. --- resources/definitions/alfawise_u20.def.json | 5 +---- resources/definitions/jgaurora_a1.def.json | 5 +---- resources/definitions/jgaurora_a5.def.json | 5 +---- resources/definitions/jgaurora_z_603s.def.json | 5 +---- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/resources/definitions/alfawise_u20.def.json b/resources/definitions/alfawise_u20.def.json index 87726fec3d..de8525fa4d 100644 --- a/resources/definitions/alfawise_u20.def.json +++ b/resources/definitions/alfawise_u20.def.json @@ -7,7 +7,7 @@ "author": "Samuel Pinches", "manufacturer": "Alfawise", "file_formats": "text/x-gcode", - "preferred_quality_type": "fine", + "preferred_quality_type": "fast", "machine_extruder_trains": { "0": "alfawise_u20_extruder_0" @@ -53,9 +53,6 @@ "material_bed_temperature": { "default_value": 50 }, - "layer_height": { - "default_value": 0.15 - }, "layer_height_0": { "default_value": 0.2 }, diff --git a/resources/definitions/jgaurora_a1.def.json b/resources/definitions/jgaurora_a1.def.json index 4fd2eb4994..b9a921c311 100644 --- a/resources/definitions/jgaurora_a1.def.json +++ b/resources/definitions/jgaurora_a1.def.json @@ -7,7 +7,7 @@ "author": "Samuel Pinches", "manufacturer": "JGAurora", "file_formats": "text/x-gcode", - "preferred_quality_type": "fine", + "preferred_quality_type": "fast", "machine_extruder_trains": { "0": "jgaurora_a1_extruder_0" @@ -53,9 +53,6 @@ "material_bed_temperature": { "default_value": 67 }, - "layer_height": { - "default_value": 0.15 - }, "layer_height_0": { "default_value": 0.12 }, diff --git a/resources/definitions/jgaurora_a5.def.json b/resources/definitions/jgaurora_a5.def.json index 02d9a9db4f..d84a8440e6 100644 --- a/resources/definitions/jgaurora_a5.def.json +++ b/resources/definitions/jgaurora_a5.def.json @@ -9,7 +9,7 @@ "file_formats": "text/x-gcode", "platform": "jgaurora_a5.stl", "platform_offset": [-242, -101, 273], - "preferred_quality_type": "fine", + "preferred_quality_type": "fast", "machine_extruder_trains": { "0": "jgaurora_a5_extruder_0" @@ -55,9 +55,6 @@ "material_bed_temperature": { "default_value": 67 }, - "layer_height": { - "default_value": 0.15 - }, "layer_height_0": { "default_value": 0.12 }, diff --git a/resources/definitions/jgaurora_z_603s.def.json b/resources/definitions/jgaurora_z_603s.def.json index 59e0ff129c..3a78585240 100644 --- a/resources/definitions/jgaurora_z_603s.def.json +++ b/resources/definitions/jgaurora_z_603s.def.json @@ -7,7 +7,7 @@ "author": "Samuel Pinches", "manufacturer": "JGAurora", "file_formats": "text/x-gcode", - "preferred_quality_type": "fine", + "preferred_quality_type": "fast", "machine_extruder_trains": { "0": "jgaurora_z_603s_extruder_0" @@ -53,9 +53,6 @@ "material_bed_temperature": { "default_value": 55 }, - "layer_height": { - "default_value": 0.15 - }, "layer_height_0": { "default_value": 0.2 }, From 9ec7428620e4ea31b1b172aeda86a29db28fd7c8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 4 Dec 2018 10:54:30 +0100 Subject: [PATCH 2/6] Fix setting visiblity current index CURA-5981 --- resources/qml/Preferences/SettingVisibilityPage.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index e319069502..1b964cad0c 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -115,15 +115,16 @@ UM.PreferencesPage currentIndex: { + var idx = -1; for(var i = 0; i < settingVisibilityPresetsModel.items.length; ++i) { if(settingVisibilityPresetsModel.items[i].presetId == settingVisibilityPresetsModel.activePreset) { - currentIndex = i; - return; + idx = i; + break; } } - return -1 + return idx; } onActivated: From 5d77209cfbadbf5f43571bf6cf350273ed874c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marijn=20De=C3=A9?= Date: Tue, 4 Dec 2018 13:57:41 +0100 Subject: [PATCH 3/6] Be more efficient in updating the print jobs --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 6 ++++-- .../src/Cloud/CloudOutputDeviceManager.py | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index d17728f513..0f3a92f9d8 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -338,8 +338,10 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): for job_id in updated_job_ids: self._updateUM3PrintJobOutputModel(current_jobs[job_id], remote_jobs[job_id]) - # TODO: properly handle removed and updated printers - self.printJobsChanged.emit() + # We only have to update when jobs are added or removed + # updated jobs push their changes via their outputmodel + if len(removed_job_ids) > 0 or len(new_job_ids) > 0: + self.printJobsChanged.emit() def _addPrintJob(self, job: CloudClusterPrintJob) -> None: try: diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 85e734f7a3..c6134d9a63 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,7 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json -from time import sleep from threading import Timer from typing import Dict, Optional From e98f3bff384c384eaab419c6997de52e55a7bb25 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 4 Dec 2018 14:09:20 +0100 Subject: [PATCH 4/6] Implement test version of showing cloud connected printers in list --- cura/Settings/MachineManager.py | 6 +++ .../src/Cloud/CloudOutputDeviceManager.py | 9 +++- resources/qml/Menus/CloudPrinterMenu.qml | 26 +++++++++++ resources/qml/Menus/PrinterMenu.qml | 17 +++++++ .../PrinterSelector/MachineSelectorList.qml | 44 ++++++++++++++++++- 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 resources/qml/Menus/CloudPrinterMenu.qml diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 53390ca88d..15e2c67c33 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -527,6 +527,12 @@ class MachineManager(QObject): return self._global_container_stack.getMetaDataEntry("um_network_key", "") return "" + @pyqtProperty(str, notify=printerConnectedStatusChanged) + def activeMachineCloudKey(self) -> str: + if self._global_container_stack: + return self._global_container_stack.getMetaDataEntry("um_cloud_cluster_id", "") + return "" + @pyqtProperty(str, notify = printerConnectedStatusChanged) def activeMachineNetworkGroupName(self) -> str: if self._global_container_stack: diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 85e734f7a3..6c5d681a39 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -116,7 +116,7 @@ class CloudOutputDeviceManager(NetworkClient): self._output_device_manager.addOutputDevice(device) self._remote_clusters[cluster.cluster_id] = device device.connect() # TODO: remove this - self._connectToActiveMachine() + self._connectToActiveMachine(cluster.cluster_id, cluster.host_name) ## Remove a CloudOutputDevice def _removeCloudOutputDevice(self, cluster: CloudCluster): @@ -124,10 +124,15 @@ class CloudOutputDeviceManager(NetworkClient): del self._remote_clusters[cluster.cluster_id] ## Callback for when the active machine was changed by the user. - def _connectToActiveMachine(self) -> None: + def _connectToActiveMachine(self, cluster_id: Optional[str] = None, host_name: Optional[str] = None) -> None: active_machine = CuraApplication.getInstance().getGlobalContainerStack() if not active_machine: return + + # TODO: Remove this once correct pairing has been added (see below). + if cluster_id: + active_machine.setMetaDataEntry("um_cloud_cluster_id", cluster_id) + active_machine.setMetaDataEntry("connect_group_name", host_name) # Check if the stored cluster_id for the active machine is in our list of remote clusters. stored_cluster_id = active_machine.getMetaDataEntry("um_cloud_cluster_id") diff --git a/resources/qml/Menus/CloudPrinterMenu.qml b/resources/qml/Menus/CloudPrinterMenu.qml new file mode 100644 index 0000000000..4ceebbfdfc --- /dev/null +++ b/resources/qml/Menus/CloudPrinterMenu.qml @@ -0,0 +1,26 @@ +// Copyright (c) 2018 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. +import QtQuick 2.2 +import QtQuick.Controls 1.4 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Instantiator { + + model: UM.ContainerStacksModel { + filter: {"type": "machine", "um_cloud_cluster_id": "*", "hidden": "False"} + } + + MenuItem { + // iconSource: UM.Theme.getIcon("printer_single") TODO: use cloud icon here + text: model.name + checkable: true + checked: true // cloud printers are only listed if they are actually online + exclusiveGroup: group; + onTriggered: Cura.MachineManager.setActiveMachine(model.id); + } + + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) +} diff --git a/resources/qml/Menus/PrinterMenu.qml b/resources/qml/Menus/PrinterMenu.qml index 741d927c13..a924b0e589 100644 --- a/resources/qml/Menus/PrinterMenu.qml +++ b/resources/qml/Menus/PrinterMenu.qml @@ -37,6 +37,23 @@ Menu visible: networkPrinterMenu.count > 0 } + MenuItem + { + text: catalog.i18nc("@label:category menu label", "Cloud enabled printers") + enabled: false + visible: cloudPrinterMenu.count > 0 + } + + CloudPrinterMenu + { + id: cloudPrinterMenu + } + + MenuSeparator + { + visible: cloudPrinterMenu.count > 0 + } + MenuItem { text: catalog.i18nc("@label:category menu label", "Local printers") diff --git a/resources/qml/PrinterSelector/MachineSelectorList.qml b/resources/qml/PrinterSelector/MachineSelectorList.qml index 5ef04b7351..26c703fddd 100644 --- a/resources/qml/PrinterSelector/MachineSelectorList.qml +++ b/resources/qml/PrinterSelector/MachineSelectorList.qml @@ -50,6 +50,46 @@ Column } } + Label + { + text: catalog.i18nc("@label", "Cloud connected printers") + visible: cloudPrintersModel.items.length > 0 + leftPadding: UM.Theme.getSize("default_margin").width + height: visible ? contentHeight + 2 * UM.Theme.getSize("default_margin").height : 0 + renderType: Text.NativeRendering + font: UM.Theme.getFont("medium") + color: UM.Theme.getColor("text_medium") + verticalAlignment: Text.AlignVCenter + } + + Repeater + { + id: cloudPrinters + + model: UM.ContainerStacksModel + { + id: cloudPrintersModel + filter: + { + "type": "machine", + "um_cloud_cluster_id": "*" + } + } + + delegate: MachineSelectorButton + { + text: model.metadata["connect_group_name"] + checked: Cura.MachineManager.activeMachineNetworkGroupName == model.metadata["connect_group_name"] + outputDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + + Connections + { + target: Cura.MachineManager + onActiveMachineNetworkGroupNameChanged: checked = Cura.MachineManager.activeMachineNetworkGroupName == model.metadata["connect_group_name"] + } + } + } + Label { text: catalog.i18nc("@label", "Preset printers") @@ -71,7 +111,9 @@ Column id: virtualPrintersModel filter: { - "type": "machine", "um_network_key": null + "type": "machine", + "um_network_key": null, + "um_cloud_cluster_id": null } } From 7de947f5fab60e8cc9d38c17d5f0c62653cd13f0 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 4 Dec 2018 14:15:19 +0100 Subject: [PATCH 5/6] use correct label text --- resources/qml/Menus/CloudPrinterMenu.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Menus/CloudPrinterMenu.qml b/resources/qml/Menus/CloudPrinterMenu.qml index 4ceebbfdfc..bd03890642 100644 --- a/resources/qml/Menus/CloudPrinterMenu.qml +++ b/resources/qml/Menus/CloudPrinterMenu.qml @@ -9,12 +9,12 @@ import Cura 1.0 as Cura Instantiator { model: UM.ContainerStacksModel { - filter: {"type": "machine", "um_cloud_cluster_id": "*", "hidden": "False"} + filter: {"type": "machine", "um_cloud_cluster_id": "*"} } MenuItem { // iconSource: UM.Theme.getIcon("printer_single") TODO: use cloud icon here - text: model.name + text: model.metadata["connect_group_name"] checkable: true checked: true // cloud printers are only listed if they are actually online exclusiveGroup: group; From a9273ec2b5563f57781eab7d096f7a8793b1a4d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marijn=20De=C3=A9?= Date: Tue, 4 Dec 2018 15:20:24 +0100 Subject: [PATCH 6/6] Use QTimer instead of threading.Timer --- .../src/Cloud/CloudOutputDeviceManager.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 6f3f1fb9d7..f5f3555145 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,9 +1,9 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json -from threading import Timer from typing import Dict, Optional +from PyQt5.QtCore import QTimer from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from UM.Logger import Logger @@ -45,6 +45,11 @@ class CloudOutputDeviceManager(NetworkClient): self._on_cluster_received = Signal() self._on_cluster_received.connect(self._getRemoteClusters) + self.update_timer = QTimer(CuraApplication.getInstance()) + self.update_timer.setInterval(self.CHECK_CLUSTER_INTERVAL * 1000) + self.update_timer.setSingleShot(False) + self.update_timer.timeout.connect(self._on_cluster_received.emit) + ## Override _createEmptyRequest to add the needed authentication header for talking to the Ultimaker Cloud API. def _createEmptyRequest(self, path: str, content_type: Optional[str] = "application/json") -> QNetworkRequest: @@ -61,10 +66,9 @@ class CloudOutputDeviceManager(NetworkClient): if self._account.isLoggedIn: self.get("/clusters", on_finished = self._onGetRemoteClustersFinished) - # Only start the polling thread after the user is authenticated + # Only start the polling timer after the user is authenticated # The first call to _getRemoteClusters comes from self._account.loginStateChanged - timer = Timer(5.0, self._on_cluster_received.emit) - timer.start() + self.update_timer.start() ## Callback for when the request for getting the clusters. is finished.