Просмотр исходного кода

Merge branch '4.1' of github.com:Ultimaker/Cura

Jaime van Kessel 5 лет назад
Родитель
Сommit
314a6495c4

+ 1 - 1
cura/ApplicationMetadata.py

@@ -9,7 +9,7 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura"
 DEFAULT_CURA_VERSION = "master"
 DEFAULT_CURA_BUILD_TYPE = ""
 DEFAULT_CURA_DEBUG_MODE = False
-DEFAULT_CURA_SDK_VERSION = "6.0.0"
+DEFAULT_CURA_SDK_VERSION = "6.1.0"
 
 try:
     from cura.CuraVersion import CuraAppName  # type: ignore

+ 5 - 1
cura/Backups/Backup.py

@@ -148,5 +148,9 @@ class Backup:
         Logger.log("d", "Removing current data in location: %s", target_path)
         Resources.factoryReset()
         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

+ 12 - 2
cura/Backups/BackupsManager.py

@@ -51,8 +51,18 @@ class BackupsManager:
     ##  Here we try to disable the auto-save plug-in as it might interfere with
     #   restoring a back-up.
     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.
     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")

+ 2 - 2
cura/CuraApplication.py

@@ -260,7 +260,7 @@ class CuraApplication(QtApplication):
         self._plugins_loaded = False
 
         # Backups
-        self._auto_save = None
+        self._auto_save = None  # type: Optional[AutoSave]
 
         from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
         self._container_registry_class = CuraContainerRegistry
@@ -988,7 +988,7 @@ class CuraApplication(QtApplication):
 
         return super().event(event)
 
-    def getAutoSave(self):
+    def getAutoSave(self) -> Optional[AutoSave]:
         return self._auto_save
 
     ##  Get print information (duration / material used)

+ 2 - 1
cura/Settings/ExtruderManager.py

@@ -279,7 +279,8 @@ class ExtruderManager(QObject):
             extruder_str_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value"))
             if extruder_str_nr == "-1":
                 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:
             return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]

+ 1 - 21
plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py

@@ -58,14 +58,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
     # Therefore we create a private signal used to trigger the printersChanged signal.
     _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
     #  \param api_client: The client that will run the API calls
     #  \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"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"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
         }
 
@@ -104,7 +97,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
 
         # We keep track of which printer is visible in the monitor page.
         self._active_printer = None  # type: Optional[PrinterOutputModel]
-        self._host_machine_type = ""
 
         # Properties to populate later on with received cloud data.
         self._print_jobs = []  # type: List[UM3PrintJobOutputModel]
@@ -244,11 +236,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
     def _updatePrinters(self, printers: List[CloudClusterPrinterStatus]) -> None:
         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]
-
-        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)
 
         for removed_printer in removed_printers:
@@ -372,13 +359,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
         ).show()
         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.
     #   We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it.
     @pyqtProperty(int, notify = _clusterPrintersChanged)

+ 2 - 2
plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py

@@ -96,7 +96,7 @@ class CloudOutputDeviceManager:
             device = CloudOutputDevice(self._api, cluster)
             self._remote_clusters[cluster.cluster_id] = device
             self._application.getDiscoveredPrintersModel().addDiscoveredPrinter(
-                    cluster.cluster_id,
+                    device.key,
                     device.key,
                     cluster.friendly_name,
                     self._createMachineFromDiscoveredPrinter,
@@ -109,7 +109,7 @@ class CloudOutputDeviceManager:
         for device, cluster in updates:
             device.clusterData = cluster
             self._application.getDiscoveredPrintersModel().updateDiscoveredPrinter(
-                    cluster.cluster_id,
+                    device.key,
                     cluster.friendly_name,
                     device.printerType,
             )

+ 5 - 1
plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py

@@ -15,9 +15,12 @@ class CloudClusterResponse(BaseCloudModel):
     #  \param is_online: Whether this cluster is currently connected to the cloud.
     #  \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_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,
                  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.host_guid = host_guid
         self.host_name = host_name
@@ -26,6 +29,7 @@ class CloudClusterResponse(BaseCloudModel):
         self.host_version = host_version
         self.host_internal_ip = host_internal_ip
         self.friendly_name = friendly_name
+        self.printer_type = printer_type
         super().__init__(**kwargs)
 
     # Validates the model, raising an exception if the model is invalid.

+ 1 - 1
resources/definitions/fdmprinter.def.json

@@ -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.",
                     "type": "bool",
                     "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,
                     "settable_per_mesh": false,
                     "settable_per_extruder": false