mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-07-06 03:15:13 +08:00
Merge branch '4.1' of github.com:Ultimaker/Cura
This commit is contained in:
commit
314a6495c4
@ -9,7 +9,7 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura"
|
|||||||
DEFAULT_CURA_VERSION = "master"
|
DEFAULT_CURA_VERSION = "master"
|
||||||
DEFAULT_CURA_BUILD_TYPE = ""
|
DEFAULT_CURA_BUILD_TYPE = ""
|
||||||
DEFAULT_CURA_DEBUG_MODE = False
|
DEFAULT_CURA_DEBUG_MODE = False
|
||||||
DEFAULT_CURA_SDK_VERSION = "6.0.0"
|
DEFAULT_CURA_SDK_VERSION = "6.1.0"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cura.CuraVersion import CuraAppName # type: ignore
|
from cura.CuraVersion import CuraAppName # type: ignore
|
||||||
|
@ -148,5 +148,9 @@ class Backup:
|
|||||||
Logger.log("d", "Removing current data in location: %s", target_path)
|
Logger.log("d", "Removing current data in location: %s", target_path)
|
||||||
Resources.factoryReset()
|
Resources.factoryReset()
|
||||||
Logger.log("d", "Extracting backup to location: %s", target_path)
|
Logger.log("d", "Extracting backup to location: %s", target_path)
|
||||||
archive.extractall(target_path)
|
try:
|
||||||
|
archive.extractall(target_path)
|
||||||
|
except PermissionError:
|
||||||
|
Logger.logException("e", "Unable to extract the backup due to permission errors")
|
||||||
|
return False
|
||||||
return True
|
return True
|
||||||
|
@ -51,8 +51,18 @@ class BackupsManager:
|
|||||||
## Here we try to disable the auto-save plug-in as it might interfere with
|
## Here we try to disable the auto-save plug-in as it might interfere with
|
||||||
# restoring a back-up.
|
# restoring a back-up.
|
||||||
def _disableAutoSave(self) -> None:
|
def _disableAutoSave(self) -> None:
|
||||||
self._application.getAutoSave().setEnabled(False)
|
auto_save = self._application.getAutoSave()
|
||||||
|
# The auto save is only not created if the application has not yet started.
|
||||||
|
if auto_save:
|
||||||
|
auto_save.setEnabled(False)
|
||||||
|
else:
|
||||||
|
Logger.log("e", "Unable to disable the autosave as application init has not been completed")
|
||||||
|
|
||||||
## Re-enable auto-save after we're done.
|
## Re-enable auto-save after we're done.
|
||||||
def _enableAutoSave(self) -> None:
|
def _enableAutoSave(self) -> None:
|
||||||
self._application.getAutoSave().setEnabled(True)
|
auto_save = self._application.getAutoSave()
|
||||||
|
# The auto save is only not created if the application has not yet started.
|
||||||
|
if auto_save:
|
||||||
|
auto_save.setEnabled(True)
|
||||||
|
else:
|
||||||
|
Logger.log("e", "Unable to enable the autosave as application init has not been completed")
|
||||||
|
@ -260,7 +260,7 @@ class CuraApplication(QtApplication):
|
|||||||
self._plugins_loaded = False
|
self._plugins_loaded = False
|
||||||
|
|
||||||
# Backups
|
# Backups
|
||||||
self._auto_save = None
|
self._auto_save = None # type: Optional[AutoSave]
|
||||||
|
|
||||||
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
||||||
self._container_registry_class = CuraContainerRegistry
|
self._container_registry_class = CuraContainerRegistry
|
||||||
@ -988,7 +988,7 @@ class CuraApplication(QtApplication):
|
|||||||
|
|
||||||
return super().event(event)
|
return super().event(event)
|
||||||
|
|
||||||
def getAutoSave(self):
|
def getAutoSave(self) -> Optional[AutoSave]:
|
||||||
return self._auto_save
|
return self._auto_save
|
||||||
|
|
||||||
## Get print information (duration / material used)
|
## Get print information (duration / material used)
|
||||||
|
@ -279,7 +279,8 @@ class ExtruderManager(QObject):
|
|||||||
extruder_str_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value"))
|
extruder_str_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value"))
|
||||||
if extruder_str_nr == "-1":
|
if extruder_str_nr == "-1":
|
||||||
extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition
|
extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition
|
||||||
used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr])
|
if extruder_str_nr in self.extruderIds:
|
||||||
|
used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
|
return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
|
||||||
|
@ -58,14 +58,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
# Therefore we create a private signal used to trigger the printersChanged signal.
|
# Therefore we create a private signal used to trigger the printersChanged signal.
|
||||||
_clusterPrintersChanged = pyqtSignal()
|
_clusterPrintersChanged = pyqtSignal()
|
||||||
|
|
||||||
# Map of Cura Connect machine_variant field to Cura machine types.
|
|
||||||
# Needed for printer discovery stack creation.
|
|
||||||
_host_machine_variant_to_machine_type_map = {
|
|
||||||
"Ultimaker 3": "ultimaker3",
|
|
||||||
"Ultimaker 3 Extended": "ultimaker3_extended",
|
|
||||||
"Ultimaker S5": "ultimaker_s5"
|
|
||||||
}
|
|
||||||
|
|
||||||
## Creates a new cloud output device
|
## Creates a new cloud output device
|
||||||
# \param api_client: The client that will run the API calls
|
# \param api_client: The client that will run the API calls
|
||||||
# \param cluster: The device response received from the cloud API.
|
# \param cluster: The device response received from the cloud API.
|
||||||
@ -79,6 +71,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
b"address": cluster.host_internal_ip.encode() if cluster.host_internal_ip else b"",
|
b"address": cluster.host_internal_ip.encode() if cluster.host_internal_ip else b"",
|
||||||
b"name": cluster.friendly_name.encode() if cluster.friendly_name else b"",
|
b"name": cluster.friendly_name.encode() if cluster.friendly_name else b"",
|
||||||
b"firmware_version": cluster.host_version.encode() if cluster.host_version else b"",
|
b"firmware_version": cluster.host_version.encode() if cluster.host_version else b"",
|
||||||
|
b"printer_type": cluster.printer_type.encode() if cluster.printer_type else b"",
|
||||||
b"cluster_size": b"1" # cloud devices are always clusters of at least one
|
b"cluster_size": b"1" # cloud devices are always clusters of at least one
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +97,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
|
|
||||||
# We keep track of which printer is visible in the monitor page.
|
# We keep track of which printer is visible in the monitor page.
|
||||||
self._active_printer = None # type: Optional[PrinterOutputModel]
|
self._active_printer = None # type: Optional[PrinterOutputModel]
|
||||||
self._host_machine_type = ""
|
|
||||||
|
|
||||||
# Properties to populate later on with received cloud data.
|
# Properties to populate later on with received cloud data.
|
||||||
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
|
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
|
||||||
@ -244,11 +236,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
def _updatePrinters(self, printers: List[CloudClusterPrinterStatus]) -> None:
|
def _updatePrinters(self, printers: List[CloudClusterPrinterStatus]) -> None:
|
||||||
previous = {p.key: p for p in self._printers} # type: Dict[str, PrinterOutputModel]
|
previous = {p.key: p for p in self._printers} # type: Dict[str, PrinterOutputModel]
|
||||||
received = {p.uuid: p for p in printers} # type: Dict[str, CloudClusterPrinterStatus]
|
received = {p.uuid: p for p in printers} # type: Dict[str, CloudClusterPrinterStatus]
|
||||||
|
|
||||||
if len(printers) > 0:
|
|
||||||
# We need the machine type of the host (1st list entry) to allow discovery to work.
|
|
||||||
self._host_machine_type = printers[0].machine_variant
|
|
||||||
|
|
||||||
removed_printers, added_printers, updated_printers = findChanges(previous, received)
|
removed_printers, added_printers, updated_printers = findChanges(previous, received)
|
||||||
|
|
||||||
for removed_printer in removed_printers:
|
for removed_printer in removed_printers:
|
||||||
@ -372,13 +359,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
).show()
|
).show()
|
||||||
self.writeFinished.emit()
|
self.writeFinished.emit()
|
||||||
|
|
||||||
## Gets the printer type of the cluster host. Falls back to the printer type in the device properties.
|
|
||||||
@pyqtProperty(str, notify=_clusterPrintersChanged)
|
|
||||||
def printerType(self) -> str:
|
|
||||||
if self._printers and self._host_machine_type in self._host_machine_variant_to_machine_type_map:
|
|
||||||
return self._host_machine_variant_to_machine_type_map[self._host_machine_type]
|
|
||||||
return super().printerType
|
|
||||||
|
|
||||||
## Gets the number of printers in the cluster.
|
## Gets the number of printers in the cluster.
|
||||||
# We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it.
|
# We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it.
|
||||||
@pyqtProperty(int, notify = _clusterPrintersChanged)
|
@pyqtProperty(int, notify = _clusterPrintersChanged)
|
||||||
|
@ -96,7 +96,7 @@ class CloudOutputDeviceManager:
|
|||||||
device = CloudOutputDevice(self._api, cluster)
|
device = CloudOutputDevice(self._api, cluster)
|
||||||
self._remote_clusters[cluster.cluster_id] = device
|
self._remote_clusters[cluster.cluster_id] = device
|
||||||
self._application.getDiscoveredPrintersModel().addDiscoveredPrinter(
|
self._application.getDiscoveredPrintersModel().addDiscoveredPrinter(
|
||||||
cluster.cluster_id,
|
device.key,
|
||||||
device.key,
|
device.key,
|
||||||
cluster.friendly_name,
|
cluster.friendly_name,
|
||||||
self._createMachineFromDiscoveredPrinter,
|
self._createMachineFromDiscoveredPrinter,
|
||||||
@ -109,7 +109,7 @@ class CloudOutputDeviceManager:
|
|||||||
for device, cluster in updates:
|
for device, cluster in updates:
|
||||||
device.clusterData = cluster
|
device.clusterData = cluster
|
||||||
self._application.getDiscoveredPrintersModel().updateDiscoveredPrinter(
|
self._application.getDiscoveredPrintersModel().updateDiscoveredPrinter(
|
||||||
cluster.cluster_id,
|
device.key,
|
||||||
cluster.friendly_name,
|
cluster.friendly_name,
|
||||||
device.printerType,
|
device.printerType,
|
||||||
)
|
)
|
||||||
|
@ -15,9 +15,12 @@ class CloudClusterResponse(BaseCloudModel):
|
|||||||
# \param is_online: Whether this cluster is currently connected to the cloud.
|
# \param is_online: Whether this cluster is currently connected to the cloud.
|
||||||
# \param status: The status of the cluster authentication (active or inactive).
|
# \param status: The status of the cluster authentication (active or inactive).
|
||||||
# \param host_version: The firmware version of the cluster host. This is where the Stardust client is running on.
|
# \param host_version: The firmware version of the cluster host. This is where the Stardust client is running on.
|
||||||
|
# \param host_internal_ip: The internal IP address of the host printer.
|
||||||
|
# \param friendly_name: The human readable name of the host printer.
|
||||||
|
# \param printer_type: The machine type of the host printer.
|
||||||
def __init__(self, cluster_id: str, host_guid: str, host_name: str, is_online: bool, status: str,
|
def __init__(self, cluster_id: str, host_guid: str, host_name: str, is_online: bool, status: str,
|
||||||
host_internal_ip: Optional[str] = None, host_version: Optional[str] = None,
|
host_internal_ip: Optional[str] = None, host_version: Optional[str] = None,
|
||||||
friendly_name: Optional[str] = None, **kwargs) -> None:
|
friendly_name: Optional[str] = None, printer_type: str = "ultimaker3", **kwargs) -> None:
|
||||||
self.cluster_id = cluster_id
|
self.cluster_id = cluster_id
|
||||||
self.host_guid = host_guid
|
self.host_guid = host_guid
|
||||||
self.host_name = host_name
|
self.host_name = host_name
|
||||||
@ -26,6 +29,7 @@ class CloudClusterResponse(BaseCloudModel):
|
|||||||
self.host_version = host_version
|
self.host_version = host_version
|
||||||
self.host_internal_ip = host_internal_ip
|
self.host_internal_ip = host_internal_ip
|
||||||
self.friendly_name = friendly_name
|
self.friendly_name = friendly_name
|
||||||
|
self.printer_type = printer_type
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
# Validates the model, raising an exception if the model is invalid.
|
# Validates the model, raising an exception if the model is invalid.
|
||||||
|
@ -5353,7 +5353,7 @@
|
|||||||
"description": "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type.",
|
"description": "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type.",
|
||||||
"type": "bool",
|
"type": "bool",
|
||||||
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') != 'raft')",
|
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') != 'raft')",
|
||||||
"resolve": "resolveOrValue('prime_tower_enable') and (adhesion_type in ('none', 'skirt'))",
|
"resolve": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') in ('none', 'skirt'))",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false
|
"settable_per_extruder": false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user