Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemco Burema <r.burema@ultimaker.com>2021-07-16 09:49:46 +0300
committerRemco Burema <r.burema@ultimaker.com>2021-07-16 09:49:46 +0300
commit6c08bbfc9d0c9d035a12f0f029215ce9024de329 (patch)
tree8adf0f8ffadc134b98d6d2335f7fa7d2ccf529a8
parent88954922d4fbb6d64981842b4f5b71ddf5a31871 (diff)
parent6f6d8d0f93927a202d81100cc203364f0aa01314 (diff)
Merge branch 'master' into libArachne_rebased
-rw-r--r--cura/Machines/Models/ExtrudersModel.py2
-rw-r--r--cura/UI/TextManager.py53
-rwxr-xr-xplugins/CuraEngineBackend/CuraEngineBackend.py38
-rw-r--r--plugins/DigitalLibrary/resources/images/projects_not_found.svg62
-rw-r--r--plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml62
-rw-r--r--plugins/DigitalLibrary/src/DigitalFactoryApiClient.py33
-rw-r--r--plugins/DigitalLibrary/src/DigitalFactoryController.py63
-rw-r--r--plugins/DigitalLibrary/src/DigitalFactoryFeatureBudgetResponse.py43
-rw-r--r--plugins/DigitalLibrary/src/DigitalFactoryFileProvider.py4
-rw-r--r--plugins/DigitalLibrary/src/DigitalFactoryOutputDevice.py4
-rw-r--r--plugins/DigitalLibrary/tests/TestDigitalLibraryApiClient.py11
-rw-r--r--plugins/PerObjectSettingsTool/PerObjectSettingsTool.py21
-rw-r--r--plugins/PrepareStage/PrepareMenu.qml143
-rw-r--r--plugins/PreviewStage/PreviewMenu.qml34
-rw-r--r--plugins/SimulationView/SimulationViewMenuComponent.qml6
-rw-r--r--plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml48
-rw-r--r--plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml2
-rw-r--r--plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml42
-rw-r--r--plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml3
-rw-r--r--plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py11
-rw-r--r--plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py3
-rw-r--r--resources/definitions/atom2.def.json35
-rw-r--r--resources/definitions/creasee_cs20.def.json32
-rw-r--r--resources/definitions/creasee_cs30.def.json32
-rw-r--r--resources/definitions/dagoma_disco.def.json3
-rw-r--r--resources/definitions/geeetech_a30.def.json2
-rw-r--r--resources/definitions/maker_made_300x.def.json1
-rw-r--r--resources/definitions/malyan_m200.def.json3
-rw-r--r--resources/definitions/pbr3d_g1.def.json45
-rw-r--r--resources/definitions/printrbot_play.def.json3
-rw-r--r--resources/definitions/rigid3d_base.def.json3
-rw-r--r--resources/definitions/strateo3d.def.json88
-rw-r--r--resources/definitions/tevo_tarantula.def.json3
-rw-r--r--resources/definitions/voron0_120.def.json4
-rw-r--r--resources/extruders/atom2_extruder_0.def.json15
-rw-r--r--resources/extruders/creasee_extruder_0.def.json15
-rw-r--r--resources/extruders/creasee_extruder_1.def.json15
-rw-r--r--resources/extruders/pbr3d_g1_extruder_0.def.json15
-rw-r--r--resources/i18n/de_DE/fdmprinter.def.json.po2
-rw-r--r--resources/meshes/pbr3d_g1_buildplate.stlbin0 -> 113884 bytes
-rw-r--r--resources/qml/Account/AccountWidget.qml13
-rw-r--r--resources/qml/Account/UserOperations.qml5
-rw-r--r--resources/qml/ActionButton.qml71
-rw-r--r--resources/qml/ActionPanel/OutputDevicesActionButton.qml26
-rw-r--r--resources/qml/Cura.qml8
-rw-r--r--resources/qml/ExpandableComponent.qml34
-rw-r--r--resources/qml/ExpandablePopup.qml32
-rw-r--r--resources/qml/ExtruderButton.qml1
-rw-r--r--resources/qml/ExtruderIcon.qml54
-rw-r--r--resources/qml/MainWindow/MainWindowHeader.qml2
-rw-r--r--resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml37
-rw-r--r--resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml6
-rw-r--r--resources/qml/ObjectItemButton.qml10
-rw-r--r--resources/qml/PrimaryButton.qml4
-rw-r--r--resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml5
-rw-r--r--resources/qml/PrintSetupSelector/PrintSetupSelector.qml3
-rw-r--r--resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml6
-rw-r--r--resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml1
-rw-r--r--resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml5
-rw-r--r--resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml2
-rw-r--r--resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml13
-rw-r--r--resources/qml/PrinterSelector/MachineSelector.qml24
-rw-r--r--resources/qml/RadioCheckbar.qml1
-rw-r--r--resources/qml/SecondaryButton.qml6
-rw-r--r--resources/qml/Settings/SettingCategory.qml13
-rw-r--r--resources/qml/Settings/SettingExtruder.qml16
-rw-r--r--resources/qml/Settings/SettingItem.qml5
-rw-r--r--resources/qml/Settings/SettingOptionalExtruder.qml16
-rw-r--r--resources/qml/Settings/SettingView.qml12
-rw-r--r--resources/qml/TertiaryButton.qml4
-rw-r--r--resources/qml/Toolbar.qml3
-rw-r--r--resources/qml/ViewOrientationButton.qml1
-rw-r--r--resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml8
-rw-r--r--resources/qml/Widgets/TextField.qml24
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_A.inst.cfg62
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_B.inst.cfg62
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_C.inst.cfg62
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_A.inst.cfg50
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_B.inst.cfg50
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_C.inst.cfg50
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_A.inst.cfg61
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_B.inst.cfg61
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_C.inst.cfg61
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PEKK_B.inst.cfg58
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_C.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_A.inst.cfg55
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_B.inst.cfg54
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_C.inst.cfg54
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_A.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_B.inst.cfg47
-rw-r--r--resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_C.inst.cfg47
-rw-r--r--resources/themes/cura-dark/theme.json21
-rw-r--r--resources/themes/cura-light/icons/default/Extruder.svg13
-rw-r--r--resources/themes/cura-light/icons/default/ExtruderColor.svg14
-rw-r--r--resources/themes/cura-light/icons/default/Infill100.svg3
-rw-r--r--resources/themes/cura-light/icons/default/Solid.svg13
-rw-r--r--resources/themes/cura-light/icons/low/CloudBadge.svg (renamed from resources/themes/cura-light/icons/low/CloudBlueBG.svg)2
-rw-r--r--resources/themes/cura-light/icons/low/CloudGreyBG.svg5
-rw-r--r--resources/themes/cura-light/icons/medium/ExtruderColor.svg14
-rw-r--r--resources/themes/cura-light/icons/medium/Folder.svg11
-rw-r--r--resources/themes/cura-light/icons/medium/Printer.svg13
-rw-r--r--resources/themes/cura-light/icons/medium/Sliders.svg17
-rwxr-xr-xresources/themes/cura-light/styles.qml6
-rw-r--r--resources/themes/cura-light/theme.json69
-rw-r--r--resources/variants/strateo3d_high_temp_04.inst.cfg20
122 files changed, 2903 insertions, 520 deletions
diff --git a/cura/Machines/Models/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py
index e979a1e848..1aba1d871a 100644
--- a/cura/Machines/Models/ExtrudersModel.py
+++ b/cura/Machines/Models/ExtrudersModel.py
@@ -215,7 +215,7 @@ class ExtrudersModel(ListModel):
"id": "",
"name": catalog.i18nc("@menuitem", "Not overridden"),
"enabled": True,
- "color": "#ffffff",
+ "color": "transparent",
"index": -1,
"definition": "",
"material": "",
diff --git a/cura/UI/TextManager.py b/cura/UI/TextManager.py
index 99c1a55d46..77dadae809 100644
--- a/cura/UI/TextManager.py
+++ b/cura/UI/TextManager.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Ultimaker B.V.
+# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import collections
@@ -6,9 +6,11 @@ from typing import Optional, Dict, List, cast
from PyQt5.QtCore import QObject, pyqtSlot
+from UM.i18n import i18nCatalog
from UM.Resources import Resources
from UM.Version import Version
+catalog = i18nCatalog("cura")
#
# This manager provides means to load texts to QML.
@@ -30,32 +32,35 @@ class TextManager(QObject):
# Load change log texts and organize them with a dict
try:
file_path = Resources.getPath(Resources.Texts, "change_log.txt")
- except FileNotFoundError:
+ except FileNotFoundError as e:
# I have no idea how / when this happens, but we're getting crash reports about it.
- return ""
+ return catalog.i18nc("@text:window", "The release notes could not be opened.") + "<br>" + str(e)
change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]]
- with open(file_path, "r", encoding = "utf-8") as f:
- open_version = None # type: Optional[Version]
- open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
- for line in f:
- line = line.replace("\n", "")
- if "[" in line and "]" in line:
- line = line.replace("[", "")
- line = line.replace("]", "")
- open_version = Version(line)
- if open_version < Version([0, 0, 1]): # Something went wrong with parsing, assume non-numerical alternate version that should be on top.
- open_version = Version([99, 99, 99])
- if Version([14, 99, 99]) < open_version < Version([16, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x
- open_version = Version([0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion()])
- open_header = ""
- change_logs_dict[open_version] = collections.OrderedDict()
- elif line.startswith("*"):
- open_header = line.replace("*", "")
- change_logs_dict[cast(Version, open_version)][open_header] = []
- elif line != "":
- if open_header not in change_logs_dict[cast(Version, open_version)]:
+ try:
+ with open(file_path, "r", encoding = "utf-8") as f:
+ open_version = None # type: Optional[Version]
+ open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
+ for line in f:
+ line = line.replace("\n", "")
+ if "[" in line and "]" in line:
+ line = line.replace("[", "")
+ line = line.replace("]", "")
+ open_version = Version(line)
+ if open_version < Version([0, 0, 1]): # Something went wrong with parsing, assume non-numerical alternate version that should be on top.
+ open_version = Version([99, 99, 99])
+ if Version([14, 99, 99]) < open_version < Version([16, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x
+ open_version = Version([0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion()])
+ open_header = ""
+ change_logs_dict[open_version] = collections.OrderedDict()
+ elif line.startswith("*"):
+ open_header = line.replace("*", "")
change_logs_dict[cast(Version, open_version)][open_header] = []
- change_logs_dict[cast(Version, open_version)][open_header].append(line)
+ elif line != "":
+ if open_header not in change_logs_dict[cast(Version, open_version)]:
+ change_logs_dict[cast(Version, open_version)][open_header] = []
+ change_logs_dict[cast(Version, open_version)][open_header].append(line)
+ except EnvironmentError as e:
+ return catalog.i18nc("@text:window", "The release notes could not be opened.") + "<br>" + str(e)
# Format changelog text
content = ""
diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py
index 1aa6c86dcb..272ad3a7e9 100755
--- a/plugins/CuraEngineBackend/CuraEngineBackend.py
+++ b/plugins/CuraEngineBackend/CuraEngineBackend.py
@@ -4,12 +4,12 @@
import argparse #To run the engine in debug mode if the front-end is in debug mode.
from collections import defaultdict
import os
-from PyQt5.QtCore import QObject, QTimer, pyqtSlot
+from PyQt5.QtCore import QObject, QTimer, QUrl, pyqtSlot
import sys
from time import time
from typing import Any, cast, Dict, List, Optional, Set, TYPE_CHECKING
-from PyQt5.QtGui import QImage
+from PyQt5.QtGui import QDesktopServices, QImage
from UM.Backend.Backend import Backend, BackendState
from UM.Scene.SceneNode import SceneNode
@@ -157,6 +157,18 @@ class CuraEngineBackend(QObject, Backend):
self.determineAutoSlicing()
application.getPreferences().preferenceChanged.connect(self._onPreferencesChanged)
+ self._slicing_error_message = Message(
+ text = catalog.i18nc("@message", "Slicing failed with an unexpected error. Please consider reporting a bug on our issue tracker."),
+ title = catalog.i18nc("@message:title", "Slicing failed")
+ )
+ self._slicing_error_message.addAction(
+ action_id = "report_bug",
+ name = catalog.i18nc("@message:button", "Report a bug"),
+ description = catalog.i18nc("@message:description", "Report a bug on Ultimaker Cura's issue tracker."),
+ icon = "[no_icon]"
+ )
+ self._slicing_error_message.actionTriggered.connect(self._reportBackendError)
+
self._snapshot = None #type: Optional[QImage]
application.initializationFinished.connect(self.initialize)
@@ -598,10 +610,15 @@ class CuraEngineBackend(QObject, Backend):
if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]:
Logger.log("w", "A socket error caused the connection to be reset")
+ elif error.getErrorCode() == Arcus.ErrorCode.ConnectionResetError:
+ Logger.error("CuraEngine crashed abnormally! The socket connection was reset unexpectedly.")
+ self._slicing_error_message.show()
+ self.setState(BackendState.Error)
+ self.stopSlicing()
# _terminate()' function sets the job status to 'cancel', after reconnecting to another Port the job status
# needs to be updated. Otherwise backendState is "Unable To Slice"
- if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None:
+ elif error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None:
self._start_slice_job.setIsCancelled(False)
# Check if there's any slicable object in the scene.
@@ -922,9 +939,22 @@ class CuraEngineBackend(QObject, Backend):
if not self._restart:
if self._process: # type: ignore
- Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) # type: ignore
+ return_code = self._process.wait()
+ if return_code != 0:
+ Logger.log("e", f"Backend exited abnormally with return code {return_code}!")
+ self._slicing_error_message.show()
+ self.setState(BackendState.Error)
+ self.stopSlicing()
+ else:
+ Logger.log("d", "Backend finished slicing. Resetting process and socket.")
self._process = None # type: ignore
+ def _reportBackendError(self, _message_id: str, _action_id: str) -> None:
+ """
+ Triggered when the user wants to report an error in the back-end.
+ """
+ QDesktopServices.openUrl(QUrl("https://github.com/Ultimaker/Cura/issues/new/choose"))
+
def _onGlobalStackChanged(self) -> None:
"""Called when the global container stack changes"""
diff --git a/plugins/DigitalLibrary/resources/images/projects_not_found.svg b/plugins/DigitalLibrary/resources/images/projects_not_found.svg
new file mode 100644
index 0000000000..8aee7b797c
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/images/projects_not_found.svg
@@ -0,0 +1,62 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 378.13 348.13">
+ <defs>
+ <style>
+ .cls-2,.cls-6{fill:#c5dbfb;}
+ .cls-3,.cls-5,.cls-8{fill:#fff;}
+ .cls-3{stroke:#c5dbfb;}
+ .cls-10,.cls-3,.cls-4,.cls-6,.cls-7,.cls-8{stroke-miterlimit:10;stroke-width:2px;}
+ .cls-4,.cls-7{fill:#f3f8fe;}
+ .cls-4{stroke:#f3f8fe;}
+ .cls-6,.cls-7,.cls-8{stroke:#061884;}
+ .cls-10{fill:#196ef0;stroke:#196ef0;}
+ .cls-11{fill:#061884;}
+ </style>
+ <clipPath id="clip-path">
+ <circle fill="none" cx="155" cy="125" r="80" />
+ </clipPath>
+ </defs>
+ <path class="cls-2" d="M43,17V3H83a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-3" d="M3,1H40L56,17H87a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V3A2,2,0,0,1,3,1Z" />
+ <path class="cls-2" d="M153,17V3h40a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-3" d="M113,1h37l16,16h31a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H113a2,2,0,0,1-2-2V3A2,2,0,0,1,113,1Z" />
+ <path class="cls-2" d="M263,17V3h40a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-3" d="M223,1h37l16,16h31a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V3A2,2,0,0,1,223,1Z" />
+ <path class="cls-2" d="M43,107V93H83a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M3,91H40l16,16H87a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V93A2,2,0,0,1,3,91Z" />
+ <path class="cls-4" d="M153,107V93h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M113,91h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H113a2,2,0,0,1-2-2V93A2,2,0,0,1,113,91Z" />
+ <path class="cls-2" d="M263,107V93h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M223,91h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V93A2,2,0,0,1,223,91Z" />
+ <path class="cls-2" d="M43,197V183H83a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M3,181H40l16,16H87a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V183A2,2,0,0,1,3,181Z" />
+ <path class="cls-4" d="M153,197V183h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M113,181h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H113a2,2,0,0,1-2-2V183A2,2,0,0,1,113,181Z" />
+ <path class="cls-2" d="M263,197V183h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-3" d="M223,181h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V183A2,2,0,0,1,223,181Z" />
+ <circle class="cls-5" cx="155" cy="125" r="100" />
+ <path class="cls-6" d="M351.12,322.62h20a10,10,0,0,1,10,10v7a0,0,0,0,1,0,0h-40a0,0,0,0,1,0,0v-7A10,10,0,0,1,351.12,322.62Z" transform="translate(850.61 309.91) rotate(135)" />
+ <rect class="cls-7" x="293.75" y="225.25" width="40" height="117" transform="translate(-108.74 304.96) rotate(-45)" />
+ <polyline class="cls-7" points="213.69 199.25 252.58 238.14 267.43 223.29 228.54 184.4" />
+ <circle class="cls-8" cx="155" cy="125" r="95" />
+ <circle class="cls-8" cx="155" cy="125" r="85" />
+ <path class="cls-6" d="M256.37,227.87h20a10,10,0,0,1,10,10v7a0,0,0,0,1,0,0h-40a0,0,0,0,1,0,0v-7a10,10,0,0,1,10-10Z" transform="translate(-89.12 257.58) rotate(-45)" />
+ <g clip-path="url(#clip-path)">
+ <path class="cls-10" d="M43,17V3H83a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-8" d="M3,1H40L56,17H87a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V3A2,2,0,0,1,3,1Z" />
+ <path class="cls-10" d="M153,17V3h40a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-8" d="M113,1h37l16,16h31a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H113a2,2,0,0,1-2-2V3A2,2,0,0,1,113,1Z" />
+ <path class="cls-10" d="M263,17V3h40a2,2,0,0,1,2,2V17Z" />
+ <path class="cls-8" d="M223,1h37l16,16h31a2,2,0,0,1,2,2V67a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V3A2,2,0,0,1,223,1Z" />
+ <path class="cls-10" d="M43,107V93H83a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-8" d="M3,91H40l16,16H87a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V93A2,2,0,0,1,3,91Z" />
+ <path class="cls-10" d="M263,107V93h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-8" d="M223,91h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V93A2,2,0,0,1,223,91Z" />
+ <path class="cls-10" d="M43,197V183H83a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-8" d="M3,181H40l16,16H87a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H3a2,2,0,0,1-2-2V183A2,2,0,0,1,3,181Z" />
+ <path class="cls-10" d="M153,197V183h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-8" d="M113,181h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H113a2,2,0,0,1-2-2V183A2,2,0,0,1,113,181Z" />
+ <path class="cls-10" d="M263,197V183h40a2,2,0,0,1,2,2v12Z" />
+ <path class="cls-8" d="M223,181h37l16,16h31a2,2,0,0,1,2,2v48a2,2,0,0,1-2,2H223a2,2,0,0,1-2-2V183A2,2,0,0,1,223,181Z" />
+ <path class="cls-11" d="M149.18,133.69v-3.48a14.36,14.36,0,0,1,1.74-7.25,20.17,20.17,0,0,1,6.4-6.17A25.87,25.87,0,0,0,163,112a7,7,0,0,0,1.48-4.34,4.13,4.13,0,0,0-1.93-3.62,9,9,0,0,0-5.14-1.3,24.94,24.94,0,0,0-7.34,1.16,45.2,45.2,0,0,0-7.78,3.31l-5.37-10.64a48.41,48.41,0,0,1,9.89-4.21,40.25,40.25,0,0,1,11.67-1.61q9.57,0,14.9,4.43a14.16,14.16,0,0,1,5.32,11.41,15.41,15.41,0,0,1-2.55,9,30.38,30.38,0,0,1-7.92,7.34A32.11,32.11,0,0,0,163,127.3a5.91,5.91,0,0,0-1.34,4v2.41Zm-1.61,15.12q0-4.38,2.46-6.12a10,10,0,0,1,5.95-1.75,9.69,9.69,0,0,1,5.77,1.75q2.46,1.74,2.46,6.12,0,4.22-2.46,6a9.42,9.42,0,0,1-5.77,1.84,9.69,9.69,0,0,1-5.95-1.84Q147.57,153,147.57,148.81Z" />
+ </g>
+</svg>
diff --git a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
index 2de0e78cc7..d184264cde 100644
--- a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
+++ b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
@@ -1,10 +1,12 @@
// Copyright (C) 2021 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Window 2.2
import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
import QtQuick.Controls 2.3
import QtQuick.Controls.Styles 1.4
+import QtQuick.Layouts 1.1
import UM 1.2 as UM
import Cura 1.6 as Cura
@@ -29,31 +31,43 @@ Item
margins: UM.Theme.getSize("default_margin").width
}
- Label
+ RowLayout
{
- id: selectProjectLabel
-
- text: "Select Project"
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("small_button_text")
- anchors.top: parent.top
- anchors.left: parent.left
- visible: projectListContainer.visible
- }
+ id: headerRow
- Cura.SecondaryButton
- {
- id: createNewProjectButton
+ anchors
+ {
+ top: parent.top
+ left: parent.left
+ right: parent.right
+ }
+ height: childrenRect.height
+ spacing: UM.Theme.getSize("default_margin").width
- anchors.verticalCenter: selectProjectLabel.verticalCenter
- anchors.right: parent.right
- text: "New Library project"
+ Cura.TextField
+ {
+ id: searchBar
+ Layout.fillWidth: true
+ implicitHeight: createNewProjectButton.height
+
+ onTextEdited: manager.projectFilter = text //Update the search filter when editing this text field.
+
+ leftIcon: UM.Theme.getIcon("Magnifier")
+ placeholderText: "Search"
+ }
- onClicked:
+ Cura.SecondaryButton
{
- createNewProjectPopup.open()
+ id: createNewProjectButton
+
+ text: "New Library project"
+
+ onClicked:
+ {
+ createNewProjectPopup.open()
+ }
+ busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
}
- busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
}
Item
@@ -76,19 +90,18 @@ Item
{
id: digitalFactoryImage
anchors.horizontalCenter: parent.horizontalCenter
- source: "../images/digital_factory.svg"
+ source: searchBar.text === "" ? "../images/digital_factory.svg" : "../images/projects_not_found.svg"
fillMode: Image.PreserveAspectFit
width: parent.width - 2 * UM.Theme.getSize("thick_margin").width
- sourceSize.width: width
- sourceSize.height: height
}
Label
{
id: noLibraryProjectsLabel
anchors.horizontalCenter: parent.horizontalCenter
- text: "It appears that you don't have any projects in the Library yet."
+ text: searchBar.text === "" ? "It appears that you don't have any projects in the Library yet." : "No projects found that match the search query."
font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
}
Cura.TertiaryButton
@@ -97,6 +110,7 @@ Item
anchors.horizontalCenter: parent.horizontalCenter
text: "Visit Digital Library"
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library")
+ visible: searchBar.text === "" //Show the link to Digital Library when there are no projects in the user's Library.
}
}
}
@@ -106,7 +120,7 @@ Item
id: projectListContainer
anchors
{
- top: selectProjectLabel.bottom
+ top: headerRow.bottom
topMargin: UM.Theme.getSize("default_margin").height
bottom: parent.bottom
left: parent.left
diff --git a/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py b/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py
index b0e34adaba..4ebb3cb051 100644
--- a/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py
+++ b/plugins/DigitalLibrary/src/DigitalFactoryApiClient.py
@@ -22,6 +22,7 @@ from .DFFileUploader import DFFileUploader
from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest
from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse
from .DFPrintJobUploadRequest import DFPrintJobUploadRequest
+from .DigitalFactoryFeatureBudgetResponse import DigitalFactoryFeatureBudgetResponse
from .DigitalFactoryFileResponse import DigitalFactoryFileResponse
from .DigitalFactoryProjectResponse import DigitalFactoryProjectResponse
from .PaginationLinks import PaginationLinks
@@ -57,6 +58,27 @@ class DigitalFactoryApiClient:
self._projects_pagination_mgr = PaginationManager(limit = projects_limit_per_page) if projects_limit_per_page else None # type: Optional[PaginationManager]
+ def checkUserHasAccess(self, callback: Callable) -> None:
+ """Checks if the user has any sort of access to the digital library.
+ A user is considered to have access if the max-# of private projects is greater then 0 (or -1 for unlimited).
+ """
+
+ 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)
+ else:
+ Logger.warning(f"Digital Factory: Response is not a feature budget, likely an error: {str(response)}")
+ callback(False)
+
+ self._http.get(f"{self.CURA_API_ROOT}/feature_budgets",
+ scope = self._scope,
+ callback = self._parseCallback(callbackWrap, DigitalFactoryFeatureBudgetResponse, callbackWrap),
+ error_callback = callbackWrap,
+ timeout = self.DEFAULT_REQUEST_TIMEOUT)
+
def getProject(self, library_project_id: str, on_finished: Callable[[DigitalFactoryProjectResponse], Any], failed: Callable) -> None:
"""
Retrieves a digital factory project by its library project id.
@@ -73,7 +95,7 @@ class DigitalFactoryApiClient:
error_callback = failed,
timeout = self.DEFAULT_REQUEST_TIMEOUT)
- def getProjectsFirstPage(self, on_finished: Callable[[List[DigitalFactoryProjectResponse]], Any], failed: Callable) -> None:
+ def getProjectsFirstPage(self, search_filter: str, on_finished: Callable[[List[DigitalFactoryProjectResponse]], Any], failed: Callable) -> None:
"""
Retrieves digital factory projects for the user that is currently logged in.
@@ -81,13 +103,18 @@ class DigitalFactoryApiClient:
according to the limit set in the pagination manager. If there is no projects pagination manager, this function
leaves the project limit to the default set on the server side (999999).
+ :param search_filter: Text to filter the search results. If given an empty string, results are not filtered.
:param on_finished: The function to be called after the result is parsed.
:param failed: The function to be called if the request fails.
"""
- url = "{}/projects".format(self.CURA_API_ROOT)
+ url = f"{self.CURA_API_ROOT}/projects"
+ query_character = "?"
if self._projects_pagination_mgr:
self._projects_pagination_mgr.reset() # reset to clear all the links and response metadata
- url += "?limit={}".format(self._projects_pagination_mgr.limit)
+ url += f"{query_character}limit={self._projects_pagination_mgr.limit}"
+ query_character = "&"
+ if search_filter != "":
+ url += f"{query_character}search={search_filter}"
self._http.get(url,
scope = self._scope,
diff --git a/plugins/DigitalLibrary/src/DigitalFactoryController.py b/plugins/DigitalLibrary/src/DigitalFactoryController.py
index 352a8c70f2..0821cc6925 100644
--- a/plugins/DigitalLibrary/src/DigitalFactoryController.py
+++ b/plugins/DigitalLibrary/src/DigitalFactoryController.py
@@ -1,4 +1,6 @@
# Copyright (c) 2021 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
import json
import math
import os
@@ -8,7 +10,7 @@ from enum import IntEnum
from pathlib import Path
from typing import Optional, List, Dict, Any, cast
-from PyQt5.QtCore import pyqtSignal, QObject, pyqtSlot, pyqtProperty, Q_ENUMS, QUrl
+from PyQt5.QtCore import pyqtSignal, QObject, pyqtSlot, pyqtProperty, Q_ENUMS, QTimer, QUrl
from PyQt5.QtNetwork import QNetworkReply
from PyQt5.QtQml import qmlRegisterType, qmlRegisterUncreatableType
@@ -89,6 +91,9 @@ class DigitalFactoryController(QObject):
uploadFileError = Signal()
uploadFileFinished = Signal()
+ """Signal to inform about the state of user access."""
+ userAccessStateChanged = pyqtSignal(bool)
+
def __init__(self, application: CuraApplication) -> None:
super().__init__(parent = None)
@@ -106,12 +111,18 @@ class DigitalFactoryController(QObject):
self._has_more_projects_to_load = False
self._account = self._application.getInstance().getCuraAPI().account # type: Account
+ self._account.loginStateChanged.connect(self._onLoginStateChanged)
self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation()
# Initialize the project model
self._project_model = DigitalFactoryProjectModel()
self._selected_project_idx = -1
self._project_creation_error_text = "Something went wrong while creating a new project. Please try again."
+ self._project_filter = ""
+ self._project_filter_change_timer = QTimer()
+ self._project_filter_change_timer.setInterval(200)
+ self._project_filter_change_timer.setSingleShot(True)
+ self._project_filter_change_timer.timeout.connect(self._applyProjectFilter)
# Initialize the file model
self._file_model = DigitalFactoryFileModel()
@@ -131,6 +142,8 @@ class DigitalFactoryController(QObject):
self._application.engineCreatedSignal.connect(self._onEngineCreated)
self._application.initializationFinished.connect(self._applicationInitializationFinished)
+ self._user_has_access = False
+
def clear(self) -> None:
self._project_model.clearProjects()
self._api.clear()
@@ -143,16 +156,24 @@ class DigitalFactoryController(QObject):
self.setSelectedProjectIndex(-1)
+ def _onLoginStateChanged(self, logged_in: bool) -> None:
+ def callback(has_access, **kwargs):
+ self._user_has_access = has_access
+ self.userAccessStateChanged.emit(logged_in)
+
+ self._api.checkUserHasAccess(callback)
+
def userAccountHasLibraryAccess(self) -> bool:
"""
Checks whether the currently logged in user account has access to the Digital Library
:return: True if the user account has Digital Library access, else False
"""
- subscriptions = [] # type: List[Dict[str, Any]]
if self._account.userProfile:
subscriptions = self._account.userProfile.get("subscriptions", [])
- return len(subscriptions) > 0
+ if len(subscriptions) > 0:
+ return True
+ return self._user_has_access
def initialize(self, preselected_project_id: Optional[str] = None) -> None:
self.clear()
@@ -162,7 +183,7 @@ class DigitalFactoryController(QObject):
if preselected_project_id:
self._api.getProject(preselected_project_id, on_finished = self.setProjectAsPreselected, failed = self._onGetProjectFailed)
else:
- self._api.getProjectsFirstPage(on_finished = self._onGetProjectsFirstPageFinished, failed = self._onGetProjectsFailed)
+ self._api.getProjectsFirstPage(search_filter = self._project_filter, on_finished = self._onGetProjectsFirstPageFinished, failed = self._onGetProjectsFailed)
def setProjectAsPreselected(self, df_project: DigitalFactoryProjectResponse) -> None:
"""
@@ -288,6 +309,38 @@ class DigitalFactoryController(QObject):
self._selected_file_indices = file_indices
self.selectedFileIndicesChanged.emit(file_indices)
+ def setProjectFilter(self, new_filter: str) -> None:
+ """
+ Called when the user wants to change the search filter for projects.
+
+ The filter is not immediately applied. There is some delay to allow the user to finish typing.
+ :param new_filter: The new filter that the user wants to apply.
+ """
+ self._project_filter = new_filter
+ self._project_filter_change_timer.start()
+
+ """
+ Signal to notify Qt that the applied filter has changed.
+ """
+ projectFilterChanged = pyqtSignal()
+
+ @pyqtProperty(str, notify = projectFilterChanged, fset = setProjectFilter)
+ def projectFilter(self) -> str:
+ """
+ The current search filter being applied to the project list.
+ :return: The current search filter being applied to the project list.
+ """
+ return self._project_filter
+
+ def _applyProjectFilter(self) -> None:
+ """
+ Actually apply the current filter to search for projects with the user-defined search string.
+ :return:
+ """
+ self.clear()
+ self.projectFilterChanged.emit()
+ self._api.getProjectsFirstPage(search_filter = self._project_filter, on_finished = self._onGetProjectsFirstPageFinished, failed = self._onGetProjectsFailed)
+
@pyqtProperty(QObject, constant = True)
def digitalFactoryProjectModel(self) -> "DigitalFactoryProjectModel":
return self._project_model
@@ -502,7 +555,7 @@ class DigitalFactoryController(QObject):
# false, we also need to clean it from the projects model
self._project_model.clearProjects()
self.setSelectedProjectIndex(-1)
- self._api.getProjectsFirstPage(on_finished = self._onGetProjectsFirstPageFinished, failed = self._onGetProjectsFailed)
+ self._api.getProjectsFirstPage(search_filter = self._project_filter, on_finished = self._onGetProjectsFirstPageFinished, failed = self._onGetProjectsFailed)
self.setRetrievingProjectsStatus(RetrievalStatus.InProgress)
self._has_preselected_project = new_has_preselected_project
self.preselectedProjectChanged.emit()
diff --git a/plugins/DigitalLibrary/src/DigitalFactoryFeatureBudgetResponse.py b/plugins/DigitalLibrary/src/DigitalFactoryFeatureBudgetResponse.py
new file mode 100644
index 0000000000..016306a478
--- /dev/null
+++ b/plugins/DigitalLibrary/src/DigitalFactoryFeatureBudgetResponse.py
@@ -0,0 +1,43 @@
+# Copyright (c) 2021 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from .BaseModel import BaseModel
+from typing import Optional
+
+
+class DigitalFactoryFeatureBudgetResponse(BaseModel):
+ """Class representing the capabilities of a user account for Digital Library.
+ NOTE: For each max_..._projects fields, '-1' means unlimited!
+ """
+
+ def __init__(self,
+ library_can_use_business_value: Optional[bool] = False,
+ library_can_use_comments: Optional[bool] = False,
+ library_can_use_status: Optional[bool] = False,
+ library_can_use_tags: Optional[bool] = False,
+ library_can_use_technical_requirements: Optional[bool] = False,
+ library_max_organization_shared_projects: Optional[int] = False, # -1 means unlimited
+ library_max_private_projects: Optional[int] = False, # -1 means unlimited
+ library_max_team_shared_projects: Optional[int] = False, # -1 means unlimited
+ **kwargs) -> None:
+
+ self.library_can_use_business_value = library_can_use_business_value
+ self.library_can_use_comments = library_can_use_comments
+ self.library_can_use_status = library_can_use_status
+ self.library_can_use_tags = library_can_use_tags
+ self.library_can_use_technical_requirements = library_can_use_technical_requirements
+ self.library_max_organization_shared_projects = library_max_organization_shared_projects # -1 means unlimited
+ self.library_max_private_projects = library_max_private_projects # -1 means unlimited
+ self.library_max_team_shared_projects = library_max_team_shared_projects # -1 means unlimited
+ super().__init__(**kwargs)
+
+ def __repr__(self) -> str:
+ return "max private: {}, max org: {}, max team: {}".format(
+ self.library_max_private_projects,
+ self.library_max_organization_shared_projects,
+ self.library_max_team_shared_projects)
+
+ # Validates the model, raising an exception if the model is invalid.
+ def validate(self) -> None:
+ super().validate()
+ # No validation for now, as the response can be "data: []", which should be interpreted as all False and 0's
diff --git a/plugins/DigitalLibrary/src/DigitalFactoryFileProvider.py b/plugins/DigitalLibrary/src/DigitalFactoryFileProvider.py
index 7a544afaa1..65a727e21a 100644
--- a/plugins/DigitalLibrary/src/DigitalFactoryFileProvider.py
+++ b/plugins/DigitalLibrary/src/DigitalFactoryFileProvider.py
@@ -22,7 +22,7 @@ class DigitalFactoryFileProvider(FileProvider):
self._dialog = None
self._account = CuraApplication.getInstance().getCuraAPI().account # type: Account
- self._account.loginStateChanged.connect(self._onLoginStateChanged)
+ self._controller.userAccessStateChanged.connect(self._onUserAccessStateChanged)
self.enabled = self._account.isLoggedIn and self._controller.userAccountHasLibraryAccess()
self.priority = 10
@@ -53,7 +53,7 @@ class DigitalFactoryFileProvider(FileProvider):
if not self._dialog:
Logger.log("e", "Unable to create the Digital Library Open dialog.")
- def _onLoginStateChanged(self, logged_in: bool) -> None:
+ def _onUserAccessStateChanged(self, logged_in: bool) -> None:
"""
Sets the enabled status of the DigitalFactoryFileProvider according to the account's login status
:param logged_in: The new login status
diff --git a/plugins/DigitalLibrary/src/DigitalFactoryOutputDevice.py b/plugins/DigitalLibrary/src/DigitalFactoryOutputDevice.py
index 202223f9b4..70e3ac34f2 100644
--- a/plugins/DigitalLibrary/src/DigitalFactoryOutputDevice.py
+++ b/plugins/DigitalLibrary/src/DigitalFactoryOutputDevice.py
@@ -45,7 +45,7 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
self._writing = False
self._account = CuraApplication.getInstance().getCuraAPI().account # type: Account
- self._account.loginStateChanged.connect(self._onLoginStateChanged)
+ self._controller.userAccessStateChanged.connect(self._onUserAccessStateChanged)
self.enabled = self._account.isLoggedIn and self._controller.userAccountHasLibraryAccess()
self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation()
@@ -97,7 +97,7 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
if not self._dialog:
Logger.log("e", "Unable to create the Digital Library Save dialog.")
- def _onLoginStateChanged(self, logged_in: bool) -> None:
+ def _onUserAccessStateChanged(self, logged_in: bool) -> None:
"""
Sets the enabled status of the DigitalFactoryOutputDevice according to the account's login status
:param logged_in: The new login status
diff --git a/plugins/DigitalLibrary/tests/TestDigitalLibraryApiClient.py b/plugins/DigitalLibrary/tests/TestDigitalLibraryApiClient.py
index ba0a0b15b4..9751838ddf 100644
--- a/plugins/DigitalLibrary/tests/TestDigitalLibraryApiClient.py
+++ b/plugins/DigitalLibrary/tests/TestDigitalLibraryApiClient.py
@@ -1,3 +1,6 @@
+# Copyright (c) 2021 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
from unittest.mock import MagicMock
import pytest
@@ -37,7 +40,7 @@ def test_getProjectsFirstPage(api_client):
failed_callback = MagicMock()
# Call
- api_client.getProjectsFirstPage(on_finished = finished_callback, failed = failed_callback)
+ api_client.getProjectsFirstPage(search_filter = "filter", on_finished = finished_callback, failed = failed_callback)
# Asserts
pagination_manager.reset.assert_called_once() # Should be called since we asked for new set of projects
@@ -45,16 +48,16 @@ def test_getProjectsFirstPage(api_client):
args = http_manager.get.call_args_list[0]
# Ensure that it's called with the right limit
- assert args[0][0] == "https://api.ultimaker.com/cura/v1/projects?limit=20"
+ assert args[0][0] == "https://api.ultimaker.com/cura/v1/projects?limit=20&search=filter"
# Change the limit & try again
http_manager.get.reset_mock()
pagination_manager.limit = 80
- api_client.getProjectsFirstPage(on_finished = finished_callback, failed = failed_callback)
+ api_client.getProjectsFirstPage(search_filter = "filter", on_finished = finished_callback, failed = failed_callback)
args = http_manager.get.call_args_list[0]
# Ensure that it's called with the right limit
- assert args[0][0] == "https://api.ultimaker.com/cura/v1/projects?limit=80"
+ assert args[0][0] == "https://api.ultimaker.com/cura/v1/projects?limit=80&search=filter"
def test_getMoreProjects_noNewProjects(api_client):
diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py
index ab2bcaad5b..e80acc8d94 100644
--- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py
+++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py
@@ -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.
from UM.Logger import Logger
@@ -103,20 +103,27 @@ class PerObjectSettingsTool(Tool):
new_instance.resetState() # Ensure that the state is not seen as a user state.
settings.addInstance(new_instance)
- for property_key in ["top_bottom_thickness", "wall_thickness", "wall_line_count"]:
+ # Override some settings to ensure that the infill mesh by default adds no skin or walls. Or remove them if not an infill mesh.
+ specialized_settings = {
+ "top_bottom_thickness": 0,
+ "top_thickness": "=top_bottom_thickness",
+ "bottom_thickness": "=top_bottom_thickness",
+ "top_layers": "=0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / resolveOrValue('layer_height'), 4))",
+ "bottom_layers": "=0 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / resolveOrValue('layer_height'), 4))",
+ "wall_thickness": 0,
+ "wall_line_count": "=max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1) if wall_thickness != 0 else 0"
+ }
+ for property_key in specialized_settings:
if mesh_type == "infill_mesh":
if settings.getInstance(property_key) is None:
definition = stack.getSettingDefinition(property_key)
new_instance = SettingInstance(definition, settings)
- # We just want the wall_line count to be there in case it was overriden in the global stack.
- # as such, we don't need to set a value.
- if property_key != "wall_line_count":
- new_instance.setProperty("value", 0)
+ new_instance.setProperty("value", specialized_settings[property_key])
new_instance.resetState() # Ensure that the state is not seen as a user state.
settings.addInstance(new_instance)
settings_visibility_changed = True
- elif old_mesh_type == "infill_mesh" and settings.getInstance(property_key) and (settings.getProperty(property_key, "value") == 0 or property_key == "wall_line_count"):
+ elif old_mesh_type == "infill_mesh" and settings.getInstance(property_key) and property_key in specialized_settings:
settings.removeInstance(property_key)
settings_visibility_changed = True
diff --git a/plugins/PrepareStage/PrepareMenu.qml b/plugins/PrepareStage/PrepareMenu.qml
index 73c2cad39a..061db0b8f6 100644
--- a/plugins/PrepareStage/PrepareMenu.qml
+++ b/plugins/PrepareStage/PrepareMenu.qml
@@ -1,7 +1,7 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.7
+import QtQuick 2.9
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.3
@@ -13,6 +13,8 @@ Item
{
id: prepareMenu
+ property var fileProviderModel: CuraApplication.getFileProviderModel()
+
UM.I18nCatalog
{
id: catalog
@@ -23,24 +25,22 @@ Item
{
left: parent.left
right: parent.right
- leftMargin: UM.Theme.getSize("wide_margin").width
- rightMargin: UM.Theme.getSize("wide_margin").width
+ leftMargin: UM.Theme.getSize("wide_margin").width * 2
+ rightMargin: UM.Theme.getSize("wide_margin").width * 2
}
// Item to ensure that all of the buttons are nicely centered.
Item
{
- anchors.horizontalCenter: parent.horizontalCenter
- width: parent.width - 2 * UM.Theme.getSize("wide_margin").width
- height: parent.height
+ anchors.fill: parent
RowLayout
{
id: itemRow
- anchors.left: openFileButton.right
+ anchors.left: parent.left
anchors.right: parent.right
- anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width + openFileButton.width + openFileMenu.width
property int machineSelectorWidth: Math.round((width - printSetupSelectorItem.width) / 3)
height: parent.height
@@ -52,9 +52,6 @@ Item
{
id: machineSelection
headerCornerSide: Cura.RoundedRectangle.Direction.Left
- headerBackgroundBorder.width: UM.Theme.getSize("default_lining").width
- headerBackgroundBorder.color: UM.Theme.getColor("lining")
- enableHeaderShadow: false
Layout.preferredWidth: parent.machineSelectorWidth
Layout.fillWidth: true
Layout.fillHeight: true
@@ -63,9 +60,6 @@ Item
Cura.ConfigurationMenu
{
id: printerSetup
- enableHeaderShadow: false
- headerBackgroundBorder.width: UM.Theme.getSize("default_lining").width
- headerBackgroundBorder.color: UM.Theme.getColor("lining")
Layout.fillHeight: true
Layout.fillWidth: true
Layout.preferredWidth: parent.machineSelectorWidth * 2
@@ -82,22 +76,129 @@ Item
}
}
+ //Pop-up shown when there are multiple items to select from.
+ Cura.ExpandablePopup
+ {
+ id: openFileMenu
+ visible: prepareMenu.fileProviderModel.count > 1
+
+ contentAlignment: Cura.ExpandablePopup.ContentAlignment.AlignLeft
+ headerCornerSide: Cura.RoundedRectangle.Direction.All
+ headerPadding: Math.round((parent.height - UM.Theme.getSize("button_icon").height) / 2)
+ contentPadding: UM.Theme.getSize("default_lining").width
+ enabled: visible
+
+ height: parent.height
+ width: visible ? (headerPadding * 3 + UM.Theme.getSize("button_icon").height + iconSize) : 0
+
+ headerItem: UM.RecolorImage
+ {
+ id: menuIcon
+ source: UM.Theme.getIcon("Folder", "medium")
+ color: UM.Theme.getColor("icon")
+
+ sourceSize.height: height
+ }
+
+ contentItem: Item
+ {
+ id: popup
+
+ Column
+ {
+ id: openProviderColumn
+
+ //The column doesn't automatically listen to its children rect if the children change internally, so we need to explicitly update the size.
+ onChildrenRectChanged:
+ {
+ popup.height = childrenRect.height
+ popup.width = childrenRect.width
+ }
+ onPositioningComplete:
+ {
+ popup.height = childrenRect.height
+ popup.width = childrenRect.width
+ }
+
+ Label
+ {
+ text: catalog.i18nc("@menu:header", "Open file")
+ color: UM.Theme.getColor("text_medium")
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+ verticalAlignment: Text.AlignVCenter
+
+ width: contentWidth
+ height: UM.Theme.getSize("action_button").height
+ leftPadding: UM.Theme.getSize("default_margin").width
+ }
+
+ Repeater
+ {
+ model: prepareMenu.fileProviderModel
+ delegate: Button
+ {
+ leftPadding: UM.Theme.getSize("default_margin").width
+ rightPadding: UM.Theme.getSize("default_margin").width
+ width: contentItem.width + leftPadding + rightPadding
+ height: UM.Theme.getSize("action_button").height
+ hoverEnabled: true
+
+ contentItem: Label
+ {
+ text: model.displayText
+ color: UM.Theme.getColor("text")
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+ verticalAlignment: Text.AlignVCenter
+
+ width: contentWidth
+ height: parent.height
+ }
+
+ onClicked:
+ {
+ if(model.index == 0) //The 0th element is the "From Disk" option, which should activate the open local file dialog.
+ {
+ Cura.Actions.open.trigger();
+ }
+ else
+ {
+ prepareMenu.fileProviderModel.trigger(model.name);
+ }
+ }
+
+ background: Rectangle
+ {
+ color: parent.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent"
+ radius: UM.Theme.getSize("action_button_radius").width
+ width: popup.width
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //If there is just a single item, show a button instead that directly chooses the one option.
Button
{
id: openFileButton
- height: UM.Theme.getSize("stage_menu").height
- width: UM.Theme.getSize("stage_menu").height
+ visible: prepareMenu.fileProviderModel.count <= 1
+
+ height: parent.height
+ width: visible ? height : 0 //Square button (and don't take up space if invisible).
onClicked: Cura.Actions.open.trigger()
+ enabled: visible && prepareMenu.fileProviderModel.count > 0
hoverEnabled: true
contentItem: Item
{
- anchors.fill: parent
UM.RecolorImage
{
id: buttonIcon
+ source: UM.Theme.getIcon("Folder", "medium")
anchors.centerIn: parent
- source: UM.Theme.getIcon("Folder")
width: UM.Theme.getSize("button_icon").width
height: UM.Theme.getSize("button_icon").height
color: UM.Theme.getColor("icon")
@@ -109,8 +210,8 @@ Item
background: Rectangle
{
id: background
- height: UM.Theme.getSize("stage_menu").height
- width: UM.Theme.getSize("stage_menu").height
+ height: parent.height
+ width: parent.width
border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width
diff --git a/plugins/PreviewStage/PreviewMenu.qml b/plugins/PreviewStage/PreviewMenu.qml
index ff1ccff75f..9e039896c6 100644
--- a/plugins/PreviewStage/PreviewMenu.qml
+++ b/plugins/PreviewStage/PreviewMenu.qml
@@ -24,54 +24,36 @@ Item
{
left: parent.left
right: parent.right
- leftMargin: UM.Theme.getSize("wide_margin").width
- rightMargin: UM.Theme.getSize("wide_margin").width
+ leftMargin: UM.Theme.getSize("wide_margin").width * 2
+ rightMargin: UM.Theme.getSize("wide_margin").width * 2
}
Row
{
id: stageMenuRow
- anchors.horizontalCenter: parent.horizontalCenter
- width: parent.width - 2 * UM.Theme.getSize("wide_margin").width
- height: parent.height
+ anchors.fill: parent
+ // This is a trick to make sure that the borders of the two adjacent buttons' borders overlap. Otherwise
+ // there will be double border (one from each button)
+ spacing: -UM.Theme.getSize("default_lining").width
Cura.ViewsSelector
{
id: viewsSelector
height: parent.height
- width: UM.Theme.getSize("views_selector").width
+ width: Math.max(Math.round((parent.width - printSetupSelectorItem.width) / 3), UM.Theme.getSize("views_selector").width)
headerCornerSide: Cura.RoundedRectangle.Direction.Left
}
- // Separator line
- Rectangle
- {
- height: parent.height
- // If there is no viewPanel, we only need a single spacer, so hide this one.
- visible: viewPanel.source != ""
- width: visible ? UM.Theme.getSize("default_lining").width : 0
-
- color: UM.Theme.getColor("lining")
- }
-
// This component will grow freely up to complete the width of the row.
Loader
{
id: viewPanel
height: parent.height
- width: source != "" ? (previewMenu.width - viewsSelector.width - printSetupSelectorItem.width - 2 * (UM.Theme.getSize("wide_margin").width + UM.Theme.getSize("default_lining").width)) : 0
+ width: source != "" ? (parent.width - viewsSelector.width - printSetupSelectorItem.width) : 0
source: UM.Controller.activeView != null && UM.Controller.activeView.stageMenuComponent != null ? UM.Controller.activeView.stageMenuComponent : ""
}
- // Separator line
- Rectangle
- {
- height: parent.height
- width: UM.Theme.getSize("default_lining").width
- color: UM.Theme.getColor("lining")
- }
-
Item
{
id: printSetupSelectorItem
diff --git a/plugins/SimulationView/SimulationViewMenuComponent.qml b/plugins/SimulationView/SimulationViewMenuComponent.qml
index 86e686e0fc..6dde44c8ae 100644
--- a/plugins/SimulationView/SimulationViewMenuComponent.qml
+++ b/plugins/SimulationView/SimulationViewMenuComponent.qml
@@ -203,16 +203,16 @@ Cura.ExpandableComponent
style: UM.Theme.styles.checkbox
-
- UM.RecolorImage
+ Rectangle
{
id: swatch
anchors.verticalCenter: parent.verticalCenter
anchors.right: extrudersModelCheckBox.right
width: UM.Theme.getSize("layerview_legend_size").width
height: UM.Theme.getSize("layerview_legend_size").height
- source: UM.Theme.getIcon("Extruder", "medium")
color: model.color
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
}
Label
diff --git a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
index 2e3d17ceb0..8dca61ec38 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
@@ -1,23 +1,26 @@
-// Copyright (c) 2019 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.3
-import QtQuick.Controls 1.4
+import QtQuick.Controls 2.4
import QtQuick.Controls.Styles 1.3
import UM 1.3 as UM
import Cura 1.0 as Cura
-Rectangle
+Button
{
- id: base
+ property var iconSource: null
+ width: UM.Theme.getSize("button").width * 0.75 //Matching the size of the content of tool buttons.
+ height: UM.Theme.getSize("button").height * 0.75
- property var enabled: true
+ hoverEnabled: true
- property var iconSource: null
- color: enabled ? UM.Theme.getColor("monitor_icon_primary") : UM.Theme.getColor("monitor_icon_disabled")
- height: width
- radius: Math.round(0.5 * width)
- width: 24 * screenScaleFactor
+ background: Rectangle
+ {
+ anchors.fill: parent
+ radius: 0.5 * width
+ color: parent.enabled ? (parent.hovered ? UM.Theme.getColor("monitor_secondary_button_hover") : "transparent") : UM.Theme.getColor("monitor_icon_disabled")
+ }
UM.RecolorImage
{
@@ -27,30 +30,21 @@ Rectangle
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
- color: UM.Theme.getColor("monitor_icon_accent")
+ color: UM.Theme.getColor("primary")
height: width
source: iconSource
width: Math.round(parent.width / 2)
}
- MouseArea
+ onClicked:
{
- id: clickArea
- anchors.fill: parent
- hoverEnabled: base.enabled
- onClicked:
+ if (OutputDevice.activeCameraUrl != "")
+ {
+ OutputDevice.setActiveCameraUrl("")
+ }
+ else
{
- if (base.enabled)
- {
- if (OutputDevice.activeCameraUrl != "")
- {
- OutputDevice.setActiveCameraUrl("")
- }
- else
- {
- OutputDevice.setActiveCameraUrl(modelData.cameraUrl)
- }
- }
+ OutputDevice.setActiveCameraUrl(modelData.cameraUrl)
}
}
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
index f3002fd25b..0f4aec5424 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
@@ -50,7 +50,7 @@ Item
id: buildplateIcon
anchors.centerIn: parent
color: UM.Theme.getColor("monitor_icon_primary")
- height: parent.height
+ height: UM.Theme.getSize("medium_button_icon").width
source: "../svg/icons/Buildplate.svg"
width: height
visible: buildplate
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
index ac5f588db3..2720e6896a 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
@@ -5,6 +5,8 @@ import QtQuick 2.2
import QtQuick.Controls 2.0
import UM 1.3 as UM
+import Cura 1.6 as Cura
+
/**
* This component comprises a colored extruder icon, the material name, and the
* print core name. It is used by the MonitorPrinterConfiguration component with
@@ -18,10 +20,10 @@ import UM 1.3 as UM
Item
{
// The material color
- property alias color: extruderIcon.color
+ property alias color: extruderIcon.materialColor
- // The extruder position; NOTE: Decent human beings count from 0
- property alias position: extruderIcon.position
+ // The extruder position
+ property int position
// The material name
property alias material: materialLabel.text
@@ -32,12 +34,13 @@ Item
// Height is 2 x 18px labels, plus 4px spacing between them
height: 40 * screenScaleFactor // TODO: Theme!
width: childrenRect.width
+ opacity: material != "" && material != "Empty" && position >= 0 ? 1 : 0.4
- MonitorIconExtruder
+ Cura.ExtruderIcon
{
id: extruderIcon
- color: UM.Theme.getColor("monitor_skeleton_loading")
- position: 0
+ materialColor: UM.Theme.getColor("monitor_skeleton_loading")
+ anchors.verticalCenter: parent.verticalCenter
}
Rectangle
@@ -46,16 +49,18 @@ Item
anchors
{
left: extruderIcon.right
- leftMargin: 12 * screenScaleFactor // TODO: Theme!
+ leftMargin: UM.Theme.getSize("default_margin").width
+ verticalCenter: extruderIcon.verticalCenter
}
color: materialLabel.visible > 0 ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading")
- height: 18 * screenScaleFactor // TODO: Theme!
+ height: childrenRect.height
width: Math.max(materialLabel.contentWidth, 60 * screenScaleFactor) // TODO: Theme!
radius: 2 * screenScaleFactor // TODO: Theme!
Label
{
id: materialLabel
+ anchors.top: parent.top
color: UM.Theme.getColor("text")
elide: Text.ElideRight
@@ -63,29 +68,13 @@ Item
text: ""
visible: text !== ""
- // FIXED-LINE-HEIGHT:
- height: parent.height
- verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
}
- }
-
- Rectangle
- {
- id: printCoreLabelWrapper
- anchors
- {
- left: materialLabelWrapper.left
- bottom: parent.bottom
- }
- color: printCoreLabel.visible > 0 ? "transparent" : UM.Theme.getColor("monitor_skeleton_loading")
- height: 18 * screenScaleFactor // TODO: Theme!
- width: Math.max(printCoreLabel.contentWidth, 36 * screenScaleFactor) // TODO: Theme!
- radius: 2 * screenScaleFactor // TODO: Theme!
Label
{
id: printCoreLabel
+ anchors.top: materialLabel.bottom
color: UM.Theme.getColor("text")
elide: Text.ElideRight
@@ -93,9 +82,6 @@ Item
text: ""
visible: text !== ""
- // FIXED-LINE-HEIGHT:
- height: parent.height
- verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
}
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
index 79bc0ec25b..ad0e8a6777 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
@@ -38,6 +38,7 @@ Item
Label
{
id: positionLabel
+ anchors.centerIn: icon
font: UM.Theme.getFont("small")
color: UM.Theme.getColor("text")
height: Math.round(size / 2)
@@ -45,8 +46,6 @@ Item
text: position + 1
verticalAlignment: Text.AlignVCenter
width: Math.round(size / 2)
- x: Math.round(size * 0.25)
- y: Math.round(size * 0.15625)
visible: position >= 0
renderType: Text.NativeRendering
}
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
index 1884efec46..9eaa133ef5 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
@@ -256,7 +256,16 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
"""
self._uploaded_print_job = self._pre_upload_print_job
self._progress.hide()
- PrintJobUploadSuccessMessage().show()
+ message = PrintJobUploadSuccessMessage()
+ message.addAction("monitor print",
+ name=I18N_CATALOG.i18nc("@action:button", "Monitor print"),
+ icon="",
+ description=I18N_CATALOG.i18nc("@action:tooltip", "Track the print in Ultimaker Digital Factory"),
+ button_align=message.ActionButtonAlignment.ALIGN_RIGHT)
+ df_url = f"https://digitalfactory.ultimaker.com/app/jobs/{self._cluster.cluster_id}?utm_source=cura&utm_medium=software&utm_campaign=monitor-button"
+ message.pyQtActionTriggered.connect(lambda message, action: (QDesktopServices.openUrl(QUrl(df_url)), message.hide()))
+
+ message.show()
self.writeFinished.emit()
def _onPrintUploadSpecificError(self, reply: "QNetworkReply", _: "QNetworkReply.NetworkError"):
diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
index aa64f338dd..aa3d72ccd8 100644
--- a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
+++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
@@ -13,6 +13,5 @@ class PrintJobUploadSuccessMessage(Message):
def __init__(self) -> None:
super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."),
- title = I18N_CATALOG.i18nc("@info:title", "Data Sent"),
- lifetime = 5
+ title = I18N_CATALOG.i18nc("@info:title", "Data Sent")
)
diff --git a/resources/definitions/atom2.def.json b/resources/definitions/atom2.def.json
new file mode 100644
index 0000000000..d7a26546d8
--- /dev/null
+++ b/resources/definitions/atom2.def.json
@@ -0,0 +1,35 @@
+{
+ "name": "Atom 2",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Victor (Yu Chieh) Lin",
+ "manufacturer": "Layer One",
+ "file_formats": "text/x-gcode",
+ "platform_offset": [0,0,0],
+ "machine_extruder_trains": { "0": "atom2_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Atom 2" },
+ "machine_shape": { "default_value": "elliptic" },
+ "machine_width": { "default_value": 210 },
+ "machine_depth": { "default_value": 210 },
+ "machine_height": { "default_value": 320 },
+ "machine_extruder_count": { "default_value": 1 },
+ "machine_heated_bed": { "default_value": false },
+ "machine_center_is_zero": { "default_value": true },
+
+ "machine_start_gcode": { "default_value": "G21\nG90 \nM107\nG28\nG92 E0\nG1 F200 E3\nG92 E0" },
+ "machine_end_gcode": { "default_value": "M104 S0\nG28\nG91\nG1 E-6 F300\nM84\nG90" },
+
+ "layer_height": { "default_value": 0.2 },
+ "default_material_print_temperature": { "default_value": 210 },
+ "speed_print": { "default_value": 32 },
+ "optimize_wall_printing_order": { "value": "True" },
+ "infill_sparse_density": { "default_value": 10 },
+ "brim_width": { "default_value": 4 }
+ }
+}
diff --git a/resources/definitions/creasee_cs20.def.json b/resources/definitions/creasee_cs20.def.json
new file mode 100644
index 0000000000..ab30f3dd1c
--- /dev/null
+++ b/resources/definitions/creasee_cs20.def.json
@@ -0,0 +1,32 @@
+{
+ "version": 2,
+ "name": "Creasee CS20",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "manufacturer": "Creasee",
+ "machine_extruder_trains":
+ {
+ "0": "creasee_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Creasee CS20" },
+ "machine_width": {
+ "default_value": 220
+ },
+ "machine_depth": {
+ "default_value": 220
+ },
+ "machine_height": {
+ "default_value": 250
+ },
+ "machine_start_gcode": {
+ "default_value": "G28 ;Home\nG1 Z15.0 F2000 ;Move the platform"
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0\nM140 S0\nG92 E0\nG1 E-10 F2000\nG28 X0 Y0\nM84"
+ }
+ }
+}
diff --git a/resources/definitions/creasee_cs30.def.json b/resources/definitions/creasee_cs30.def.json
new file mode 100644
index 0000000000..7d6a5090bb
--- /dev/null
+++ b/resources/definitions/creasee_cs30.def.json
@@ -0,0 +1,32 @@
+{
+ "version": 2,
+ "name": "Creasee CS30",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "manufacturer": "Creasee",
+ "machine_extruder_trains":
+ {
+ "0": "creasee_extruder_1"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Creasee CS30" },
+ "machine_width": {
+ "default_value": 300
+ },
+ "machine_depth": {
+ "default_value": 300
+ },
+ "machine_height": {
+ "default_value": 400
+ },
+ "machine_start_gcode": {
+ "default_value": "G28 ;Home\nG1 Z15.0 F2000 ;Move the platform"
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0\nM140 S0\nG92 E0\nG1 E-10 F2000\nG28 X0 Y0\nM84"
+ }
+ }
+}
diff --git a/resources/definitions/dagoma_disco.def.json b/resources/definitions/dagoma_disco.def.json
index bf098b8b4a..89773d9c0e 100644
--- a/resources/definitions/dagoma_disco.def.json
+++ b/resources/definitions/dagoma_disco.def.json
@@ -73,6 +73,7 @@
"machine_steps_per_mm_x": { "default_value": 80 },
"machine_steps_per_mm_y": { "default_value": 80 },
"machine_steps_per_mm_z": { "default_value": 2560 },
- "machine_steps_per_mm_e": { "default_value": 98 }
+ "machine_steps_per_mm_e": { "default_value": 98 },
+ "speed_z_hop": {"default_value": 4}
}
}
diff --git a/resources/definitions/geeetech_a30.def.json b/resources/definitions/geeetech_a30.def.json
index 1f08d37445..d4f7df139f 100644
--- a/resources/definitions/geeetech_a30.def.json
+++ b/resources/definitions/geeetech_a30.def.json
@@ -4,7 +4,7 @@
"inherits": "fdmprinter",
"metadata": {
"author": "William & Cataldo URSO",
- "manufacturer": "Shenzhen Geeetech Technology",
+ "manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"visible": true,
"has_materials": true,
diff --git a/resources/definitions/maker_made_300x.def.json b/resources/definitions/maker_made_300x.def.json
index fa584c9cfe..a4b49820b7 100644
--- a/resources/definitions/maker_made_300x.def.json
+++ b/resources/definitions/maker_made_300x.def.json
@@ -92,7 +92,6 @@
"speed_travel": {"value": 150},
"speed_layer_0": {"value": 10},
"speed_travel_layer_0": {"value": 50},
- "machine_max_feedrate_z": {"value": 0},
"speed_slowdown_layers": {"value": 2},
"speed_equalize_flow_enabled": {"value": false },
"acceleration_enabled": {"value": false },
diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json
index c853f8f772..e9980724cb 100644
--- a/resources/definitions/malyan_m200.def.json
+++ b/resources/definitions/malyan_m200.def.json
@@ -80,6 +80,7 @@
"retraction_amount" : { "default_value": 4.5},
"retraction_speed" : { "default_value": 40},
"coasting_enable": { "default_value": true },
- "prime_tower_enable": { "default_value": false}
+ "prime_tower_enable": { "default_value": false},
+ "speed_z_hop": {"default_value": 1.5}
}
}
diff --git a/resources/definitions/pbr3d_g1.def.json b/resources/definitions/pbr3d_g1.def.json
new file mode 100644
index 0000000000..fbe1d5bfc6
--- /dev/null
+++ b/resources/definitions/pbr3d_g1.def.json
@@ -0,0 +1,45 @@
+{
+ "version": 2,
+ "name": "PBR 3D Gen-I",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Kapil H. Sonone, Prof. Bahubali P. Fuladi",
+ "manufacturer": "PBR Research",
+ "file_formats": "text/x-gcode",
+ "platform": "pbr3d_g1_buildplate.stl",
+ "platform_offset": [0, -5, 0],
+ "machine_extruder_trains":
+ {
+ "0": "pbr3d_g1_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "PBR 3D Gen-I" },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_width": {
+ "default_value": 200
+ },
+ "machine_height": {
+ "default_value": 200
+ },
+ "machine_depth": {
+ "default_value": 200
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "gantry_height": {
+ "value": "200"
+ },
+ "machine_start_gcode": {
+ "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the Platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0\nM140 S0\n;Retract the Filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
+ }
+ }
+}
diff --git a/resources/definitions/printrbot_play.def.json b/resources/definitions/printrbot_play.def.json
index e3c0c85d80..b1f7e72967 100644
--- a/resources/definitions/printrbot_play.def.json
+++ b/resources/definitions/printrbot_play.def.json
@@ -45,6 +45,7 @@
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
- }
+ },
+ "speed_z_hop": {"default_value": 5}
}
}
diff --git a/resources/definitions/rigid3d_base.def.json b/resources/definitions/rigid3d_base.def.json
index 8e86f6bd7d..bd1995f3dc 100644
--- a/resources/definitions/rigid3d_base.def.json
+++ b/resources/definitions/rigid3d_base.def.json
@@ -143,7 +143,8 @@
"adaptive_layer_height_variation_step": { "value": 0.04 },
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
- "wall_thickness": {"value": "line_width * 2" }
+ "wall_thickness": {"value": "line_width * 2" },
+ "speed_z_hop": {"default_value": 8}
}
} \ No newline at end of file
diff --git a/resources/definitions/strateo3d.def.json b/resources/definitions/strateo3d.def.json
index 2858a859c5..9c865fe233 100644
--- a/resources/definitions/strateo3d.def.json
+++ b/resources/definitions/strateo3d.def.json
@@ -15,14 +15,14 @@
"preferred_material": "emotiontech_pla",
"preferred_quality_type": "c",
"variants_name": "Print Head",
- "machine_extruder_trains":
- {
- "0": "strateo3d_right_extruder",
+ "machine_extruder_trains":
+ {
+ "0": "strateo3d_right_extruder",
"1": "strateo3d_left_extruder"
}
},
-
- "overrides":
+
+ "overrides":
{
"machine_name": { "default_value": "Strateo3D" },
"machine_width": { "default_value": 600 },
@@ -35,28 +35,43 @@
"gantry_height": { "value": "40" },
"machine_extruder_count": { "default_value": 2 },
"machine_gcode_flavor": { "default_value": "Marlin" },
- "machine_start_gcode": { "default_value": "G28 \nG90 G1 X300 Y210 Z15 F6000 \nG92 E0" },
+ "machine_start_gcode": { "default_value": ";M104 T0 S{material_standby_temperature, 0} \n;M104 T1 S{material_standby_temperature, 1} \n;M140 S{material_bed_temperature_layer_0} \n;M141 S{build_volume_temperature} \nG28 \nG90 \nT{initial_extruder_nr} \nG1 X0 Y0 Z15 F6000 \n;M190 S{material_bed_temperature_layer_0} \n;M109 S{material_print_temperature_layer_0, initial_extruder_nr} \nG1 Z0.3 \nG92 E0 \nG1 F300 X45 E18 \n;G1 F1500 E17 \nG1 F600 X25 \nG1 F600 Z3" },
"machine_end_gcode": { "default_value": "T1 \nM104 S0 \nT0 \nM104 S0 \nM140 S0 \nM141 S0 \nG91 \nG0 z1 \nG90 \nG28 \nM801.0 \nM84 \nM192" },
"extruder_prime_pos_y": {"minimum_value": "0", "maximum_value": "machine_depth"},
"extruder_prime_pos_x": {"minimum_value": "0", "maximum_value": "machine_width"},
"machine_heat_zone_length": { "default_value": 7 },
- "default_material_print_temperature": { "maximum_value_warning": "350" },
- "material_print_temperature": { "maximum_value_warning": "350" },
- "material_print_temperature_layer_0": { "maximum_value_warning": "350" },
- "material_bed_temperature": { "maximum_value": "130" },
- "material_bed_temperature_layer_0": { "maximum_value": "130" },
+ "default_material_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
+ "material_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
+ "material_print_temperature_layer_0": { "maximum_value_warning": "400", "maximum_value": "415" },
+ "material_initial_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
+ "material_final_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
+ "material_standby_temperature": { "maximum_value_warning": "material_print_temperature - 40", "maximum_value": "material_print_temperature" },
+ "material_bed_temperature": { "maximum_value_warning": "140", "maximum_value": "140" },
+ "material_bed_temperature_layer_0": { "maximum_value_warning": "140", "maximum_value": "140" },
"extruder_prime_pos_abs": { "default_value": true },
"machine_acceleration": { "default_value": 1500 },
+ "machine_max_jerk_xy": { "default_value": 0.01 },
+ "machine_max_jerk_z": { "default_value": 0},
"acceleration_enabled": { "value": false },
- "acceleration_print": { "value": "machine_acceleration" },
- "acceleration_wall": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" },
- "acceleration_wall_0": { "value": "math.ceil(acceleration_print * 1000 / acceleration_print)" },
- "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" },
- "acceleration_support": { "value": "acceleration_print" },
- "acceleration_support_interface": { "value": "acceleration_topbottom" },
- "acceleration_travel": { "value": "acceleration_print" },
- "acceleration_layer_0": { "value": "acceleration_topbottom" },
+ "acceleration_print": { "value": "machine_acceleration", "maximum_value_warning": "1500" },
+ "acceleration_infill": { "maximum_value_warning": "1500" },
+ "acceleration_wall": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)", "maximum_value_warning": "1500" },
+ "acceleration_wall_0": { "value": "math.ceil(acceleration_print * 1000 / acceleration_print)", "maximum_value_warning": "1500" },
+ "acceleration_wall_x": { "maximum_value_warning": "1500" },
+ "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)", "maximum_value_warning": "1500" },
+ "acceleration_support": { "value": "acceleration_print", "maximum_value_warning": "1500" },
+ "acceleration_support_infill": { "maximum_value_warning": "1500" },
+ "acceleration_support_interface": { "value": "acceleration_topbottom", "maximum_value_warning": "1500" },
+ "acceleration_support_roof": { "maximum_value_warning": "1500" },
+ "acceleration_support_bottom": { "maximum_value_warning": "1500" },
+ "acceleration_prime_tower": { "maximum_value_warning": "1500" },
+ "acceleration_travel": { "value": "acceleration_print", "maximum_value_warning": "1500" },
+ "acceleration_layer_0": { "value": "acceleration_topbottom", "maximum_value_warning": "1500" },
+ "acceleration_print_layer_0": { "maximum_value_warning": "1500" },
+ "acceleration_travel_layer_0": { "maximum_value_warning": "1500" },
+ "acceleration_skirt_brim": { "maximum_value_warning": "1500" },
+
"adaptive_layer_height_variation": { "default_value": 0.1 },
"adaptive_layer_height_variation_step": { "default_value": 0.05 },
"adhesion_type": { "default_value": "skirt" },
@@ -66,30 +81,39 @@
"infill_before_walls": { "default_value": false },
"infill_overlap": { "value": "0" },
"infill_wipe_dist": { "value": "0" },
- "jerk_enabled": { "value": "False" },
- "jerk_layer_0": { "value": "jerk_topbottom" },
- "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
- "jerk_print": { "value": "25" },
- "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
- "jerk_support_interface": { "value": "jerk_topbottom" },
- "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
- "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
- "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
+
+ "jerk_enabled": { "value": "False", "maximum_value_warning": "0.01" },
+ "jerk_print": { "value": "0.01", "maximum_value_warning": "0.01" },
+ "jerk_infill": { "value": "0.01", "maximum_value_warning": "0.01" },
+ "jerk_layer_0": { "value": "jerk_topbottom", "maximum_value_warning": "0.01" },
+ "jerk_print_layer_0": { "maximum_value_warning": "0.01" },
+ "jerk_travel_layer_0": { "maximum_value_warning": "0.01" },
+ "jerk_skirt_brim": { "maximum_value_warning": "0.01" },
+ "jerk_prime_tower": { "value": "jerk_print * 15 / 25", "maximum_value_warning": "0.01" },
+ "jerk_support": { "value": "jerk_print * 15 / 25", "maximum_value_warning": "0.01" },
+ "jerk_support_infill": { "maximum_value_warning": "0.01" },
+ "jerk_support_interface": { "value": "jerk_topbottom", "maximum_value_warning": "0.01" },
+ "jerk_support_roof": { "maximum_value_warning": "0.01" },
+ "jerk_support_bottom": { "maximum_value_warning": "0.01" },
+ "jerk_topbottom": { "value": "jerk_print * 5 / 25", "maximum_value_warning": "0.01" },
+ "jerk_wall": { "value": "jerk_print * 5 / 25", "maximum_value_warning": "0.01" },
+ "jerk_wall_0": { "value": "jerk_wall * 5 / 10", "maximum_value_warning": "0.01" },
+ "jerk_wall_x": { "maximum_value_warning": "0.01" },
+ "jerk_travel": { "value": "machine_max_jerk_xy", "maximum_value_warning": "0.01" },
+
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_min_cool_heat_time_window": { "value": "15" },
"machine_nozzle_cool_down_speed": { "default_value": 0.50 },
"machine_nozzle_heat_up_speed": { "default_value": 2.25 },
- "material_final_print_temperature": { "value": "material_print_temperature - 10" },
"material_flow": { "default_value": 93 },
"material_flow_layer_0": { "value": "math.ceil(material_flow*1)" },
- "material_initial_print_temperature": { "value": "material_print_temperature - 5" },
"meshfix_maximum_resolution": { "value": "0.5" },
"meshfix_maximum_deviation": { "default_value": 0.04 },
"optimize_wall_printing_order": { "value": "True" },
"prime_blob_enable": { "enabled": false, "default_value": false },
"prime_tower_min_volume": { "default_value": 35 },
- "prime_tower_position_x": { "value": "machine_width/2 - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
+ "prime_tower_position_x": { "value": "machine_width/2 + prime_tower_size/2" },
"prime_tower_position_y": { "value": "machine_depth - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
"retraction_amount": { "default_value": 1.5 },
"retraction_combing": { "default_value": "all" },
@@ -135,4 +159,4 @@
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_thickness": { "value": "wall_line_width_0 + wall_line_width_x" }
}
-} \ No newline at end of file
+}
diff --git a/resources/definitions/tevo_tarantula.def.json b/resources/definitions/tevo_tarantula.def.json
index eee773cd74..8efa9c4f87 100644
--- a/resources/definitions/tevo_tarantula.def.json
+++ b/resources/definitions/tevo_tarantula.def.json
@@ -47,6 +47,7 @@
"machine_max_acceleration_y": { "default_value": 2650 },
"acceleration_print": { "default_value": 2650 },
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." },
- "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 X0 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off" }
+ "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 X0 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off" },
+ "speed_z_hop": {"default_value": 3}
}
}
diff --git a/resources/definitions/voron0_120.def.json b/resources/definitions/voron0_120.def.json
index 7a06c2eac7..d0bf92f0e0 100644
--- a/resources/definitions/voron0_120.def.json
+++ b/resources/definitions/voron0_120.def.json
@@ -1,5 +1,5 @@
{
- "name": "Voron V0",
+ "name": "Voron 0",
"version": 2,
"inherits": "voron2_base",
"metadata":
@@ -10,7 +10,7 @@
},
"overrides":
{
- "machine_name": { "default_value": "VORON V0" },
+ "machine_name": { "default_value": "VORON 0" },
"machine_width": { "default_value": 120 },
"machine_depth": { "default_value": 120 },
"machine_height": { "default_value": 120 }
diff --git a/resources/extruders/atom2_extruder_0.def.json b/resources/extruders/atom2_extruder_0.def.json
new file mode 100644
index 0000000000..be9d5782ff
--- /dev/null
+++ b/resources/extruders/atom2_extruder_0.def.json
@@ -0,0 +1,15 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "atom2",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/creasee_extruder_0.def.json b/resources/extruders/creasee_extruder_0.def.json
new file mode 100644
index 0000000000..abefa6b1c8
--- /dev/null
+++ b/resources/extruders/creasee_extruder_0.def.json
@@ -0,0 +1,15 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "creasee_cs20",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/creasee_extruder_1.def.json b/resources/extruders/creasee_extruder_1.def.json
new file mode 100644
index 0000000000..747e1c48f8
--- /dev/null
+++ b/resources/extruders/creasee_extruder_1.def.json
@@ -0,0 +1,15 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "creasee_cs30",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/pbr3d_g1_extruder_0.def.json b/resources/extruders/pbr3d_g1_extruder_0.def.json
new file mode 100644
index 0000000000..3a79fe4f20
--- /dev/null
+++ b/resources/extruders/pbr3d_g1_extruder_0.def.json
@@ -0,0 +1,15 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "pbr3d_g1",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po
index 5d7915ac0d..3eb590b680 100644
--- a/resources/i18n/de_DE/fdmprinter.def.json.po
+++ b/resources/i18n/de_DE/fdmprinter.def.json.po
@@ -1177,7 +1177,7 @@ msgstr "Hinten links"
#: fdmprinter.def.json
msgctxt "z_seam_position option back"
msgid "Back"
-msgstr "Zurück"
+msgstr "Hinten"
#: fdmprinter.def.json
msgctxt "z_seam_position option backright"
diff --git a/resources/meshes/pbr3d_g1_buildplate.stl b/resources/meshes/pbr3d_g1_buildplate.stl
new file mode 100644
index 0000000000..1f7b77bd78
--- /dev/null
+++ b/resources/meshes/pbr3d_g1_buildplate.stl
Binary files differ
diff --git a/resources/qml/Account/AccountWidget.qml b/resources/qml/Account/AccountWidget.qml
index 48c05f8a11..ef1622daee 100644
--- a/resources/qml/Account/AccountWidget.qml
+++ b/resources/qml/Account/AccountWidget.qml
@@ -54,9 +54,10 @@ Item
id: accountWidget
anchors.verticalCenter: parent.verticalCenter
+ anchors.horizontalCenter: signInButton.horizontalCenter
- implicitHeight: UM.Theme.getSize("main_window_header").height
- implicitWidth: UM.Theme.getSize("main_window_header").height
+ implicitHeight: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
+ implicitWidth: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
hoverEnabled: true
@@ -68,8 +69,8 @@ Item
{
id: avatar
- width: Math.round(0.8 * accountWidget.width)
- height: Math.round(0.8 * accountWidget.height)
+ width: accountWidget.width
+ height: accountWidget.height
anchors.verticalCenter: accountWidget.verticalCenter
anchors.horizontalCenter: accountWidget.horizontalCenter
@@ -86,7 +87,7 @@ Item
{
id: initialCircle
anchors.centerIn: parent
- width: Math.min(parent.width, parent.height)
+ width: Math.min(accountWidget.width, accountWidget.height)
height: width
radius: width
color: accountWidget.hovered ? UM.Theme.getColor("primary_text") : "transparent"
@@ -141,7 +142,7 @@ Item
borderColor: UM.Theme.getColor("lining")
borderWidth: UM.Theme.getSize("default_lining").width
- target: Qt.point(width - (accountWidget.width / 2), -10)
+ target: Qt.point(width - (signInButton.width / 2), -10)
arrowSize: UM.Theme.getSize("default_arrow").width
}
diff --git a/resources/qml/Account/UserOperations.qml b/resources/qml/Account/UserOperations.qml
index 19e92e0249..f5241596d5 100644
--- a/resources/qml/Account/UserOperations.qml
+++ b/resources/qml/Account/UserOperations.qml
@@ -9,7 +9,7 @@ import Cura 1.1 as Cura
Column
{
- spacing: UM.Theme.getSize("narrow_margin").height
+ spacing: UM.Theme.getSize("default_margin").height
topPadding: UM.Theme.getSize("default_margin").height
bottomPadding: UM.Theme.getSize("default_margin").height
width: childrenRect.width
@@ -18,7 +18,7 @@ Column
{
id: accountInfo
width: childrenRect.width
- height: childrenRect.height
+ height: accountSyncDetailsColumn.height
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
AvatarImage
@@ -56,6 +56,7 @@ Column
Column
{
+ id: accountSyncDetailsColumn
anchors.left: avatar.right
anchors.leftMargin: UM.Theme.getSize("default_margin").width
spacing: UM.Theme.getSize("narrow_margin").height
diff --git a/resources/qml/ActionButton.qml b/resources/qml/ActionButton.qml
index 0c1be007b5..31d5c35d2c 100644
--- a/resources/qml/ActionButton.qml
+++ b/resources/qml/ActionButton.qml
@@ -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 QtQuick 2.7
@@ -18,19 +18,16 @@ Button
property alias textFont: buttonText.font
property alias cornerRadius: backgroundRect.radius
property alias tooltip: tooltip.tooltipText
- property alias cornerSide: backgroundRect.cornerSide
property color color: UM.Theme.getColor("primary")
property color hoverColor: UM.Theme.getColor("primary_hover")
property color disabledColor: color
property color textColor: UM.Theme.getColor("button_text")
property color textHoverColor: textColor
- property color textDisabledColor: textColor
+ property color textDisabledColor: disabledColor
property color outlineColor: color
- property color outlineHoverColor: hoverColor
- property color outlineDisabledColor: outlineColor
- property alias shadowColor: shadow.color
- property alias shadowEnabled: shadow.visible
+ property color outlineHoverColor: outlineColor
+ property color outlineDisabledColor: disabledColor
property alias busy: busyIndicator.visible
property bool underlineTextOnHover: false
@@ -46,6 +43,49 @@ Button
// but it can exceed a maximum, then this value have to be set.
property int maximumWidth: 0
+ // These properties are deprecated.
+ // To (maybe) prevent a major SDK upgrade, mark them as deprecated instead of just outright removing them.
+ // Note, if you still want rounded corners, use (something based on) Cura.RoundedRectangle.
+ property alias cornerSide: deprecatedProperties.cornerSide
+ property alias shadowColor: deprecatedProperties.shadowColor
+ property alias shadowEnabled: deprecatedProperties.shadowEnabled
+
+ Item
+ {
+ id: deprecatedProperties
+
+ visible: false
+ enabled: false
+ width: 0
+ height: 0
+
+ property var cornerSide: null
+ property var shadowColor: null
+ property var shadowEnabled: null
+
+ onCornerSideChanged:
+ {
+ if (cornerSide != null)
+ {
+ CuraApplication.writeToLog("w", "'ActionButton.cornerSide' is deprecated since 4.11. Rounded corners can still be made with 'Cura.RoundedRectangle'.");
+ }
+ }
+ onShadowColorChanged:
+ {
+ if (shadowColor != null)
+ {
+ CuraApplication.writeToLog("w", "'ActionButton.shadowColor' is deprecated since 4.11.")
+ }
+ }
+ onShadowEnabledChanged:
+ {
+ if (shadowEnabled != null)
+ {
+ CuraApplication.writeToLog("w", "'ActionButton.shadowEnabled' is deprecated since 4.11.")
+ }
+ }
+ }
+
leftPadding: UM.Theme.getSize("default_margin").width
rightPadding: UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("action_button").height
@@ -130,24 +170,13 @@ Button
background: Cura.RoundedRectangle
{
id: backgroundRect
- cornerSide: Cura.RoundedRectangle.Direction.All
color: button.enabled ? (button.hovered ? button.hoverColor : button.color) : button.disabledColor
- radius: UM.Theme.getSize("action_button_radius").width
border.width: UM.Theme.getSize("default_lining").width
border.color: button.enabled ? (button.hovered ? button.outlineHoverColor : button.outlineColor) : button.outlineDisabledColor
- }
- DropShadow
- {
- id: shadow
- // Don't blur the shadow
+ // Disable the rounded-ness of this rectangle. We can't use a normal Rectangle here yet, as the API/SDK has only just been deprecated.
radius: 0
- anchors.fill: backgroundRect
- source: backgroundRect
- verticalOffset: 2
- visible: false
- // Should always be drawn behind the background.
- z: backgroundRect.z - 1
+ cornerSide: Cura.RoundedRectangle.Direction.None
}
Cura.ToolTip
@@ -189,4 +218,4 @@ Button
duration: 2500
}
}
-} \ No newline at end of file
+}
diff --git a/resources/qml/ActionPanel/OutputDevicesActionButton.qml b/resources/qml/ActionPanel/OutputDevicesActionButton.qml
index 6d1a1d83dd..48416e69fd 100644
--- a/resources/qml/ActionPanel/OutputDevicesActionButton.qml
+++ b/resources/qml/ActionPanel/OutputDevicesActionButton.qml
@@ -1,4 +1,4 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7
@@ -23,7 +23,6 @@ Item
id: saveToButton
height: parent.height
fixedWidthMode: true
- cornerSide: deviceSelectionMenu.visible ? Cura.RoundedRectangle.Direction.Left : Cura.RoundedRectangle.Direction.All
anchors
{
@@ -43,15 +42,11 @@ Item
}
}
- Cura.ActionButton
+ Cura.PrimaryButton
{
id: deviceSelectionMenu
height: parent.height
- shadowEnabled: true
- shadowColor: UM.Theme.getColor("primary_shadow")
- cornerSide: Cura.RoundedRectangle.Direction.Right
-
anchors
{
top: parent.top
@@ -61,7 +56,7 @@ Item
leftPadding: UM.Theme.getSize("narrow_margin").width //Need more space than usual here for wide text.
rightPadding: UM.Theme.getSize("narrow_margin").width
iconSource: popup.opened ? UM.Theme.getIcon("ChevronSingleUp") : UM.Theme.getIcon("ChevronSingleDown")
- color: UM.Theme.getColor("action_panel_secondary")
+ color: popup.opened ? hoverColor : UM.Theme.getColor("action_panel_secondary")
visible: (devicesModel.deviceCount > 1)
onClicked: popup.opened ? popup.close() : popup.open()
@@ -70,6 +65,7 @@ Item
{
id: popup
padding: 0
+ spacing: 0
y: -height
x: parent.width - width
@@ -78,17 +74,16 @@ Item
contentItem: ColumnLayout
{
+ spacing: 0
+
Repeater
{
model: devicesModel
- delegate: Cura.ActionButton
+ delegate: Cura.PrimaryButton
{
text: model.description
visible: model.id != UM.OutputDeviceManager.activeDevice // Don't show the active device in the list
- color: "transparent"
- cornerRadius: 0
- hoverColor: UM.Theme.getColor("primary")
Layout.fillWidth: true
// The total width of the popup should be defined by the largest button. By stating that each
// button should be minimally the size of it's content (aka; implicitWidth) we can ensure that.
@@ -102,13 +97,6 @@ Item
}
}
}
-
- background: Rectangle
- {
- opacity: visible ? 1 : 0
- Behavior on opacity { NumberAnimation { duration: 100 } }
- color: UM.Theme.getColor("action_panel_secondary")
- }
}
}
diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml
index db910d1798..191ae712d4 100644
--- a/resources/qml/Cura.qml
+++ b/resources/qml/Cura.qml
@@ -429,6 +429,14 @@ UM.MainWindow
height: UM.Theme.getSize("message_action_button").height
}
}
+ link: Component
+ {
+ Cura.TertiaryButton
+ {
+ text: model.name
+ height: UM.Theme.getSize("message_action_button").height
+ }
+ }
}
}
diff --git a/resources/qml/ExpandableComponent.qml b/resources/qml/ExpandableComponent.qml
index f58d7b59ff..18eb8c0fa6 100644
--- a/resources/qml/ExpandableComponent.qml
+++ b/resources/qml/ExpandableComponent.qml
@@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.2 as UM
import Cura 1.0 as Cura
-import QtGraphicalEffects 1.0 // For the dropshadow
-
// The expandable component has 2 major sub components:
// * The headerItem; Always visible and should hold some info about what happens if the component is expanded
// * The contentItem; The content that needs to be shown if the component is expanded.
@@ -58,6 +56,9 @@ Item
property alias headerBackgroundBorder: background.border
+ // Whether or not to show the background border
+ property bool enableHeaderBackgroundBorder: true
+
// What icon should be displayed on the right.
property alias iconSource: collapseButton.source
@@ -75,11 +76,7 @@ Item
// On what side should the header corners be shown? 1 is down, 2 is left, 3 is up and 4 is right.
property alias headerCornerSide: background.cornerSide
- property alias headerShadowColor: shadow.color
-
- property alias enableHeaderShadow: shadow.visible
-
- property int shadowOffset: 2
+ property int popupOffset: 2
// Prefix used for the dragged position preferences. Preferences not used if empty. Don't translate!
property string dragPreferencesNamePrefix: ""
@@ -122,6 +119,9 @@ Item
id: background
property real padding: UM.Theme.getSize("default_margin").width
+ border.width: base.enableHeaderBackgroundBorder ? UM.Theme.getSize("default_lining").width : 0
+ border.color: UM.Theme.getColor("lining")
+
color: base.enabled ? (base.expanded ? headerActiveColor : headerBackgroundColor) : UM.Theme.getColor("disabled")
anchors.fill: parent
@@ -167,7 +167,7 @@ Item
verticalCenter: parent.verticalCenter
margins: background.padding
}
- source: UM.Theme.getIcon("Pen")
+ source: UM.Theme.getIcon("ChevronSingleDown")
visible: source != ""
width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.getSize("standard_arrow").height
@@ -186,20 +186,6 @@ Item
}
}
- DropShadow
- {
- id: shadow
- // Don't blur the shadow
- radius: 0
- anchors.fill: background
- source: background
- verticalOffset: base.shadowOffset
- visible: true
- color: UM.Theme.getColor("action_button_shadow")
- // Should always be drawn behind the background.
- z: background.z - 1
- }
-
Cura.RoundedRectangle
{
id: contentContainer
@@ -211,7 +197,7 @@ Item
height: childrenRect.height
// Ensure that the content is located directly below the headerItem
- y: dragPreferencesNamePrefix === "" ? (background.height + base.shadowOffset + base.contentSpacingY) : UM.Preferences.getValue(dragPreferencesNamePrefix + dragPreferencesNameY)
+ y: dragPreferencesNamePrefix === "" ? (background.height + base.popupOffset + base.contentSpacingY) : UM.Preferences.getValue(dragPreferencesNamePrefix + dragPreferencesNameY)
// Make the content aligned with the rest, using the property contentAlignment to decide whether is right or left.
// In case of right alignment, the 3x padding is due to left, right and padding between the button & text.
@@ -230,7 +216,7 @@ Item
var maxPt = base.mapFromItem(null,
CuraApplication.appWidth() - (contentContainer.width + margin.width),
CuraApplication.appHeight() - (contentContainer.height + margin.height));
- var initialY = background.height + base.shadowOffset + margin.height;
+ var initialY = background.height + base.popupOffset + margin.height;
contentContainer.x = Math.max(minPt.x, Math.min(maxPt.x, posNewX));
contentContainer.y = Math.max(initialY, Math.min(maxPt.y, posNewY));
diff --git a/resources/qml/ExpandablePopup.qml b/resources/qml/ExpandablePopup.qml
index 69f7f61433..3bcfdbb6f8 100644
--- a/resources/qml/ExpandablePopup.qml
+++ b/resources/qml/ExpandablePopup.qml
@@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.2 as UM
import Cura 1.0 as Cura
-import QtGraphicalEffects 1.0 // For the dropshadow
-
// The expandable component has 2 major sub components:
// * The headerItem; Always visible and should hold some info about what happens if the component is expanded
// * The contentItem; The content that needs to be shown if the component is expanded.
@@ -52,6 +50,9 @@ Item
property alias headerBackgroundBorder: background.border
+ // Whether or not to show the background border
+ property bool enableHeaderBackgroundBorder: true
+
// What icon should be displayed on the right.
property alias iconSource: collapseButton.source
@@ -74,11 +75,7 @@ Item
// Change the contentItem close behaviour
property alias contentClosePolicy : content.closePolicy
- property alias headerShadowColor: shadow.color
-
- property alias enableHeaderShadow: shadow.visible
-
- property int shadowOffset: 2
+ property int popupOffset: 2
onEnabledChanged:
{
@@ -116,6 +113,9 @@ Item
id: background
property real padding: UM.Theme.getSize("default_margin").width
+ border.width: base.enableHeaderBackgroundBorder ? UM.Theme.getSize("default_lining").width : 0
+ border.color: UM.Theme.getColor("lining")
+
color: base.enabled ? headerBackgroundColor : UM.Theme.getColor("disabled")
anchors.fill: parent
@@ -180,7 +180,7 @@ Item
verticalCenter: parent.verticalCenter
margins: background.padding
}
- source: expanded ? UM.Theme.getIcon("ChevronSingleDown") : UM.Theme.getIcon("ChevronSingleLeft")
+ source: UM.Theme.getIcon("ChevronSingleDown")
visible: source != ""
width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.getSize("standard_arrow").height
@@ -190,26 +190,12 @@ Item
}
- DropShadow
- {
- id: shadow
- // Don't blur the shadow
- radius: 0
- anchors.fill: background
- source: background
- verticalOffset: base.shadowOffset
- visible: true
- color: UM.Theme.getColor("action_button_shadow")
- // Should always be drawn behind the background.
- z: background.z - 1
- }
-
Popup
{
id: content
// Ensure that the content is located directly below the headerItem
- y: background.height + base.shadowOffset
+ y: background.height + base.popupOffset
// Make the content aligned with the rest, using the property contentAlignment to decide whether is right or left.
// In case of right alignment, the 3x padding is due to left, right and padding between the button & text.
diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml
index feb399d528..b87855e25e 100644
--- a/resources/qml/ExtruderButton.qml
+++ b/resources/qml/ExtruderButton.qml
@@ -22,6 +22,7 @@ Cura.ToolbarButton
{
materialColor: extruder.color
extruderEnabled: extruder.stack.isEnabled
+ iconVariant: "default"
property int index: extruder.index
}
diff --git a/resources/qml/ExtruderIcon.qml b/resources/qml/ExtruderIcon.qml
index 1c93966519..f33e345b68 100644
--- a/resources/qml/ExtruderIcon.qml
+++ b/resources/qml/ExtruderIcon.qml
@@ -1,7 +1,7 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.7
+import QtQuick 2.11
import QtQuick.Controls 1.1
import UM 1.2 as UM
@@ -16,30 +16,30 @@ Item
property color materialColor
property alias textColor: extruderNumberText.color
property bool extruderEnabled: true
+ property alias iconSize: mainIcon.sourceSize
+ property string iconVariant: "medium"
- UM.RecolorImage
+ Item
{
- id: mainIcon
+ opacity: extruderEnabled ? 1 : UM.Theme.getColor("extruder_disabled").a
anchors.fill: parent
- source: UM.Theme.getIcon("Extruder", "medium")
- color: extruderEnabled ? materialColor: UM.Theme.getColor("disabled")
- }
-
- Rectangle
- {
- id: extruderNumberCircle
-
- width: height
- height: Math.round(parent.height / 2)
- radius: Math.round(width)
- color: UM.Theme.getColor("toolbar_background")
+ UM.RecolorImage
+ {
+ anchors.fill: parent
+ sourceSize: mainIcon.sourceSize
- anchors
+ source: UM.Theme.getIcon("ExtruderColor", iconVariant)
+ color: materialColor
+ }
+ UM.RecolorImage
{
- horizontalCenter: parent.horizontalCenter
- top: parent.top
- topMargin: (parent.height - height) / 2
+ id: mainIcon
+ anchors.fill: parent
+ sourceSize: UM.Theme.getSize("extruder_icon")
+
+ source: UM.Theme.getIcon("Extruder", iconVariant)
+ color: extruderNumberText.color
}
Label
@@ -47,25 +47,13 @@ Item
id: extruderNumberText
anchors.centerIn: parent
text: index + 1
- font: UM.Theme.getFont("small")
+ font: UM.Theme.getFont("small_emphasis")
color: UM.Theme.getColor("text")
width: contentWidth
height: contentHeight
- visible: extruderEnabled
renderType: Text.NativeRendering
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
-
- UM.RecolorImage
- {
- id: disabledIcon
- anchors.fill: parent
- anchors.margins: UM.Theme.getSize("thick_lining").width
- sourceSize.height: width
- source: UM.Theme.getIcon("Cancel")
- visible: !extruderEnabled
- color: UM.Theme.getColor("text")
- }
}
}
diff --git a/resources/qml/MainWindow/MainWindowHeader.qml b/resources/qml/MainWindow/MainWindowHeader.qml
index cb7d5c3d88..c670abb67a 100644
--- a/resources/qml/MainWindow/MainWindowHeader.qml
+++ b/resources/qml/MainWindow/MainWindowHeader.qml
@@ -62,7 +62,7 @@ Item
anchors.verticalCenter: parent.verticalCenter
exclusiveGroup: mainWindowHeaderMenuGroup
style: UM.Theme.styles.main_window_header_tab
- height: UM.Theme.getSize("main_window_header_button").height
+ height: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
iconSource: model.stage.iconSource
property color overlayColor: "transparent"
diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml
index 9d9437776d..43ccde461e 100644
--- a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml
+++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml
@@ -56,13 +56,13 @@ Cura.ExpandablePopup
id: extruderIcon
materialColor: model.color
extruderEnabled: model.enabled
- width: UM.Theme.getSize("button_icon").width
anchors.verticalCenter: parent.verticalCenter
}
- Item
+ ColumnLayout
{
- height: childrenRect.height
+ opacity: model.enabled ? 1 : UM.Theme.getColor("extruder_disabled").a
+ spacing: 0
anchors
{
left: extruderIcon.right
@@ -81,13 +81,8 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
+ width: parent.width
- anchors
- {
- top: parent.top
- left: parent.left
- right: parent.right
- }
visible: !truncated
}
@@ -100,13 +95,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
-
- anchors
- {
- top: parent.top
- left: parent.left
- right: parent.right
- }
+ width: parent.width
visible: !materialBrandColorTypeLabel.visible && !truncated
}
@@ -120,13 +109,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
-
- anchors
- {
- top: parent.top
- left: parent.left
- right: parent.right
- }
+ width: parent.width
visible: !materialBrandColorTypeLabel.visible && !materialColorTypeLabel.visible
}
// Label that shows the name of the variant
@@ -141,13 +124,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default_bold")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
-
- anchors
- {
- left: parent.left
- top: materialBrandColorTypeLabel.bottom
- right: parent.right
- }
+ width: parent.width
}
}
}
diff --git a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml
index 7d1393151f..8376693ad1 100644
--- a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml
+++ b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml
@@ -302,15 +302,15 @@ Item
}
Item
{
- width: instructionButton.width + 2 * UM.Theme.getSize("default_margin").width
+ width: instructionButton.width + 2 * UM.Theme.getSize("narrow_margin").width
height: instructionButton.visible ? materialSelection.height: 0
Button
{
id: instructionButton
hoverEnabled: true
contentItem: Item {}
- height: 0.5 * materialSelection.height
- width: height
+ height: UM.Theme.getSize("small_button").height
+ width: UM.Theme.getSize("small_button").width
anchors.centerIn: parent
background: UM.RecolorImage
{
diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml
index 7d8988fde4..1637b8d0cd 100644
--- a/resources/qml/ObjectItemButton.qml
+++ b/resources/qml/ObjectItemButton.qml
@@ -13,8 +13,6 @@ Button
width: parent.width
height: UM.Theme.getSize("action_button").height
- leftPadding: UM.Theme.getSize("thin_margin").width
- rightPadding: perObjectSettingsInfo.visible ? UM.Theme.getSize("default_lining").width : UM.Theme.getSize("thin_margin").width
checkable: true
hoverEnabled: true
@@ -46,14 +44,14 @@ Button
width: objectItemButton.width - objectItemButton.leftPadding
height: UM.Theme.getSize("action_button").height
- UM.RecolorImage
+ Rectangle
{
id: swatch
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
- width: height
- height: parent.height - UM.Theme.getSize("narrow_margin").height
- source: UM.Theme.getIcon("Extruder", "medium")
+ width: UM.Theme.getSize("standard_arrow").height
+ height: UM.Theme.getSize("standard_arrow").height
+ radius: Math.round(width / 2)
color: extruderColor
visible: showExtruderSwatches && extruderColor != ""
}
diff --git a/resources/qml/PrimaryButton.qml b/resources/qml/PrimaryButton.qml
index fca63d2cdb..52c460bde4 100644
--- a/resources/qml/PrimaryButton.qml
+++ b/resources/qml/PrimaryButton.qml
@@ -1,4 +1,4 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2
@@ -9,8 +9,6 @@ import Cura 1.1 as Cura
Cura.ActionButton
{
- shadowEnabled: true
- shadowColor: enabled ? UM.Theme.getColor("primary_button_shadow"): UM.Theme.getColor("action_button_disabled_shadow")
color: UM.Theme.getColor("primary_button")
textColor: UM.Theme.getColor("primary_button_text")
outlineColor: "transparent"
diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml
index 92cbd7dd89..cde2cd8dfc 100644
--- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml
+++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml
@@ -226,9 +226,12 @@ Item
{
Cura.ExtruderIcon
{
- anchors.horizontalCenter: parent.horizontalCenter
+ anchors.centerIn: parent
materialColor: model.color
extruderEnabled: model.enabled
+ iconVariant: "default"
+ height: parent.height
+ width: height
}
}
onClicked:
diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelector.qml b/resources/qml/PrintSetupSelector/PrintSetupSelector.qml
index a378290b03..414c349bb6 100644
--- a/resources/qml/PrintSetupSelector/PrintSetupSelector.qml
+++ b/resources/qml/PrintSetupSelector/PrintSetupSelector.qml
@@ -17,9 +17,6 @@ Cura.ExpandableComponent
contentPadding: UM.Theme.getSize("default_lining").width
contentHeaderTitle: catalog.i18nc("@label", "Print settings")
- enableHeaderShadow: false
- headerBackgroundBorder.width: UM.Theme.getSize("default_lining").width
- headerBackgroundBorder.color: UM.Theme.getColor("lining")
enabled: !preSlicedData
disabledText: catalog.i18nc("@label shown when we load a Gcode file", "Print setup disabled. G-code file can not be modified.")
diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml
index ff9204655f..3b6fc37eb4 100644
--- a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml
+++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml
@@ -15,7 +15,8 @@ RowLayout
Cura.IconWithText
{
- source: UM.Theme.getIcon("PrintQuality")
+ source: UM.Theme.getIcon("Sliders", "medium")
+ iconSize: UM.Theme.getSize("button_icon").width
text:
{
if (Cura.MachineManager.activeStack)
@@ -53,6 +54,7 @@ RowLayout
source: UM.Theme.getIcon("Infill1")
text: Cura.MachineManager.activeStack ? parseInt(infillDensity.properties.value) + "%" : "0%"
font: UM.Theme.getFont("medium")
+ iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider
{
@@ -68,6 +70,7 @@ RowLayout
source: UM.Theme.getIcon("Support")
text: supportEnabled.properties.value == "True" ? enabledText : disabledText
font: UM.Theme.getFont("medium")
+ iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider
{
@@ -83,6 +86,7 @@ RowLayout
source: UM.Theme.getIcon("Adhesion")
text: platformAdhesionType.properties.value != "skirt" && platformAdhesionType.properties.value != "none" ? enabledText : disabledText
font: UM.Theme.getFont("medium")
+ iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider
{
diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml
index df2c1bfae6..a3a5047ee9 100644
--- a/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml
+++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml
@@ -29,6 +29,7 @@ Item
text: catalog.i18nc("@label", "Adhesion")
font: UM.Theme.getFont("medium")
width: labelColumnWidth
+ iconSize: UM.Theme.getSize("medium_button_icon").width
}
Item
diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml
index 8da97437cf..705a3e95ef 100644
--- a/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml
+++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml
@@ -43,7 +43,7 @@ Item
{
return UM.Theme.getIcon("Infill2")
}
- return UM.Theme.getIcon("Solid")
+ return UM.Theme.getIcon("Infill100")
}
}
@@ -65,6 +65,7 @@ Item
text: catalog.i18nc("@label", "Infill") + " (%)"
font: UM.Theme.getFont("medium")
width: labelColumnWidth
+ iconSize: UM.Theme.getSize("medium_button_icon").width
}
Item
@@ -119,6 +120,8 @@ Item
implicitWidth: UM.Theme.getSize("print_setup_slider_handle").width
implicitHeight: implicitWidth
radius: Math.round(implicitWidth / 2)
+ border.color: UM.Theme.getColor("slider_groove_fill")
+ border.width: UM.Theme.getSize("default_lining").height
}
tickmarks: Repeater
diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml
index a8e19c7357..0823b5cb62 100644
--- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml
+++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml
@@ -52,6 +52,7 @@ Item
text: catalog.i18nc("@label", "Profiles")
font: UM.Theme.getFont("medium")
width: labelColumnWidth
+ iconSize: UM.Theme.getSize("medium_button_icon").width
}
UM.SimpleButton
{
@@ -91,6 +92,7 @@ Item
{
left: profileLabel.right
right: parent.right
+ verticalCenter: profileLabel.verticalCenter
}
model: Cura.QualityProfilesDropDownMenuModel
diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml
index 924dcd5ec4..4e2341fb57 100644
--- a/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml
+++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml
@@ -30,6 +30,7 @@ Item
text: catalog.i18nc("@label", "Support")
font: UM.Theme.getFont("medium")
width: labelColumnWidth
+ iconSize: UM.Theme.getSize("medium_button_icon").width
}
Item
@@ -218,18 +219,16 @@ Item
elide: Text.ElideLeft
verticalAlignment: Text.AlignVCenter
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: supportExtruderCombobox.color
}
}
@@ -288,18 +287,16 @@ Item
verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: supportExtruderCombobox.model.getItem(index).color
}
}
diff --git a/resources/qml/PrinterSelector/MachineSelector.qml b/resources/qml/PrinterSelector/MachineSelector.qml
index 7c74be1605..c12e364339 100644
--- a/resources/qml/PrinterSelector/MachineSelector.qml
+++ b/resources/qml/PrinterSelector/MachineSelector.qml
@@ -93,11 +93,11 @@ Cura.ExpandablePopup
{
if (isGroup)
{
- return UM.Theme.getIcon("PrinterTriple")
+ return UM.Theme.getIcon("PrinterTriple", "medium")
}
else if (isNetworkPrinter || isCloudRegistered)
{
- return UM.Theme.getIcon("Printer")
+ return UM.Theme.getIcon("Printer", "medium")
}
else
{
@@ -114,8 +114,9 @@ Cura.ExpandablePopup
anchors
{
bottom: parent.bottom
+ bottomMargin: - height * 1 / 6
left: parent.left
- leftMargin: UM.Theme.getSize("thick_margin").width
+ leftMargin: iconSize - width * 5 / 6
}
source:
@@ -124,13 +125,9 @@ Cura.ExpandablePopup
{
return UM.Theme.getIcon("CheckBlueBG", "low")
}
- else if (connectionStatus == "printer_cloud_connected")
+ else if (connectionStatus == "printer_cloud_connected" || connectionStatus == "printer_cloud_not_available")
{
- return UM.Theme.getIcon("CloudBlueBG", "low")
- }
- else if (connectionStatus == "printer_cloud_not_available")
- {
- return UM.Theme.getIcon("CloudGreyBG", "low")
+ return UM.Theme.getIcon("CloudBadge", "low")
}
else
{
@@ -150,11 +147,10 @@ Cura.ExpandablePopup
{
id: iconBackground
anchors.centerIn: parent
- // Make it a bit bigger so there is an outline
- width: parent.width + 2 * UM.Theme.getSize("default_lining").width
- height: parent.height + 2 * UM.Theme.getSize("default_lining").height
- radius: Math.round(width / 2)
- color: UM.Theme.getColor("main_background")
+ width: parent.width - 1.5 //1.5 pixels smaller, (at least sqrt(2), regardless of screen pixel scale) so that the circle doesn't show up behind the icon due to anti-aliasing.
+ height: parent.height - 1.5
+ radius: width / 2
+ color: UM.Theme.getColor("connection_badge_background")
z: parent.z - 1
}
diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml
index 0b8709fe7a..5aea771a44 100644
--- a/resources/qml/RadioCheckbar.qml
+++ b/resources/qml/RadioCheckbar.qml
@@ -146,6 +146,7 @@ Item
}
radius: Math.round(width / 2)
color: activeColor
+ border.color: defaultItemColor
visible: checkbox.checked
}
}
diff --git a/resources/qml/SecondaryButton.qml b/resources/qml/SecondaryButton.qml
index f03d8acdfa..ba4e0bb2c1 100644
--- a/resources/qml/SecondaryButton.qml
+++ b/resources/qml/SecondaryButton.qml
@@ -1,4 +1,4 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2
@@ -9,11 +9,9 @@ import Cura 1.1 as Cura
Cura.ActionButton
{
- shadowEnabled: true
- shadowColor: enabled ? UM.Theme.getColor("secondary_button_shadow"): UM.Theme.getColor("action_button_disabled_shadow")
color: UM.Theme.getColor("secondary_button")
textColor: UM.Theme.getColor("secondary_button_text")
- outlineColor: "transparent"
+ outlineColor: UM.Theme.getColor("secondary_button_text")
disabledColor: UM.Theme.getColor("action_button_disabled")
textDisabledColor: UM.Theme.getColor("action_button_disabled_text")
hoverColor: UM.Theme.getColor("secondary_button_hover")
diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml
index a42db9cdcb..5beb6e209e 100644
--- a/resources/qml/Settings/SettingCategory.qml
+++ b/resources/qml/Settings/SettingCategory.qml
@@ -16,10 +16,13 @@ Button
anchors.rightMargin: 2 * UM.Theme.getSize("thin_margin").width
hoverEnabled: true
+ height: UM.Theme.getSize("section_icon_column").height
+
background: Rectangle
{
id: backgroundRectangle
height: UM.Theme.getSize("section").height
+ anchors.verticalCenter: parent.verticalCenter
color:
{
if (!base.enabled)
@@ -107,8 +110,8 @@ Button
source: UM.Theme.getIcon(definition.icon)
width: UM.Theme.getSize("section_icon").width
height: UM.Theme.getSize("section_icon").height
- sourceSize.width: width + 15 * screenScaleFactor
- sourceSize.height: width + 15 * screenScaleFactor
+ sourceSize.width: width
+ sourceSize.height: width
}
onClicked:
@@ -141,8 +144,8 @@ Button
id: settingsButton
visible: base.hovered || settingsButton.hovered
- height: Math.round(base.height * 0.6)
- width: Math.round(base.height * 0.6)
+ height: UM.Theme.getSize("small_button_icon").height
+ width: height
anchors
{
@@ -184,7 +187,7 @@ Button
return false
}
- height: Math.round(parent.height / 2)
+ height: UM.Theme.getSize("small_button_icon").height
width: height
onClicked:
diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml
index 995e1103f3..ea514eb069 100644
--- a/resources/qml/Settings/SettingExtruder.qml
+++ b/resources/qml/Settings/SettingExtruder.qml
@@ -77,7 +77,7 @@ SettingItem
currentIndex: propertyProvider.properties.value !== undefined ? propertyProvider.properties.value : 0
- property string color: "#fff"
+ property string color: "transparent"
Binding
{
@@ -85,7 +85,7 @@ SettingItem
// explicit binding here otherwise we do not handle value changes after the model changes.
target: control
property: "color"
- value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : ""
+ value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "transparent"
}
Binding
@@ -160,18 +160,16 @@ SettingItem
elide: Text.ElideLeft
verticalAlignment: Text.AlignVCenter
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: control.color
}
}
@@ -229,18 +227,16 @@ SettingItem
verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: control.model.getItem(index).color
}
}
diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml
index a377d08cfc..35172fc799 100644
--- a/resources/qml/Settings/SettingItem.qml
+++ b/resources/qml/Settings/SettingItem.qml
@@ -156,7 +156,7 @@ Item
{
id: settingControls
- height: UM.Theme.getSize("section_control").height
+ height: UM.Theme.getSize("small_button_icon").height
spacing: Math.round(UM.Theme.getSize("thick_margin").height / 2)
anchors
@@ -174,6 +174,7 @@ Item
anchors.top: parent.top
anchors.bottom: parent.bottom
+ height: UM.Theme.getSize("small_button_icon").height
width: height
color: UM.Theme.getColor("setting_control_button")
@@ -203,6 +204,7 @@ Item
anchors.top: parent.top
anchors.bottom: parent.bottom
+ height: UM.Theme.getSize("small_button_icon").height
width: height
color: UM.Theme.getColor("setting_control_button")
@@ -286,6 +288,7 @@ Item
anchors.top: parent.top
anchors.bottom: parent.bottom
+ height: UM.Theme.getSize("small_button_icon").height
width: height
onClicked:
diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml
index 5b1da6b785..94df1bcc03 100644
--- a/resources/qml/Settings/SettingOptionalExtruder.qml
+++ b/resources/qml/Settings/SettingOptionalExtruder.qml
@@ -88,7 +88,7 @@ SettingItem
when: control.model.items.length > 0
}
- property string color: "#fff"
+ property string color: "transparent"
Binding
{
@@ -96,7 +96,7 @@ SettingItem
// explicit binding here otherwise we do not handle value changes after the model changes.
target: control
property: "color"
- value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : ""
+ value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "transparent"
}
indicator: UM.RecolorImage
@@ -161,18 +161,16 @@ SettingItem
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: control.color
}
}
@@ -226,18 +224,16 @@ SettingItem
verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
- background: UM.RecolorImage
+ background: Rectangle
{
id: swatch
height: Math.round(parent.height / 2)
width: height
+ radius: Math.round(width / 2)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("Extruder", "medium")
color: control.model.getItem(index).color
}
}
diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml
index f038d15ca3..fc920a30e7 100644
--- a/resources/qml/Settings/SettingView.qml
+++ b/resources/qml/Settings/SettingView.qml
@@ -65,7 +65,13 @@ Item
anchors.right: clearFilterButton.left
anchors.rightMargin: Math.round(UM.Theme.getSize("thick_margin").width)
- placeholderText: "<img align='middle' src='"+ UM.Theme.getIcon("Magnifier") +"'>" + "<div vertical-align=bottom>" + catalog.i18nc("@label:textbox", "Search settings")
+ placeholderText:
+ {
+ var imageSize = "width='" + UM.Theme.getSize("small_button_icon").width + "' height='" + UM.Theme.getSize("small_button_icon").height
+ var imageSource = "' src='"+ UM.Theme.getIcon("Magnifier")
+ var searchPlaceholder = catalog.i18nc("@label:textbox", "Search settings")
+ return "<img align='middle' " + imageSize + imageSource +"'>" + "<div vertical-align=bottom>" + searchPlaceholder
+ }
style: TextFieldStyle
{
@@ -188,8 +194,8 @@ Item
{
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
- width: UM.Theme.getSize("standard_arrow").width
- height: UM.Theme.getSize("standard_arrow").height
+ width: UM.Theme.getSize("medium_button_icon").width
+ height: UM.Theme.getSize("medium_button_icon").height
sourceSize.width: width
sourceSize.height: height
color: control.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")
diff --git a/resources/qml/TertiaryButton.qml b/resources/qml/TertiaryButton.qml
index eb714c22f6..76684b6ef2 100644
--- a/resources/qml/TertiaryButton.qml
+++ b/resources/qml/TertiaryButton.qml
@@ -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 QtQuick 2.2
@@ -9,8 +9,6 @@ import Cura 1.1 as Cura
Cura.ActionButton
{
- shadowEnabled: true
- shadowColor: enabled ? UM.Theme.getColor("secondary_button_shadow"): UM.Theme.getColor("action_button_disabled_shadow")
color: "transparent"
textColor: UM.Theme.getColor("text_link")
outlineColor: "transparent"
diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml
index ec4d29420b..c948bb8242 100644
--- a/resources/qml/Toolbar.qml
+++ b/resources/qml/Toolbar.qml
@@ -68,7 +68,8 @@ Item
source: UM.Theme.getIcon(model.icon) != "" ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon
color: UM.Theme.getColor("icon")
- sourceSize: Math.round(UM.Theme.getSize("button") / 2)
+ sourceSize.height: Math.round(UM.Theme.getSize("button").height / 2)
+ sourceSize.width: Math.round(UM.Theme.getSize("button").width / 2)
}
onCheckedChanged:
diff --git a/resources/qml/ViewOrientationButton.qml b/resources/qml/ViewOrientationButton.qml
index 5d72de9a8d..7040447b29 100644
--- a/resources/qml/ViewOrientationButton.qml
+++ b/resources/qml/ViewOrientationButton.qml
@@ -11,5 +11,4 @@ UM.SimpleButton
height: UM.Theme.getSize("small_button").height
hoverColor: UM.Theme.getColor("small_button_text_hover")
color: UM.Theme.getColor("small_button_text")
- iconMargin: UM.Theme.getSize("thick_lining").width
} \ No newline at end of file
diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml
index 5334a15974..58cadbec37 100644
--- a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml
+++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml
@@ -1,4 +1,4 @@
-// Copyright (c) 2019 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
@@ -214,16 +214,16 @@ Item
id: troubleshootingButton
anchors.right: parent.right
- anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ anchors.rightMargin: UM.Theme.getSize("thin_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshootingLinkIcon.height
- width: troubleshootingLinkIcon.width + troubleshootingLabel.width + UM.Theme.getSize("default_margin").width
+ width: troubleshootingLinkIcon.width + troubleshootingLabel.width + UM.Theme.getSize("thin_margin").width
UM.RecolorImage
{
id: troubleshootingLinkIcon
anchors.right: troubleshootingLabel.left
- anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ anchors.rightMargin: UM.Theme.getSize("thin_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshootingLabel.height
width: height
diff --git a/resources/qml/Widgets/TextField.qml b/resources/qml/Widgets/TextField.qml
index 28074d4415..c126c8a6e0 100644
--- a/resources/qml/Widgets/TextField.qml
+++ b/resources/qml/Widgets/TextField.qml
@@ -1,4 +1,4 @@
-// Copyright (c) 2019 Ultimaker B.V.
+// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
@@ -15,6 +15,8 @@ TextField
{
id: textField
+ property alias leftIcon: iconLeft.source
+
UM.I18nCatalog { id: catalog; name: "cura" }
hoverEnabled: true
@@ -22,6 +24,7 @@ TextField
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
+ leftPadding: iconLeft.visible ? iconLeft.width + UM.Theme.getSize("default_margin").width * 2 : UM.Theme.getSize("thin_margin").width
states: [
State
@@ -52,7 +55,6 @@ TextField
color: UM.Theme.getColor("main_background")
- anchors.margins: Math.round(UM.Theme.getSize("default_lining").width)
radius: UM.Theme.getSize("setting_control_radius").width
border.color:
@@ -67,5 +69,23 @@ TextField
}
return UM.Theme.getColor("setting_control_border")
}
+
+ //Optional icon added on the left hand side.
+ UM.RecolorImage
+ {
+ id: iconLeft
+
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ left: parent.left
+ leftMargin: UM.Theme.getSize("default_margin").width
+ }
+
+ visible: source != ""
+ height: UM.Theme.getSize("small_button_icon").height
+ width: visible ? height : 0
+ color: textField.color
+ }
}
}
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_A.inst.cfg
new file mode 100644
index 0000000000..76ec06262a
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_absx
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 19 * layer_height
+cool_min_speed = 10
+support_angle = 65
+material_print_temperature = =default_material_print_temperature + 3
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 100
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_B.inst.cfg
new file mode 100644
index 0000000000..f3f24b3469
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_absx
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 14 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature + 3
+material_flow = 96
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_C.inst.cfg
new file mode 100644
index 0000000000..1a81a07607
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS-X_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_absx
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 9 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 10
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_flow = 91
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_A.inst.cfg
new file mode 100644
index 0000000000..ccb80ab2f1
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_abs
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 19 * layer_height
+cool_min_speed = 10
+support_angle = 65
+material_print_temperature = =default_material_print_temperature + 1
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 100
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_B.inst.cfg
new file mode 100644
index 0000000000..25f6aef09a
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_abs
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 14 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature + 3
+material_print_temperature_layer_0 = =default_material_print_temperature + 1
+material_flow = 96
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_C.inst.cfg
new file mode 100644
index 0000000000..3413ce30aa
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ABS_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_abs
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 9 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature +3
+material_flow = 91
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_A.inst.cfg
new file mode 100644
index 0000000000..739ae5bf06
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_acetate
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 37/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/37)
+speed_topbottom = =math.ceil(speed_print * 33/50)
+speed_layer_0 = =math.ceil(speed_print * 25/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 10 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 98
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_B.inst.cfg
new file mode 100644
index 0000000000..7787def8bb
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_acetate
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 40/55)
+speed_wall_0 = =math.ceil(speed_wall * 30/40)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 27/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 7 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 2
+material_print_temperature_layer_0 = =default_material_print_temperature + 0
+material_flow = 95
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_C.inst.cfg
new file mode 100644
index 0000000000..f670bb6eb1
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ACETATE_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_acetate
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 45/60)
+speed_wall_0 = =math.ceil(speed_wall * 33/45)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 35
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 5 * layer_height
+cool_min_speed = 10
+support_angle = 50
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature + 3
+material_flow = 93
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_A.inst.cfg
new file mode 100644
index 0000000000..cfe30caf9f
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_asax
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 40
+cool_fan_speed_max = 75
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 19 * layer_height
+cool_min_speed = 10
+support_angle = 65
+material_print_temperature = =default_material_print_temperature + 1
+material_print_temperature_layer_0 = =default_material_print_temperature + 3
+material_flow = 100
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_B.inst.cfg
new file mode 100644
index 0000000000..2d113281a8
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_asax
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 40
+cool_fan_speed_max = 75
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 14 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature + 3
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_flow = 96
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_C.inst.cfg
new file mode 100644
index 0000000000..7dc65e54da
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_ASA-X_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_asax
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 40
+cool_fan_speed_max = 75
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 9 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature + 7
+material_flow = 91
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_A.inst.cfg
new file mode 100644
index 0000000000..010c252721
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_A.inst.cfg
@@ -0,0 +1,62 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_copa
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+wall_line_count = 3
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 20
+cool_fan_speed_max = 80
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 2
+cool_lift_head = True
+support_angle = 45
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_initial_print_temperature = =default_material_print_temperature
+material_final_print_temperature = =default_material_print_temperature
+material_flow = 91
+skin_material_flow = 92
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 8
+bridge_wall_material_flow = 50
+bridge_skin_speed = 8
+bridge_skin_material_flow = 60
+bridge_skin_density = 80
+bridge_fan_speed = 80
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_B.inst.cfg
new file mode 100644
index 0000000000..80c7c4c6ad
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_B.inst.cfg
@@ -0,0 +1,62 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_copa
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+wall_line_count = 3
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 20
+cool_fan_speed_max = 80
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 2
+cool_lift_head = True
+support_angle = 60
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_initial_print_temperature = =default_material_print_temperature
+material_final_print_temperature = =default_material_print_temperature
+material_flow = 91
+skin_material_flow = 92
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 8
+bridge_wall_material_flow = 50
+bridge_skin_speed = 8
+bridge_skin_material_flow = 60
+bridge_skin_density = 80
+bridge_fan_speed = 80
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_C.inst.cfg
new file mode 100644
index 0000000000..5de7b0ea9f
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_COPA_C.inst.cfg
@@ -0,0 +1,62 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_copa
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+wall_line_count = 3
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 20
+cool_fan_speed_max = 80
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 2
+cool_lift_head = True
+support_angle = 60
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_initial_print_temperature = =default_material_print_temperature
+material_final_print_temperature = =default_material_print_temperature
+material_flow = 91
+skin_material_flow = 92
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 8
+bridge_wall_material_flow = 50
+bridge_skin_speed = 8
+bridge_skin_material_flow = 60
+bridge_skin_density = 80
+bridge_fan_speed = 80
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_A.inst.cfg
new file mode 100644
index 0000000000..cb3871fc6d
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_A.inst.cfg
@@ -0,0 +1,50 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_hips
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 30/40)
+speed_wall_0 = =math.ceil(speed_wall * 30/40)
+speed_topbottom = =math.ceil(speed_print * 20/40)
+speed_layer_0 = =math.ceil(speed_print * 20/40)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 14 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 97
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_bottom_stair_step_height = 0
+support_bottom_stair_step_width = 0
+support_z_distance = =layer_height-layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 0.5
+support_xy_distance_overhang = =line_width*0
+support_offset = 3
+support_pattern = grid
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_B.inst.cfg
new file mode 100644
index 0000000000..d29a61bae6
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_B.inst.cfg
@@ -0,0 +1,50 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_hips
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 30/40)
+speed_wall_0 = =math.ceil(speed_wall * 30/40)
+speed_topbottom = =math.ceil(speed_print * 20/40)
+speed_layer_0 = =math.ceil(speed_print * 20/40)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 9 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 3
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 97
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_bottom_stair_step_height = 0
+support_bottom_stair_step_width = 0
+support_z_distance = =layer_height-layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 0.5
+support_xy_distance_overhang = =line_width*0
+support_offset = 3
+support_pattern = grid
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_C.inst.cfg
new file mode 100644
index 0000000000..46b30ef1a1
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_HIPS_C.inst.cfg
@@ -0,0 +1,50 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_hips
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 30/40)
+speed_wall_0 = =math.ceil(speed_wall * 30/40)
+speed_topbottom = =math.ceil(speed_print * 20/40)
+speed_layer_0 = =math.ceil(speed_print * 20/40)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 4 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 97
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_bottom_stair_step_height = 0
+support_bottom_stair_step_width = 0
+support_z_distance = =layer_height-layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 0.5
+support_xy_distance_overhang = =line_width*0
+support_offset = 3
+support_pattern = grid
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_A.inst.cfg
new file mode 100644
index 0000000000..c2065bf506
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_A.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_pc
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 10
+cool_fan_speed_max = 10
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 12
+support_angle = 60
+cool_lift_head = true
+material_print_temperature = 260
+material_print_temperature_layer_0 = 265
+material_flow = 88
+wall_line_count = 3
+retraction_extra_prime_amount = 0.1
+retraction_speed = 30
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+adhesion_type = brim
+
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 12
+bridge_wall_material_flow = 50
+bridge_skin_speed = 12.5
+bridge_skin_material_flow = 100
+bridge_skin_density = 80
+bridge_fan_speed = 100
+
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_B.inst.cfg
new file mode 100644
index 0000000000..e3804df9e2
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_B.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_pc
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 10
+cool_fan_speed_max = 10
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 12
+cool_lift_head = true
+support_angle = 60
+material_print_temperature = 270
+material_print_temperature_layer_0 = 275
+material_flow = 88
+wall_line_count = 3
+retraction_speed = 30
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+
+adhesion_type = brim
+
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 12
+bridge_wall_material_flow = 50
+bridge_skin_speed = 12.5
+bridge_skin_material_flow = 100
+bridge_skin_density = 80
+bridge_fan_speed = 100
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_C.inst.cfg
new file mode 100644
index 0000000000..453c4c8700
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PC_C.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_pc
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 10
+cool_fan_speed_max = 10
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 12
+support_angle = 60
+cool_lift_head = true
+material_print_temperature = 270
+material_print_temperature_layer_0 = 275
+material_flow = 88
+wall_line_count = 3
+retraction_speed = 30
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+
+adhesion_type = brim
+
+bridge_settings_enabled = True
+bridge_wall_coast = 50
+bridge_wall_speed = 12
+bridge_wall_material_flow = 50
+bridge_skin_speed = 12.5
+bridge_skin_material_flow = 100
+bridge_skin_density = 80
+bridge_fan_speed = 100
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PEKK_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PEKK_B.inst.cfg
new file mode 100644
index 0000000000..3782c7f994
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PEKK_B.inst.cfg
@@ -0,0 +1,58 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_pekk
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+initial_layer_line_width_factor = 120
+material_flow_layer_0 = 120
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = 10
+speed_travel_layer_0 = 100
+skirt_brim_speed = 5
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 30
+cool_fan_speed_max = 30
+cool_min_layer_time_fan_speed_max = 10
+cool_min_layer_time = 11
+cool_fan_full_layer = 2
+cool_min_speed = 5
+support_angle = 45
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 15
+material_flow = 105
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height
+support_bottom_distance = =support_z_distance
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 105
+prime_tower_enable = True
+bridge_settings_enabled = True
+bridge_wall_speed = 5
+bridge_wall_material_flow = 185
+bridge_skin_speed = =bridge_wall_speed
+bridge_skin_material_flow = =bridge_wall_material_flow
+bridge_fan_speed = 100
+bridge_enable_more_layers = False
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_A.inst.cfg
new file mode 100644
index 0000000000..a5bf7374ca
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_petg
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 3 * layer_height
+cool_min_speed = 10
+support_angle = 65
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 98
+retraction_extra_prime_amount = 0
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_B.inst.cfg
new file mode 100644
index 0000000000..91d3015b25
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_petg
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 3 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 95
+retraction_extra_prime_amount = 0
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_C.inst.cfg
new file mode 100644
index 0000000000..77bd280b59
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PETG_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_petg
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 3 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 10
+material_print_temperature_layer_0 = =default_material_print_temperature +5
+material_flow = 91
+retraction_extra_prime_amount = 0
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_A.inst.cfg
new file mode 100644
index 0000000000..5ee51facb5
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_pla
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 50
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 10
+support_angle = 65
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature -5
+material_flow = 98
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_B.inst.cfg
new file mode 100644
index 0000000000..b575c4db11
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_pla
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 55
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 10
+support_angle = 60
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 95
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_C.inst.cfg
new file mode 100644
index 0000000000..3dd12ec3d3
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_pla
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 60
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 10
+support_angle = 55
+material_print_temperature = =default_material_print_temperature + 10
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_flow = 91
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_A.inst.cfg
new file mode 100644
index 0000000000..46a34e8290
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_A.inst.cfg
@@ -0,0 +1,55 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_pla_hr_870
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+wall_line_count = 3
+speed_print = 30
+speed_wall = =math.ceil(speed_print * 35/50)
+speed_wall_0 = =math.ceil(speed_wall * 30/35)
+speed_topbottom = =math.ceil(speed_print * 35/50)
+speed_layer_0 = =math.ceil(speed_print * 20/50)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 4
+support_angle = 65
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature + 10
+material_initial_print_temperature = =default_material_print_temperature + 5
+material_final_print_temperature = =default_material_print_temperature + 5
+material_flow = 91
+skin_material_flow = 92
+retraction_amount = 2
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 10
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
+cool_lift_head = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_B.inst.cfg
new file mode 100644
index 0000000000..504695192f
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_B.inst.cfg
@@ -0,0 +1,54 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_pla_hr_870
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 37/55)
+speed_wall_0 = =math.ceil(speed_wall * 33/37)
+speed_topbottom = =math.ceil(speed_print * 37/55)
+speed_layer_0 = =math.ceil(speed_print * 25/55)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 4
+support_angle = 60
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_initial_print_temperature = =default_material_print_temperature
+material_final_print_temperature = =default_material_print_temperature
+material_flow = 91
+skin_material_flow = 92
+retraction_amount = 2
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 15
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
+cool_lift_head = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_C.inst.cfg
new file mode 100644
index 0000000000..1bc06df105
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_PLA_HT_C.inst.cfg
@@ -0,0 +1,54 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_pla_hr_870
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.4
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 40/60)
+speed_wall_0 = =math.ceil(speed_wall * 35/40)
+speed_topbottom = =math.ceil(speed_print * 40/60)
+speed_layer_0 = =math.ceil(speed_print * 30/60)
+speed_slowdown_layers = 2
+cool_fan_enabled = True
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 2
+cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
+cool_min_speed = 4
+support_angle = 55
+material_print_temperature = =default_material_print_temperature
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+material_initial_print_temperature = =default_material_print_temperature
+material_final_print_temperature = =default_material_print_temperature
+material_flow = 91
+skin_material_flow = 92
+retraction_amount = 2
+retraction_extra_prime_amount = 0.1
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = True
+skin_overlap = 20
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 1.7
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 1
+support_interface_density = 100
+prime_tower_enable = True
+meshfix_maximum_resolution = 0.5
+meshfix_maximum_deviation = 0.04
+cool_lift_head = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_A.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_A.inst.cfg
new file mode 100644
index 0000000000..5a2e9009be
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_A.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = A
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = a
+weight = 1
+material = emotiontech_tpu98a
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.5*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 30
+speed_wall = =math.ceil(speed_print * 30/30)
+speed_wall_0 = =math.ceil(speed_print * 25/30)
+speed_topbottom = =math.ceil(speed_print * 25/30)
+speed_layer_0 = =math.ceil(speed_print * 20/30)
+speed_slowdown_layers = 1
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 4 * layer_height
+cool_min_speed = 10
+support_angle = 50
+material_print_temperature = =default_material_print_temperature + 3
+material_print_temperature_layer_0 = =default_material_print_temperature - 3
+material_flow = 107
+retraction_extra_prime_amount = 0.2
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = False
+skin_overlap = 5
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 2.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 0.5
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_B.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_B.inst.cfg
new file mode 100644
index 0000000000..46bdc28c7e
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_B.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = B
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = b
+weight = 0
+material = emotiontech_tpu98a
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.67*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 35
+speed_wall = =math.ceil(speed_print * 35/35)
+speed_wall_0 = =math.ceil(speed_print * 27/35)
+speed_topbottom = =math.ceil(speed_print * 25/35)
+speed_layer_0 = =math.ceil(speed_print * 20/35)
+speed_slowdown_layers = 1
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 4 * layer_height
+cool_min_speed = 10
+support_angle = 50
+material_print_temperature = =default_material_print_temperature + 5
+material_print_temperature_layer_0 = =default_material_print_temperature
+material_flow = 103
+retraction_extra_prime_amount = 0.2
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = False
+skin_overlap = 5
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 2.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 0.5
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_C.inst.cfg b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_C.inst.cfg
new file mode 100644
index 0000000000..57a47f9a3b
--- /dev/null
+++ b/resources/quality/strateo3d/HT0.4/s3d_ht0.4_TPU98A_C.inst.cfg
@@ -0,0 +1,47 @@
+[general]
+version = 4
+name = C
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = quality
+quality_type = c
+weight = -1
+material = emotiontech_tpu98a
+variant = High temp 0.4
+
+[values]
+layer_height_0 = =round(0.75*machine_nozzle_size, 2)
+line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.38
+wall_0_wipe_dist = =machine_nozzle_size/2
+speed_print = 40
+speed_wall = =math.ceil(speed_print * 40/40)
+speed_wall_0 = =math.ceil(speed_print * 30/40)
+speed_topbottom = =math.ceil(speed_print * 27/40)
+speed_layer_0 = =math.ceil(speed_print * 20/40)
+speed_slowdown_layers = 1
+cool_fan_enabled = True
+cool_fan_speed = 50
+cool_fan_speed_max = 100
+cool_min_layer_time_fan_speed_max = 20
+cool_min_layer_time = 11
+cool_fan_full_at_height = =layer_height_0 + 4 * layer_height
+cool_min_speed = 10
+support_angle = 50
+material_print_temperature = =default_material_print_temperature + 7
+material_print_temperature_layer_0 = =default_material_print_temperature + 3
+material_flow = 101
+retraction_extra_prime_amount = 0.2
+retraction_min_travel = =3*line_width
+retraction_hop_only_when_collides = False
+skin_overlap = 5
+support_z_distance = =layer_height*2
+support_bottom_distance = =support_z_distance*0.5
+support_xy_distance = =line_width * 2.5
+support_xy_distance_overhang = =wall_line_width_0
+support_offset = 0.5
+support_interface_density = 100
+prime_tower_enable = True
diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json
index e3266b923b..0d6fa2f260 100644
--- a/resources/themes/cura-dark/theme.json
+++ b/resources/themes/cura-dark/theme.json
@@ -16,13 +16,20 @@
"primary_text": [255, 255, 255, 204],
"secondary": [95, 95, 95, 255],
- "icon": [204, 204, 204, 255],
+ "secondary_button": [0, 0, 0, 0],
+ "secondary_button_hover": [85, 85, 87, 255],
+ "secondary_button_text": [255, 255, 255, 255],
+
+ "icon": [255, 255, 255, 255],
"toolbar_background": [39, 44, 48, 255],
- "toolbar_button_active": [95, 95, 95, 255],
- "toolbar_button_hover": [95, 95, 95, 255],
- "toolbar_button_active_hover": [95, 95, 95, 255],
+ "toolbar_button_active": [57, 57, 58, 255],
+ "toolbar_button_hover": [57, 57, 58, 255],
+ "toolbar_button_active_hover": [57, 57, 58, 255],
"main_window_header_button_text_inactive": [128, 128, 128, 255],
+ "main_window_header_background": [14, 14, 14, 255],
+ "main_window_header_background_gradient": [32, 32, 32, 255],
+ "main_window_header_button_background_hovered": [46, 46, 46, 255],
"account_sync_state_icon": [255, 255, 255, 204],
@@ -32,7 +39,7 @@
"text": [255, 255, 255, 204],
"text_detail": [255, 255, 255, 172],
- "text_link": [255, 255, 255, 127],
+ "text_link": [25, 110, 240, 255],
"text_inactive": [255, 255, 255, 88],
"text_hover": [255, 255, 255, 204],
"text_pressed": [255, 255, 255, 204],
@@ -87,8 +94,8 @@
"action_button_active": [39, 44, 48, 30],
"action_button_active_text": [255, 255, 255, 255],
"action_button_active_border": [255, 255, 255, 100],
- "action_button_disabled": [19, 24, 28, 255],
- "action_button_disabled_text": [200, 200, 200, 80],
+ "action_button_disabled": [85, 85, 87, 255],
+ "action_button_disabled_text": [103, 103, 104, 255],
"action_button_disabled_border": [255, 255, 255, 30],
"scrollbar_background": [39, 44, 48, 0],
diff --git a/resources/themes/cura-light/icons/default/Extruder.svg b/resources/themes/cura-light/icons/default/Extruder.svg
new file mode 100644
index 0000000000..7c17fa67ca
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Extruder.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="Layer_1_1_">
+ <g>
+ <path d="M12,2C6.5,2,2,6.5,2,12v9h2v-3c1.8,2.4,4.7,4,8,4c5.5,0,10-4.5,10-10S17.5,2,12,2z M12,20c-4.4,0-8-3.6-8-8s3.6-8,8-8
+ s8,3.6,8,8S16.4,20,12,20z"/>
+ </g>
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/icons/default/ExtruderColor.svg b/resources/themes/cura-light/icons/default/ExtruderColor.svg
new file mode 100644
index 0000000000..ff202e7296
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/ExtruderColor.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#231F20;}
+</style>
+<g id="Layer_1_1_">
+ <path class="st0" d="M12,21c-5,0-9-4-9-9s4-9,9-9s9,4,9,9S17,21,12,21z M12,6c-3.3,0-6,2.7-6,6s2.7,6,6,6s6-2.7,6-6S15.3,6,12,6z"
+ />
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/icons/default/Infill100.svg b/resources/themes/cura-light/icons/default/Infill100.svg
new file mode 100644
index 0000000000..d136666990
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Infill100.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<rect x="3" y="3" width="18" height="18" rx="3" />
+</svg> \ No newline at end of file
diff --git a/resources/themes/cura-light/icons/default/Solid.svg b/resources/themes/cura-light/icons/default/Solid.svg
index 34367b7bc7..608a56a3e3 100644
--- a/resources/themes/cura-light/icons/default/Solid.svg
+++ b/resources/themes/cura-light/icons/default/Solid.svg
@@ -1,10 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-282 405.9 30 30">
-<path d="M-280.4 407.1l-.4.4v1.8l2.2-2.2zm2.2 0l-2.6 2.6v1.8l4.4-4.4zm2.2 0l-4.8 4.8v1.8l6.6-6.6zm2.2 0l-7 6.9v1.8l8.8-8.7zm2.1 0l-9.1 9.1v1.8l10.9-10.9zm2.2 0l-11.3 11.3v1.8l13.1-13.1zm2.2 0l-13.5 13.5v1.8l15.3-15.3zm2.2 0l-15.7 15.7v1.8l17.5-17.5zm2.2 0l-17.9 17.9v1.8l19.7-19.7zm2.2 0l-20.1 20.1v1.8l21.9-21.9zm2.2 0l-22.3 22.3v1.8l24.1-24.1zm2.2 0l-24.5 24.5v1.8l26.3-26.3zM-282 435zm28.8-27.9h-.9l-26.7 26.7v.9h.9l26.7-26.7zm0 1.3l-26.3 26.3h1.8l24.5-24.5zm0 2.1l-24.1 24.2h1.8l22.3-22.4zm0 2.2l-22 22h1.8l20.2-20.2zm0 2.2l-19.8 19.8h1.8l18-18zm0 2.2l-17.6 17.6h1.8l15.8-15.8zm0 2.2l-15.4 15.4h1.8l13.6-13.6zm0 2.2l-13.2 13.2h1.8l11.4-11.4zm0 2.2l-11 11h1.8l9.2-9.2zm0 2.2l-8.8 8.8h1.8l7-7zm0 2.2l-6.6 6.6h1.8l4.8-4.8zm0 2.2l-4.4 4.4h1.8l2.6-2.6zm-2.2 4.4h1.8l.4-.4v-1.8zm-25.4-27.6h-1.2v1.6l1.2-1.2zm0 8.7l-1.2 1.2v.4l1.2-1.2zm0 6.6l-1.2 1.2v.4l1.2-1.2zm0-8.7l-1.2 1.2v.3l1.2-1.2zm0 4.3l-1.2 1.2v.4l1.2-1.2zm0-8.7l-1.2 1.2v.4l1.2-1.2zm0 2.2l-1.2 1.2v.4l1.2-1.2zm0 8.7l-1.2 1.2v.4l1.2-1.2zm0 13.6v-.4l-1.2 1.2v.1h.3zm0-4.8l-1.2 1.2v.4l1.2-1.2zm0 2.2l-1.2 1.2v.4l1.2-1.2zm0-6.6l-1.2 1.2v.4l1.2-1.2zm0 2.2l-1.2 1.2v.4l1.2-1.2z" />
-<path d="M-280.8 407.5l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.1l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm0 2.2l-1.2 1.2v1.8l1.2-1.2zm-.9 3.1h.9v-.9zm28.5-19.8l1.2-1.2v-.4l-1.2 1.2zm0 4.4l1.2-1.2v-.4l-1.2 1.2zm0-11.3v.4l1.2-1.2v-.1h-.3zm0 15.7l1.2-1.2v-.4l-1.2 1.2zm0-6.6l1.2-1.2v-.4l-1.2 1.2zm0-6.6l1.2-1.2v-.3l-1.2 1.2zm0 2.2l1.2-1.2v-.4l-1.2 1.2zm0 8.8l1.2-1.2v-.4l-1.2 1.2zm0 12.8v.4h1.2v-1.6zm0-8.4l1.2-1.2v-.4l-1.2 1.2zm0 2.2l1.2-1.2v-.4l-1.2 1.2zm0 4.4l1.2-1.2v-.4l-1.2 1.2zm0-2.2l1.2-1.2v-.4l-1.2 1.2z" />
-<path d="M-252.3 407.1h-.9v.9zm-.9 3.1l1.2-1.2v-1.8l-1.2 1.2zm0 2.1l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm0 2.2l1.2-1.2v-1.8l-1.2 1.2zm-10.1-27.2h.4l1.2-1.2h-2.2l.9.9zm-2.2 0h.4l1.2-1.2h-2.2l.9.9zm-4.4 0h.4l1.2-1.2h-2.2l.9.9zm13.2 0h.4l1.2-1.2h-2.2l.9.9zm2.2 0h.4l.9-.9v-.3h-1.9l.9.9zm-4.4 0h.4l1.2-1.2h-2.2l.9.9zm-2.2 0h.4l1.2-1.2h-2.2l.9.9zm-19.3 0l1.2-1.2h-1.6v1.2zm4 0h.4l1.2-1.2h-2.2l.9.9z" />
-<path d="M-278.6 407.1h.4l1.2-1.2h-2.2l.9.9zm4.4 0h.4l1.2-1.2h-2.2l.9.9zm2.2 0h.3l1.2-1.2h-2.1l.9.9zm4.3 0h.4l1.2-1.2h-2.2l.9.9z" />
-<path d="M-278.6 407.1l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.1 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm2.2 0l.3-.3-.9-.9-1.2 1.2zm1.3-.9l-.9.9h.9zm-28.8-.3h1.2v1.2h-1.2zm29.7 1.2h.3v-1.2h-.9l.9.9zm-.6-1.2h-.3v.3z" />
-<path d="M-253.2 407.1h.9l.3-.3-.9-.9-.3.3zm-13.2 27.6h-.4l-1.2 1.2h2.2l-.9-.9zm2.2 0h-.4l-1.2 1.2h2.2l-.9-.9zm-6.6 0h-.4l-1.2 1.2h2.2l-.9-.9zm2.2 0h-.4l-1.2 1.2h2.2l-.9-.9zm15 0l-1.2 1.2h1.6v-1.2zm-4 0h-.4l-1.2 1.2h2.2l-.9-.9zm-2.2 0h-.4l-1.2 1.2h2.2l-.9-.9zm4.4 0h-.4l-1.2 1.2h2.2l-.9-.9zm-17.6 0h-.4l-1.2 1.2h2.2l-.9-.9zm11 0h-.4l-1.2 1.2h2.2l-.9-.9zm-15.3 0h-.4l-1.2 1.2h2.2l-.9-.9zm2.1 0h-.3l-1.2 1.2h2.1l-.9-.9zm-4.3 0h-.4l-.9.9v.3h1.9l-.9-.9z" />
-<path d="M-280.8 435.6l.9-.9h-.9zm1.3-.9l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.1 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm2.2 0l-.3.3.9.9 1.2-1.2zm-26.6 1.2h.9l-.9-.9zm0-1.2v.3l.3-.3zm.9 1.2h.3v-.3z" />
-<path d="M-280.8 434.7h-.9l-.3.3.9.9.3-.3zm27.6 0h1.2v1.2h-1.2z" />
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<rect x="0" y="0" width="24" height="24" />
+</svg> \ No newline at end of file
diff --git a/resources/themes/cura-light/icons/low/CloudBlueBG.svg b/resources/themes/cura-light/icons/low/CloudBadge.svg
index a3c092992d..e37fb324d4 100644
--- a/resources/themes/cura-light/icons/low/CloudBlueBG.svg
+++ b/resources/themes/cura-light/icons/low/CloudBadge.svg
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
-<path fill="#196EF0" d="M6,0C2.7,0,0,2.7,0,6s2.7,6,6,6s6-2.7,6-6S9.3,0,6,0z M7,9H4C2.9,9,2,8.1,2,7s0.9-2,2-2c0.1,0,0.1,0,0.2,0
+<path d="M6,0C2.7,0,0,2.7,0,6s2.7,6,6,6s6-2.7,6-6S9.3,0,6,0z M7,9H4C2.9,9,2,8.1,2,7s0.9-2,2-2c0.1,0,0.1,0,0.2,0
C4.6,3.8,5.7,3,7,3c1.7,0,3,1.3,3,3S8.7,9,7,9z" />
</svg>
diff --git a/resources/themes/cura-light/icons/low/CloudGreyBG.svg b/resources/themes/cura-light/icons/low/CloudGreyBG.svg
deleted file mode 100644
index 0637dd7de9..0000000000
--- a/resources/themes/cura-light/icons/low/CloudGreyBG.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
-<path fill="#6C6C6C" d="M6,0C2.7,0,0,2.7,0,6s2.7,6,6,6s6-2.7,6-6S9.3,0,6,0z M7,9H4C2.9,9,2,8.1,2,7s0.9-2,2-2c0.1,0,0.1,0,0.2,0
- C4.6,3.8,5.7,3,7,3c1.7,0,3,1.3,3,3S8.7,9,7,9z" />
-</svg>
diff --git a/resources/themes/cura-light/icons/medium/ExtruderColor.svg b/resources/themes/cura-light/icons/medium/ExtruderColor.svg
new file mode 100644
index 0000000000..cd4452b246
--- /dev/null
+++ b/resources/themes/cura-light/icons/medium/ExtruderColor.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#231F20;}
+</style>
+<g id="Layer_1_1_">
+ <path class="st0" d="M15,26C8.9,26,4,21.1,4,15S8.9,4,15,4s11,4.9,11,11S21.1,26,15,26z M15,8c-3.8,0-7,3.2-7,7s3.2,7,7,7
+ s7-3.1,7-7S18.9,8,15,8z"/>
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/icons/medium/Folder.svg b/resources/themes/cura-light/icons/medium/Folder.svg
new file mode 100644
index 0000000000..8dc9b5ea9f
--- /dev/null
+++ b/resources/themes/cura-light/icons/medium/Folder.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
+<g id="Layer_1">
+ <path d="M24,9c0-1.65-1.35-3-3-3h-9l-1-1H6C4.34,5,3,6.34,3,8v14c0,1.66,1.34,3,3,3h18c1.66,0,3-1.34,3-3V12C27,10.34,25.66,9,24,9
+ z M25,23H5V7h5.17l4,4H25V23z"/>
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/icons/medium/Printer.svg b/resources/themes/cura-light/icons/medium/Printer.svg
new file mode 100644
index 0000000000..ef67996d48
--- /dev/null
+++ b/resources/themes/cura-light/icons/medium/Printer.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
+<g id="Layer_1">
+ <g>
+ <path d="M24,6v18h-2l-2-2H10l-2,2H6V6H24 M26,4H4v22h4.828l2-2h8.343l2,2H26V4L26,4z"/>
+ <rect x="10" y="18" width="10" height="2"/>
+ </g>
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/icons/medium/Sliders.svg b/resources/themes/cura-light/icons/medium/Sliders.svg
new file mode 100644
index 0000000000..91bd9ae0fd
--- /dev/null
+++ b/resources/themes/cura-light/icons/medium/Sliders.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 30 30" style="enable-background:new 0 0 30 30;" xml:space="preserve">
+<g id="Layer_1">
+ <g>
+ <path d="M18,5h-2c-1.1,0-2,0.9-2,2H3v2h11c0,1.1,0.9,2,2,2h2c1.1,0,2-0.9,2-2V7C20,5.9,19.1,5,18,5z M18,9h-2V7h2V9z"/>
+ <rect x="21" y="7" width="6" height="2"/>
+ <rect x="25" y="14" width="2" height="2"/>
+ <path d="M22,12h-2c-1.1,0-2,0.9-2,2H3v2h15c0,1.1,0.9,2,2,2h2c1.1,0,2-0.9,2-2v-2C24,12.9,23.1,12,22,12z M22,16h-2v-2h2V16z"/>
+ <path d="M12,19h-2c-1.1,0-2,0.9-2,2H3v2h5c0,1.1,0.9,2,2,2h2c1.1,0,2-0.9,2-2v-2C14,19.9,13.1,19,12,19z M12,23h-2v-2h2V23z"/>
+ <rect x="15" y="21" width="12" height="2"/>
+ </g>
+</g>
+<g id="Comments">
+</g>
+</svg>
diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml
index de15866f1a..1320b54f37 100755
--- a/resources/themes/cura-light/styles.qml
+++ b/resources/themes/cura-light/styles.qml
@@ -252,11 +252,11 @@ QtObject
anchors.centerIn: parent
opacity: control.enabled ? 1.0 : 0.2
source: control.iconSource
- width: UM.Theme.getSize("button_icon").width
- height: UM.Theme.getSize("button_icon").height
+ width: UM.Theme.getSize("medium_button_icon").width
+ height: UM.Theme.getSize("medium_button_icon").height
color: UM.Theme.getColor("icon")
- sourceSize: UM.Theme.getSize("button_icon")
+ sourceSize: UM.Theme.getSize("medium_button_icon")
}
}
}
diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json
index 5245d21455..93a40d645d 100644
--- a/resources/themes/cura-light/theme.json
+++ b/resources/themes/cura-light/theme.json
@@ -129,24 +129,44 @@
"family": "Noto Sans"
},
"small": {
- "size": 0.7,
+ "size": 0.9,
"weight": 40,
"family": "Noto Sans"
},
"small_ja_JP": {
- "size": 0.7,
+ "size": 0.9,
"weight": 50,
"family": "Noto Sans"
},
"small_zh_CN": {
- "size": 0.7,
+ "size": 0.9,
"weight": 50,
"family": "Noto Sans"
},
"small_zh_TW": {
- "size": 0.7,
+ "size": 0.9,
"weight": 50,
"family": "Noto Sans"
+ },
+ "small_emphasis": {
+ "size": 0.9,
+ "weight": 100,
+ "family": "Noto Sans"
+ },
+ "small_emphasis_ja_JP": {
+ "size": 0.9,
+ "weight": 100,
+ "family": "Noto Sans"
+ },
+ "small_emphasis_zh_CN": {
+ "size": 0.9,
+ "weight": 100,
+ "family": "Noto Sans"
+ },
+ "small_emphasis_zh_TW": {
+ "size": 0.9,
+ "weight": 100,
+ "family": "Noto Sans"
}
},
@@ -168,15 +188,15 @@
"icon": [8, 7, 63, 255],
- "primary_button": [38, 113, 231, 255],
+ "primary_button": [25, 110, 240, 255],
"primary_button_shadow": [27, 95, 202, 255],
- "primary_button_hover": [81, 145, 247, 255],
+ "primary_button_hover": [16, 70, 156, 255],
"primary_button_text": [255, 255, 255, 255],
- "secondary_button": [240, 240, 240, 255],
+ "secondary_button": [255, 255, 255, 0],
"secondary_button_shadow": [216, 216, 216, 255],
- "secondary_button_hover": [228, 228, 228, 255],
- "secondary_button_text": [30, 102, 215, 255],
+ "secondary_button_hover": [232, 240, 253, 255],
+ "secondary_button_text": [25, 110, 240, 255],
"main_window_header_background": [8, 7, 63, 255],
"main_window_header_background_gradient": [25, 23, 91, 255],
@@ -196,7 +216,7 @@
"machine_selector_text_active": [255, 255, 255, 255],
"machine_selector_printer_icon": [8, 7, 63, 255],
- "action_panel_secondary": [27, 95, 202, 255],
+ "action_panel_secondary": [25, 110, 240, 255],
"first_run_shadow": [50, 50, 50, 255],
@@ -210,7 +230,7 @@
"text": [25, 25, 25, 255],
"text_detail": [174, 174, 174, 128],
- "text_link": [50, 130, 255, 255],
+ "text_link": [25, 110, 240, 255],
"text_inactive": [174, 174, 174, 255],
"text_pressed": [50, 130, 255, 255],
"text_subtext": [0, 0, 0, 255],
@@ -250,6 +270,7 @@
"button_tooltip_text": [192, 193, 194, 255],
"extruder_button_material_border": [255, 255, 255, 255],
+ "extruder_disabled": [255, 255, 255, 102],
"rating_star": [90, 90, 90, 255],
@@ -266,8 +287,8 @@
"action_button_active_text": [0, 0, 0, 255],
"action_button_active_border": [50, 130, 255, 255],
"action_button_disabled": [245, 245, 245, 255],
- "action_button_disabled_text": [127, 127, 127, 255],
- "action_button_disabled_border": [245, 245, 245, 255],
+ "action_button_disabled_text": [196, 196, 196, 255],
+ "action_button_disabled_border": [196, 196, 196, 255],
"action_button_shadow": [223, 223, 223, 255],
"action_button_disabled_shadow": [228, 228, 228, 255],
@@ -329,7 +350,7 @@
"checkbox_hover": [255, 255, 255, 255],
"checkbox_border": [199, 199, 199, 255],
"checkbox_border_hover": [50, 130, 255, 255],
- "checkbox_mark": [50, 130, 255, 255],
+ "checkbox_mark": [35, 35, 35, 255],
"checkbox_disabled": [223, 223, 223, 255],
"checkbox_text": [35, 35, 35, 255],
@@ -416,7 +437,7 @@
"monitor_icon_accent": [255, 255, 255, 255],
"monitor_icon_disabled": [238, 238, 238, 255],
- "monitor_secondary_button_hover": [228, 228, 228, 255],
+ "monitor_secondary_button_hover": [232, 242, 252, 255],
"monitor_secondary_button": [240, 240, 240, 255],
"monitor_secondary_button_text": [30, 102, 215, 255],
"monitor_secondary_button_shadow": [216, 216, 216, 255],
@@ -445,7 +466,8 @@
"monitor_carousel_dot": [216, 216, 216, 255],
"monitor_carousel_dot_current": [119, 119, 119, 255],
- "cloud_unavailable": [153, 153, 153, 255]
+ "cloud_unavailable": [153, 153, 153, 255],
+ "connection_badge_background": [255, 255, 255, 255]
},
"sizes": {
@@ -482,9 +504,9 @@
"machine_selector_widget": [20.0, 4.0],
"machine_selector_widget_content": [25.0, 32.0],
- "machine_selector_icon": [2.66, 2.66],
+ "machine_selector_icon": [2.5, 2.5],
- "views_selector": [23.0, 4.0],
+ "views_selector": [16.0, 4.0],
"printer_type_label": [3.5, 1.5],
@@ -503,12 +525,12 @@
"thin_margin": [0.71, 0.71],
"narrow_margin": [0.5, 0.5],
- "extruder_icon": [2.33, 2.33],
+ "extruder_icon": [2.5, 2.5],
"section": [0.0, 2],
"section_control": [0, 1],
- "section_icon": [1.6, 1.6],
- "section_icon_column": [2.8, 0.0],
+ "section_icon": [2, 2],
+ "section_icon_column": [2.5, 2.5],
"rating_star": [1.0, 1.0],
"setting": [25.0, 1.8],
@@ -537,6 +559,9 @@
"small_button": [2, 2],
"small_button_icon": [1.5, 1.5],
+ "medium_button": [2.5, 2.5],
+ "medium_button_icon": [2, 2],
+
"favorites_row": [2, 2],
"favorites_button": [2, 2],
"favorites_button_icon": [1.2, 1.2],
@@ -589,7 +614,7 @@
"message": [30.0, 5.0],
"message_close": [1, 1],
"message_radius": [0.25, 0.25],
- "message_action_button": [0, 2.0],
+ "message_action_button": [0, 2.5],
"message_image": [15.0, 5.0],
"infill_button_margin": [0.5, 0.5],
diff --git a/resources/variants/strateo3d_high_temp_04.inst.cfg b/resources/variants/strateo3d_high_temp_04.inst.cfg
new file mode 100644
index 0000000000..bb51ab03cc
--- /dev/null
+++ b/resources/variants/strateo3d_high_temp_04.inst.cfg
@@ -0,0 +1,20 @@
+[general]
+name = High temp 0.4
+version = 4
+definition = strateo3d
+
+[metadata]
+setting_version = 17
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = HT0.4
+machine_nozzle_size = 0.4
+machine_nozzle_tip_outer_diameter = 1.0
+layer_height = 0.2
+layer_height_0 = 0.3
+prime_tower_enable = True
+retract_at_layer_change = False
+support_angle = 45
+support_use_towers = True