Merge branch 'master' into libArachne_rebased

This commit is contained in:
Remco Burema 2021-07-16 08:49:46 +02:00
commit 6c08bbfc9d
No known key found for this signature in database
GPG key ID: 215C49431D43F98C
122 changed files with 2907 additions and 524 deletions

View file

@ -215,7 +215,7 @@ class ExtrudersModel(ListModel):
"id": "", "id": "",
"name": catalog.i18nc("@menuitem", "Not overridden"), "name": catalog.i18nc("@menuitem", "Not overridden"),
"enabled": True, "enabled": True,
"color": "#ffffff", "color": "transparent",
"index": -1, "index": -1,
"definition": "", "definition": "",
"material": "", "material": "",

View file

@ -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. # Cura is released under the terms of the LGPLv3 or higher.
import collections import collections
@ -6,9 +6,11 @@ from typing import Optional, Dict, List, cast
from PyQt5.QtCore import QObject, pyqtSlot from PyQt5.QtCore import QObject, pyqtSlot
from UM.i18n import i18nCatalog
from UM.Resources import Resources from UM.Resources import Resources
from UM.Version import Version from UM.Version import Version
catalog = i18nCatalog("cura")
# #
# This manager provides means to load texts to QML. # This manager provides means to load texts to QML.
@ -30,10 +32,11 @@ class TextManager(QObject):
# Load change log texts and organize them with a dict # Load change log texts and organize them with a dict
try: try:
file_path = Resources.getPath(Resources.Texts, "change_log.txt") 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. # 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]]] change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]]
try:
with open(file_path, "r", encoding = "utf-8") as f: with open(file_path, "r", encoding = "utf-8") as f:
open_version = None # type: Optional[Version] 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 open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
@ -56,6 +59,8 @@ class TextManager(QObject):
if open_header not in change_logs_dict[cast(Version, open_version)]: 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] = []
change_logs_dict[cast(Version, open_version)][open_header].append(line) 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 # Format changelog text
content = "" content = ""

View file

@ -4,12 +4,12 @@
import argparse #To run the engine in debug mode if the front-end is in debug mode. import argparse #To run the engine in debug mode if the front-end is in debug mode.
from collections import defaultdict from collections import defaultdict
import os import os
from PyQt5.QtCore import QObject, QTimer, pyqtSlot from PyQt5.QtCore import QObject, QTimer, QUrl, pyqtSlot
import sys import sys
from time import time from time import time
from typing import Any, cast, Dict, List, Optional, Set, TYPE_CHECKING 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.Backend.Backend import Backend, BackendState
from UM.Scene.SceneNode import SceneNode from UM.Scene.SceneNode import SceneNode
@ -157,6 +157,18 @@ class CuraEngineBackend(QObject, Backend):
self.determineAutoSlicing() self.determineAutoSlicing()
application.getPreferences().preferenceChanged.connect(self._onPreferencesChanged) 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] self._snapshot = None #type: Optional[QImage]
application.initializationFinished.connect(self.initialize) 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]: 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") 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 # _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" # 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) self._start_slice_job.setIsCancelled(False)
# Check if there's any slicable object in the scene. # Check if there's any slicable object in the scene.
@ -922,9 +939,22 @@ class CuraEngineBackend(QObject, Backend):
if not self._restart: if not self._restart:
if self._process: # type: ignore 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 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: def _onGlobalStackChanged(self) -> None:
"""Called when the global container stack changes""" """Called when the global container stack changes"""

View file

@ -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>

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -1,10 +1,12 @@
// Copyright (C) 2021 Ultimaker B.V. // Copyright (C) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10 import QtQuick 2.10
import QtQuick.Window 2.2 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 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 2.3
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.1
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.6 as Cura import Cura 1.6 as Cura
@ -29,24 +31,35 @@ Item
margins: UM.Theme.getSize("default_margin").width margins: UM.Theme.getSize("default_margin").width
} }
Label RowLayout
{ {
id: selectProjectLabel id: headerRow
text: "Select Project" anchors
font: UM.Theme.getFont("medium") {
color: UM.Theme.getColor("small_button_text") top: parent.top
anchors.top: parent.top left: parent.left
anchors.left: parent.left right: parent.right
visible: projectListContainer.visible }
height: childrenRect.height
spacing: UM.Theme.getSize("default_margin").width
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"
} }
Cura.SecondaryButton Cura.SecondaryButton
{ {
id: createNewProjectButton id: createNewProjectButton
anchors.verticalCenter: selectProjectLabel.verticalCenter
anchors.right: parent.right
text: "New Library project" text: "New Library project"
onClicked: onClicked:
@ -55,6 +68,7 @@ Item
} }
busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
} }
}
Item Item
{ {
@ -76,19 +90,18 @@ Item
{ {
id: digitalFactoryImage id: digitalFactoryImage
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
source: "../images/digital_factory.svg" source: searchBar.text === "" ? "../images/digital_factory.svg" : "../images/projects_not_found.svg"
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
width: parent.width - 2 * UM.Theme.getSize("thick_margin").width width: parent.width - 2 * UM.Theme.getSize("thick_margin").width
sourceSize.width: width
sourceSize.height: height
} }
Label Label
{ {
id: noLibraryProjectsLabel id: noLibraryProjectsLabel
anchors.horizontalCenter: parent.horizontalCenter 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") font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
} }
Cura.TertiaryButton Cura.TertiaryButton
@ -97,6 +110,7 @@ Item
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
text: "Visit Digital Library" text: "Visit Digital Library"
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/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 id: projectListContainer
anchors anchors
{ {
top: selectProjectLabel.bottom top: headerRow.bottom
topMargin: UM.Theme.getSize("default_margin").height topMargin: UM.Theme.getSize("default_margin").height
bottom: parent.bottom bottom: parent.bottom
left: parent.left left: parent.left

View file

@ -22,6 +22,7 @@ from .DFFileUploader import DFFileUploader
from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest
from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse
from .DFPrintJobUploadRequest import DFPrintJobUploadRequest from .DFPrintJobUploadRequest import DFPrintJobUploadRequest
from .DigitalFactoryFeatureBudgetResponse import DigitalFactoryFeatureBudgetResponse
from .DigitalFactoryFileResponse import DigitalFactoryFileResponse from .DigitalFactoryFileResponse import DigitalFactoryFileResponse
from .DigitalFactoryProjectResponse import DigitalFactoryProjectResponse from .DigitalFactoryProjectResponse import DigitalFactoryProjectResponse
from .PaginationLinks import PaginationLinks 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] 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: 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. Retrieves a digital factory project by its library project id.
@ -73,7 +95,7 @@ class DigitalFactoryApiClient:
error_callback = failed, error_callback = failed,
timeout = self.DEFAULT_REQUEST_TIMEOUT) 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. 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 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). 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 on_finished: The function to be called after the result is parsed.
:param failed: The function to be called if the request fails. :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: if self._projects_pagination_mgr:
self._projects_pagination_mgr.reset() # reset to clear all the links and response metadata 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, self._http.get(url,
scope = self._scope, scope = self._scope,

View file

@ -1,4 +1,6 @@
# Copyright (c) 2021 Ultimaker B.V. # Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import json import json
import math import math
import os import os
@ -8,7 +10,7 @@ from enum import IntEnum
from pathlib import Path from pathlib import Path
from typing import Optional, List, Dict, Any, cast 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.QtNetwork import QNetworkReply
from PyQt5.QtQml import qmlRegisterType, qmlRegisterUncreatableType from PyQt5.QtQml import qmlRegisterType, qmlRegisterUncreatableType
@ -89,6 +91,9 @@ class DigitalFactoryController(QObject):
uploadFileError = Signal() uploadFileError = Signal()
uploadFileFinished = Signal() uploadFileFinished = Signal()
"""Signal to inform about the state of user access."""
userAccessStateChanged = pyqtSignal(bool)
def __init__(self, application: CuraApplication) -> None: def __init__(self, application: CuraApplication) -> None:
super().__init__(parent = None) super().__init__(parent = None)
@ -106,12 +111,18 @@ class DigitalFactoryController(QObject):
self._has_more_projects_to_load = False self._has_more_projects_to_load = False
self._account = self._application.getInstance().getCuraAPI().account # type: Account self._account = self._application.getInstance().getCuraAPI().account # type: Account
self._account.loginStateChanged.connect(self._onLoginStateChanged)
self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation() self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation()
# Initialize the project model # Initialize the project model
self._project_model = DigitalFactoryProjectModel() self._project_model = DigitalFactoryProjectModel()
self._selected_project_idx = -1 self._selected_project_idx = -1
self._project_creation_error_text = "Something went wrong while creating a new project. Please try again." 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 # Initialize the file model
self._file_model = DigitalFactoryFileModel() self._file_model = DigitalFactoryFileModel()
@ -131,6 +142,8 @@ class DigitalFactoryController(QObject):
self._application.engineCreatedSignal.connect(self._onEngineCreated) self._application.engineCreatedSignal.connect(self._onEngineCreated)
self._application.initializationFinished.connect(self._applicationInitializationFinished) self._application.initializationFinished.connect(self._applicationInitializationFinished)
self._user_has_access = False
def clear(self) -> None: def clear(self) -> None:
self._project_model.clearProjects() self._project_model.clearProjects()
self._api.clear() self._api.clear()
@ -143,16 +156,24 @@ class DigitalFactoryController(QObject):
self.setSelectedProjectIndex(-1) 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: def userAccountHasLibraryAccess(self) -> bool:
""" """
Checks whether the currently logged in user account has access to the Digital Library 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 :return: True if the user account has Digital Library access, else False
""" """
subscriptions = [] # type: List[Dict[str, Any]]
if self._account.userProfile: if self._account.userProfile:
subscriptions = self._account.userProfile.get("subscriptions", []) 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: def initialize(self, preselected_project_id: Optional[str] = None) -> None:
self.clear() self.clear()
@ -162,7 +183,7 @@ class DigitalFactoryController(QObject):
if preselected_project_id: if preselected_project_id:
self._api.getProject(preselected_project_id, on_finished = self.setProjectAsPreselected, failed = self._onGetProjectFailed) self._api.getProject(preselected_project_id, on_finished = self.setProjectAsPreselected, failed = self._onGetProjectFailed)
else: 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: def setProjectAsPreselected(self, df_project: DigitalFactoryProjectResponse) -> None:
""" """
@ -288,6 +309,38 @@ class DigitalFactoryController(QObject):
self._selected_file_indices = file_indices self._selected_file_indices = file_indices
self.selectedFileIndicesChanged.emit(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) @pyqtProperty(QObject, constant = True)
def digitalFactoryProjectModel(self) -> "DigitalFactoryProjectModel": def digitalFactoryProjectModel(self) -> "DigitalFactoryProjectModel":
return self._project_model return self._project_model
@ -502,7 +555,7 @@ class DigitalFactoryController(QObject):
# false, we also need to clean it from the projects model # false, we also need to clean it from the projects model
self._project_model.clearProjects() self._project_model.clearProjects()
self.setSelectedProjectIndex(-1) 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.setRetrievingProjectsStatus(RetrievalStatus.InProgress)
self._has_preselected_project = new_has_preselected_project self._has_preselected_project = new_has_preselected_project
self.preselectedProjectChanged.emit() self.preselectedProjectChanged.emit()

View file

@ -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

View file

@ -22,7 +22,7 @@ class DigitalFactoryFileProvider(FileProvider):
self._dialog = None self._dialog = None
self._account = CuraApplication.getInstance().getCuraAPI().account # type: Account 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.enabled = self._account.isLoggedIn and self._controller.userAccountHasLibraryAccess()
self.priority = 10 self.priority = 10
@ -53,7 +53,7 @@ class DigitalFactoryFileProvider(FileProvider):
if not self._dialog: if not self._dialog:
Logger.log("e", "Unable to create the Digital Library Open 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 Sets the enabled status of the DigitalFactoryFileProvider according to the account's login status
:param logged_in: The new login status :param logged_in: The new login status

View file

@ -45,7 +45,7 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
self._writing = False self._writing = False
self._account = CuraApplication.getInstance().getCuraAPI().account # type: Account 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.enabled = self._account.isLoggedIn and self._controller.userAccountHasLibraryAccess()
self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation() self._current_workspace_information = CuraApplication.getInstance().getCurrentWorkspaceInformation()
@ -97,7 +97,7 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
if not self._dialog: if not self._dialog:
Logger.log("e", "Unable to create the Digital Library Save 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 Sets the enabled status of the DigitalFactoryOutputDevice according to the account's login status
:param logged_in: The new login status :param logged_in: The new login status

View file

@ -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 from unittest.mock import MagicMock
import pytest import pytest
@ -37,7 +40,7 @@ def test_getProjectsFirstPage(api_client):
failed_callback = MagicMock() failed_callback = MagicMock()
# Call # 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 # Asserts
pagination_manager.reset.assert_called_once() # Should be called since we asked for new set of projects 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] args = http_manager.get.call_args_list[0]
# Ensure that it's called with the right limit # 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 # Change the limit & try again
http_manager.get.reset_mock() http_manager.get.reset_mock()
pagination_manager.limit = 80 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] args = http_manager.get.call_args_list[0]
# Ensure that it's called with the right limit # 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): def test_getMoreProjects_noNewProjects(api_client):

View file

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V. # Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from UM.Logger import Logger 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. new_instance.resetState() # Ensure that the state is not seen as a user state.
settings.addInstance(new_instance) 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 mesh_type == "infill_mesh":
if settings.getInstance(property_key) is None: if settings.getInstance(property_key) is None:
definition = stack.getSettingDefinition(property_key) definition = stack.getSettingDefinition(property_key)
new_instance = SettingInstance(definition, settings) new_instance = SettingInstance(definition, settings)
# We just want the wall_line count to be there in case it was overriden in the global stack. new_instance.setProperty("value", specialized_settings[property_key])
# as such, we don't need to set a value.
if property_key != "wall_line_count":
new_instance.setProperty("value", 0)
new_instance.resetState() # Ensure that the state is not seen as a user state. new_instance.resetState() # Ensure that the state is not seen as a user state.
settings.addInstance(new_instance) settings.addInstance(new_instance)
settings_visibility_changed = True 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.removeInstance(property_key)
settings_visibility_changed = True settings_visibility_changed = True

View file

@ -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. // 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.Layouts 1.1
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
@ -13,6 +13,8 @@ Item
{ {
id: prepareMenu id: prepareMenu
property var fileProviderModel: CuraApplication.getFileProviderModel()
UM.I18nCatalog UM.I18nCatalog
{ {
id: catalog id: catalog
@ -23,24 +25,22 @@ Item
{ {
left: parent.left left: parent.left
right: parent.right right: parent.right
leftMargin: UM.Theme.getSize("wide_margin").width leftMargin: UM.Theme.getSize("wide_margin").width * 2
rightMargin: UM.Theme.getSize("wide_margin").width rightMargin: UM.Theme.getSize("wide_margin").width * 2
} }
// Item to ensure that all of the buttons are nicely centered. // Item to ensure that all of the buttons are nicely centered.
Item Item
{ {
anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent
width: parent.width - 2 * UM.Theme.getSize("wide_margin").width
height: parent.height
RowLayout RowLayout
{ {
id: itemRow id: itemRow
anchors.left: openFileButton.right anchors.left: parent.left
anchors.right: parent.right 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) property int machineSelectorWidth: Math.round((width - printSetupSelectorItem.width) / 3)
height: parent.height height: parent.height
@ -52,9 +52,6 @@ Item
{ {
id: machineSelection id: machineSelection
headerCornerSide: Cura.RoundedRectangle.Direction.Left 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.preferredWidth: parent.machineSelectorWidth
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
@ -63,9 +60,6 @@ Item
Cura.ConfigurationMenu Cura.ConfigurationMenu
{ {
id: printerSetup id: printerSetup
enableHeaderShadow: false
headerBackgroundBorder.width: UM.Theme.getSize("default_lining").width
headerBackgroundBorder.color: UM.Theme.getColor("lining")
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredWidth: parent.machineSelectorWidth * 2 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 Button
{ {
id: openFileButton id: openFileButton
height: UM.Theme.getSize("stage_menu").height visible: prepareMenu.fileProviderModel.count <= 1
width: UM.Theme.getSize("stage_menu").height
height: parent.height
width: visible ? height : 0 //Square button (and don't take up space if invisible).
onClicked: Cura.Actions.open.trigger() onClicked: Cura.Actions.open.trigger()
enabled: visible && prepareMenu.fileProviderModel.count > 0
hoverEnabled: true hoverEnabled: true
contentItem: Item contentItem: Item
{ {
anchors.fill: parent
UM.RecolorImage UM.RecolorImage
{ {
id: buttonIcon id: buttonIcon
source: UM.Theme.getIcon("Folder", "medium")
anchors.centerIn: parent anchors.centerIn: parent
source: UM.Theme.getIcon("Folder")
width: UM.Theme.getSize("button_icon").width width: UM.Theme.getSize("button_icon").width
height: UM.Theme.getSize("button_icon").height height: UM.Theme.getSize("button_icon").height
color: UM.Theme.getColor("icon") color: UM.Theme.getColor("icon")
@ -109,8 +210,8 @@ Item
background: Rectangle background: Rectangle
{ {
id: background id: background
height: UM.Theme.getSize("stage_menu").height height: parent.height
width: UM.Theme.getSize("stage_menu").height width: parent.width
border.color: UM.Theme.getColor("lining") border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width border.width: UM.Theme.getSize("default_lining").width

View file

@ -24,54 +24,36 @@ Item
{ {
left: parent.left left: parent.left
right: parent.right right: parent.right
leftMargin: UM.Theme.getSize("wide_margin").width leftMargin: UM.Theme.getSize("wide_margin").width * 2
rightMargin: UM.Theme.getSize("wide_margin").width rightMargin: UM.Theme.getSize("wide_margin").width * 2
} }
Row Row
{ {
id: stageMenuRow id: stageMenuRow
anchors.horizontalCenter: parent.horizontalCenter anchors.fill: parent
width: parent.width - 2 * UM.Theme.getSize("wide_margin").width // This is a trick to make sure that the borders of the two adjacent buttons' borders overlap. Otherwise
height: parent.height // there will be double border (one from each button)
spacing: -UM.Theme.getSize("default_lining").width
Cura.ViewsSelector Cura.ViewsSelector
{ {
id: viewsSelector id: viewsSelector
height: parent.height 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 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. // This component will grow freely up to complete the width of the row.
Loader Loader
{ {
id: viewPanel id: viewPanel
height: parent.height 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 : "" 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 Item
{ {
id: printSetupSelectorItem id: printSetupSelectorItem

View file

@ -203,16 +203,16 @@ Cura.ExpandableComponent
style: UM.Theme.styles.checkbox style: UM.Theme.styles.checkbox
Rectangle
UM.RecolorImage
{ {
id: swatch id: swatch
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.right: extrudersModelCheckBox.right anchors.right: extrudersModelCheckBox.right
width: UM.Theme.getSize("layerview_legend_size").width width: UM.Theme.getSize("layerview_legend_size").width
height: UM.Theme.getSize("layerview_legend_size").height height: UM.Theme.getSize("layerview_legend_size").height
source: UM.Theme.getIcon("Extruder", "medium")
color: model.color color: model.color
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("lining")
} }
Label Label

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.3 import QtQuick 2.3
import QtQuick.Controls 1.4 import QtQuick.Controls 2.4
import QtQuick.Controls.Styles 1.3 import QtQuick.Controls.Styles 1.3
import UM 1.3 as UM import UM 1.3 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
Rectangle Button
{ {
id: base
property var enabled: true
property var iconSource: null property var iconSource: null
color: enabled ? UM.Theme.getColor("monitor_icon_primary") : UM.Theme.getColor("monitor_icon_disabled") width: UM.Theme.getSize("button").width * 0.75 //Matching the size of the content of tool buttons.
height: width height: UM.Theme.getSize("button").height * 0.75
radius: Math.round(0.5 * width)
width: 24 * screenScaleFactor hoverEnabled: true
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 UM.RecolorImage
{ {
@ -27,20 +30,13 @@ Rectangle
horizontalCenter: parent.horizontalCenter horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
color: UM.Theme.getColor("monitor_icon_accent") color: UM.Theme.getColor("primary")
height: width height: width
source: iconSource source: iconSource
width: Math.round(parent.width / 2) width: Math.round(parent.width / 2)
} }
MouseArea
{
id: clickArea
anchors.fill: parent
hoverEnabled: base.enabled
onClicked: onClicked:
{
if (base.enabled)
{ {
if (OutputDevice.activeCameraUrl != "") if (OutputDevice.activeCameraUrl != "")
{ {
@ -51,6 +47,4 @@ Rectangle
OutputDevice.setActiveCameraUrl(modelData.cameraUrl) OutputDevice.setActiveCameraUrl(modelData.cameraUrl)
} }
} }
}
}
} }

View file

@ -50,7 +50,7 @@ Item
id: buildplateIcon id: buildplateIcon
anchors.centerIn: parent anchors.centerIn: parent
color: UM.Theme.getColor("monitor_icon_primary") color: UM.Theme.getColor("monitor_icon_primary")
height: parent.height height: UM.Theme.getSize("medium_button_icon").width
source: "../svg/icons/Buildplate.svg" source: "../svg/icons/Buildplate.svg"
width: height width: height
visible: buildplate visible: buildplate

View file

@ -5,6 +5,8 @@ import QtQuick 2.2
import QtQuick.Controls 2.0 import QtQuick.Controls 2.0
import UM 1.3 as UM import UM 1.3 as UM
import Cura 1.6 as Cura
/** /**
* This component comprises a colored extruder icon, the material name, and the * This component comprises a colored extruder icon, the material name, and the
* print core name. It is used by the MonitorPrinterConfiguration component with * print core name. It is used by the MonitorPrinterConfiguration component with
@ -18,10 +20,10 @@ import UM 1.3 as UM
Item Item
{ {
// The material color // The material color
property alias color: extruderIcon.color property alias color: extruderIcon.materialColor
// The extruder position; NOTE: Decent human beings count from 0 // The extruder position
property alias position: extruderIcon.position property int position
// The material name // The material name
property alias material: materialLabel.text property alias material: materialLabel.text
@ -32,12 +34,13 @@ Item
// Height is 2 x 18px labels, plus 4px spacing between them // Height is 2 x 18px labels, plus 4px spacing between them
height: 40 * screenScaleFactor // TODO: Theme! height: 40 * screenScaleFactor // TODO: Theme!
width: childrenRect.width width: childrenRect.width
opacity: material != "" && material != "Empty" && position >= 0 ? 1 : 0.4
MonitorIconExtruder Cura.ExtruderIcon
{ {
id: extruderIcon id: extruderIcon
color: UM.Theme.getColor("monitor_skeleton_loading") materialColor: UM.Theme.getColor("monitor_skeleton_loading")
position: 0 anchors.verticalCenter: parent.verticalCenter
} }
Rectangle Rectangle
@ -46,16 +49,18 @@ Item
anchors anchors
{ {
left: extruderIcon.right 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") 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! width: Math.max(materialLabel.contentWidth, 60 * screenScaleFactor) // TODO: Theme!
radius: 2 * screenScaleFactor // TODO: Theme! radius: 2 * screenScaleFactor // TODO: Theme!
Label Label
{ {
id: materialLabel id: materialLabel
anchors.top: parent.top
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
elide: Text.ElideRight elide: Text.ElideRight
@ -63,29 +68,13 @@ Item
text: "" text: ""
visible: text !== "" visible: text !== ""
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering 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 Label
{ {
id: printCoreLabel id: printCoreLabel
anchors.top: materialLabel.bottom
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
elide: Text.ElideRight elide: Text.ElideRight
@ -93,9 +82,6 @@ Item
text: "" text: ""
visible: text !== "" visible: text !== ""
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering renderType: Text.NativeRendering
} }
} }

View file

@ -38,6 +38,7 @@ Item
Label Label
{ {
id: positionLabel id: positionLabel
anchors.centerIn: icon
font: UM.Theme.getFont("small") font: UM.Theme.getFont("small")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
height: Math.round(size / 2) height: Math.round(size / 2)
@ -45,8 +46,6 @@ Item
text: position + 1 text: position + 1
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
width: Math.round(size / 2) width: Math.round(size / 2)
x: Math.round(size * 0.25)
y: Math.round(size * 0.15625)
visible: position >= 0 visible: position >= 0
renderType: Text.NativeRendering renderType: Text.NativeRendering
} }

View file

@ -256,7 +256,16 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
""" """
self._uploaded_print_job = self._pre_upload_print_job self._uploaded_print_job = self._pre_upload_print_job
self._progress.hide() 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() self.writeFinished.emit()
def _onPrintUploadSpecificError(self, reply: "QNetworkReply", _: "QNetworkReply.NetworkError"): def _onPrintUploadSpecificError(self, reply: "QNetworkReply", _: "QNetworkReply.NetworkError"):

View file

@ -13,6 +13,5 @@ class PrintJobUploadSuccessMessage(Message):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__( super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."), text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."),
title = I18N_CATALOG.i18nc("@info:title", "Data Sent"), title = I18N_CATALOG.i18nc("@info:title", "Data Sent")
lifetime = 5
) )

View file

@ -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 }
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -73,6 +73,7 @@
"machine_steps_per_mm_x": { "default_value": 80 }, "machine_steps_per_mm_x": { "default_value": 80 },
"machine_steps_per_mm_y": { "default_value": 80 }, "machine_steps_per_mm_y": { "default_value": 80 },
"machine_steps_per_mm_z": { "default_value": 2560 }, "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}
} }
} }

View file

@ -4,7 +4,7 @@
"inherits": "fdmprinter", "inherits": "fdmprinter",
"metadata": { "metadata": {
"author": "William & Cataldo URSO", "author": "William & Cataldo URSO",
"manufacturer": "Shenzhen Geeetech Technology", "manufacturer": "Geeetech",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"visible": true, "visible": true,
"has_materials": true, "has_materials": true,

View file

@ -92,7 +92,6 @@
"speed_travel": {"value": 150}, "speed_travel": {"value": 150},
"speed_layer_0": {"value": 10}, "speed_layer_0": {"value": 10},
"speed_travel_layer_0": {"value": 50}, "speed_travel_layer_0": {"value": 50},
"machine_max_feedrate_z": {"value": 0},
"speed_slowdown_layers": {"value": 2}, "speed_slowdown_layers": {"value": 2},
"speed_equalize_flow_enabled": {"value": false }, "speed_equalize_flow_enabled": {"value": false },
"acceleration_enabled": {"value": false }, "acceleration_enabled": {"value": false },

View file

@ -80,6 +80,7 @@
"retraction_amount" : { "default_value": 4.5}, "retraction_amount" : { "default_value": 4.5},
"retraction_speed" : { "default_value": 40}, "retraction_speed" : { "default_value": 40},
"coasting_enable": { "default_value": true }, "coasting_enable": { "default_value": true },
"prime_tower_enable": { "default_value": false} "prime_tower_enable": { "default_value": false},
"speed_z_hop": {"default_value": 1.5}
} }
} }

View file

@ -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"
}
}
}

View file

@ -45,6 +45,7 @@
}, },
"machine_end_gcode": { "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" "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}
} }
} }

View file

@ -143,7 +143,8 @@
"adaptive_layer_height_variation_step": { "value": 0.04 }, "adaptive_layer_height_variation_step": { "value": 0.04 },
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" }, "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}
} }
} }

View file

@ -35,28 +35,43 @@
"gantry_height": { "value": "40" }, "gantry_height": { "value": "40" },
"machine_extruder_count": { "default_value": 2 }, "machine_extruder_count": { "default_value": 2 },
"machine_gcode_flavor": { "default_value": "Marlin" }, "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" }, "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_y": {"minimum_value": "0", "maximum_value": "machine_depth"},
"extruder_prime_pos_x": {"minimum_value": "0", "maximum_value": "machine_width"}, "extruder_prime_pos_x": {"minimum_value": "0", "maximum_value": "machine_width"},
"machine_heat_zone_length": { "default_value": 7 }, "machine_heat_zone_length": { "default_value": 7 },
"default_material_print_temperature": { "maximum_value_warning": "350" }, "default_material_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
"material_print_temperature": { "maximum_value_warning": "350" }, "material_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
"material_print_temperature_layer_0": { "maximum_value_warning": "350" }, "material_print_temperature_layer_0": { "maximum_value_warning": "400", "maximum_value": "415" },
"material_bed_temperature": { "maximum_value": "130" }, "material_initial_print_temperature": { "maximum_value_warning": "400", "maximum_value": "415" },
"material_bed_temperature_layer_0": { "maximum_value": "130" }, "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 }, "extruder_prime_pos_abs": { "default_value": true },
"machine_acceleration": { "default_value": 1500 }, "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_enabled": { "value": false },
"acceleration_print": { "value": "machine_acceleration" }, "acceleration_print": { "value": "machine_acceleration", "maximum_value_warning": "1500" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" }, "acceleration_infill": { "maximum_value_warning": "1500" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_print * 1000 / acceleration_print)" }, "acceleration_wall": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)", "maximum_value_warning": "1500" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" }, "acceleration_wall_0": { "value": "math.ceil(acceleration_print * 1000 / acceleration_print)", "maximum_value_warning": "1500" },
"acceleration_support": { "value": "acceleration_print" }, "acceleration_wall_x": { "maximum_value_warning": "1500" },
"acceleration_support_interface": { "value": "acceleration_topbottom" }, "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)", "maximum_value_warning": "1500" },
"acceleration_travel": { "value": "acceleration_print" }, "acceleration_support": { "value": "acceleration_print", "maximum_value_warning": "1500" },
"acceleration_layer_0": { "value": "acceleration_topbottom" }, "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": { "default_value": 0.1 },
"adaptive_layer_height_variation_step": { "default_value": 0.05 }, "adaptive_layer_height_variation_step": { "default_value": 0.05 },
"adhesion_type": { "default_value": "skirt" }, "adhesion_type": { "default_value": "skirt" },
@ -66,30 +81,39 @@
"infill_before_walls": { "default_value": false }, "infill_before_walls": { "default_value": false },
"infill_overlap": { "value": "0" }, "infill_overlap": { "value": "0" },
"infill_wipe_dist": { "value": "0" }, "infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "False" },
"jerk_layer_0": { "value": "jerk_topbottom" }, "jerk_enabled": { "value": "False", "maximum_value_warning": "0.01" },
"jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, "jerk_print": { "value": "0.01", "maximum_value_warning": "0.01" },
"jerk_print": { "value": "25" }, "jerk_infill": { "value": "0.01", "maximum_value_warning": "0.01" },
"jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, "jerk_layer_0": { "value": "jerk_topbottom", "maximum_value_warning": "0.01" },
"jerk_support_interface": { "value": "jerk_topbottom" }, "jerk_print_layer_0": { "maximum_value_warning": "0.01" },
"jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, "jerk_travel_layer_0": { "maximum_value_warning": "0.01" },
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, "jerk_skirt_brim": { "maximum_value_warning": "0.01" },
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, "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_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'))" }, "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_min_cool_heat_time_window": { "value": "15" },
"machine_nozzle_cool_down_speed": { "default_value": 0.50 }, "machine_nozzle_cool_down_speed": { "default_value": 0.50 },
"machine_nozzle_heat_up_speed": { "default_value": 2.25 }, "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": { "default_value": 93 },
"material_flow_layer_0": { "value": "math.ceil(material_flow*1)" }, "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_resolution": { "value": "0.5" },
"meshfix_maximum_deviation": { "default_value": 0.04 }, "meshfix_maximum_deviation": { "default_value": 0.04 },
"optimize_wall_printing_order": { "value": "True" }, "optimize_wall_printing_order": { "value": "True" },
"prime_blob_enable": { "enabled": false, "default_value": false }, "prime_blob_enable": { "enabled": false, "default_value": false },
"prime_tower_min_volume": { "default_value": 35 }, "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" }, "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_amount": { "default_value": 1.5 },
"retraction_combing": { "default_value": "all" }, "retraction_combing": { "default_value": "all" },

View file

@ -47,6 +47,7 @@
"machine_max_acceleration_y": { "default_value": 2650 }, "machine_max_acceleration_y": { "default_value": 2650 },
"acceleration_print": { "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_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}
} }
} }

View file

@ -1,5 +1,5 @@
{ {
"name": "Voron V0", "name": "Voron 0",
"version": 2, "version": 2,
"inherits": "voron2_base", "inherits": "voron2_base",
"metadata": "metadata":
@ -10,7 +10,7 @@
}, },
"overrides": "overrides":
{ {
"machine_name": { "default_value": "VORON V0" }, "machine_name": { "default_value": "VORON 0" },
"machine_width": { "default_value": 120 }, "machine_width": { "default_value": 120 },
"machine_depth": { "default_value": 120 }, "machine_depth": { "default_value": 120 },
"machine_height": { "default_value": 120 } "machine_height": { "default_value": 120 }

View file

@ -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 }
}
}

View file

@ -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 }
}
}

View file

@ -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 }
}
}

View file

@ -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 }
}
}

View file

@ -1177,7 +1177,7 @@ msgstr "Hinten links"
#: fdmprinter.def.json #: fdmprinter.def.json
msgctxt "z_seam_position option back" msgctxt "z_seam_position option back"
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Hinten"
#: fdmprinter.def.json #: fdmprinter.def.json
msgctxt "z_seam_position option backright" msgctxt "z_seam_position option backright"

Binary file not shown.

View file

@ -54,9 +54,10 @@ Item
id: accountWidget id: accountWidget
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: signInButton.horizontalCenter
implicitHeight: UM.Theme.getSize("main_window_header").height implicitHeight: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
implicitWidth: UM.Theme.getSize("main_window_header").height implicitWidth: Math.round(0.5 * UM.Theme.getSize("main_window_header").height)
hoverEnabled: true hoverEnabled: true
@ -68,8 +69,8 @@ Item
{ {
id: avatar id: avatar
width: Math.round(0.8 * accountWidget.width) width: accountWidget.width
height: Math.round(0.8 * accountWidget.height) height: accountWidget.height
anchors.verticalCenter: accountWidget.verticalCenter anchors.verticalCenter: accountWidget.verticalCenter
anchors.horizontalCenter: accountWidget.horizontalCenter anchors.horizontalCenter: accountWidget.horizontalCenter
@ -86,7 +87,7 @@ Item
{ {
id: initialCircle id: initialCircle
anchors.centerIn: parent anchors.centerIn: parent
width: Math.min(parent.width, parent.height) width: Math.min(accountWidget.width, accountWidget.height)
height: width height: width
radius: width radius: width
color: accountWidget.hovered ? UM.Theme.getColor("primary_text") : "transparent" color: accountWidget.hovered ? UM.Theme.getColor("primary_text") : "transparent"
@ -141,7 +142,7 @@ Item
borderColor: UM.Theme.getColor("lining") borderColor: UM.Theme.getColor("lining")
borderWidth: UM.Theme.getSize("default_lining").width 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 arrowSize: UM.Theme.getSize("default_arrow").width
} }

View file

@ -9,7 +9,7 @@ import Cura 1.1 as Cura
Column Column
{ {
spacing: UM.Theme.getSize("narrow_margin").height spacing: UM.Theme.getSize("default_margin").height
topPadding: UM.Theme.getSize("default_margin").height topPadding: UM.Theme.getSize("default_margin").height
bottomPadding: UM.Theme.getSize("default_margin").height bottomPadding: UM.Theme.getSize("default_margin").height
width: childrenRect.width width: childrenRect.width
@ -18,7 +18,7 @@ Column
{ {
id: accountInfo id: accountInfo
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: accountSyncDetailsColumn.height
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.leftMargin: UM.Theme.getSize("default_margin").width
AvatarImage AvatarImage
@ -56,6 +56,7 @@ Column
Column Column
{ {
id: accountSyncDetailsColumn
anchors.left: avatar.right anchors.left: avatar.right
anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.leftMargin: UM.Theme.getSize("default_margin").width
spacing: UM.Theme.getSize("narrow_margin").height spacing: UM.Theme.getSize("narrow_margin").height

View file

@ -1,4 +1,4 @@
// Copyright (c) 2020 Ultimaker B.V. // Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7 import QtQuick 2.7
@ -18,19 +18,16 @@ Button
property alias textFont: buttonText.font property alias textFont: buttonText.font
property alias cornerRadius: backgroundRect.radius property alias cornerRadius: backgroundRect.radius
property alias tooltip: tooltip.tooltipText property alias tooltip: tooltip.tooltipText
property alias cornerSide: backgroundRect.cornerSide
property color color: UM.Theme.getColor("primary") property color color: UM.Theme.getColor("primary")
property color hoverColor: UM.Theme.getColor("primary_hover") property color hoverColor: UM.Theme.getColor("primary_hover")
property color disabledColor: color property color disabledColor: color
property color textColor: UM.Theme.getColor("button_text") property color textColor: UM.Theme.getColor("button_text")
property color textHoverColor: textColor property color textHoverColor: textColor
property color textDisabledColor: textColor property color textDisabledColor: disabledColor
property color outlineColor: color property color outlineColor: color
property color outlineHoverColor: hoverColor property color outlineHoverColor: outlineColor
property color outlineDisabledColor: outlineColor property color outlineDisabledColor: disabledColor
property alias shadowColor: shadow.color
property alias shadowEnabled: shadow.visible
property alias busy: busyIndicator.visible property alias busy: busyIndicator.visible
property bool underlineTextOnHover: false property bool underlineTextOnHover: false
@ -46,6 +43,49 @@ Button
// but it can exceed a maximum, then this value have to be set. // but it can exceed a maximum, then this value have to be set.
property int maximumWidth: 0 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 leftPadding: UM.Theme.getSize("default_margin").width
rightPadding: UM.Theme.getSize("default_margin").width rightPadding: UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("action_button").height height: UM.Theme.getSize("action_button").height
@ -130,24 +170,13 @@ Button
background: Cura.RoundedRectangle background: Cura.RoundedRectangle
{ {
id: backgroundRect id: backgroundRect
cornerSide: Cura.RoundedRectangle.Direction.All
color: button.enabled ? (button.hovered ? button.hoverColor : button.color) : button.disabledColor 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.width: UM.Theme.getSize("default_lining").width
border.color: button.enabled ? (button.hovered ? button.outlineHoverColor : button.outlineColor) : button.outlineDisabledColor border.color: button.enabled ? (button.hovered ? button.outlineHoverColor : button.outlineColor) : button.outlineDisabledColor
}
DropShadow // 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.
{
id: shadow
// Don't blur the shadow
radius: 0 radius: 0
anchors.fill: backgroundRect cornerSide: Cura.RoundedRectangle.Direction.None
source: backgroundRect
verticalOffset: 2
visible: false
// Should always be drawn behind the background.
z: backgroundRect.z - 1
} }
Cura.ToolTip Cura.ToolTip

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7 import QtQuick 2.7
@ -23,7 +23,6 @@ Item
id: saveToButton id: saveToButton
height: parent.height height: parent.height
fixedWidthMode: true fixedWidthMode: true
cornerSide: deviceSelectionMenu.visible ? Cura.RoundedRectangle.Direction.Left : Cura.RoundedRectangle.Direction.All
anchors anchors
{ {
@ -43,15 +42,11 @@ Item
} }
} }
Cura.ActionButton Cura.PrimaryButton
{ {
id: deviceSelectionMenu id: deviceSelectionMenu
height: parent.height height: parent.height
shadowEnabled: true
shadowColor: UM.Theme.getColor("primary_shadow")
cornerSide: Cura.RoundedRectangle.Direction.Right
anchors anchors
{ {
top: parent.top top: parent.top
@ -61,7 +56,7 @@ Item
leftPadding: UM.Theme.getSize("narrow_margin").width //Need more space than usual here for wide text. leftPadding: UM.Theme.getSize("narrow_margin").width //Need more space than usual here for wide text.
rightPadding: UM.Theme.getSize("narrow_margin").width rightPadding: UM.Theme.getSize("narrow_margin").width
iconSource: popup.opened ? UM.Theme.getIcon("ChevronSingleUp") : UM.Theme.getIcon("ChevronSingleDown") 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) visible: (devicesModel.deviceCount > 1)
onClicked: popup.opened ? popup.close() : popup.open() onClicked: popup.opened ? popup.close() : popup.open()
@ -70,6 +65,7 @@ Item
{ {
id: popup id: popup
padding: 0 padding: 0
spacing: 0
y: -height y: -height
x: parent.width - width x: parent.width - width
@ -78,17 +74,16 @@ Item
contentItem: ColumnLayout contentItem: ColumnLayout
{ {
spacing: 0
Repeater Repeater
{ {
model: devicesModel model: devicesModel
delegate: Cura.ActionButton delegate: Cura.PrimaryButton
{ {
text: model.description text: model.description
visible: model.id != UM.OutputDeviceManager.activeDevice // Don't show the active device in the list 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 Layout.fillWidth: true
// The total width of the popup should be defined by the largest button. By stating that each // 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. // 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")
}
} }
} }

View file

@ -429,6 +429,14 @@ UM.MainWindow
height: UM.Theme.getSize("message_action_button").height height: UM.Theme.getSize("message_action_button").height
} }
} }
link: Component
{
Cura.TertiaryButton
{
text: model.name
height: UM.Theme.getSize("message_action_button").height
}
}
} }
} }

View file

@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
import QtGraphicalEffects 1.0 // For the dropshadow
// The expandable component has 2 major sub components: // 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 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. // * The contentItem; The content that needs to be shown if the component is expanded.
@ -58,6 +56,9 @@ Item
property alias headerBackgroundBorder: background.border 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. // What icon should be displayed on the right.
property alias iconSource: collapseButton.source 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. // 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 headerCornerSide: background.cornerSide
property alias headerShadowColor: shadow.color property int popupOffset: 2
property alias enableHeaderShadow: shadow.visible
property int shadowOffset: 2
// Prefix used for the dragged position preferences. Preferences not used if empty. Don't translate! // Prefix used for the dragged position preferences. Preferences not used if empty. Don't translate!
property string dragPreferencesNamePrefix: "" property string dragPreferencesNamePrefix: ""
@ -122,6 +119,9 @@ Item
id: background id: background
property real padding: UM.Theme.getSize("default_margin").width 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") color: base.enabled ? (base.expanded ? headerActiveColor : headerBackgroundColor) : UM.Theme.getColor("disabled")
anchors.fill: parent anchors.fill: parent
@ -167,7 +167,7 @@ Item
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
margins: background.padding margins: background.padding
} }
source: UM.Theme.getIcon("Pen") source: UM.Theme.getIcon("ChevronSingleDown")
visible: source != "" visible: source != ""
width: UM.Theme.getSize("standard_arrow").width width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.getSize("standard_arrow").height 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 Cura.RoundedRectangle
{ {
id: contentContainer id: contentContainer
@ -211,7 +197,7 @@ Item
height: childrenRect.height height: childrenRect.height
// Ensure that the content is located directly below the headerItem // 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. // 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. // 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, var maxPt = base.mapFromItem(null,
CuraApplication.appWidth() - (contentContainer.width + margin.width), CuraApplication.appWidth() - (contentContainer.width + margin.width),
CuraApplication.appHeight() - (contentContainer.height + margin.height)); 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.x = Math.max(minPt.x, Math.min(maxPt.x, posNewX));
contentContainer.y = Math.max(initialY, Math.min(maxPt.y, posNewY)); contentContainer.y = Math.max(initialY, Math.min(maxPt.y, posNewY));

View file

@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.2 as UM import UM 1.2 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
import QtGraphicalEffects 1.0 // For the dropshadow
// The expandable component has 2 major sub components: // 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 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. // * The contentItem; The content that needs to be shown if the component is expanded.
@ -52,6 +50,9 @@ Item
property alias headerBackgroundBorder: background.border 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. // What icon should be displayed on the right.
property alias iconSource: collapseButton.source property alias iconSource: collapseButton.source
@ -74,11 +75,7 @@ Item
// Change the contentItem close behaviour // Change the contentItem close behaviour
property alias contentClosePolicy : content.closePolicy property alias contentClosePolicy : content.closePolicy
property alias headerShadowColor: shadow.color property int popupOffset: 2
property alias enableHeaderShadow: shadow.visible
property int shadowOffset: 2
onEnabledChanged: onEnabledChanged:
{ {
@ -116,6 +113,9 @@ Item
id: background id: background
property real padding: UM.Theme.getSize("default_margin").width 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") color: base.enabled ? headerBackgroundColor : UM.Theme.getColor("disabled")
anchors.fill: parent anchors.fill: parent
@ -180,7 +180,7 @@ Item
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
margins: background.padding margins: background.padding
} }
source: expanded ? UM.Theme.getIcon("ChevronSingleDown") : UM.Theme.getIcon("ChevronSingleLeft") source: UM.Theme.getIcon("ChevronSingleDown")
visible: source != "" visible: source != ""
width: UM.Theme.getSize("standard_arrow").width width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.getSize("standard_arrow").height 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 Popup
{ {
id: content id: content
// Ensure that the content is located directly below the headerItem // 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. // 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. // In case of right alignment, the 3x padding is due to left, right and padding between the button & text.

View file

@ -22,6 +22,7 @@ Cura.ToolbarButton
{ {
materialColor: extruder.color materialColor: extruder.color
extruderEnabled: extruder.stack.isEnabled extruderEnabled: extruder.stack.isEnabled
iconVariant: "default"
property int index: extruder.index property int index: extruder.index
} }

View file

@ -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. // 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 QtQuick.Controls 1.1
import UM 1.2 as UM import UM 1.2 as UM
@ -16,30 +16,30 @@ Item
property color materialColor property color materialColor
property alias textColor: extruderNumberText.color property alias textColor: extruderNumberText.color
property bool extruderEnabled: true property bool extruderEnabled: true
property alias iconSize: mainIcon.sourceSize
property string iconVariant: "medium"
Item
{
opacity: extruderEnabled ? 1 : UM.Theme.getColor("extruder_disabled").a
anchors.fill: parent
UM.RecolorImage
{
anchors.fill: parent
sourceSize: mainIcon.sourceSize
source: UM.Theme.getIcon("ExtruderColor", iconVariant)
color: materialColor
}
UM.RecolorImage UM.RecolorImage
{ {
id: mainIcon id: mainIcon
anchors.fill: parent anchors.fill: parent
sourceSize: UM.Theme.getSize("extruder_icon")
source: UM.Theme.getIcon("Extruder", "medium") source: UM.Theme.getIcon("Extruder", iconVariant)
color: extruderEnabled ? materialColor: UM.Theme.getColor("disabled") color: extruderNumberText.color
}
Rectangle
{
id: extruderNumberCircle
width: height
height: Math.round(parent.height / 2)
radius: Math.round(width)
color: UM.Theme.getColor("toolbar_background")
anchors
{
horizontalCenter: parent.horizontalCenter
top: parent.top
topMargin: (parent.height - height) / 2
} }
Label Label
@ -47,25 +47,13 @@ Item
id: extruderNumberText id: extruderNumberText
anchors.centerIn: parent anchors.centerIn: parent
text: index + 1 text: index + 1
font: UM.Theme.getFont("small") font: UM.Theme.getFont("small_emphasis")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
width: contentWidth width: contentWidth
height: contentHeight height: contentHeight
visible: extruderEnabled
renderType: Text.NativeRendering renderType: Text.NativeRendering
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter 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")
}
} }
} }

View file

@ -62,7 +62,7 @@ Item
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
exclusiveGroup: mainWindowHeaderMenuGroup exclusiveGroup: mainWindowHeaderMenuGroup
style: UM.Theme.styles.main_window_header_tab 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 iconSource: model.stage.iconSource
property color overlayColor: "transparent" property color overlayColor: "transparent"

View file

@ -56,13 +56,13 @@ Cura.ExpandablePopup
id: extruderIcon id: extruderIcon
materialColor: model.color materialColor: model.color
extruderEnabled: model.enabled extruderEnabled: model.enabled
width: UM.Theme.getSize("button_icon").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
Item ColumnLayout
{ {
height: childrenRect.height opacity: model.enabled ? 1 : UM.Theme.getColor("extruder_disabled").a
spacing: 0
anchors anchors
{ {
left: extruderIcon.right left: extruderIcon.right
@ -81,13 +81,8 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
renderType: Text.NativeRendering renderType: Text.NativeRendering
width: parent.width
anchors
{
top: parent.top
left: parent.left
right: parent.right
}
visible: !truncated visible: !truncated
} }
@ -100,13 +95,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
renderType: Text.NativeRendering renderType: Text.NativeRendering
width: parent.width
anchors
{
top: parent.top
left: parent.left
right: parent.right
}
visible: !materialBrandColorTypeLabel.visible && !truncated visible: !materialBrandColorTypeLabel.visible && !truncated
} }
@ -120,13 +109,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
renderType: Text.NativeRendering renderType: Text.NativeRendering
width: parent.width
anchors
{
top: parent.top
left: parent.left
right: parent.right
}
visible: !materialBrandColorTypeLabel.visible && !materialColorTypeLabel.visible visible: !materialBrandColorTypeLabel.visible && !materialColorTypeLabel.visible
} }
// Label that shows the name of the variant // Label that shows the name of the variant
@ -141,13 +124,7 @@ Cura.ExpandablePopup
font: UM.Theme.getFont("default_bold") font: UM.Theme.getFont("default_bold")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
renderType: Text.NativeRendering renderType: Text.NativeRendering
width: parent.width
anchors
{
left: parent.left
top: materialBrandColorTypeLabel.bottom
right: parent.right
}
} }
} }
} }

View file

@ -302,15 +302,15 @@ Item
} }
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 height: instructionButton.visible ? materialSelection.height: 0
Button Button
{ {
id: instructionButton id: instructionButton
hoverEnabled: true hoverEnabled: true
contentItem: Item {} contentItem: Item {}
height: 0.5 * materialSelection.height height: UM.Theme.getSize("small_button").height
width: height width: UM.Theme.getSize("small_button").width
anchors.centerIn: parent anchors.centerIn: parent
background: UM.RecolorImage background: UM.RecolorImage
{ {

View file

@ -13,8 +13,6 @@ Button
width: parent.width width: parent.width
height: UM.Theme.getSize("action_button").height 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 checkable: true
hoverEnabled: true hoverEnabled: true
@ -46,14 +44,14 @@ Button
width: objectItemButton.width - objectItemButton.leftPadding width: objectItemButton.width - objectItemButton.leftPadding
height: UM.Theme.getSize("action_button").height height: UM.Theme.getSize("action_button").height
UM.RecolorImage Rectangle
{ {
id: swatch id: swatch
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
width: height width: UM.Theme.getSize("standard_arrow").height
height: parent.height - UM.Theme.getSize("narrow_margin").height height: UM.Theme.getSize("standard_arrow").height
source: UM.Theme.getIcon("Extruder", "medium") radius: Math.round(width / 2)
color: extruderColor color: extruderColor
visible: showExtruderSwatches && extruderColor != "" visible: showExtruderSwatches && extruderColor != ""
} }

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2 import QtQuick 2.2
@ -9,8 +9,6 @@ import Cura 1.1 as Cura
Cura.ActionButton 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") color: UM.Theme.getColor("primary_button")
textColor: UM.Theme.getColor("primary_button_text") textColor: UM.Theme.getColor("primary_button_text")
outlineColor: "transparent" outlineColor: "transparent"

View file

@ -226,9 +226,12 @@ Item
{ {
Cura.ExtruderIcon Cura.ExtruderIcon
{ {
anchors.horizontalCenter: parent.horizontalCenter anchors.centerIn: parent
materialColor: model.color materialColor: model.color
extruderEnabled: model.enabled extruderEnabled: model.enabled
iconVariant: "default"
height: parent.height
width: height
} }
} }
onClicked: onClicked:

View file

@ -17,9 +17,6 @@ Cura.ExpandableComponent
contentPadding: UM.Theme.getSize("default_lining").width contentPadding: UM.Theme.getSize("default_lining").width
contentHeaderTitle: catalog.i18nc("@label", "Print settings") contentHeaderTitle: catalog.i18nc("@label", "Print settings")
enableHeaderShadow: false
headerBackgroundBorder.width: UM.Theme.getSize("default_lining").width
headerBackgroundBorder.color: UM.Theme.getColor("lining")
enabled: !preSlicedData enabled: !preSlicedData
disabledText: catalog.i18nc("@label shown when we load a Gcode file", "Print setup disabled. G-code file can not be modified.") disabledText: catalog.i18nc("@label shown when we load a Gcode file", "Print setup disabled. G-code file can not be modified.")

View file

@ -15,7 +15,8 @@ RowLayout
Cura.IconWithText Cura.IconWithText
{ {
source: UM.Theme.getIcon("PrintQuality") source: UM.Theme.getIcon("Sliders", "medium")
iconSize: UM.Theme.getSize("button_icon").width
text: text:
{ {
if (Cura.MachineManager.activeStack) if (Cura.MachineManager.activeStack)
@ -53,6 +54,7 @@ RowLayout
source: UM.Theme.getIcon("Infill1") source: UM.Theme.getIcon("Infill1")
text: Cura.MachineManager.activeStack ? parseInt(infillDensity.properties.value) + "%" : "0%" text: Cura.MachineManager.activeStack ? parseInt(infillDensity.properties.value) + "%" : "0%"
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider UM.SettingPropertyProvider
{ {
@ -68,6 +70,7 @@ RowLayout
source: UM.Theme.getIcon("Support") source: UM.Theme.getIcon("Support")
text: supportEnabled.properties.value == "True" ? enabledText : disabledText text: supportEnabled.properties.value == "True" ? enabledText : disabledText
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider UM.SettingPropertyProvider
{ {
@ -83,6 +86,7 @@ RowLayout
source: UM.Theme.getIcon("Adhesion") source: UM.Theme.getIcon("Adhesion")
text: platformAdhesionType.properties.value != "skirt" && platformAdhesionType.properties.value != "none" ? enabledText : disabledText text: platformAdhesionType.properties.value != "skirt" && platformAdhesionType.properties.value != "none" ? enabledText : disabledText
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
iconSize: UM.Theme.getSize("medium_button_icon").width
UM.SettingPropertyProvider UM.SettingPropertyProvider
{ {

View file

@ -29,6 +29,7 @@ Item
text: catalog.i18nc("@label", "Adhesion") text: catalog.i18nc("@label", "Adhesion")
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
width: labelColumnWidth width: labelColumnWidth
iconSize: UM.Theme.getSize("medium_button_icon").width
} }
Item Item

View file

@ -43,7 +43,7 @@ Item
{ {
return UM.Theme.getIcon("Infill2") 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") + " (%)" text: catalog.i18nc("@label", "Infill") + " (%)"
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
width: labelColumnWidth width: labelColumnWidth
iconSize: UM.Theme.getSize("medium_button_icon").width
} }
Item Item
@ -119,6 +120,8 @@ Item
implicitWidth: UM.Theme.getSize("print_setup_slider_handle").width implicitWidth: UM.Theme.getSize("print_setup_slider_handle").width
implicitHeight: implicitWidth implicitHeight: implicitWidth
radius: Math.round(implicitWidth / 2) radius: Math.round(implicitWidth / 2)
border.color: UM.Theme.getColor("slider_groove_fill")
border.width: UM.Theme.getSize("default_lining").height
} }
tickmarks: Repeater tickmarks: Repeater

View file

@ -52,6 +52,7 @@ Item
text: catalog.i18nc("@label", "Profiles") text: catalog.i18nc("@label", "Profiles")
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
width: labelColumnWidth width: labelColumnWidth
iconSize: UM.Theme.getSize("medium_button_icon").width
} }
UM.SimpleButton UM.SimpleButton
{ {
@ -91,6 +92,7 @@ Item
{ {
left: profileLabel.right left: profileLabel.right
right: parent.right right: parent.right
verticalCenter: profileLabel.verticalCenter
} }
model: Cura.QualityProfilesDropDownMenuModel model: Cura.QualityProfilesDropDownMenuModel

View file

@ -30,6 +30,7 @@ Item
text: catalog.i18nc("@label", "Support") text: catalog.i18nc("@label", "Support")
font: UM.Theme.getFont("medium") font: UM.Theme.getFont("medium")
width: labelColumnWidth width: labelColumnWidth
iconSize: UM.Theme.getSize("medium_button_icon").width
} }
Item Item
@ -218,18 +219,16 @@ Item
elide: Text.ElideLeft elide: Text.ElideLeft
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width anchors.rightMargin: UM.Theme.getSize("thin_margin").width
sourceSize.width: width
sourceSize.height: height
source: UM.Theme.getIcon("Extruder", "medium")
color: supportExtruderCombobox.color color: supportExtruderCombobox.color
} }
} }
@ -288,18 +287,16 @@ Item
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width 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 color: supportExtruderCombobox.model.getItem(index).color
} }
} }

View file

@ -93,11 +93,11 @@ Cura.ExpandablePopup
{ {
if (isGroup) if (isGroup)
{ {
return UM.Theme.getIcon("PrinterTriple") return UM.Theme.getIcon("PrinterTriple", "medium")
} }
else if (isNetworkPrinter || isCloudRegistered) else if (isNetworkPrinter || isCloudRegistered)
{ {
return UM.Theme.getIcon("Printer") return UM.Theme.getIcon("Printer", "medium")
} }
else else
{ {
@ -114,8 +114,9 @@ Cura.ExpandablePopup
anchors anchors
{ {
bottom: parent.bottom bottom: parent.bottom
bottomMargin: - height * 1 / 6
left: parent.left left: parent.left
leftMargin: UM.Theme.getSize("thick_margin").width leftMargin: iconSize - width * 5 / 6
} }
source: source:
@ -124,13 +125,9 @@ Cura.ExpandablePopup
{ {
return UM.Theme.getIcon("CheckBlueBG", "low") 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") return UM.Theme.getIcon("CloudBadge", "low")
}
else if (connectionStatus == "printer_cloud_not_available")
{
return UM.Theme.getIcon("CloudGreyBG", "low")
} }
else else
{ {
@ -150,11 +147,10 @@ Cura.ExpandablePopup
{ {
id: iconBackground id: iconBackground
anchors.centerIn: parent anchors.centerIn: parent
// Make it a bit bigger so there is an outline 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.
width: parent.width + 2 * UM.Theme.getSize("default_lining").width height: parent.height - 1.5
height: parent.height + 2 * UM.Theme.getSize("default_lining").height radius: width / 2
radius: Math.round(width / 2) color: UM.Theme.getColor("connection_badge_background")
color: UM.Theme.getColor("main_background")
z: parent.z - 1 z: parent.z - 1
} }

View file

@ -146,6 +146,7 @@ Item
} }
radius: Math.round(width / 2) radius: Math.round(width / 2)
color: activeColor color: activeColor
border.color: defaultItemColor
visible: checkbox.checked visible: checkbox.checked
} }
} }

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2 import QtQuick 2.2
@ -9,11 +9,9 @@ import Cura 1.1 as Cura
Cura.ActionButton 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") color: UM.Theme.getColor("secondary_button")
textColor: UM.Theme.getColor("secondary_button_text") textColor: UM.Theme.getColor("secondary_button_text")
outlineColor: "transparent" outlineColor: UM.Theme.getColor("secondary_button_text")
disabledColor: UM.Theme.getColor("action_button_disabled") disabledColor: UM.Theme.getColor("action_button_disabled")
textDisabledColor: UM.Theme.getColor("action_button_disabled_text") textDisabledColor: UM.Theme.getColor("action_button_disabled_text")
hoverColor: UM.Theme.getColor("secondary_button_hover") hoverColor: UM.Theme.getColor("secondary_button_hover")

View file

@ -16,10 +16,13 @@ Button
anchors.rightMargin: 2 * UM.Theme.getSize("thin_margin").width anchors.rightMargin: 2 * UM.Theme.getSize("thin_margin").width
hoverEnabled: true hoverEnabled: true
height: UM.Theme.getSize("section_icon_column").height
background: Rectangle background: Rectangle
{ {
id: backgroundRectangle id: backgroundRectangle
height: UM.Theme.getSize("section").height height: UM.Theme.getSize("section").height
anchors.verticalCenter: parent.verticalCenter
color: color:
{ {
if (!base.enabled) if (!base.enabled)
@ -107,8 +110,8 @@ Button
source: UM.Theme.getIcon(definition.icon) source: UM.Theme.getIcon(definition.icon)
width: UM.Theme.getSize("section_icon").width width: UM.Theme.getSize("section_icon").width
height: UM.Theme.getSize("section_icon").height height: UM.Theme.getSize("section_icon").height
sourceSize.width: width + 15 * screenScaleFactor sourceSize.width: width
sourceSize.height: width + 15 * screenScaleFactor sourceSize.height: width
} }
onClicked: onClicked:
@ -141,8 +144,8 @@ Button
id: settingsButton id: settingsButton
visible: base.hovered || settingsButton.hovered visible: base.hovered || settingsButton.hovered
height: Math.round(base.height * 0.6) height: UM.Theme.getSize("small_button_icon").height
width: Math.round(base.height * 0.6) width: height
anchors anchors
{ {
@ -184,7 +187,7 @@ Button
return false return false
} }
height: Math.round(parent.height / 2) height: UM.Theme.getSize("small_button_icon").height
width: height width: height
onClicked: onClicked:

View file

@ -77,7 +77,7 @@ SettingItem
currentIndex: propertyProvider.properties.value !== undefined ? propertyProvider.properties.value : 0 currentIndex: propertyProvider.properties.value !== undefined ? propertyProvider.properties.value : 0
property string color: "#fff" property string color: "transparent"
Binding Binding
{ {
@ -85,7 +85,7 @@ SettingItem
// explicit binding here otherwise we do not handle value changes after the model changes. // explicit binding here otherwise we do not handle value changes after the model changes.
target: control target: control
property: "color" property: "color"
value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "" value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "transparent"
} }
Binding Binding
@ -160,18 +160,16 @@ SettingItem
elide: Text.ElideLeft elide: Text.ElideLeft
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width anchors.rightMargin: UM.Theme.getSize("thin_margin").width
sourceSize.width: width
sourceSize.height: height
source: UM.Theme.getIcon("Extruder", "medium")
color: control.color color: control.color
} }
} }
@ -229,18 +227,16 @@ SettingItem
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width 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 color: control.model.getItem(index).color
} }
} }

View file

@ -156,7 +156,7 @@ Item
{ {
id: settingControls 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) spacing: Math.round(UM.Theme.getSize("thick_margin").height / 2)
anchors anchors
@ -174,6 +174,7 @@ Item
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: UM.Theme.getSize("small_button_icon").height
width: height width: height
color: UM.Theme.getColor("setting_control_button") color: UM.Theme.getColor("setting_control_button")
@ -203,6 +204,7 @@ Item
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: UM.Theme.getSize("small_button_icon").height
width: height width: height
color: UM.Theme.getColor("setting_control_button") color: UM.Theme.getColor("setting_control_button")
@ -286,6 +288,7 @@ Item
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
height: UM.Theme.getSize("small_button_icon").height
width: height width: height
onClicked: onClicked:

View file

@ -88,7 +88,7 @@ SettingItem
when: control.model.items.length > 0 when: control.model.items.length > 0
} }
property string color: "#fff" property string color: "transparent"
Binding Binding
{ {
@ -96,7 +96,7 @@ SettingItem
// explicit binding here otherwise we do not handle value changes after the model changes. // explicit binding here otherwise we do not handle value changes after the model changes.
target: control target: control
property: "color" property: "color"
value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "" value: control.currentText != "" ? control.model.getItem(control.currentIndex).color : "transparent"
} }
indicator: UM.RecolorImage indicator: UM.RecolorImage
@ -161,18 +161,16 @@ SettingItem
elide: Text.ElideRight elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width anchors.rightMargin: UM.Theme.getSize("thin_margin").width
sourceSize.width: width
sourceSize.height: height
source: UM.Theme.getIcon("Extruder", "medium")
color: control.color color: control.color
} }
} }
@ -226,18 +224,16 @@ SettingItem
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width
background: UM.RecolorImage background: Rectangle
{ {
id: swatch id: swatch
height: Math.round(parent.height / 2) height: Math.round(parent.height / 2)
width: height width: height
radius: Math.round(width / 2)
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: UM.Theme.getSize("thin_margin").width 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 color: control.model.getItem(index).color
} }
} }

View file

@ -65,7 +65,13 @@ Item
anchors.right: clearFilterButton.left anchors.right: clearFilterButton.left
anchors.rightMargin: Math.round(UM.Theme.getSize("thick_margin").width) 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 style: TextFieldStyle
{ {
@ -188,8 +194,8 @@ Item
{ {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
width: UM.Theme.getSize("standard_arrow").width width: UM.Theme.getSize("medium_button_icon").width
height: UM.Theme.getSize("standard_arrow").height height: UM.Theme.getSize("medium_button_icon").height
sourceSize.width: width sourceSize.width: width
sourceSize.height: height sourceSize.height: height
color: control.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text") color: control.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")

View file

@ -1,4 +1,4 @@
// Copyright (c) 2020 Ultimaker B.V. // Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2 import QtQuick 2.2
@ -9,8 +9,6 @@ import Cura 1.1 as Cura
Cura.ActionButton Cura.ActionButton
{ {
shadowEnabled: true
shadowColor: enabled ? UM.Theme.getColor("secondary_button_shadow"): UM.Theme.getColor("action_button_disabled_shadow")
color: "transparent" color: "transparent"
textColor: UM.Theme.getColor("text_link") textColor: UM.Theme.getColor("text_link")
outlineColor: "transparent" outlineColor: "transparent"

View file

@ -68,7 +68,8 @@ Item
source: UM.Theme.getIcon(model.icon) != "" ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon source: UM.Theme.getIcon(model.icon) != "" ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon
color: UM.Theme.getColor("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: onCheckedChanged:

View file

@ -11,5 +11,4 @@ UM.SimpleButton
height: UM.Theme.getSize("small_button").height height: UM.Theme.getSize("small_button").height
hoverColor: UM.Theme.getColor("small_button_text_hover") hoverColor: UM.Theme.getColor("small_button_text_hover")
color: UM.Theme.getColor("small_button_text") color: UM.Theme.getColor("small_button_text")
iconMargin: UM.Theme.getSize("thick_lining").width
} }

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10 import QtQuick 2.10
@ -214,16 +214,16 @@ Item
id: troubleshootingButton id: troubleshootingButton
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("thin_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
height: troubleshootingLinkIcon.height 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 UM.RecolorImage
{ {
id: troubleshootingLinkIcon id: troubleshootingLinkIcon
anchors.right: troubleshootingLabel.left anchors.right: troubleshootingLabel.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("thin_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
height: troubleshootingLabel.height height: troubleshootingLabel.height
width: height width: height

View file

@ -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. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10 import QtQuick 2.10
@ -15,6 +15,8 @@ TextField
{ {
id: textField id: textField
property alias leftIcon: iconLeft.source
UM.I18nCatalog { id: catalog; name: "cura" } UM.I18nCatalog { id: catalog; name: "cura" }
hoverEnabled: true hoverEnabled: true
@ -22,6 +24,7 @@ TextField
font: UM.Theme.getFont("default") font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
renderType: Text.NativeRendering renderType: Text.NativeRendering
leftPadding: iconLeft.visible ? iconLeft.width + UM.Theme.getSize("default_margin").width * 2 : UM.Theme.getSize("thin_margin").width
states: [ states: [
State State
@ -52,7 +55,6 @@ TextField
color: UM.Theme.getColor("main_background") color: UM.Theme.getColor("main_background")
anchors.margins: Math.round(UM.Theme.getSize("default_lining").width)
radius: UM.Theme.getSize("setting_control_radius").width radius: UM.Theme.getSize("setting_control_radius").width
border.color: border.color:
@ -67,5 +69,23 @@ TextField
} }
return UM.Theme.getColor("setting_control_border") 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
}
} }
} }

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

Some files were not shown because too many files have changed in this diff Show more