mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-08-08 22:35:03 -06:00
Merge branch 'master' into merge_main_20211019
This commit is contained in:
commit
86046a32b3
274 changed files with 8944 additions and 602 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 []
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ""
|
||||
|
|
|
@ -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"
|
||||
}
|
353
plugins/UM3NetworkPrinting/resources/svg/CloudPlatform.svg
Normal file
353
plugins/UM3NetworkPrinting/resources/svg/CloudPlatform.svg
Normal 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 |
|
@ -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 |
|
@ -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"))
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()]
|
56
plugins/VersionUpgrade/VersionUpgrade411to412/__init__.py
Normal file
56
plugins/VersionUpgrade/VersionUpgrade411to412/__init__.py
Normal 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}
|
|
@ -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"
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue