Merge branch 'master' into merge_main_20211019

This commit is contained in:
Remco Burema 2021-10-20 08:38:01 +02:00
commit 86046a32b3
No known key found for this signature in database
GPG key ID: 215C49431D43F98C
274 changed files with 8944 additions and 602 deletions

View file

@ -428,6 +428,7 @@ class CuraEngineBackend(QObject, Backend):
"Unable to slice with the current settings. The following settings have errors: {0}").format(", ".join(error_labels)),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
Logger.warning(f"Unable to slice with the current settings. The following settings have errors: {', '.join(error_labels)}")
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -454,6 +455,7 @@ class CuraEngineBackend(QObject, Backend):
"Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}").format(error_labels = ", ".join(errors.values())),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
Logger.warning(f"Unable to slice due to per-object settings. The following settings have errors on one or more models: {', '.join(errors.values())}")
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)

View file

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import numpy
@ -353,10 +353,19 @@ class StartSliceJob(Job):
result[key] = stack.getProperty(key, "value")
Job.yieldThread()
result["print_bed_temperature"] = result["material_bed_temperature"] # Renamed settings.
# Material identification in addition to non-human-readable GUID
result["material_id"] = stack.material.getMetaDataEntry("base_file", "")
result["material_type"] = stack.material.getMetaDataEntry("material", "")
result["material_name"] = stack.material.getMetaDataEntry("name", "")
result["material_brand"] = stack.material.getMetaDataEntry("brand", "")
# Renamed settings.
result["print_bed_temperature"] = result["material_bed_temperature"]
result["print_temperature"] = result["material_print_temperature"]
result["travel_speed"] = result["speed_travel"]
result["time"] = time.strftime("%H:%M:%S") #Some extra settings.
#Some extra settings.
result["time"] = time.strftime("%H:%M:%S")
result["date"] = time.strftime("%d-%m-%Y")
result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))]
result["initial_extruder_nr"] = CuraApplication.getInstance().getExtruderManager().getInitialExtruderNr()
@ -455,9 +464,9 @@ class StartSliceJob(Job):
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"]
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature", "print_temperature"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) == None
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None
# Replace the setting tokens in start and end g-code.
# Use values from the first used extruder by default so we get the expected temperatures

View file

@ -67,10 +67,12 @@ class DigitalFactoryApiClient:
def callbackWrap(response: Optional[Any] = None, *args, **kwargs) -> None:
if (response is not None and isinstance(response, DigitalFactoryFeatureBudgetResponse) and
response.library_max_private_projects is not None):
callback(
response.library_max_private_projects == -1 or # Note: -1 is unlimited
response.library_max_private_projects > 0)
# A user has DF access when library_max_private_projects is either -1 (unlimited) or bigger then 0
has_access = response.library_max_private_projects == -1 or response.library_max_private_projects > 0
callback(has_access)
self._library_max_private_projects = response.library_max_private_projects
# update the account with the additional user rights
self._account.updateAdditionalRight(df_access = has_access)
else:
Logger.warning(f"Digital Factory: Response is not a feature budget, likely an error: {str(response)}")
callback(False)

View file

@ -603,8 +603,8 @@ class DigitalFactoryController(QObject):
self._saveFileToSelectedProjectHelper(filename, formats)
def _saveFileToSelectedProjectHelper(self, filename: str, formats: List[str]) -> None:
# Indicate we have started sending a job.
self.uploadStarted.emit()
# Indicate we have started sending a job (and propagate any user file name changes back to the open project)
self.uploadStarted.emit(filename if "3mf" in formats else None)
library_project_id = self._project_model.items[self._selected_project_idx]["libraryProjectId"]
library_project_name = self._project_model.items[self._selected_project_idx]["displayName"]

View file

@ -8,6 +8,8 @@ from UM.Logger import Logger
from UM.OutputDevice import OutputDeviceError
from UM.OutputDevice.ProjectOutputDevice import ProjectOutputDevice
from UM.Scene.SceneNode import SceneNode
from UM.Version import Version
from cura import ApplicationMetadata
from cura.API import Account
from cura.CuraApplication import CuraApplication
from .DigitalFactoryController import DigitalFactoryController
@ -105,8 +107,11 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
self.enabled = logged_in and self._controller.userAccountHasLibraryAccess()
self.enabledChanged.emit()
def _onWriteStarted(self) -> None:
def _onWriteStarted(self, new_name: Optional[str] = None) -> None:
self._writing = True
if new_name and Version(ApplicationMetadata.CuraSDKVersion) >= Version("7.8.0"):
# setLastOutputName is only supported in sdk version 7.8.0 and up
self.setLastOutputName(new_name) # On saving, the user can change the name, this should propagate.
self.writeStarted.emit(self)
def _onWriteFinished(self) -> None:

View file

@ -96,11 +96,11 @@ UM.Dialog
}
showAll: toggleShowAll.checked || filterInput.text !== ""
}
delegate:Loader
delegate: Loader
{
id: loader
width: parent.width
width: listview.width
height: model.type != undefined ? UM.Theme.getSize("section").height : 0
property var definition: model

View file

@ -9,7 +9,7 @@
# Modified by Ricardo Gomez, ricardoga@otulook.com, to add Bed Temperature and make it work with Cura_13.06.04+
# Modified by Stefan Heule, Dim3nsioneer@gmx.ch since V3.0 (see changelog below)
# Modified by Jaime van Kessel (Ultimaker), j.vankessel@ultimaker.com to make it work for 15.10 / 2.x
# Modified by Ruben Dulek (Ultimaker), r.dulek@ultimaker.com, to debug.
# Modified by Ghostkeeper (Ultimaker), rubend@tutanota.com, to debug.
# Modified by Wes Hanney, https://github.com/novamxd, Retract Length + Speed, Clean up
# history / changelog:

View file

@ -7,6 +7,8 @@
from typing import List
from ..Script import Script
from UM.Application import Application #To get the current printer's settings.
class FilamentChange(Script):
_layer_keyword = ";LAYER:"
@ -81,10 +83,51 @@ class FilamentChange(Script):
"type": "float",
"default_value": 0,
"minimum_value": 0
},
"retract_method":
{
"label": "Retract method",
"description": "The gcode variant to use for retract.",
"type": "enum",
"options": {"U": "Marlin (M600 U)", "L": "Reprap (M600 L)"},
"default_value": "U",
"value": "\\\"L\\\" if machine_gcode_flavor==\\\"RepRap (RepRap)\\\" else \\\"U\\\"",
"enabled": "not firmware_config"
},
"machine_gcode_flavor":
{
"label": "G-code flavor",
"description": "The type of g-code to be generated. This setting is controlled by the script and will not be visible.",
"type": "enum",
"options":
{
"RepRap (Marlin/Sprinter)": "Marlin",
"RepRap (Volumetric)": "Marlin (Volumetric)",
"RepRap (RepRap)": "RepRap",
"UltiGCode": "Ultimaker 2",
"Griffin": "Griffin",
"Makerbot": "Makerbot",
"BFB": "Bits from Bytes",
"MACH3": "Mach3",
"Repetier": "Repetier"
},
"default_value": "RepRap (Marlin/Sprinter)",
"enabled": "false"
}
}
}"""
## Copy machine name and gcode flavor from global stack so we can use their value in the script stack
def initialize(self) -> None:
super().initialize()
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack is None or self._instance is None:
return
for key in ["machine_gcode_flavor"]:
self._instance.setProperty(key, "value", global_container_stack.getProperty(key, "value"))
def execute(self, data: List[str]):
"""Inserts the filament change g-code at specific layer numbers.
@ -106,7 +149,10 @@ class FilamentChange(Script):
color_change = color_change + (" E%.2f" % initial_retract)
if later_retract is not None and later_retract > 0.:
color_change = color_change + (" L%.2f" % later_retract)
# Reprap uses 'L': https://reprap.org/wiki/G-code#M600:_Filament_change_pause
# Marlin uses 'U' https://marlinfw.org/docs/gcode/M600.html
retract_method = self.getSettingValueByKey("retract_method")
color_change = color_change + (" %s%.2f" % (retract_method, later_retract))
if x_pos is not None:
color_change = color_change + (" X%.2f" % x_pos)

View file

@ -1,4 +1,4 @@
# Copyright (c) 2017 Ruben Dulek
# Copyright (c) 2017 Ghostkeeper
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
import re #To perform the search and replace.

View file

@ -130,6 +130,7 @@ class SliceInfo(QObject, Extension):
data["cura_version"] = self._application.getVersion()
data["cura_build_type"] = ApplicationMetadata.CuraBuildType
org_id = user_profile.get("organization_id", None) if user_profile else None
data["is_logged_in"] = self._application.getCuraAPI().account.isLoggedIn
data["organization_id"] = org_id if org_id else None
data["subscriptions"] = user_profile.get("subscriptions", []) if user_profile else []

View file

@ -7,6 +7,7 @@
<b>Intent Profile:</b> Default<br/>
<b>Quality Profile:</b> Fast<br/>
<b>Using Custom Settings:</b> No<br/>
<b>Is Logged In:</b> Yes<br/>
<b>Organization ID (if any):</b> ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE=<br/>
<b>Subscriptions (if any):</b>
<ul>

View file

@ -1,3 +1,6 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os
from collections import OrderedDict
from typing import Dict, Optional, List, Any
@ -95,7 +98,11 @@ class LicensePresenter(QObject):
for package_id, item in packages.items():
item["package_id"] = package_id
item["licence_content"] = self._package_manager.getPackageLicense(item["package_path"])
try:
item["licence_content"] = self._package_manager.getPackageLicense(item["package_path"])
except EnvironmentError as e:
Logger.error(f"Could not open downloaded package {package_id} to read license file! {type(e)} - {e}")
continue # Skip this package.
if item["licence_content"] is None:
# Implicitly accept when there is no license
item["accepted"] = True

View file

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Toolbox is released under the terms of the LGPLv3 or higher.
import json
@ -542,7 +542,7 @@ class Toolbox(QObject, Extension):
# Make API Calls
# --------------------------------------------------------------------------
def _makeRequestByType(self, request_type: str) -> None:
Logger.log("d", "Requesting [%s] metadata from server.", request_type)
Logger.debug(f"Requesting {request_type} metadata from server.")
url = self._request_urls[request_type]
callback = lambda r, rt = request_type: self._onDataRequestFinished(rt, r)
@ -554,7 +554,7 @@ class Toolbox(QObject, Extension):
@pyqtSlot(str)
def startDownload(self, url: str) -> None:
Logger.log("i", "Attempting to download & install package from %s.", url)
Logger.info(f"Attempting to download & install package from {url}.")
callback = lambda r: self._onDownloadFinished(r)
error_callback = lambda r, e: self._onDownloadFailed(r, e)
@ -572,7 +572,7 @@ class Toolbox(QObject, Extension):
@pyqtSlot()
def cancelDownload(self) -> None:
Logger.log("i", "User cancelled the download of a package. request %s", self._download_request_data)
Logger.info(f"User cancelled the download of a package. request {self._download_request_data}")
if self._download_request_data is not None:
self._application.getHttpRequestManager().abortRequest(self._download_request_data)
self._download_request_data = None
@ -585,7 +585,7 @@ class Toolbox(QObject, Extension):
# Handlers for Network Events
# --------------------------------------------------------------------------
def _onDataRequestError(self, request_type: str, reply: "QNetworkReply", error: "QNetworkReply.NetworkError") -> None:
Logger.log("e", "Request [%s] failed due to error [%s]: %s", request_type, error, reply.errorString())
Logger.error(f"Request {request_type} failed due to error {error}: {reply.errorString()}")
self.setViewPage("errored")
def _onDataRequestFinished(self, request_type: str, reply: "QNetworkReply") -> None:
@ -682,9 +682,13 @@ class Toolbox(QObject, Extension):
if not package_info:
Logger.log("w", "Package file [%s] was not a valid CuraPackage.", file_path)
return
license_content = self._package_manager.getPackageLicense(file_path)
package_id = package_info["package_id"]
try:
license_content = self._package_manager.getPackageLicense(file_path)
except EnvironmentError as e:
Logger.error(f"Could not open downloaded package {package_id} to read license file! {type(e)} - {e}")
return
if license_content is not None:
# get the icon url for package_id, make sure the result is a string, never None
icon_url = next((x["icon_url"] for x in self.packagesModel.items if x["id"] == package_id), None) or ""

View file

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Provides support for reading Ultimaker Format Packages.",
"supported_sdk_versions": ["7.7.0"],
"supported_sdk_versions": ["7.8.0"],
"i18n-catalog": "cura"
}

View file

@ -0,0 +1,353 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 274.75 126.24"
version="1.1"
id="svg425"
sodipodi:docname="CloudPlatform.svg"
width="274.75"
height="126.24"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata429">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1200"
id="namedview427"
showgrid="false"
fit-margin-left="1"
fit-margin-bottom="1"
fit-margin-top="1"
fit-margin-right="1"
inkscape:zoom="2.593819"
inkscape:cx="115.77157"
inkscape:cy="14.444977"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg425" />
<defs
id="defs332">
<style
id="style330">.cls-1{fill:#f3f8fe;}.cls-2{fill:none;stroke:#061884;stroke-miterlimit:10;}.cls-3{fill:#061884;}.cls-4,.cls-6{fill:#fff;}.cls-4{fill-rule:evenodd;}.cls-5{fill:#dde9fd;}.cls-7{fill:#c5dbfb;}</style>
</defs>
<g
id="Layer_2"
data-name="Layer 2"
transform="translate(-28.84,-11.189998)">
<path
class="cls-1"
d="M 71.93,79.82 H 49.62 a 4.12,4.12 0 0 0 -4.13,4.11 v 47.55 a 4.13,4.13 0 0 0 4.13,4.12 h 22.31 a 4.13,4.13 0 0 0 4.13,-4.12 V 83.93 a 4.12,4.12 0 0 0 -4.13,-4.11 z m 2.18,51 a 2.82,2.82 0 0 1 -2.82,2.82 h -21 a 2.83,2.83 0 0 1 -2.82,-2.82 V 84.58 a 2.84,2.84 0 0 1 2.82,-2.83 h 5.92 a 1.45,1.45 0 0 0 1.45,1.46 h 6.3 a 1.46,1.46 0 0 0 1.46,-1.46 h 5.91 a 2.83,2.83 0 0 1 2.82,2.83 z"
id="path334"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-2"
d="M 71.93,79.82 H 49.62 a 4.12,4.12 0 0 0 -4.13,4.11 v 47.55 a 4.13,4.13 0 0 0 4.13,4.12 h 22.31 a 4.13,4.13 0 0 0 4.13,-4.12 V 83.93 a 4.12,4.12 0 0 0 -4.13,-4.11 z"
id="path336"
inkscape:connector-curvature="0"
style="fill:none;stroke:#061884;stroke-miterlimit:10" />
<path
class="cls-3"
d="m 63.2,81 h -4.85 a 0.5,0.5 0 1 0 0,1 h 4.85 a 0.5,0.5 0 0 0 0,-1 z"
id="path338"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-4"
d="m 74.11,84.58 v 46.26 a 2.82,2.82 0 0 1 -2.82,2.82 h -21 a 2.83,2.83 0 0 1 -2.82,-2.82 V 84.58 a 2.84,2.84 0 0 1 2.82,-2.83 h 5.92 a 1.45,1.45 0 0 0 1.45,1.46 h 6.3 a 1.46,1.46 0 0 0 1.46,-1.46 h 5.91 a 2.83,2.83 0 0 1 2.78,2.83 z"
id="path340"
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-rule:evenodd" />
<rect
class="cls-5"
x="50.32"
y="125.88"
width="19.91"
height="4.7399998"
id="rect342"
style="fill:#dde9fd" />
<rect
class="cls-5"
x="50.32"
y="85.959999"
width="19.91"
height="1.9"
rx="0.94999999"
id="rect344"
style="fill:#dde9fd" />
<rect
class="cls-5"
x="50.32"
y="114.4"
width="10.43"
height="1.9"
rx="0.94999999"
id="rect346"
style="fill:#dde9fd" />
<rect
class="cls-5"
x="50.32"
y="117.25"
width="10.43"
height="1.9"
rx="0.94999999"
id="rect348"
style="fill:#dde9fd" />
<path
class="cls-1"
d="m 291.5,135.38 a 5.12,5.12 0 0 0 5.11,-5.11 v -0.38 a 0.38,0.38 0 0 0 -0.37,-0.37 h -103.9 a 0.37,0.37 0 0 0 -0.36,0.37 v 0.38 a 5.11,5.11 0 0 0 5.1,5.11 z"
id="path350"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-3"
d="m 296.24,129.89 h -103.9 v 0.38 0 a 4.74,4.74 0 0 0 4.74,4.74 h 94.42 a 4.74,4.74 0 0 0 4.74,-4.74 v -0.38 m 0,-0.73 a 0.73,0.73 0 0 1 0.73,0.73 v 0.38 a 5.47,5.47 0 0 1 -5.47,5.47 h -94.42 a 5.47,5.47 0 0 1 -5.47,-5.47 v -0.38 a 0.73,0.73 0 0 1 0.73,-0.73 z"
id="path352"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-3"
d="m 235.51,129.16 a 2.93,2.93 0 0 0 2.93,2.93 h 11.71 a 2.93,2.93 0 0 0 2.92,-2.93 z"
id="path354"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-1"
d="M 287.83,129.52 V 71.36 a 2.56,2.56 0 0 0 -2.56,-2.56 h -81.95 a 2.56,2.56 0 0 0 -2.56,2.56 v 58.16 z"
id="path356"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-2"
d="M 287.83,129.52 V 71.36 a 2.56,2.56 0 0 0 -2.56,-2.56 h -81.95 a 2.56,2.56 0 0 0 -2.56,2.56 v 58.16"
id="path358"
inkscape:connector-curvature="0"
style="fill:none;stroke:#061884;stroke-miterlimit:10" />
<path
class="cls-6"
d="m 284.17,128.79 v -56 a 0.36,0.36 0 0 0 -0.37,-0.36 h -79 a 0.36,0.36 0 0 0 -0.36,0.36 v 56 z"
id="path360"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-1"
d="m 283.8,72.82 h -79 v 55.61 h 79 V 72.82 m 0.74,0 v 56.34 H 204.05 V 72.82 a 0.73,0.73 0 0 1 0.73,-0.73 h 79 a 0.74,0.74 0 0 1 0.76,0.73 z"
id="path362"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-2"
d="M 204.11,129.57 V 73.86 a 1.64,1.64 0 0 1 1.64,-1.64 H 283 a 1.64,1.64 0 0 1 1.64,1.64 v 55.71"
id="path364"
inkscape:connector-curvature="0"
style="fill:none;stroke:#061884;stroke-miterlimit:10" />
<path
class="cls-2"
d="m 291.5,135.38 a 5.12,5.12 0 0 0 5.11,-5.11 v -0.38 a 0.38,0.38 0 0 0 -0.37,-0.37 h -103.9 a 0.37,0.37 0 0 0 -0.36,0.37 v 0.38 a 5.11,5.11 0 0 0 5.1,5.11 z"
id="path366"
inkscape:connector-curvature="0"
style="fill:none;stroke:#061884;stroke-miterlimit:10" />
<path
class="cls-3"
d="m 131.73,12.19 c -3.87,0 -8.7,5.75 -14.75,17.5 -4.63,9 -8.26,18.32 -8.3,18.41 a 0.86443623,0.86443623 0 0 0 1.61,0.63 c 5.46,-14.09 16.24,-36 21.88,-34.77 5.64,1.23 5.35,21.35 3.87,33.76 a 0.86142324,0.86142324 0 1 0 1.71,0.21 c 0.41,-3.45 3.75,-33.71 -5.22,-35.65 a 3.57,3.57 0 0 0 -0.8,-0.09 z"
id="path368"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-3"
d="m 143.87,17.34 a 3.56,3.56 0 0 0 -0.8,0.08 c -9,1.94 -5.63,32.2 -5.22,35.65 a 0.86142324,0.86142324 0 1 0 1.71,-0.21 c -1.48,-12.41 -1.74,-32.55 3.87,-33.76 5.61,-1.21 16.42,20.68 21.88,34.77 a 0.86443623,0.86443623 0 1 0 1.61,-0.63 c 0,-0.09 -3.67,-9.42 -8.3,-18.41 -6.05,-11.75 -10.88,-17.49 -14.75,-17.49 z"
id="path370"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-1"
d="m 178,135.58 a 2.25,2.25 0 0 0 2.24,-2.24 v -84 A 2.3,2.3 0 0 0 178,47 H 94.81 a 2.29,2.29 0 0 0 -2.24,2.29 v 84 a 2.24,2.24 0 0 0 2.24,2.24 h 6 l 0.69,-0.38 c 3.56,-2 3.94,-2.2 8.66,-2.2 h 51.59 c 4.72,0 5.09,0.21 8.66,2.2 l 0.69,0.38 z"
id="path372"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-3"
d="M 178,47.45 H 94.81 A 1.85,1.85 0 0 0 93,49.31 v 84 0 a 1.81,1.81 0 0 0 1.81,1.81 h 5.93 c 4.15,-2.3 4.37,-2.58 9.46,-2.58 h 51.59 c 5.08,0 5.31,0.28 9.46,2.58 H 178 a 1.81,1.81 0 0 0 1.81,-1.81 v -84 A 1.85,1.85 0 0 0 178,47.45 m 2.67,1.86 v 84 A 2.68,2.68 0 0 1 178,136 h -7 l -0.19,-0.11 -0.59,-0.33 c -3.55,-2 -3.84,-2.14 -8.45,-2.14 H 110.2 c -4.61,0 -4.9,0.16 -8.45,2.14 l -0.59,0.33 -0.2,0.11 h -6.15 a 2.66,2.66 0 0 1 -2.67,-2.67 v -84 a 2.69,2.69 0 0 1 2.67,-2.72 H 178 a 2.7,2.7 0 0 1 2.71,2.7 z"
id="path374"
inkscape:connector-curvature="0"
style="fill:#061884" />
<rect
class="cls-3"
x="111.92"
y="126.55"
width="3.4400001"
height="0.86000001"
id="rect376"
style="fill:#061884" />
<circle
class="cls-3"
cx="102.46"
cy="50.029999"
r="0.86000001"
id="circle378"
style="fill:#061884" />
<circle
class="cls-3"
cx="124.81"
cy="50.029999"
r="0.86000001"
id="circle380"
style="fill:#061884" />
<circle
class="cls-3"
cx="147.17"
cy="50.029999"
r="0.86000001"
id="circle382"
style="fill:#061884" />
<circle
class="cls-3"
cx="169.53"
cy="50.029999"
r="0.86000001"
id="circle384"
style="fill:#061884" />
<circle
class="cls-3"
cx="102.46"
cy="126.55"
r="0.86000001"
id="circle386"
style="fill:#061884" />
<circle
class="cls-3"
cx="169.53"
cy="126.55"
r="0.86000001"
id="circle388"
style="fill:#061884" />
<path
class="cls-6"
d="m 168.52,121.82 a 6.6,6.6 0 0 0 6.6,-6.59 V 60.42 A 3.1,3.1 0 0 0 172,57.34 h -71.19 a 3.08,3.08 0 0 0 -3.08,3.08 v 54.81 a 6.59,6.59 0 0 0 6.6,6.59 z"
id="path390"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-1"
d="m 172,57.77 h -71.19 a 2.65,2.65 0 0 0 -2.65,2.65 v 54.81 a 6.16,6.16 0 0 0 6.17,6.16 h 64.19 a 6.18,6.18 0 0 0 6.17,-6.16 V 60.42 A 2.66,2.66 0 0 0 172,57.77 m 3.52,2.65 v 54.81 0 a 7,7 0 0 1 -7,7 h -64.19 a 7,7 0 0 1 -7,-7 V 60.42 a 3.51,3.51 0 0 1 3.51,-3.51 H 172 a 3.52,3.52 0 0 1 3.55,3.51 z"
id="path392"
inkscape:connector-curvature="0"
style="fill:#f3f8fe" />
<path
class="cls-3"
d="m 172,56.91 h -71.19 a 3.51,3.51 0 0 0 -3.51,3.51 v 54.81 a 7,7 0 0 0 7,7 h 64.19 a 7,7 0 0 0 7,-7 V 60.42 A 3.52,3.52 0 0 0 172,56.91 m 4.38,3.51 v 54.81 a 7.9,7.9 0 0 1 -7.89,7.88 h -64.16 a 7.88,7.88 0 0 1 -7.89,-7.88 V 60.42 a 4.37,4.37 0 0 1 4.37,-4.37 H 172 a 4.38,4.38 0 0 1 4.41,4.37 z"
id="path394"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-7"
d="m 146.31,118 h -20.64 v 10.32 h 20.64 V 118 m 0,-0.85 v 0 a 0.83,0.83 0 0 1 0.84,0.83 v 10.32 0 a 0.83,0.83 0 0 1 -0.84,0.83 h -20.66 a 0.84,0.84 0 0 1 -0.84,-0.83 v -10.37 a 0.84,0.84 0 0 1 0.84,-0.83 z"
id="path396"
inkscape:connector-curvature="0"
style="fill:#c5dbfb" />
<path
class="cls-6"
d="m 142.1,65.93 a 1.35,1.35 0 0 0 1.29,-1 L 145,58.77 v -2.29 h -18 v 2.29 l 1.6,6.23 a 1.34,1.34 0 0 0 1.28,1 z"
id="path398"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-3"
d="m 144.59,56.91 h -17.2 v 1.8 l 1.61,6.14 a 0.9,0.9 0 0 0 0.87,0.65 h 12.23 a 0.89,0.89 0 0 0 0.87,-0.65 l 1.62,-6.14 v -1.8 m 0.86,-0.86 v 2.78 0.1 l -1.62,6.16 a 1.77,1.77 0 0 1 -1.7,1.27 h -12.25 a 1.78,1.78 0 0 1 -1.7,-1.29 l -1.62,-6.14 v -0.1 -2.78 z"
id="path400"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-6"
d="m 140.19,67.65 h 0.15 a 1.34,1.34 0 0 0 1.17,-1.48 l -0.84,-7.11 h -9.36 l -0.84,7.11 v 0.15 a 1.32,1.32 0 0 0 1.33,1.33 z"
id="path402"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-3"
d="m 140.29,59.49 h -8.6 l -0.79,6.73 v 0.1 a 0.9,0.9 0 0 0 0.9,0.9 h 8.49 a 0.9,0.9 0 0 0 0.79,-1 l -0.79,-6.73 m 0.77,-0.86 0.09,0.76 0.79,6.74 a 1.21,1.21 0 0 1 0,0.19 1.76,1.76 0 0 1 -1.76,1.76 h -8.58 a 1.76,1.76 0 0 1 -1.55,-1.95 l 0.79,-6.73 0.09,-0.76 z"
id="path404"
inkscape:connector-curvature="0"
style="fill:#061884" />
<path
class="cls-6"
d="m 147,59.06 a 2.59,2.59 0 0 0 0,-5.16 h -22 a 2.59,2.59 0 0 0 0,5.16 z"
id="path406"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-3"
d="m 147,54.33 h -22 a 2,2 0 0 0 -1.92,2.13 2.07,2.07 0 0 0 1.92,2.17 h 22 a 2.07,2.07 0 0 0 1.92,-2.17 2,2 0 0 0 -1.92,-2.13 m 2.78,2.13 a 2.92,2.92 0 0 1 -2.78,3 h -22 a 3,3 0 0 1 0,-6 h 22 a 2.9,2.9 0 0 1 2.75,3 z"
id="path408"
inkscape:connector-curvature="0"
style="fill:#061884" />
<rect
class="cls-3"
x="135.56"
y="54.330002"
width="0.86000001"
height="4.3699999"
id="rect410"
style="fill:#061884" />
<line
class="cls-2"
x1="29.84"
y1="135.92999"
x2="302.59"
y2="135.92999"
id="line412"
style="fill:none;stroke:#061884;stroke-miterlimit:10" />
<polygon
class="cls-5"
points="112.35,101.51 124.06,121.81 147.5,121.81 159.22,101.51 147.5,81.22 124.06,81.22 "
id="polygon414"
style="fill:#dde9fd" />
<polygon
class="cls-5"
points="224.57,103.51 234.68,121.01 254.89,121.01 264.99,103.51 254.89,86.01 234.68,86.01 "
id="polygon416"
style="fill:#dde9fd" />
<path
class="cls-6"
d="m 125.65,117.53 a 0.41,0.41 0 0 0 -0.41,0.4 v 10.37 0 a 0.41,0.41 0 0 0 0.41,0.4 h 20.68 a 0.4,0.4 0 0 0 0.41,-0.4 v -10.37 0 a 0.4,0.4 0 0 0 -0.41,-0.4 z"
id="path418"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
class="cls-3"
d="m 146.33,117.1 h -20.68 a 0.84,0.84 0 0 0 -0.84,0.83 v 10.37 a 0.84,0.84 0 0 0 0.84,0.83 h 20.68 a 0.83,0.83 0 0 0 0.84,-0.83 v -10.37 0 a 0.83,0.83 0 0 0 -0.84,-0.83 m 1.7,0.83 v 10.37 a 1.7,1.7 0 0 1 -1.7,1.69 h -20.68 a 1.7,1.7 0 0 1 -1.7,-1.69 v -10.37 a 1.7,1.7 0 0 1 1.7,-1.69 h 20.68 a 1.7,1.7 0 0 1 1.67,1.69 z"
id="path420"
inkscape:connector-curvature="0"
style="fill:#061884" />
<polygon
class="cls-5"
points="50.22,101.67 55.22,110.33 65.22,110.33 70.22,101.67 65.22,93.01 55.22,93.01 "
id="polygon422"
style="fill:#dde9fd" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="186px" height="57px" viewBox="0 0 186 57" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
<title>Cloud_connection-icon</title>
<desc>Created with Sketch.</desc>
<g id="Cloud_connection-icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M38.6261428,52.7109865 L7.48755878,52.7109865 C6.85100215,52.7676651 6.21444551,52.994379 5.75149524,53.3911284 L5.40428251,53.7311992 C5.05706981,54.2979841 4.36264439,54.4113411 3.66821896,54.4113411 L0.543304569,54.4113411 C0.369698215,54.4113411 0.196091859,54.2413055 0.196091859,54.0712703 L0.196091859,0.623463283 C0.196091859,0.453427843 0.369698215,0.283392401 0.543304569,0.283392401 L48.3429212,0.283392401 C48.5165273,0.283392401 48.6901338,0.453427843 48.6901338,0.623463283 L48.6901338,26.0155943 C48.4613867,26.0052354 48.2313048,26 48,26 C46.4042274,26 44.8666558,26.2491876 43.4240742,26.7107738 L43.4240742,6.23463283 C43.4240742,5.61116956 42.9032553,5.15774169 42.3245675,5.15774169 L6.50378945,5.15774169 C5.86723281,5.15774169 5.40428251,5.66784803 5.40428251,6.23463283 L5.40428251,41.3186122 C5.40428251,42.9056095 6.73526457,44.2092147 8.35559054,44.2092147 L33.3440862,44.2092147 C34.087979,47.6221969 35.9937272,50.6011835 38.6261428,52.7109865 Z" id="Combined-Shape" fill="#08073F" fill-rule="nonzero"></path>
<path d="M158.961954,52.7109865 L131.487559,52.7109865 C130.851002,52.7676651 130.214446,52.994379 129.751495,53.3911284 L129.404283,53.7311992 C129.05707,54.2979841 128.362644,54.4113411 127.668219,54.4113411 L124.543305,54.4113411 C124.369698,54.4113411 124.196092,54.2413055 124.196092,54.0712703 L124.196092,0.623463283 C124.196092,0.453427843 124.369698,0.283392401 124.543305,0.283392401 L172.342921,0.283392401 C172.516527,0.283392401 172.690134,0.453427843 172.690134,0.623463283 L172.690134,27.0854877 C172.13468,27.0289729 171.570805,27 171,27 C169.770934,27 168.574002,27.1343278 167.424074,27.3886981 L167.424074,6.23463283 C167.424074,5.61116956 166.903255,5.15774169 166.324567,5.15774169 L130.503789,5.15774169 C129.867233,5.15774169 129.404283,5.66784803 129.404283,6.23463283 L129.404283,41.3186122 C129.404283,42.9056095 130.735265,44.2092147 132.355591,44.2092147 L155.096113,44.2092147 C155.462794,47.4493334 156.859805,50.3873861 158.961954,52.7109865 Z" id="Combined-Shape" fill="#08073F" fill-rule="nonzero"></path>
<path d="M171,56 C163.26057,56 157,49.9481159 157,42.5 C157,35.0518841 163.26057,29 171,29 C178.73943,29 185,35.0518841 185,42.5 C185,49.9481159 178.73943,56 171,56 Z M177.416667,40.7546296 C177.233333,39.1569444 175.858333,37.9351852 174.208333,37.9351852 C173.75,37.9351852 173.383333,38.0291667 173.016667,38.2171296 C172.191667,36.9013889 170.725,36.0555556 169.166667,36.0555556 C166.6,36.0555556 164.583333,38.1231482 164.583333,40.7546296 C164.583333,40.7546296 164.583333,40.7546296 164.583333,40.8486111 C163.025,41.0365741 161.833333,42.4462963 161.833333,44.0439815 C161.833333,45.8296296 163.3,47.3333333 165.041667,47.3333333 C166.416667,47.3333333 175.308333,47.3333333 176.958333,47.3333333 C178.7,47.3333333 180.166667,45.8296296 180.166667,44.0439815 C180.166667,42.3523148 178.975,41.0365741 177.416667,40.7546296 Z" id="Combined-Shape" fill="#3282FF" fill-rule="nonzero"></path>
<path d="M48,54 C40.8202983,54 35,48.1797017 35,41 C35,33.8202983 40.8202983,28 48,28 C55.1797017,28 61,33.8202983 61,41 C61,48.1797017 55.1797017,54 48,54 Z M46.862511,41.4631428 L43.8629783,38.6111022 L41.1067187,41.5099007 L47.0308248,47.1427085 L55.8527121,37.698579 L52.9296286,34.9680877 L46.862511,41.4631428 Z" id="Combined-Shape" fill="#3282FF" fill-rule="nonzero"></path>
<path d="M54.5,25 C53.6715729,25 53,24.3284271 53,23.5 C53,22.6715729 53.6715729,22 54.5,22 C55.3284271,22 56,22.6715729 56,23.5 C56,24.3284271 55.3284271,25 54.5,25 Z M78.5,25 C77.6715729,25 77,24.3284271 77,23.5 C77,22.6715729 77.6715729,22 78.5,22 C79.3284271,22 80,22.6715729 80,23.5 C80,24.3284271 79.3284271,25 78.5,25 Z M102.5,25 C101.671573,25 101,24.3284271 101,23.5 C101,22.6715729 101.671573,22 102.5,22 C103.328427,22 104,22.6715729 104,23.5 C104,24.3284271 103.328427,25 102.5,25 Z M62.5,25 C61.6715729,25 61,24.3284271 61,23.5 C61,22.6715729 61.6715729,22 62.5,22 C63.3284271,22 64,22.6715729 64,23.5 C64,24.3284271 63.3284271,25 62.5,25 Z M86.5,25 C85.6715729,25 85,24.3284271 85,23.5 C85,22.6715729 85.6715729,22 86.5,22 C87.3284271,22 88,22.6715729 88,23.5 C88,24.3284271 87.3284271,25 86.5,25 Z M110.5,25 C109.671573,25 109,24.3284271 109,23.5 C109,22.6715729 109.671573,22 110.5,22 C111.328427,22 112,22.6715729 112,23.5 C112,24.3284271 111.328427,25 110.5,25 Z M70.5,25 C69.6715729,25 69,24.3284271 69,23.5 C69,22.6715729 69.6715729,22 70.5,22 C71.3284271,22 72,22.6715729 72,23.5 C72,24.3284271 71.3284271,25 70.5,25 Z M94.5,25 C93.6715729,25 93,24.3284271 93,23.5 C93,22.6715729 93.6715729,22 94.5,22 C95.3284271,22 96,22.6715729 96,23.5 C96,24.3284271 95.3284271,25 94.5,25 Z M118.5,25 C117.671573,25 117,24.3284271 117,23.5 C117,22.6715729 117.671573,22 118.5,22 C119.328427,22 120,22.6715729 120,23.5 C120,24.3284271 119.328427,25 118.5,25 Z" id="Combined-Shape" fill="#3282FF" fill-rule="nonzero"></path>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -15,27 +15,26 @@ I18N_CATALOG = i18nCatalog("cura")
class CloudFlowMessage(Message):
def __init__(self, address: str) -> None:
def __init__(self, printer_name: str) -> None:
image_path = os.path.join(
CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or "",
"resources", "svg", "cloud-flow-start.svg"
"resources", "svg", "CloudPlatform.svg"
)
super().__init__(
text=I18N_CATALOG.i18nc("@info:status",
"Send and monitor print jobs from anywhere using your Ultimaker account."),
lifetime=0,
dismissable=True,
option_state=False,
image_source=QUrl.fromLocalFile(image_path),
image_caption=I18N_CATALOG.i18nc("@info:status Ultimaker Cloud should not be translated.",
"Connect to Ultimaker Digital Factory"),
text = I18N_CATALOG.i18nc("@info:status",
f"Your printer <b>{printer_name}</b> could be connected via cloud.\n Manage your print queue and monitor your prints from anywhere connecting your printer to Digital Factory"),
title = I18N_CATALOG.i18nc("@info:title", "Are you ready for cloud printing?"),
image_source = QUrl.fromLocalFile(image_path)
)
self._address = address
self.addAction("", I18N_CATALOG.i18nc("@action", "Get started"), "", "")
self._printer_name = printer_name
self.addAction("get_started", I18N_CATALOG.i18nc("@action", "Get started"), "", "")
self.addAction("learn_more", I18N_CATALOG.i18nc("@action", "Learn more"), "", "", button_style = Message.ActionButtonStyle.LINK, button_align = Message.ActionButtonAlignment.ALIGN_LEFT)
self.actionTriggered.connect(self._onCloudFlowStarted)
def _onCloudFlowStarted(self, messageId: str, actionId: str) -> None:
QDesktopServices.openUrl(QUrl("http://{}/cloud_connect".format(self._address)))
self.hide()
def _onCloudFlowStarted(self, message_id: str, action_id: str) -> None:
if action_id == "get_started":
QDesktopServices.openUrl(QUrl("https://digitalfactory.ultimaker.com/app/printers?add_printer=true&utm_source=cura&utm_medium=software&utm_campaign=message-networkprinter-added"))
self.hide()
else:
QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360012019239?utm_source=cura&utm_medium=software&utm_campaign=add-cloud-printer"))

View file

@ -52,7 +52,6 @@ class LocalClusterOutputDeviceManager:
def start(self) -> None:
"""Start the network discovery."""
self._zero_conf_client.start()
for address in self._getStoredManualAddresses():
self.addManualDevice(address)
@ -292,4 +291,4 @@ class LocalClusterOutputDeviceManager:
if not CuraApplication.getInstance().getCuraAPI().account.isLoggedIn:
# Do not show the message if the user is not signed in.
return
CloudFlowMessage(device.ipAddress).show()
CloudFlowMessage(device.name).show()

View file

@ -133,6 +133,9 @@ class SendMaterialJob(Job):
except FileNotFoundError:
Logger.error("Unable to send material {material_id}, since it has been deleted in the meanwhile.".format(material_id = material_id))
return
except EnvironmentError as e:
Logger.error(f"Unable to send material {material_id}. We can't open that file for reading: {str(e)}")
return
# Add the material signature file if needed.
signature_file_path = "{}.sig".format(file_path)

View file

@ -0,0 +1,114 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
import io
import os.path
from typing import List, Tuple
from UM.VersionUpgrade import VersionUpgrade
class VersionUpgrade411to412(VersionUpgrade):
"""
Upgrades configurations from the state they were in at version 4.11 to the
state they should be in at version 4.12.
"""
_flsun_profile_mapping = {
"extra_coarse": "flsun_sr_normal",
"coarse": "flsun_sr_normal",
"extra_fast": "flsun_sr_normal",
"draft": "flsun_sr_normal",
"fast": "flsun_sr_normal",
"normal": "flsun_sr_normal",
"high": "flsun_sr_fine"
}
_flsun_quality_type_mapping = {
"extra coarse": "normal",
"coarse" : "normal",
"verydraft" : "normal",
"draft" : "normal",
"fast" : "normal",
"normal" : "normal",
"high" : "fine"
}
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades preferences to have the new version number.
:param serialized: The original contents of the preferences file.
:param filename: The file name of the preferences file.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "19"
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades instance containers to have the new version number.
:param serialized: The original contents of the instance container.
:param filename: The file name of the instance container.
:return: A list of file names, and a list of the new contents for those
files.
"""
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
parser.read_string(serialized)
# Update setting version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "19"
# Update user-made quality profiles of flsun_sr printers to use the flsun_sr-specific qualities instead of the
# global ones as their base
file_base_name = os.path.basename(filename) # Remove any path-related characters from the filename
if file_base_name.startswith("flsun_sr_") and parser["metadata"].get("type") == "quality_changes":
if "general" in parser and parser["general"].get("definition") == "fdmprinter":
old_quality_type = parser["metadata"].get("quality_type", "normal")
parser["general"]["definition"] = "flsun_sr"
parser["metadata"]["quality_type"] = self._flsun_quality_type_mapping.get(old_quality_type, "normal")
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades container stacks to have the new version number.
Upgrades container stacks for FLSun Racer to change their profiles.
:param serialized: The original contents of the container stack.
:param filename: The file name of the container stack.
:return: A list of file names, and a list of the new contents for those
files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update setting version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "19"
# Change renamed profiles.
if "containers" in parser:
definition_id = parser["containers"].get("7")
if definition_id == "flsun_sr":
if parser["metadata"].get("type", "machine") == "machine": # Only global stacks.
old_quality = parser["containers"].get("3")
new_quality = self._flsun_profile_mapping.get(old_quality, "flsun_sr_normal")
parser["containers"]["3"] = new_quality
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View file

@ -0,0 +1,56 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade411to412
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade411to412.VersionUpgrade411to412()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("machine_stack", 5000017): ("machine_stack", 5000019, upgrade.upgradeStack),
("extruder_train", 5000017): ("extruder_train", 5000019, upgrade.upgradeStack),
("definition_changes", 4000017): ("definition_changes", 4000019, upgrade.upgradeInstanceContainer),
("quality_changes", 4000017): ("quality_changes", 4000019, upgrade.upgradeInstanceContainer),
("quality", 4000017): ("quality", 4000019, upgrade.upgradeInstanceContainer),
("user", 4000017): ("user", 4000019, upgrade.upgradeInstanceContainer),
("preferences", 7000017): ("preferences", 7000019, upgrade.upgradePreferences),
},
"sources": {
"machine_stack": {
"get_version": upgrade.getCfgVersion,
"location": {"./machine_instances"}
},
"extruder_train": {
"get_version": upgrade.getCfgVersion,
"location": {"./extruders"}
},
"definition_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./definition_changes"}
},
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality_changes"}
},
"quality": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
}
}
def register(app: "Application") -> Dict[str, Any]:
return {"version_upgrade": upgrade}

View file

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 4.11 to 4.12",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.11 to Cura 4.12.",
"api": 7,
"i18n-catalog": "cura"
}