mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-19 09:10:47 +08:00
Merge remote-tracking branch 'origin/4.0' into CL-1154_monitor_empty_states
This commit is contained in:
commit
d495e80959
@ -5,10 +5,8 @@ from UM.Qt.ListModel import ListModel
|
|||||||
|
|
||||||
from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal
|
from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal
|
||||||
|
|
||||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
|
||||||
from UM.Settings.ContainerStack import ContainerStack
|
|
||||||
|
|
||||||
from cura.PrinterOutputDevice import ConnectionType
|
from cura.PrinterOutputDevice import ConnectionType
|
||||||
|
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
||||||
|
|
||||||
from cura.Settings.GlobalStack import GlobalStack
|
from cura.Settings.GlobalStack import GlobalStack
|
||||||
|
|
||||||
@ -25,14 +23,13 @@ class GlobalStacksModel(ListModel):
|
|||||||
self.addRoleName(self.NameRole, "name")
|
self.addRoleName(self.NameRole, "name")
|
||||||
self.addRoleName(self.IdRole, "id")
|
self.addRoleName(self.IdRole, "id")
|
||||||
self.addRoleName(self.HasRemoteConnectionRole, "hasRemoteConnection")
|
self.addRoleName(self.HasRemoteConnectionRole, "hasRemoteConnection")
|
||||||
self.addRoleName(self.ConnectionTypeRole, "connectionType")
|
|
||||||
self.addRoleName(self.MetaDataRole, "metadata")
|
self.addRoleName(self.MetaDataRole, "metadata")
|
||||||
self._container_stacks = []
|
self._container_stacks = []
|
||||||
|
|
||||||
# Listen to changes
|
# Listen to changes
|
||||||
ContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
|
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
|
||||||
ContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
|
CuraContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
|
||||||
ContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
|
CuraContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
|
||||||
self._filter_dict = {}
|
self._filter_dict = {}
|
||||||
self._update()
|
self._update()
|
||||||
|
|
||||||
@ -45,11 +42,14 @@ class GlobalStacksModel(ListModel):
|
|||||||
def _update(self) -> None:
|
def _update(self) -> None:
|
||||||
items = []
|
items = []
|
||||||
|
|
||||||
container_stacks = ContainerRegistry.getInstance().findContainerStacks(type = "machine")
|
container_stacks = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine")
|
||||||
|
|
||||||
for container_stack in container_stacks:
|
for container_stack in container_stacks:
|
||||||
connection_type = int(container_stack.getMetaDataEntry("connection_type", ConnectionType.NotConnected.value))
|
has_remote_connection = False
|
||||||
has_remote_connection = connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
|
|
||||||
|
for connection_type in container_stack.configuredConnectionTypes:
|
||||||
|
has_remote_connection |= connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
|
||||||
|
|
||||||
if container_stack.getMetaDataEntry("hidden", False) in ["True", True]:
|
if container_stack.getMetaDataEntry("hidden", False) in ["True", True]:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -57,7 +57,6 @@ class GlobalStacksModel(ListModel):
|
|||||||
items.append({"name": container_stack.getMetaDataEntry("connect_group_name", container_stack.getName()),
|
items.append({"name": container_stack.getMetaDataEntry("connect_group_name", container_stack.getName()),
|
||||||
"id": container_stack.getId(),
|
"id": container_stack.getId(),
|
||||||
"hasRemoteConnection": has_remote_connection,
|
"hasRemoteConnection": has_remote_connection,
|
||||||
"connectionType": connection_type,
|
|
||||||
"metadata": container_stack.getMetaData().copy()})
|
"metadata": container_stack.getMetaData().copy()})
|
||||||
items.sort(key=lambda i: not i["hasRemoteConnection"])
|
items.sort(key=lambda i: not i["hasRemoteConnection"])
|
||||||
self.setItems(items)
|
self.setItems(items)
|
||||||
|
@ -132,8 +132,7 @@ class PrintJobOutputModel(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(float, notify = timeElapsedChanged)
|
@pyqtProperty(float, notify = timeElapsedChanged)
|
||||||
def progress(self) -> float:
|
def progress(self) -> float:
|
||||||
time_elapsed = max(float(self.timeElapsed), 1.0) # Prevent a division by zero exception
|
result = float(self.timeElapsed) / max(self.timeTotal, 1.0) # Prevent a division by zero exception.
|
||||||
result = time_elapsed / self.timeTotal
|
|
||||||
return min(result, 1.0) # Never get a progress past 1.0
|
return min(result, 1.0) # Never get a progress past 1.0
|
||||||
|
|
||||||
@pyqtProperty(str, notify=stateChanged)
|
@pyqtProperty(str, notify=stateChanged)
|
||||||
|
@ -42,7 +42,12 @@ class GlobalStack(CuraContainerStack):
|
|||||||
# Per thread we have our own resolving_settings, or strange things sometimes occur.
|
# Per thread we have our own resolving_settings, or strange things sometimes occur.
|
||||||
self._resolving_settings = defaultdict(set) #type: Dict[str, Set[str]] # keys are thread names
|
self._resolving_settings = defaultdict(set) #type: Dict[str, Set[str]] # keys are thread names
|
||||||
|
|
||||||
|
# Since the metadatachanged is defined in container stack, we can't use it here as a notifier for pyqt
|
||||||
|
# properties. So we need to tie them together like this.
|
||||||
|
self.metaDataChanged.connect(self.configuredConnectionTypesChanged)
|
||||||
|
|
||||||
extrudersChanged = pyqtSignal()
|
extrudersChanged = pyqtSignal()
|
||||||
|
configuredConnectionTypesChanged = pyqtSignal()
|
||||||
|
|
||||||
## Get the list of extruders of this stack.
|
## Get the list of extruders of this stack.
|
||||||
#
|
#
|
||||||
@ -63,6 +68,34 @@ class GlobalStack(CuraContainerStack):
|
|||||||
def getLoadingPriority(cls) -> int:
|
def getLoadingPriority(cls) -> int:
|
||||||
return 2
|
return 2
|
||||||
|
|
||||||
|
# The configured connection types can be used to find out if the global stack is configured to be connected with
|
||||||
|
# a printer, without having to know all the details as to how this is exactly done (and without actually setting
|
||||||
|
# the stack to be active). This data can then in turn also be used when the global stack is active; If we can't
|
||||||
|
# get a network connection, but it is configured to have one, we can display a different icon to indicate the
|
||||||
|
# difference.
|
||||||
|
@pyqtProperty("QVariantList", notify=configuredConnectionTypesChanged)
|
||||||
|
def configuredConnectionTypes(self):
|
||||||
|
# Requesting it from the metadata actually gets them as strings (as that's what you get from serializing).
|
||||||
|
# But we do want them returned as a list of ints (so the rest of the code can directly compare)
|
||||||
|
connection_types = self.getMetaDataEntry("connection_type", "").split(",")
|
||||||
|
return [int(connection_type) for connection_type in connection_types if connection_type != ""]
|
||||||
|
|
||||||
|
# \sa configuredConnectionTypes
|
||||||
|
def addConfiguredConnectionType(self, connection_type):
|
||||||
|
configured_connection_types = self.configuredConnectionTypes
|
||||||
|
if connection_type not in configured_connection_types:
|
||||||
|
# Store the values as a string.
|
||||||
|
configured_connection_types.append(str(connection_type))
|
||||||
|
self.setMetaDataEntry("connection_type", ",".join(configured_connection_types))
|
||||||
|
|
||||||
|
# \sa configuredConnectionTypes
|
||||||
|
def removeConfiguredConnectionType(self, connection_type):
|
||||||
|
configured_connection_types = self.configuredConnectionTypes
|
||||||
|
if connection_type in self.configured_connection_types:
|
||||||
|
# Store the values as a string.
|
||||||
|
configured_connection_types.remove(str(connection_type))
|
||||||
|
self.setMetaDataEntry("connection_type", ",".join(configured_connection_types))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def getConfigurationTypeFromSerialized(cls, serialized: str) -> Optional[str]:
|
def getConfigurationTypeFromSerialized(cls, serialized: str) -> Optional[str]:
|
||||||
configuration_type = super().getConfigurationTypeFromSerialized(serialized)
|
configuration_type = super().getConfigurationTypeFromSerialized(serialized)
|
||||||
|
@ -528,8 +528,12 @@ class MachineManager(QObject):
|
|||||||
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
|
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
|
||||||
def activeMachineHasRemoteConnection(self) -> bool:
|
def activeMachineHasRemoteConnection(self) -> bool:
|
||||||
if self._global_container_stack:
|
if self._global_container_stack:
|
||||||
connection_type = int(self._global_container_stack.getMetaDataEntry("connection_type", ConnectionType.NotConnected.value))
|
has_remote_connection = False
|
||||||
return connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
|
|
||||||
|
for connection_type in self._global_container_stack.configuredConnectionTypes:
|
||||||
|
has_remote_connection |= connection_type in [ConnectionType.NetworkConnection.value,
|
||||||
|
ConnectionType.CloudConnection.value]
|
||||||
|
return has_remote_connection
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
|
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional, List, Dict, Any
|
from typing import Optional, List, Dict, Any, cast
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
|
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ class DrivePluginExtension(QObject, Extension):
|
|||||||
|
|
||||||
def showDriveWindow(self) -> None:
|
def showDriveWindow(self) -> None:
|
||||||
if not self._drive_window:
|
if not self._drive_window:
|
||||||
plugin_dir_path = CuraApplication.getInstance().getPluginRegistry().getPluginPath("CuraDrive")
|
plugin_dir_path = cast(str, CuraApplication.getInstance().getPluginRegistry().getPluginPath("CuraDrive"))
|
||||||
path = os.path.join(plugin_dir_path, "src", "qml", "main.qml")
|
path = os.path.join(plugin_dir_path, "src", "qml", "main.qml")
|
||||||
self._drive_window = CuraApplication.getInstance().createQmlComponent(path, {"CuraDrive": self})
|
self._drive_window = CuraApplication.getInstance().createQmlComponent(path, {"CuraDrive": self})
|
||||||
self.refreshBackups()
|
self.refreshBackups()
|
||||||
|
@ -37,7 +37,7 @@ class Toolbox(QObject, Extension):
|
|||||||
self._application = application # type: CuraApplication
|
self._application = application # type: CuraApplication
|
||||||
|
|
||||||
self._sdk_version = ApplicationMetadata.CuraSDKVersion # type: Union[str, int]
|
self._sdk_version = ApplicationMetadata.CuraSDKVersion # type: Union[str, int]
|
||||||
self._cloud_api_version = UltimakerCloudAuthentication.CuraCloudAPIVersion # type: int
|
self._cloud_api_version = UltimakerCloudAuthentication.CuraCloudAPIVersion # type: str
|
||||||
self._cloud_api_root = UltimakerCloudAuthentication.CuraCloudAPIRoot # type: str
|
self._cloud_api_root = UltimakerCloudAuthentication.CuraCloudAPIRoot # type: str
|
||||||
self._api_url = None # type: Optional[str]
|
self._api_url = None # type: Optional[str]
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ Item
|
|||||||
}
|
}
|
||||||
text: catalog.i18nc("@label", "Move to top");
|
text: catalog.i18nc("@label", "Move to top");
|
||||||
visible: {
|
visible: {
|
||||||
if (printJob && printJob.state == "queued" && !isAssigned(printJob)) {
|
if (printJob && (printJob.state == "queued" || printJob.state == "error") && !isAssigned(printJob)) {
|
||||||
if (OutputDevice && OutputDevice.queuedPrintJobs[0]) {
|
if (OutputDevice && OutputDevice.queuedPrintJobs[0]) {
|
||||||
return OutputDevice.queuedPrintJobs[0].key != printJob.key;
|
return OutputDevice.queuedPrintJobs[0].key != printJob.key;
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ Item
|
|||||||
if (!printJob) {
|
if (!printJob) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var states = ["queued", "sent_to_printer"];
|
var states = ["queued", "error", "sent_to_printer"];
|
||||||
return states.indexOf(printJob.state) !== -1;
|
return states.indexOf(printJob.state) !== -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ Item
|
|||||||
if (!printJob) {
|
if (!printJob) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
var states = ["queued", "sent_to_printer", "pre_print", "printing", "pausing", "paused", "resuming"]
|
var states = ["queued", "error", "sent_to_printer", "pre_print", "printing", "pausing", "paused", "resuming"]
|
||||||
return states.indexOf(printJob.state) !== -1
|
return states.indexOf(printJob.state) !== -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ Item
|
|||||||
if (!printer || !printer.activePrintJob) {
|
if (!printer || !printer.activePrintJob) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
var states = ["queued", "sent_to_printer", "pre_print", "printing", "pausing", "paused", "resuming"]
|
var states = ["queued", "error", "sent_to_printer", "pre_print", "printing", "pausing", "paused", "resuming"]
|
||||||
return states.indexOf(printer.activePrintJob.state) !== -1
|
return states.indexOf(printer.activePrintJob.state) !== -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -306,7 +306,7 @@ Item
|
|||||||
}
|
}
|
||||||
if (printer && printer.state == "unreachable")
|
if (printer && printer.state == "unreachable")
|
||||||
{
|
{
|
||||||
return catalog.i18nc("@label:status", "Unavailable")
|
return catalog.i18nc("@label:status", "Unreachable")
|
||||||
}
|
}
|
||||||
if (printer && !printer.activePrintJob && printer.state == "idle")
|
if (printer && !printer.activePrintJob && printer.state == "idle")
|
||||||
{
|
{
|
||||||
@ -398,6 +398,7 @@ Item
|
|||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default")
|
||||||
text: catalog.i18nc("@label:status", "Requires configuration changes")
|
text: catalog.i18nc("@label:status", "Requires configuration changes")
|
||||||
visible: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 && !printerStatus.visible
|
visible: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 && !printerStatus.visible
|
||||||
|
color: UM.Theme.getColor("monitor_text_primary")
|
||||||
|
|
||||||
// FIXED-LINE-HEIGHT:
|
// FIXED-LINE-HEIGHT:
|
||||||
height: 18 * screenScaleFactor // TODO: Theme!
|
height: 18 * screenScaleFactor // TODO: Theme!
|
||||||
|
@ -13,6 +13,7 @@ from UM.i18n import i18nCatalog
|
|||||||
|
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
from cura.MachineAction import MachineAction
|
from cura.MachineAction import MachineAction
|
||||||
|
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
||||||
|
|
||||||
from .UM3OutputDevicePlugin import UM3OutputDevicePlugin
|
from .UM3OutputDevicePlugin import UM3OutputDevicePlugin
|
||||||
|
|
||||||
@ -133,23 +134,29 @@ class DiscoverUM3Action(MachineAction):
|
|||||||
return
|
return
|
||||||
|
|
||||||
meta_data = global_container_stack.getMetaData()
|
meta_data = global_container_stack.getMetaData()
|
||||||
if "um_network_key" in meta_data:
|
|
||||||
previous_network_key = meta_data["um_network_key"]
|
if "um_network_key" in meta_data: # Global stack already had a connection, but it's changed.
|
||||||
global_container_stack.setMetaDataEntry("um_network_key", printer_device.key)
|
old_network_key = meta_data["um_network_key"]
|
||||||
|
# Since we might have a bunch of hidden stacks, we also need to change it there.
|
||||||
|
metadata_filter = {"um_network_key": old_network_key}
|
||||||
|
containers = CuraContainerRegistry.getInstance().findContainerStacks(type="machine", **metadata_filter)
|
||||||
|
|
||||||
|
for container in containers:
|
||||||
|
container.setMetaDataEntry("um_network_key", printer_device.key)
|
||||||
|
|
||||||
# Delete old authentication data.
|
# Delete old authentication data.
|
||||||
Logger.log("d", "Removing old authentication id %s for device %s",
|
Logger.log("d", "Removing old authentication id %s for device %s",
|
||||||
global_container_stack.getMetaDataEntry("network_authentication_id", None), printer_device.key)
|
global_container_stack.getMetaDataEntry("network_authentication_id", None), printer_device.key)
|
||||||
global_container_stack.removeMetaDataEntry("network_authentication_id")
|
|
||||||
global_container_stack.removeMetaDataEntry("network_authentication_key")
|
|
||||||
CuraApplication.getInstance().getMachineManager().replaceContainersMetadata(key = "um_network_key", value = previous_network_key, new_value = printer_device.key)
|
|
||||||
|
|
||||||
if "connection_type" in meta_data:
|
container.removeMetaDataEntry("network_authentication_id")
|
||||||
previous_connection_type = meta_data["connection_type"]
|
container.removeMetaDataEntry("network_authentication_key")
|
||||||
global_container_stack.setMetaDataEntry("connection_type", printer_device.connectionType.value)
|
|
||||||
CuraApplication.getInstance().getMachineManager().replaceContainersMetadata(key = "connection_type", value = previous_connection_type, new_value = printer_device.connectionType.value)
|
# Ensure that these containers do know that they are configured for network connection
|
||||||
else:
|
container.addConfiguredConnectionType(printer_device.connectionType.value)
|
||||||
|
|
||||||
|
else: # Global stack didn't have a connection yet, configure it.
|
||||||
global_container_stack.setMetaDataEntry("um_network_key", printer_device.key)
|
global_container_stack.setMetaDataEntry("um_network_key", printer_device.key)
|
||||||
global_container_stack.setMetaDataEntry("connection_type", printer_device.connectionType.value)
|
global_container_stack.addConfiguredConnectionType(printer_device.connectionType.value)
|
||||||
|
|
||||||
if self._network_plugin:
|
if self._network_plugin:
|
||||||
# Ensure that the connection states are refreshed.
|
# Ensure that the connection states are refreshed.
|
||||||
|
@ -9,7 +9,7 @@ from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo
|
|||||||
from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager
|
from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager
|
||||||
from PyQt5.QtCore import QUrl
|
from PyQt5.QtCore import QUrl
|
||||||
|
|
||||||
from UM.Application import Application
|
from cura.CuraApplication import CuraApplication
|
||||||
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
|
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
from UM.Signal import Signal, signalemitter
|
from UM.Signal import Signal, signalemitter
|
||||||
@ -41,7 +41,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
self.addDeviceSignal.connect(self._onAddDevice)
|
self.addDeviceSignal.connect(self._onAddDevice)
|
||||||
self.removeDeviceSignal.connect(self._onRemoveDevice)
|
self.removeDeviceSignal.connect(self._onRemoveDevice)
|
||||||
|
|
||||||
Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections)
|
CuraApplication.getInstance().globalContainerStackChanged.connect(self.reCheckConnections)
|
||||||
|
|
||||||
self._discovered_devices = {}
|
self._discovered_devices = {}
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/"
|
self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/"
|
||||||
|
|
||||||
# Get list of manual instances from preferences
|
# Get list of manual instances from preferences
|
||||||
self._preferences = Application.getInstance().getPreferences()
|
self._preferences = CuraApplication.getInstance().getPreferences()
|
||||||
self._preferences.addPreference("um3networkprinting/manual_instances",
|
self._preferences.addPreference("um3networkprinting/manual_instances",
|
||||||
"") # A comma-separated list of ip adresses or hostnames
|
"") # A comma-separated list of ip adresses or hostnames
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
self.resetLastManualDevice()
|
self.resetLastManualDevice()
|
||||||
|
|
||||||
def reCheckConnections(self):
|
def reCheckConnections(self):
|
||||||
active_machine = Application.getInstance().getGlobalContainerStack()
|
active_machine = CuraApplication.getInstance().getGlobalContainerStack()
|
||||||
if not active_machine:
|
if not active_machine:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -118,7 +118,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
if key == um_network_key:
|
if key == um_network_key:
|
||||||
if not self._discovered_devices[key].isConnected():
|
if not self._discovered_devices[key].isConnected():
|
||||||
Logger.log("d", "Attempting to connect with [%s]" % key)
|
Logger.log("d", "Attempting to connect with [%s]" % key)
|
||||||
active_machine.setMetaDataEntry("connection_type", self._discovered_devices[key].connectionType.value)
|
# It should already be set, but if it actually connects we know for sure it's supported!
|
||||||
|
active_machine.addConfiguredConnectionType(self._discovered_devices[key].connectionType.value)
|
||||||
self._discovered_devices[key].connect()
|
self._discovered_devices[key].connect()
|
||||||
self._discovered_devices[key].connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
|
self._discovered_devices[key].connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
|
||||||
else:
|
else:
|
||||||
@ -134,7 +135,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
return
|
return
|
||||||
if self._discovered_devices[key].isConnected():
|
if self._discovered_devices[key].isConnected():
|
||||||
# Sometimes the status changes after changing the global container and maybe the device doesn't belong to this machine
|
# Sometimes the status changes after changing the global container and maybe the device doesn't belong to this machine
|
||||||
um_network_key = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("um_network_key")
|
um_network_key = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("um_network_key")
|
||||||
if key == um_network_key:
|
if key == um_network_key:
|
||||||
self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key])
|
self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key])
|
||||||
else:
|
else:
|
||||||
@ -287,9 +288,10 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
self._discovered_devices[device.getId()] = device
|
self._discovered_devices[device.getId()] = device
|
||||||
self.discoveredDevicesChanged.emit()
|
self.discoveredDevicesChanged.emit()
|
||||||
|
|
||||||
global_container_stack = Application.getInstance().getGlobalContainerStack()
|
global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
|
||||||
if global_container_stack and device.getId() == global_container_stack.getMetaDataEntry("um_network_key"):
|
if global_container_stack and device.getId() == global_container_stack.getMetaDataEntry("um_network_key"):
|
||||||
global_container_stack.setMetaDataEntry("connection_type", device.connectionType.value)
|
# Ensure that the configured connection type is set.
|
||||||
|
global_container_stack.addConfiguredConnectionType(device.connectionType.value)
|
||||||
device.connect()
|
device.connect()
|
||||||
device.connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
|
device.connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
|
||||||
|
|
||||||
@ -306,7 +308,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
|
|||||||
self._service_changed_request_event.wait(timeout = 5.0)
|
self._service_changed_request_event.wait(timeout = 5.0)
|
||||||
|
|
||||||
# Stop if the application is shutting down
|
# Stop if the application is shutting down
|
||||||
if Application.getInstance().isShuttingDown():
|
if CuraApplication.getInstance().isShuttingDown():
|
||||||
return
|
return
|
||||||
|
|
||||||
self._service_changed_request_event.clear()
|
self._service_changed_request_event.clear()
|
||||||
|
@ -55,6 +55,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||||||
self._update_thread = Thread(target = self._update, daemon = True)
|
self._update_thread = Thread(target = self._update, daemon = True)
|
||||||
|
|
||||||
self._last_temperature_request = None # type: Optional[int]
|
self._last_temperature_request = None # type: Optional[int]
|
||||||
|
self._firmware_idle_count = 0
|
||||||
|
|
||||||
self._is_printing = False # A print is being sent.
|
self._is_printing = False # A print is being sent.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2019 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
@ -36,30 +36,63 @@ Column
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
property var printDuration: PrintInformation.currentPrintTime
|
id: byLineType
|
||||||
|
|
||||||
text:
|
property var printDuration: PrintInformation.currentPrintTime
|
||||||
|
property var columnWidthMultipliers: [ 0.4, 0.3, 0.3 ]
|
||||||
|
property var columnHorizontalAligns: [ TextInput.AlignLeft, TextInput.AlignHCenter, TextInput.AlignHCenter ]
|
||||||
|
|
||||||
|
function getMaterialTable()
|
||||||
{
|
{
|
||||||
|
var result = []
|
||||||
|
|
||||||
// All the time information for the different features is achieved
|
// All the time information for the different features is achieved
|
||||||
var printTime = PrintInformation.getFeaturePrintTimes()
|
var printTime = PrintInformation.getFeaturePrintTimes()
|
||||||
var totalSeconds = parseInt(printDuration.getDisplayString(UM.DurationFormat.Seconds))
|
var totalSeconds = parseInt(printDuration.getDisplayString(UM.DurationFormat.Seconds))
|
||||||
|
|
||||||
// A message is created and displayed when the user hover the time label
|
// A message is created and displayed when the user hover the time label
|
||||||
var text = "<table width=\"100%\">"
|
|
||||||
for(var feature in printTime)
|
for(var feature in printTime)
|
||||||
{
|
{
|
||||||
if(!printTime[feature].isTotalDurationZero)
|
if(!printTime[feature].isTotalDurationZero)
|
||||||
{
|
{
|
||||||
text += "<tr><td>" + feature + ":</td>" +
|
var row = []
|
||||||
"<td align=\"right\" valign=\"bottom\"> %1</td>".arg(printTime[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) +
|
row.push(feature + ": ")
|
||||||
"<td align=\"right\" valign=\"bottom\"> %1%</td>".arg(Math.round(100 * parseInt(printTime[feature].getDisplayString(UM.DurationFormat.Seconds)) / totalSeconds)) +
|
row.push("%1".arg(printTime[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)))
|
||||||
"</tr>"
|
row.push("%1%".arg(Math.round(100 * parseInt(printTime[feature].getDisplayString(UM.DurationFormat.Seconds)) / totalSeconds)))
|
||||||
|
result.push(row)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
text += "</table>"
|
|
||||||
return text
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Column
|
||||||
|
{
|
||||||
|
Repeater
|
||||||
|
{
|
||||||
|
model: byLineType.getMaterialTable()
|
||||||
|
Row
|
||||||
|
{
|
||||||
|
Repeater
|
||||||
|
{
|
||||||
|
model: modelData
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
width: Math.round(byLineType.width * byLineType.columnWidthMultipliers[index])
|
||||||
|
height: contentHeight
|
||||||
|
horizontalAlignment: byLineType.columnHorizontalAligns[index]
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
|
text: modelData
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
|
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
|
||||||
|
height: childrenRect.height
|
||||||
color: UM.Theme.getColor("text")
|
color: UM.Theme.getColor("text")
|
||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default")
|
||||||
renderType: Text.NativeRendering
|
renderType: Text.NativeRendering
|
||||||
@ -85,31 +118,19 @@ Column
|
|||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
|
id: byMaterialType
|
||||||
|
|
||||||
property var printMaterialLengths: PrintInformation.materialLengths
|
property var printMaterialLengths: PrintInformation.materialLengths
|
||||||
property var printMaterialWeights: PrintInformation.materialWeights
|
property var printMaterialWeights: PrintInformation.materialWeights
|
||||||
property var printMaterialCosts: PrintInformation.materialCosts
|
property var printMaterialCosts: PrintInformation.materialCosts
|
||||||
property var printMaterialNames: PrintInformation.materialNames
|
property var printMaterialNames: PrintInformation.materialNames
|
||||||
|
property var columnWidthMultipliers: [ 0.4, 0.2, 0.2, 0.2 ]
|
||||||
|
property var columnHorizontalAligns: [ TextInput.AlignLeft, TextInput.AlignHCenter, TextInput.AlignHCenter, TextInput.AlignHCenter ]
|
||||||
|
|
||||||
function formatRow(items)
|
function getMaterialTable()
|
||||||
{
|
{
|
||||||
var rowHTML = "<tr>"
|
var result = []
|
||||||
for(var item = 0; item < items.length; item++)
|
|
||||||
{
|
|
||||||
if (item == 0)
|
|
||||||
{
|
|
||||||
rowHTML += "<td valign=\"bottom\">%1</td>".arg(items[item])
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rowHTML += "<td align=\"right\" valign=\"bottom\"> %1</td>".arg(items[item])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rowHTML += "</tr>"
|
|
||||||
return rowHTML
|
|
||||||
}
|
|
||||||
|
|
||||||
text:
|
|
||||||
{
|
|
||||||
var lengths = []
|
var lengths = []
|
||||||
var weights = []
|
var weights = []
|
||||||
var costs = []
|
var costs = []
|
||||||
@ -135,21 +156,46 @@ Column
|
|||||||
costs = ["0.00"]
|
costs = ["0.00"]
|
||||||
}
|
}
|
||||||
|
|
||||||
var text = "<table width=\"100%\">"
|
|
||||||
for(var index = 0; index < lengths.length; index++)
|
for(var index = 0; index < lengths.length; index++)
|
||||||
{
|
{
|
||||||
text += formatRow([
|
var row = []
|
||||||
"%1:".arg(names[index]),
|
row.push("%1".arg(names[index]))
|
||||||
catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]),
|
row.push(catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]))
|
||||||
catalog.i18nc("@label g for grams", "%1g").arg(weights[index]),
|
row.push(catalog.i18nc("@label g for grams", "%1g").arg(weights[index]))
|
||||||
"%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]),
|
row.push("%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]))
|
||||||
])
|
result.push(row)
|
||||||
}
|
}
|
||||||
text += "</table>"
|
|
||||||
|
|
||||||
return text
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Column
|
||||||
|
{
|
||||||
|
Repeater
|
||||||
|
{
|
||||||
|
model: byMaterialType.getMaterialTable()
|
||||||
|
Row
|
||||||
|
{
|
||||||
|
Repeater
|
||||||
|
{
|
||||||
|
model: modelData
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
width: Math.round(byMaterialType.width * byMaterialType.columnWidthMultipliers[index])
|
||||||
|
height: contentHeight
|
||||||
|
horizontalAlignment: byLineType.columnHorizontalAligns[index]
|
||||||
|
font: UM.Theme.getFont("default")
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
|
text: modelData
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
|
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
|
||||||
|
height: childrenRect.height
|
||||||
color: UM.Theme.getColor("text")
|
color: UM.Theme.getColor("text")
|
||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default")
|
||||||
renderType: Text.NativeRendering
|
renderType: Text.NativeRendering
|
||||||
|
Loading…
x
Reference in New Issue
Block a user