From 21c6bba1ce2eb18ed3ba055858eb1237305c5012 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 27 Feb 2019 11:05:54 +0100 Subject: [PATCH] Add the discovered printer functionality This can be used in the add machine wizard to short circuit the creation of a printer. So instead of first selecting a printer and then connecting it, it will be possible to have a list that contains all network discovered printers (from all plugins that can do this). This means we can select one of those printers and directly add it (thus no longer needing that step) CURA-6179 --- cura/CuraApplication.py | 2 ++ cura/Settings/MachineManager.py | 26 +++++++++++++++++-- .../src/UM3OutputDevicePlugin.py | 9 +++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4d3d2434ff..cb3a37ee69 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -745,6 +745,8 @@ class CuraApplication(QtApplication): # Initialize Cura API self._cura_API.initialize() + self._output_device_manager.start() + # Detect in which mode to run and execute that mode if self._is_headless: self.runWithoutGUI() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a96a2c9443..29a39fc461 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -4,7 +4,7 @@ import time import re import unicodedata -from typing import Any, List, Dict, TYPE_CHECKING, Optional, cast +from typing import Any, List, Dict, TYPE_CHECKING, Optional, cast, NamedTuple, Callable from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -49,6 +49,8 @@ if TYPE_CHECKING: from cura.Machines.QualityChangesGroup import QualityChangesGroup from cura.Machines.QualityGroup import QualityGroup +DiscoveredPrinter = NamedTuple("DiscoveredPrinter", [("key", str), ("name", str), ("create_callback", Callable[[str], None]), ("machine_type", "str")]) + class MachineManager(QObject): def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None: @@ -134,6 +136,9 @@ class MachineManager(QObject): self.globalContainerChanged.connect(self.printerConnectedStatusChanged) self.outputDevicesChanged.connect(self.printerConnectedStatusChanged) + # This will contain all discovered network printers + self._discovered_printers = {} # type: Dict[str, DiscoveredPrinter] + activeQualityGroupChanged = pyqtSignal() activeQualityChangesGroupChanged = pyqtSignal() @@ -171,7 +176,24 @@ class MachineManager(QObject): self._printer_output_devices.append(printer_output_device) self.outputDevicesChanged.emit() - self.printerConnectedStatusChanged.emit() + + # Discovered printers are all the printers that were found on the network, which provide a more convenient way + # to add networked printers (Plugin finds a bunch of printers, user can select one from the list, plugin can then + # add that printer to Cura as the active one). + def addDiscoveredPrinter(self, key: str, name: str, create_callback: Callable[[str], None], machine_type: str) -> None: + if key not in self._discovered_printers: + self._discovered_printers[key] = DiscoveredPrinter(key, name, create_callback, machine_type) + else: + Logger.log("e", "Printer with the key %s was already in the discovered printer list", key) + + def removeDiscoveredPrinter(self, key: str) -> None: + if key in self._discovered_printers: + del self._discovered_printers[key] + + @pyqtSlot(str) + def addMachineFromDiscoveredPrinter(self, key: str) -> None: + if key in self._discovered_printers: + self._discovered_printers[key].create_callback(key) @pyqtProperty(QObject, notify = currentConfigurationChanged) def currentConfiguration(self) -> ConfigurationModel: diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index 723bcf2b7c..4529b31c45 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -213,6 +213,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._checkManualDevice(address) + def _createMachineFromDiscoveredPrinter(self, key: str) -> None: + # TODO: This needs to be implemented. It's supposed to create a machine given a unique key as already discovered + # by this plugin. + pass + def _checkManualDevice(self, address): # Check if a UM3 family device exists at this address. # If a printer responds, it will replace the preliminary printer created above @@ -293,7 +298,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): except TypeError: # Disconnect already happened. pass - + self._application.getMachineManager().removeDiscoveredPrinter(device.getId()) self.discoveredDevicesChanged.emit() def _onAddDevice(self, name, address, properties): @@ -318,7 +323,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) - + self._application.getMachineManager().addDiscoveredPrinter(device.getId(), name, self._createMachineFromDiscoveredPrinter, properties[b"printer_type"].decode("utf-8")) self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit()