Resolve merge conflicts with master

This commit is contained in:
Lipu Fei 2019-11-06 12:01:49 +01:00
commit 7c36b6a8ba
67 changed files with 1716 additions and 171 deletions

View File

@ -9,7 +9,11 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura"
DEFAULT_CURA_VERSION = "master"
DEFAULT_CURA_BUILD_TYPE = ""
DEFAULT_CURA_DEBUG_MODE = False
DEFAULT_CURA_SDK_VERSION = "7.0.0"
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "7.0.0"
try:
from cura.CuraVersion import CuraAppName # type: ignore
@ -32,6 +36,9 @@ try:
except ImportError:
CuraVersion = DEFAULT_CURA_VERSION # [CodeStyle: Reflecting imported value]
# CURA-6569
# This string indicates what type of version it is. For example, "enterprise". By default it's empty which indicates
# a default/normal Cura build.
try:
from cura.CuraVersion import CuraBuildType # type: ignore
except ImportError:
@ -42,12 +49,7 @@ try:
except ImportError:
CuraDebugMode = DEFAULT_CURA_DEBUG_MODE
try:
from cura.CuraVersion import CuraIsSecuredVersion # type: ignore
except ImportError:
CuraIsSecuredVersion = (CuraBuildType.lower() in ["essentials", "enterprise", "assured", "secure", "secured"])
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "7.0.0"
# CURA-6569
# Various convenience flags indicating what kind of Cura build it is.
__ENTERPRISE_VERSION_TYPE = "enterprise"
IsEnterpriseVersion = CuraBuildType.lower() == __ENTERPRISE_VERSION_TYPE

View File

@ -720,7 +720,7 @@ class CuraApplication(QtApplication):
## Handle loading of all plugin types (and the backend explicitly)
# \sa PluginRegistry
def _loadPlugins(self) -> None:
self._plugin_registry.setCheckIfTrusted(ApplicationMetadata.CuraIsSecuredVersion)
self._plugin_registry.setCheckIfTrusted(ApplicationMetadata.IsEnterpriseVersion)
self._plugin_registry.addType("profile_reader", self._addProfileReader)
self._plugin_registry.addType("profile_writer", self._addProfileWriter)

View File

@ -2,8 +2,8 @@
#Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import Qt, QTimer
import collections
from typing import TYPE_CHECKING, Optional, Dict
from cura.Machines.Models.IntentTranslations import intent_translations
from cura.Machines.Models.IntentModel import IntentModel
from cura.Settings.IntentManager import IntentManager
@ -29,26 +29,6 @@ class IntentCategoryModel(ListModel):
modelUpdated = pyqtSignal()
# Translations to user-visible string. Ordered by weight.
# TODO: Create a solution for this name and weight to be used dynamically.
_translations = collections.OrderedDict() # type: "collections.OrderedDict[str,Dict[str,Optional[str]]]"
_translations["default"] = {
"name": catalog.i18nc("@label", "Default")
}
_translations["visual"] = {
"name": catalog.i18nc("@label", "Visual"),
"description": catalog.i18nc("@text", "Optimized for appearance")
}
_translations["engineering"] = {
"name": catalog.i18nc("@label", "Engineering"),
"description": catalog.i18nc("@text", "Optimized for higher accuracy")
}
_translations["quick"] = {
"name": catalog.i18nc("@label", "Draft"),
"description": catalog.i18nc("@text", "Optimized for fast results")
}
## Creates a new model for a certain intent category.
# \param The category to list the intent profiles for.
def __init__(self, intent_category: str) -> None:
@ -99,15 +79,15 @@ class IntentCategoryModel(ListModel):
"name": IntentCategoryModel.translation(category, "name", catalog.i18nc("@label", "Unknown")),
"description": IntentCategoryModel.translation(category, "description", None),
"intent_category": category,
"weight": list(self._translations.keys()).index(category),
"weight": list(intent_translations).index(category),
"qualities": qualities
})
result.sort(key = lambda k: k["weight"])
self.setItems(result)
## Get a display value for a category. See IntenCategoryModel._translations
## Get a display value for a category.
## for categories and keys
@staticmethod
def translation(category: str, key: str, default: Optional[str] = None):
display_strings = IntentCategoryModel._translations.get(category, {})
display_strings = intent_translations.get(category, {})
return display_strings.get(key, default)

View File

@ -0,0 +1,20 @@
import collections
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
intent_translations = collections.OrderedDict() # type: "collections.OrderedDict[str, Dict[str, Optional[str]]]"
intent_translations["default"] = {
"name": catalog.i18nc("@label", "Default")
}
intent_translations["visual"] = {
"name": catalog.i18nc("@label", "Visual"),
"description": catalog.i18nc("@text", "The visual profile is designed to print visual prototypes and models with the intent of high visual and surface quality.")
}
intent_translations["engineering"] = {
"name": catalog.i18nc("@label", "Engineering"),
"description": catalog.i18nc("@text", "The engineering profile is designed to print functional prototypes and end-use parts with the intent of better accuracy and for closer tolerances.")
}
intent_translations["quick"] = {
"name": catalog.i18nc("@label", "Draft"),
"description": catalog.i18nc("@text", "The draft profile is designed to print initial prototypes and concept validation with the intent of significant print time reduction.")
}

View File

@ -14,6 +14,7 @@ from cura.Machines.ContainerTree import ContainerTree
from cura.Settings.cura_empty_instance_containers import empty_quality_changes_container
from cura.Settings.IntentManager import IntentManager
from cura.Machines.Models.MachineModelUtils import fetchLayerHeight
from cura.Machines.Models.IntentTranslations import intent_translations
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
@ -336,10 +337,11 @@ class QualityManagementModel(ListModel):
"quality_type": quality_type,
"quality_changes_group": None,
"intent_category": intent_category,
"section_name": catalog.i18nc("@label", intent_category.capitalize()),
"section_name": catalog.i18nc("@label", intent_translations.get(intent_category, {}).get("name", catalog.i18nc("@label", "Unknown"))),
})
# Sort by quality_type for each intent category
result = sorted(result, key = lambda x: (x["intent_category"], x["quality_type"]))
result = sorted(result, key = lambda x: (list(intent_translations).index(x["intent_category"]), x["quality_type"]))
item_list += result
# Create quality_changes group items

View File

@ -85,10 +85,20 @@ class VariantNode(ContainerNode):
for base_material, material_node in self.materials.items():
if self.machine.preferred_material == base_material and approximate_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
return material_node
# First fallback: Choose any material with matching diameter.
# First fallback: Check if we should be checking for the 175 variant.
if approximate_diameter == 2:
preferred_material = self.machine.preferred_material + "_175"
for base_material, material_node in self.materials.items():
if preferred_material == base_material and approximate_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
return material_node
# Second fallback: Choose any material with matching diameter.
for material_node in self.materials.values():
if material_node.getMetaDataEntry("approximate_diameter") and approximate_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
Logger.log("w", "Could not find preferred material %s, falling back to whatever works", self.machine.preferred_material)
return material_node
fallback = next(iter(self.materials.values())) # Should only happen with empty material node.
Logger.log("w", "Could not find preferred material {preferred_material} with diameter {diameter} for variant {variant_id}, falling back to {fallback}.".format(
preferred_material = self.machine.preferred_material,

View File

@ -56,11 +56,11 @@ class CuraSplashScreen(QSplashScreen):
if buildtype:
version[0] += " (%s)" % buildtype
# draw version text
# Draw version text
font = QFont() # Using system-default font here
font.setPixelSize(37)
painter.setFont(font)
painter.drawText(215, 66, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0])
painter.drawText(60, 66, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0])
if len(version) > 1:
font.setPixelSize(16)
painter.setFont(font)
@ -68,14 +68,14 @@ class CuraSplashScreen(QSplashScreen):
painter.drawText(247, 105, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1])
painter.setPen(QColor(255, 255, 255, 255))
# draw the loading image
# Draw the loading image
pen = QPen()
pen.setWidth(6 * self._scale)
pen.setColor(QColor(32, 166, 219, 255))
painter.setPen(pen)
painter.drawArc(60, 150, 32 * self._scale, 32 * self._scale, self._loading_image_rotation_angle * 16, 300 * 16)
# draw message text
# Draw message text
if self._current_message:
font = QFont() # Using system-default font here
font.setPixelSize(13)

View File

@ -87,9 +87,25 @@ Cura.MachineAction
}
}
}
Label
{
id: machineNameLabel
anchors.top: parent.top
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
text: Cura.MachineManager.activeMachine.name
horizontalAlignment: Text.AlignHCenter
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
renderType: Text.NativeRendering
}
UM.TabRow
{
id: tabBar
anchors.top: machineNameLabel.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width
Repeater
{

View File

@ -48,9 +48,13 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
drives = {}
bitmask = ctypes.windll.kernel32.GetLogicalDrives()
# Check possible drive letters, from A to Z
# Check possible drive letters, from C to Z
# Note: using ascii_uppercase because we do not want this to change with locale!
for letter in string.ascii_uppercase:
# Skip A and B, since those drives are typically reserved for floppy disks.
# Those drives can theoretically be reassigned but it's safer to not check them for removable drives.
# Windows will also behave weirdly even with some of its internal functions if you do this (e.g. search indexing doesn't search it).
# Users that have removable drives in A or B will just have to save to file and select the drive there.
for letter in string.ascii_uppercase[2:]:
drive = "{0}:/".format(letter)
# Do we really want to skip A and B?

View File

@ -155,25 +155,13 @@ Item
}
onPositionChanged: parent.onHandleDragged()
onPressed: sliderRoot.setActiveHandle(rangeHandle)
onPressed:
{
sliderRoot.setActiveHandle(rangeHandle)
sliderRoot.forceActiveFocus()
}
}
SimulationSliderLabel
{
id: rangleHandleLabel
height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height
x: parent.x - width - UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
target: Qt.point(sliderRoot.width, y + height / 2)
visible: sliderRoot.activeHandle == parent
// custom properties
maximumValue: sliderRoot.maximumValue
value: sliderRoot.upperValue
busy: UM.SimulationView.busy
setValue: rangeHandle.setValueManually // connect callback functions
}
}
onHeightChanged : {
@ -275,11 +263,12 @@ Item
{
id: upperHandleLabel
height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height
x: parent.x - parent.width - width
anchors.verticalCenter: parent.verticalCenter
target: Qt.point(sliderRoot.width, y + height / 2)
visible: sliderRoot.activeHandle == parent
height: sliderRoot.handleSize + UM.Theme.getSize("small_margin").height
anchors.bottom: parent.top
anchors.bottomMargin: UM.Theme.getSize("narrow_margin").height
anchors.horizontalCenter: parent.horizontalCenter
target: Qt.point(parent.width / 2, parent.top)
visible: sliderRoot.activeHandle == parent || sliderRoot.activeHandle == rangeHandle
// custom properties
maximumValue: sliderRoot.maximumValue
@ -384,11 +373,12 @@ Item
{
id: lowerHandleLabel
height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height
x: parent.x - parent.width - width
anchors.verticalCenter: parent.verticalCenter
target: Qt.point(sliderRoot.width + width, y + height / 2)
visible: sliderRoot.activeHandle == parent
height: sliderRoot.handleSize + UM.Theme.getSize("small_margin").height
anchors.top: parent.bottom
anchors.topMargin: UM.Theme.getSize("narrow_margin").height
anchors.horizontalCenter: parent.horizontalCenter
target: Qt.point(parent.width / 2, parent.bottom)
visible: sliderRoot.activeHandle == parent || sliderRoot.activeHandle == rangeHandle
// custom properties
maximumValue: sliderRoot.maximumValue
@ -397,4 +387,4 @@ Item
setValue: lowerHandle.setValueManually // connect callback functions
}
}
}
}

View File

@ -20,9 +20,9 @@ UM.PointingRectangle {
property int startFrom: 1
target: Qt.point(parent.width, y + height / 2)
arrowSize: UM.Theme.getSize("default_arrow").width
arrowSize: UM.Theme.getSize("button_tooltip_arrow").height
height: parent.height
width: valueLabel.width + UM.Theme.getSize("default_margin").width
width: valueLabel.width
visible: false
color: UM.Theme.getColor("tool_panel_background")
@ -48,9 +48,9 @@ UM.PointingRectangle {
horizontalCenter: parent.horizontalCenter
}
width: ((maximumValue + 1).toString().length + 1) * 10 * screenScaleFactor
width: ((maximumValue + 1).toString().length + 1) * 8 * screenScaleFactor
text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array
horizontalAlignment: TextInput.AlignRight
horizontalAlignment: TextInput.AlignHCenter
// key bindings, work when label is currenctly focused (active handle in LayerSlider)
Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
@ -58,7 +58,7 @@ UM.PointingRectangle {
style: TextFieldStyle {
textColor: UM.Theme.getColor("setting_control_text")
font: UM.Theme.getFont("default")
font: UM.Theme.getFont("small")
background: Item { }
}

View File

@ -29,14 +29,14 @@ Item
PathSlider
{
id: pathSlider
readonly property real preferredWidth: UM.Theme.getSize("slider_layerview_size").height // not a typo, should be as long as layerview slider
readonly property real margin: UM.Theme.getSize("default_margin").width
readonly property real pathSliderSafeWidth: pathSliderSafeXMax - pathSliderSafeXMin
height: UM.Theme.getSize("slider_handle").width
width: preferredWidth + margin * 2 < pathSliderSafeWidth ? preferredWidth : pathSliderSafeWidth - margin * 2
anchors.bottom: parent.bottom
anchors.bottomMargin: margin
@ -194,9 +194,8 @@ Item
LayerSlider
{
property var preferredHeight: UM.Theme.getSize("slider_layerview_size").height
property double heightMargin: UM.Theme.getSize("default_margin").height
property double heightMargin: UM.Theme.getSize("default_margin").height * 3 // extra margin to accomodate layer number tooltips
property double layerSliderSafeHeight: layerSliderSafeYMax - layerSliderSafeYMin
//todo incorporate margins in safeHeight?
id: layerSlider

View File

@ -1,11 +1,17 @@
// Copyright (c) 2018 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
// Main window for the Toolbox
import QtQuick 2.2
import QtQuick.Dialogs 1.1
import QtQuick.Window 2.2
import UM 1.1 as UM
import "./pages"
import "./dialogs"
import "./components"
Window
{
id: base
@ -29,9 +35,16 @@ Window
Item
{
anchors.fill: parent
WelcomePage
{
visible: toolbox.viewPage === "welcome"
}
ToolboxHeader
{
id: header
visible: toolbox.viewPage !== "welcome"
}
Item

View File

@ -67,7 +67,7 @@ Item
width: UM.Theme.getSize("toolbox_thumbnail_small").width - UM.Theme.getSize("wide_margin").width
height: UM.Theme.getSize("toolbox_thumbnail_small").height - UM.Theme.getSize("wide_margin").width
fillMode: Image.PreserveAspectFit
source: model.icon_url || "../images/logobot.svg"
source: model.icon_url || "../../images/logobot.svg"
mipmap: true
}
UM.RecolorImage
@ -82,7 +82,7 @@ Item
sourceSize.height: height
visible: installedPackages != 0
color: (installedPackages >= packageCount) ? UM.Theme.getColor("primary") : UM.Theme.getColor("border")
source: "../images/installed_check.svg"
source: "../../images/installed_check.svg"
}
}
Item

View File

@ -23,7 +23,7 @@ Rectangle
height: UM.Theme.getSize("toolbox_thumbnail_large").height - 4 * UM.Theme.getSize("default_margin").height
width: UM.Theme.getSize("toolbox_thumbnail_large").height - 4 * UM.Theme.getSize("default_margin").height
fillMode: Image.PreserveAspectFit
source: model.icon_url || "../images/logobot.svg"
source: model.icon_url || "../../images/logobot.svg"
mipmap: true
anchors
{
@ -62,7 +62,7 @@ Rectangle
}
visible: installedPackages != 0
color: (installedPackages >= packageCount) ? UM.Theme.getColor("primary") : UM.Theme.getColor("border")
source: "../images/installed_check.svg"
source: "../../images/installed_check.svg"
}
SmallRatingWidget

View File

@ -14,7 +14,7 @@ import Cura 1.0 as Cura
UM.Dialog
{
// This dialog asks the user whether he/she wants to open a project file as a project or import models.
// This dialog asks the user to confirm he/she wants to uninstall materials/pprofiles which are currently in use
id: base
title: catalog.i18nc("@title:window", "Confirm uninstall") + toolbox.pluginToUninstall

View File

@ -6,6 +6,8 @@ import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import UM 1.1 as UM
import "../components"
Item
{
id: page
@ -31,7 +33,7 @@ Item
width: UM.Theme.getSize("toolbox_thumbnail_medium").width
height: UM.Theme.getSize("toolbox_thumbnail_medium").height
fillMode: Image.PreserveAspectFit
source: details.icon_url || "../images/logobot.svg"
source: details.icon_url || "../../images/logobot.svg"
mipmap: true
anchors
{

View File

@ -8,6 +8,8 @@ import UM 1.1 as UM
import Cura 1.1 as Cura
import "../components"
Item
{
id: page
@ -44,7 +46,7 @@ Item
{
anchors.fill: parent
fillMode: Image.PreserveAspectFit
source: details === null ? "" : (details.icon_url || "../images/logobot.svg")
source: details === null ? "" : (details.icon_url || "../../images/logobot.svg")
mipmap: true
}
}

View File

@ -5,6 +5,8 @@ import QtQuick 2.10
import QtQuick.Controls 2.3
import UM 1.1 as UM
import "../components"
ScrollView
{
clip: true

View File

@ -6,6 +6,8 @@ import QtQuick.Controls 2.3
import UM 1.1 as UM
import "../components"
ScrollView
{
id: page

View File

@ -0,0 +1,53 @@
// Copyright (c) 2018 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7
import QtQuick.Controls 2.1
import QtQuick.Window 2.2
import UM 1.3 as UM
import Cura 1.1 as Cura
Column
{
id: welcomePage
spacing: UM.Theme.getSize("wide_margin").height
width: parent.width
height: childrenRect.height
anchors.centerIn: parent
Image
{
id: profileImage
fillMode: Image.PreserveAspectFit
source: "../../images/logobot.svg"
anchors.horizontalCenter: parent.horizontalCenter
width: Math.round(parent.width / 4)
}
Label
{
id: welcomeTextLabel
text: catalog.i18nc("@description", "Get plugins and materials verified by Ultimaker")
width: Math.round(parent.width / 2)
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
wrapMode: Label.WordWrap
renderType: Text.NativeRendering
}
Cura.PrimaryButton
{
id: loginButton
width: UM.Theme.getSize("account_button").width
height: UM.Theme.getSize("account_button").height
anchors.horizontalCenter: parent.horizontalCenter
text: catalog.i18nc("@button", "Sign in")
onClicked: Cura.API.account.login()
fixedWidthMode: true
}
}

View File

@ -86,7 +86,7 @@ class Toolbox(QObject, Extension):
# View page defines which type of page layout to use. For example,
# possible values include "overview", "detail" or "author".
self._view_page = "loading" # type: str
self._view_page = "welcome" # type: str
# Active package refers to which package is currently being downloaded,
# installed, or otherwise modified.
@ -105,7 +105,6 @@ class Toolbox(QObject, Extension):
self._restart_dialog_message = "" # type: str
self._application.initializationFinished.connect(self._onAppInitialized)
self._application.getCuraAPI().account.loginStateChanged.connect(self._updateRequestHeader)
self._application.getCuraAPI().account.accessTokenChanged.connect(self._updateRequestHeader)
# Signals:
@ -126,6 +125,16 @@ class Toolbox(QObject, Extension):
showLicenseDialog = pyqtSignal()
uninstallVariablesChanged = pyqtSignal()
## Go back to the start state (welcome screen or loading if no login required)
def _restart(self):
self._updateRequestHeader()
# For an Essentials build, login is mandatory
if not self._application.getCuraAPI().account.isLoggedIn and ApplicationMetadata.IsEnterpriseVersion:
self.setViewPage("welcome")
else:
self.setViewPage("loading")
self._fetchPackageData()
def _updateRequestHeader(self):
self._request_headers = [
(b"User-Agent",
@ -191,8 +200,11 @@ class Toolbox(QObject, Extension):
"packages": QUrl("{base_url}/packages".format(base_url = self._api_url))
}
# Request the latest and greatest!
self._fetchPackageData()
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
if CuraApplication.getInstance().getPreferences().getValue("info/automatic_update_check"):
# Request the latest and greatest!
self._fetchPackageData()
def _fetchPackageData(self):
# Create the network manager:
@ -212,9 +224,9 @@ class Toolbox(QObject, Extension):
# Gather installed packages:
self._updateInstalledModels()
# Displays the toolbox
@pyqtSlot()
def browsePackages(self) -> None:
self._fetchPackageData()
def launch(self) -> None:
if not self._dialog:
self._dialog = self._createDialog("Toolbox.qml")
@ -223,6 +235,8 @@ class Toolbox(QObject, Extension):
Logger.log("e", "Unexpected error trying to create the 'Marketplace' dialog.")
return
self._restart()
self._dialog.show()
# Apply enabled/disabled state to installed plugins
@ -328,7 +342,7 @@ class Toolbox(QObject, Extension):
self._package_used_qualities = package_used_qualities
# Ask change to default material / profile
if self._confirm_reset_dialog is None:
self._confirm_reset_dialog = self._createDialog("ToolboxConfirmUninstallResetDialog.qml")
self._confirm_reset_dialog = self._createDialog("dialogs/ToolboxConfirmUninstallResetDialog.qml")
self.uninstallVariablesChanged.emit()
if self._confirm_reset_dialog is None:
Logger.log("e", "ToolboxConfirmUninstallResetDialog should have been initialized, but it is not. Not showing dialog and not uninstalling package.")

View File

@ -15,7 +15,6 @@ from cura.Settings.GlobalStack import GlobalStack
from .CloudApiClient import CloudApiClient
from .CloudOutputDevice import CloudOutputDevice
from ..Models.Http.CloudClusterResponse import CloudClusterResponse
from ..Messages.CloudPrinterDetectedMessage import CloudPrinterDetectedMessage
## The cloud output device manager is responsible for using the Ultimaker Cloud APIs to manage remote clusters.
@ -111,7 +110,6 @@ class CloudOutputDeviceManager:
)
self._remote_clusters[device.getId()] = device
self.discoveredDevicesChanged.emit()
self._checkIfNewClusterWasAdded(device.clusterData.cluster_id)
self._connectToActiveMachine()
def _onDiscoveredDeviceUpdated(self, cluster_data: CloudClusterResponse) -> None:
@ -183,11 +181,4 @@ class CloudOutputDeviceManager:
output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
if device.key not in output_device_manager.getOutputDeviceIds():
output_device_manager.addOutputDevice(device)
## Checks if Cura has a machine stack (printer) for the given cluster ID and shows a message if it hasn't.
def _checkIfNewClusterWasAdded(self, cluster_id: str) -> None:
container_registry = CuraApplication.getInstance().getContainerRegistry()
cloud_machines = container_registry.findContainersMetadata(**{self.META_CLUSTER_ID: "*"}) # all cloud machines
if not any(machine[self.META_CLUSTER_ID] == cluster_id for machine in cloud_machines):
CloudPrinterDetectedMessage().show()
output_device_manager.addOutputDevice(device)

View File

@ -1,45 +0,0 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM import i18nCatalog
from UM.Message import Message
from cura.CuraApplication import CuraApplication
I18N_CATALOG = i18nCatalog("cura")
## Message shown when a new printer was added to your account but not yet in Cura.
class CloudPrinterDetectedMessage(Message):
# Singleton used to prevent duplicate messages of this type at the same time.
__is_visible = False
# Store in preferences to hide this message in the future.
_preference_key = "cloud/block_new_printers_popup"
def __init__(self) -> None:
super().__init__(
title=I18N_CATALOG.i18nc("@info:title", "New cloud printers found"),
text=I18N_CATALOG.i18nc("@info:message", "New printers have been found connected to your account, "
"you can find them in your list of discovered printers."),
lifetime=0,
dismissable=True,
option_state=False,
option_text=I18N_CATALOG.i18nc("@info:option_text", "Do not show this message again")
)
self.optionToggled.connect(self._onDontAskMeAgain)
CuraApplication.getInstance().getPreferences().addPreference(self._preference_key, False)
def show(self) -> None:
if CuraApplication.getInstance().getPreferences().getValue(self._preference_key):
return
if CloudPrinterDetectedMessage.__is_visible:
return
super().show()
CloudPrinterDetectedMessage.__is_visible = True
def hide(self, send_signal = True) -> None:
super().hide(send_signal)
CloudPrinterDetectedMessage.__is_visible = False
def _onDontAskMeAgain(self, checked: bool) -> None:
CuraApplication.getInstance().getPreferences().setValue(self._preference_key, checked)

View File

@ -325,7 +325,9 @@ class VersionUpgrade41to42(VersionUpgrade):
material_id = parser["containers"]["3"]
old_quality_id = parser["containers"]["2"]
if material_id in _creality_quality_per_material and old_quality_id in _creality_quality_per_material[material_id]:
parser["containers"]["2"] = _creality_quality_per_material[material_id][old_quality_id]
if definition_id == "creality_cr10_extruder_0": # We can't disambiguate between Creality CR-10 and Creality-CR10S since they share the same extruder definition. Have to go by the name.
if "cr-10s" in parser["metadata"].get("machine", "Creality CR-10").lower(): # Not perfect, since the user can change this name :(
parser["containers"]["2"] = _creality_quality_per_material[material_id][old_quality_id]
stack_copy = {} # type: Dict[str, str] # Make a copy so that we don't modify the dict we're iterating over.
stack_copy.update(parser["containers"])

View File

@ -7375,6 +7375,7 @@
"description": "Retract the filament when the nozzle is moving over a non-printed area.",
"type": "bool",
"default_value": true,
"value": "retraction_enable",
"enabled": "clean_between_layers",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -7387,6 +7388,7 @@
"unit": "mm",
"type": "float",
"default_value": 1,
"value": "retraction_amount",
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10.0",
"enabled": "wipe_retraction_enable and clean_between_layers",
@ -7401,6 +7403,7 @@
"unit": "mm³",
"type": "float",
"default_value": 0,
"value": "retraction_extra_prime_amount",
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10.0",
"enabled": "wipe_retraction_enable and clean_between_layers",
@ -7414,6 +7417,7 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"value": "retraction_speed",
"minimum_value": "0",
"minimum_value_warning": "1",
"maximum_value": "machine_max_feedrate_e",
@ -7435,13 +7439,13 @@
"minimum_value_warning": "1",
"maximum_value_warning": "70",
"enabled": "wipe_retraction_enable and clean_between_layers",
"value": "retraction_speed",
"value": "wipe_retraction_speed",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"wipe_retraction_prime_speed":
{
"label": "Retraction Prime Speed",
"label": "Wipe Retraction Prime Speed",
"description": "The speed at which the filament is primed during a wipe retraction move.",
"unit": "mm/s",
"type": "float",
@ -7451,7 +7455,7 @@
"minimum_value_warning": "1",
"maximum_value_warning": "70",
"enabled": "wipe_retraction_enable and clean_between_layers",
"value": "retraction_speed",
"value": "wipe_retraction_speed",
"settable_per_mesh": false,
"settable_per_extruder": true
}
@ -7472,10 +7476,11 @@
},
"wipe_hop_enable":
{
"label": "Wipe Z Hop When Retracted",
"description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
"label": "Wipe Z Hop",
"description": "When wiping, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
"type": "bool",
"default_value": true,
"value": "retraction_hop_enabled",
"enabled": "clean_between_layers",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -7488,6 +7493,7 @@
"unit": "mm",
"type": "float",
"default_value": 1,
"value": "retraction_hop",
"enabled": "wipe_hop_enable and clean_between_layers",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -7499,7 +7505,8 @@
"description": "Speed to move the z-axis during the hop.",
"unit": "mm/s",
"type": "float",
"default_value": 100,
"default_value": 10,
"value": "speed_z_hop",
"minimum_value": "0",
"minimum_value_warning": "1",
"enabled": "wipe_hop_enable and clean_between_layers",
@ -7552,18 +7559,21 @@
"type": "float",
"minimum_value": "0",
"default_value": 0,
"settable_per_mesh": true
},
"small_feature_max_length":
{
"label": "Small Feature Max Length",
"description": "Feature outlines that are shorter than this length will be printed using Small Feature Speed.",
"unit": "mm",
"type": "float",
"minimum_value": "0",
"default_value": 0,
"value": "small_hole_max_size * math.pi",
"settable_per_mesh": true
"settable_per_mesh": true,
"children":
{
"small_feature_max_length":
{
"label": "Small Feature Max Length",
"description": "Feature outlines that are shorter than this length will be printed using Small Feature Speed.",
"unit": "mm",
"type": "float",
"minimum_value": "0",
"default_value": 0,
"value": "small_hole_max_size * math.pi",
"settable_per_mesh": true
}
}
},
"small_feature_speed_factor":
{

View File

@ -0,0 +1,117 @@
{
"version": 2,
"name": "Leapfrog Bolt Pro",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Karan and Vincent 20191104",
"manufacturer": "Leapfrog B.V.",
"category": "Other",
"platform": "leapfrog_bolt_pro_platform.stl",
"platform_offset": [0, 0, -14],
"file_formats": "text/x-gcode",
"supports_usb_connection": false,
"supports_network_connection": false,
"has_materials": true,
"has_machine_quality": true,
"has_variants": true,
"preferred_variant_name": "Brass 0.4",
"preferred_material": "leapfrog_epla_natural",
"variants_name": "Hot end",
"exclude_materials": [
"generic_pla_175",
"generic_abs_175",
"generic_cpe_175",
"generic_hips_175",
"generic_nylon_175",
"generic_pc_175",
"generic_petg_175",
"generic_pva_175",
"generic_tpu_175",
"chromatik_pla",
"dsm_arnitel2045_175",
"dsm_novamid1070_175",
"emotiontech_abs",
"emotiontech_petg",
"emotiontech_pla",
"emotiontech_pva-m",
"emotiontech_pva-oks",
"emotiontech_pva-s",
"emotiontech_tpu98a",
"fabtotum_abs",
"fabtotum_nylon",
"fabtotum_pla",
"fabtotum_tpu",
"fiberlogy_hd_pla",
"filo3d_pla",
"filo3d_pla_green",
"filo3d_pla_red",
"imade3d_petg_175",
"imade3d_pla_175",
"innofill_innoflex60_175",
"octofiber_pla",
"polyflex_pla",
"polymax_pla",
"polyplus_pla",
"polywood_pla",
"tizyx_abs",
"tizyx_pla",
"tizyx_flex",
"tizyx_petg",
"tizyx_pva",
"tizyx_pla_bois",
"verbatim_bvoh_175",
"Vertex_Delta_ABS",
"Vertex_Delta_PET",
"Vertex_Delta_PLA_Glitter",
"Vertex_Delta_PLA_Mat",
"Vertex_Delta_PLA_Satin",
"Vertex_Delta_PLA_Wood",
"Vertex_Delta_PLA",
"Vertex_Delta_TPU",
"zyyx_pro_flex",
"zyyx_pro_pla"
],
"machine_extruder_trains":
{
"0": "leapfrog_bolt_pro_extruder_right",
"1": "leapfrog_bolt_pro_extruder_left"
}
},
"overrides": {
"machine_name": {"default_value": "Leapfrog Bolt Pro" },
"machine_extruder_count": {"default_value": 2},
"machine_center_is_zero": {"default_value": false},
"machine_width": {"default_value": 302},
"machine_height": {"default_value": 205},
"machine_depth": {"default_value": 322},
"machine_heated_bed": {"default_value": true},
"machine_head_with_fans_polygon": {"default_value": [[-60, 110 ], [-60, -45], [60, -45 ], [60, 110]]},
"machine_max_feedrate_z": {"default_value": 16.7 },
"machine_max_feedrate_e": {"default_value": 50 },
"machine_max_acceleration_z": {"default_value": 100 },
"machine_acceleration": {"default_value": 400 },
"machine_max_jerk_xy": {"default_value": 20 },
"machine_max_jerk_z": {"default_value": 0.4 },
"machine_max_jerk_e": {"default_value": 5 },
"machine_gcode_flavor": {"default_value": "RepRap (Marlin/Sprinter)"},
"material_final_print_temperature": {"value": "default_material_print_temperature" },
"material_initial_print_temperature": {"value": "default_material_print_temperature" },
"gantry_height": {"value": "20"},
"retraction_combing": { "default_value": "all" },
"retraction_amount": {"default_value": 2},
"adhesion_type": {"default_value": "skirt"},
"skirt_line_count": {"default_value": 3},
"machine_use_extruder_offset_to_offset_coords": {"default_value": true},
"machine_start_gcode": {"default_value": "G90\nG28 X0 Y0 Z0\nG1 Z5 F1000\nG92 E0\nG1 Y-32 F12000\nG1 E15 F1000\nG1 E45 F150\nG4 S5"},
"machine_end_gcode": {"default_value": "G92 E0\nG1 E-3 F300\nM104 S0 T0\nM104 S0 T1\nM140 S0\nG28 X0 Y0\nM84"},
"prime_tower_enable": { "resolve": "extruders_enabled_count > 1"},
"prime_tower_circular": {"default_value": false},
"prime_tower_position_x": {"value": "169"},
"prime_tower_position_y": {"value": "25"},
"speed_travel": { "value": "200"},
"build_volume_temperature": {"enabled": false},
"material_standby_temperature": {"enabled": false }
}
}

View File

@ -0,0 +1,598 @@
{
"name": "Skriware 2",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Skriware",
"manufacturer": "Skriware",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [
0,
0,
0
],
"supports_usb_connection": false,
"platform": "skriware_2_platform.stl",
"machine_extruder_trains": {
"0": "skriware_2_extruder_0",
"1": "skriware_2_extruder_1"
}
},
"overrides": {
"jerk_print_layer_0": {
"value": "5"
},
"jerk_prime_tower": {
"value": "5"
},
"expand_skins_expand_distance": {
"value": "1.2"
},
"jerk_support_interface": {
"value": "5"
},
"jerk_travel_layer_0": {
"value": "5.0"
},
"wipe_retraction_prime_speed": {
"value": "30"
},
"material_standby_temperature": {
"default_value": 195
},
"acceleration_support_bottom": {
"value": "250"
},
"raft_base_line_width": {
"value": "0.5"
},
"raft_speed": {
"value": "30.0"
},
"jerk_topbottom": {
"value": "5"
},
"ironing_inset": {
"value": "0.2"
},
"acceleration_wall": {
"value": "250"
},
"cross_infill_pocket_size": {
"value": "5.333333333333333"
},
"jerk_support_roof": {
"value": "5"
},
"acceleration_print": {
"default_value": 250
},
"meshfix_maximum_travel_resolution": {
"value": "0.8"
},
"support_top_distance": {
"value": "0.22"
},
"acceleration_enabled": {
"default_value": true
},
"optimize_wall_printing_order": {
"default_value": true
},
"jerk_layer_0": {
"value": "5"
},
"infill_line_distance": {
"value": "5.333333333333333"
},
"acceleration_ironing": {
"value": "250"
},
"material_print_temperature_layer_0": {
"value": "195"
},
"bridge_skin_speed_2": {
"value": "15"
},
"acceleration_travel": {
"value": "250"
},
"switch_extruder_retraction_speed": {
"value": "30"
},
"jerk_print": {
"default_value": 5
},
"material_guid": {
"default_value": "0ff92885-617b-4144-a03c-9989872454bc"
},
"raft_interface_acceleration": {
"value": "250"
},
"acceleration_support_interface": {
"value": "250"
},
"cool_fan_full_layer": {
"value": "1"
},
"skirt_brim_minimal_length": {
"default_value": 50
},
"material_bed_temperature": {
"value": "50"
},
"speed_slowdown_layers": {
"default_value": 1
},
"speed_travel": {
"value": "150"
},
"skin_overlap": {
"value": "15"
},
"acceleration_infill": {
"value": "250"
},
"support_roof_material_flow": {
"value": "99"
},
"raft_base_jerk": {
"value": "5"
},
"retraction_retract_speed": {
"value": "30"
},
"infill_wipe_dist": {
"value": "0.1"
},
"jerk_wall_x": {
"value": "5"
},
"layer_height": {
"default_value": 0.2
},
"bottom_skin_expand_distance": {
"value": "1.2000000000000002"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 X0 Y0;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM420 S1 Z0.9 ;enable bed levelling\nG1 Z10 F250 ;move the platform down 10mm\nM107 ;fan off\nM42 P11 S255 ;turn on front fan\nM140 S{material_bed_temperature}\nM104 T0 S{material_print_temperature}\nM104 T1 S{material_print_temperature}\nG1 F2500 Y260\nM190 S{material_bed_temperature}\nM109 T0 S{material_print_temperature}\nM109 T1 S{material_print_temperature}\nM60 ;enable E-FADE Algorithm\nM62 A ;filament sensor off\nG92 E0 ;zero the extruded length\nT1\nG92 E0;zero the extruded length\nG1 F300 Z0.3\nG1 F1200 X20\nG1 F1200 X180 E21 ;extrude 21 mm of feed stock\nG1 F1200 E15 ;retracting 6 mm\nG1 F2000 E21\nG1 F2000 E15\nG1 F300 Z1.5\nG92 E0 ;zero the extruded length again\nT0\nG92 E0 ;zero the extruded length\nG1 F1200 Y258\nG1 F300 Z0.3\nG1 F1200 X40 E21 ;extrude 21 mm of feed stock\nG1 F1200 E15 ;retracting 6 mm\nG1 F2000 E21\nG1 F2000 E15\nG1 Z1.5\nM61 A\nM63 A ;filament sensor on\nG92 E0 ;zero the extruded length again\nM58 ;end of Start G-Code and signal retract management"
},
"travel_retract_before_outer_wall": {
"default_value": true
},
"xy_offset_layer_0": {
"value": "-0.16"
},
"adhesion_type": {
"default_value": "raft"
},
"min_skin_width_for_expansion": {
"value": "0.671279704941824"
},
"support_bottom_material_flow": {
"value": "99"
},
"prime_tower_position_x": {
"value": "1"
},
"machine_depth": {
"default_value": 260
},
"retraction_speed": {
"default_value": 30
},
"support_skip_some_zags": {
"default_value": true
},
"remove_empty_first_layers": {
"default_value": false
},
"z_seam_x": {
"value": "115"
},
"support_xy_distance_overhang": {
"value": "0.5"
},
"support_tree_wall_thickness": {
"value": "0.4"
},
"acceleration_print_layer_0": {
"value": "250"
},
"support_xy_distance": {
"default_value": 0.8
},
"support_roof_line_distance": {
"value": "0.5714285714285714"
},
"jerk_enabled": {
"default_value": true
},
"min_infill_area": {
"default_value": 1
},
"travel_avoid_supports": {
"default_value": true
},
"bottom_layers": {
"value": "3"
},
"multiple_mesh_overlap": {
"default_value": 0
},
"retraction_hop_enabled": {
"default_value": true
},
"acceleration_topbottom": {
"value": "250"
},
"jerk_wall": {
"value": "5"
},
"jerk_wall_0": {
"value": "5"
},
"skin_overlap_mm": {
"value": "0.06"
},
"retraction_min_travel": {
"value": "1"
},
"support_interface_material_flow": {
"value": "99"
},
"material_diameter": {
"default_value": 1.75
},
"speed_roofing": {
"value": "30.0"
},
"skin_outline_count": {
"default_value": 0
},
"skin_no_small_gaps_heuristic": {
"default_value": true
},
"top_bottom_pattern_0": {
"value": "'zigzag'"
},
"top_skin_expand_distance": {
"value": "1.2000000000000002"
},
"acceleration_travel_layer_0": {
"value": "250.0"
},
"prime_tower_min_volume": {
"default_value": 4
},
"switch_extruder_retraction_speeds": {
"default_value": 30
},
"skin_preshrink": {
"value": "1.2000000000000002"
},
"material_bed_temperature_layer_0": {
"value": "50"
},
"support_tree_collision_resolution": {
"value": "0.2"
},
"machine_height": {
"default_value": 210
},
"raft_acceleration": {
"value": "250"
},
"fill_outline_gaps": {
"default_value": true
},
"wall_x_material_flow": {
"value": "99"
},
"jerk_support_bottom": {
"value": "5"
},
"machine_end_gcode": {
"default_value": "M59\nG92 E1\nG1 E-1 F300\nM104 T0 S0\nM104 T1 S0\nM140 S0\nG28 X0 Y0\nM84\nM106 S0\nM107"
},
"infill_sparse_density": {
"default_value": 15
},
"meshfix_maximum_deviation": {
"default_value": 0.005
},
"wall_0_material_flow": {
"value": "99"
},
"material_adhesion_tendency": {
"default_value": 0
},
"prime_tower_flow": {
"value": "99"
},
"prime_tower_position_y": {
"value": "1"
},
"support_material_flow": {
"value": "99"
},
"retract_at_layer_change": {
"default_value": true
},
"machine_extruder_count": {
"default_value": 2
},
"wall_thickness": {
"default_value": 1.2
},
"support_infill_sparse_thickness": {
"value": "0.2"
},
"raft_surface_acceleration": {
"value": "250"
},
"roofing_layer_count": {
"value": "1"
},
"skirt_brim_line_width": {
"value": "0.5"
},
"jerk_support": {
"value": "5"
},
"raft_surface_jerk": {
"value": "5"
},
"speed_equalize_flow_max": {
"default_value": 40
},
"raft_surface_speed": {
"value": "30.0"
},
"jerk_travel": {
"value": "5"
},
"support_zag_skip_count": {
"value": "8"
},
"retraction_combing": {
"default_value": "infill"
},
"raft_interface_line_spacing": {
"value": "0.4"
},
"layer_height_0": {
"default_value": 0.2
},
"extruders_enabled_count": {
"value": "2"
},
"support_line_distance": {
"value": "1.3333333333333333"
},
"support_roof_density": {
"value": "70"
},
"raft_base_line_spacing": {
"value": "0.8"
},
"acceleration_prime_tower": {
"value": "250"
},
"skin_material_flow": {
"value": "99"
},
"support_z_distance": {
"default_value": 0.22
},
"bottom_skin_preshrink": {
"value": "1.2000000000000002"
},
"jerk_skirt_brim": {
"value": "5"
},
"z_seam_y": {
"value": "180"
},
"skirt_line_count": {
"default_value": 2
},
"raft_margin": {
"default_value": 4
},
"infill_material_flow": {
"value": "99"
},
"wipe_retraction_retract_speed": {
"value": "30"
},
"z_seam_corner": {
"default_value": "z_seam_corner_weighted"
},
"support_roof_height": {
"value": "0.4"
},
"top_layers": {
"value": "4"
},
"support_infill_rate": {
"value": "30"
},
"raft_interface_speed": {
"value": "35"
},
"default_material_print_temperature": {
"default_value": 195
},
"acceleration_layer_0": {
"value": "250"
},
"support_skip_zag_per_mm": {
"default_value": 10
},
"material_initial_print_temperature": {
"value": "195"
},
"raft_interface_jerk": {
"value": "5"
},
"machine_width": {
"default_value": 210
},
"wall_line_count": {
"value": "3"
},
"retraction_amount": {
"default_value": 3
},
"infill_sparse_thickness": {
"value": "0.2"
},
"support_initial_layer_line_distance": {
"value": "1.3333333333333333"
},
"jerk_support_infill": {
"value": "5"
},
"acceleration_roofing": {
"value": "250"
},
"retraction_extrusion_window": {
"value": "3"
},
"raft_interface_line_width": {
"value": "0.4"
},
"acceleration_support_roof": {
"value": "250"
},
"support_brim_line_count": {
"value": "16"
},
"layer_0_z_overlap": {
"value": "0.1"
},
"support_angle": {
"default_value": 60
},
"machine_heated_bed": {
"default_value": true
},
"raft_surface_thickness": {
"value": "0.2"
},
"cool_min_layer_time": {
"default_value": 10
},
"gantry_height": {
"value": "210"
},
"raft_airgap": {
"default_value": 0.2
},
"acceleration_skirt_brim": {
"value": "250"
},
"skirt_brim_material_flow": {
"value": "99"
},
"jerk_infill": {
"value": "5"
},
"roofing_material_flow": {
"value": "99"
},
"support_use_towers": {
"default_value": false
},
"ooze_shield_angle": {
"default_value": 50
},
"material_flow": {
"default_value": 99
},
"speed_travel_layer_0": {
"value": "75.0"
},
"raft_base_acceleration": {
"value": "250"
},
"retraction_count_max": {
"default_value": 40
},
"ooze_shield_dist": {
"default_value": 4
},
"acceleration_support": {
"value": "250"
},
"max_skin_angle_for_expansion": {
"default_value": 50
},
"coasting_enable": {
"default_value": true
},
"brim_width": {
"default_value": 10
},
"acceleration_support_infill": {
"value": "250"
},
"retraction_prime_speed": {
"value": "30"
},
"raft_base_speed": {
"value": "35"
},
"acceleration_wall_0": {
"value": "250"
},
"xy_offset": {
"default_value": -0.16
},
"prime_tower_size": {
"default_value": 1
},
"jerk_ironing": {
"value": "5"
},
"switch_extruder_prime_speed": {
"value": "30"
},
"raft_jerk": {
"value": "5"
},
"top_skin_preshrink": {
"value": "1.2000000000000002"
},
"material_print_temperature": {
"value": "195"
},
"wall_material_flow": {
"value": "99"
},
"jerk_roofing": {
"value": "5"
},
"cool_fan_full_at_height": {
"value": "0"
},
"acceleration_wall_x": {
"value": "250"
},
"support_bottom_distance": {
"value": "0.23"
},
"cool_min_speed": {
"default_value": 15
},
"default_material_bed_temperature": {
"default_value": 50
},
"raft_interface_thickness": {
"value": "0.2"
}
}
}

View File

@ -0,0 +1,23 @@
{
"id": "leapfrog_bolt_pro_extruder_left",
"version": 2,
"name": "Left extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "leapfrog_bolt_pro",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 },
"machine_nozzle_head_distance": { "default_value": 22 },
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0.0 },
"machine_extruder_start_code": { "default_value": "G1 Y-32 F12000\nG1 X6 F1000\nG1 X-32 F4000\nG1 X6"}
}
}

View File

@ -0,0 +1,23 @@
{
"id": "leapfrog_bolt_pro_extruder_right",
"version": 2,
"name": "Right extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "leapfrog_bolt_pro",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 },
"machine_nozzle_head_distance": { "default_value": 22 },
"machine_nozzle_offset_x": { "default_value": 0},
"machine_nozzle_offset_y": { "default_value": 0.0 },
"machine_extruder_start_code": { "default_value": "G1 Y-32 F12000\nG1 X296 F1000\nG1 X334 F4000\nG1 X296"}
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Left Extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "skriware_2",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Right Extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "skriware_2",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Binary file not shown.

View File

@ -41,6 +41,7 @@ UM.Dialog
source: UM.Theme.getImage("logo")
sourceSize.width: width
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.top: parent.top
anchors.topMargin: parent.topPadding

View File

@ -129,6 +129,7 @@ Item
{
CuraApplication.deleteAll();
Cura.Actions.resetProfile.trigger();
UM.Controller.setActiveStage("PrepareStage")
}
}
@ -159,7 +160,7 @@ Item
target: Cura.Actions.browsePackages
onTriggered:
{
curaExtensions.callExtensionMethod("Toolbox", "browsePackages")
curaExtensions.callExtensionMethod("Toolbox", "launch")
}
}
}

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
global_quality = True
[values]
layer_height = 0.15

View File

@ -0,0 +1,107 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_abs_natural
variant = Brass 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 35
speed_wall = 25
speed_wall_0 = 25
speed_wall_x = 35
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 40
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = True
retraction_hop_only_when_collides = True
retraction_hop = 2
retraction_hop_after_extruder_switch = True
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 30
cool_fan_speed_min = 0
cool_fan_speed_max = 30
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 3
cool_min_layer_time = 5
cool_min_speed = 10
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = brim
brim_width = 8
brim_line_count = 14
brim_outside_only = True
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,107 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_abs_natural
variant = NozzleX 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 35
speed_wall = 25
speed_wall_0 = 25
speed_wall_x = 35
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 40
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = True
retraction_hop_only_when_collides = True
retraction_hop = 2
retraction_hop_after_extruder_switch = True
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 30
cool_fan_speed_min = 0
cool_fan_speed_max = 30
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 3
cool_min_layer_time = 5
cool_min_speed = 10
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = brim
brim_width = 8
brim_line_count = 14
brim_outside_only = True
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,107 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_epla_natural
variant = Brass 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 50
speed_wall = 25
speed_wall_0 = 25
speed_wall_x = 40
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 50
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
acceleration_enabled = False
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = False
retraction_hop_only_when_collides = True
retraction_hop = 2
retraction_hop_after_extruder_switch = True
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 100
cool_fan_speed_min = 100
cool_fan_speed_max = 100
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 4
cool_min_layer_time = 5
cool_min_speed = 5
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = skirt
skirt_line_count = 3
skirt_gap = 1
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,107 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_epla_natural
variant = NozzleX 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 50
speed_wall = 25
speed_wall_0 = 25
speed_wall_x = 40
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 50
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
acceleration_enabled = False
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = False
retraction_hop_only_when_collides = True
retraction_hop = 2
retraction_hop_after_extruder_switch = True
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 100
cool_fan_speed_min = 100
cool_fan_speed_max = 100
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 4
cool_min_layer_time = 5
cool_min_speed = 5
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = skirt
skirt_line_count = 3
skirt_gap = 1
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,104 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_pva_natural
variant = Brass 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 50
speed_wall = 20
speed_wall_0 = 20
speed_wall_x = 20
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 40
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = False
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 100
cool_fan_speed_min = 100
cool_fan_speed_max = 100
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 4
cool_min_layer_time = 5
cool_min_speed = 5
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = skirt
skirt_line_count = 3
skirt_gap = 1
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,104 @@
[general]
version = 4
name = Standard
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = quality
quality_type = standard
weight = 0
material = leapfrog_pva_natural
variant = NozzleX 0.4
[values]
layer_height_0 = 0.3
line_width = 0.4
initial_layer_line_width_factor = 120
wall_thickness = 0.8
wall_0_wipe_dist = 0.2
top_bottom_thickness = 0.8
top_bottom_pattern = lines
optimize_wall_printing_order = True
travel_compensate_overlapping_walls_enabled = True
travel_compensate_overlapping_walls_0_enabled = True
travel_compensate_overlapping_walls_x_enabled = True
fill_perimeter_gaps = everywhere
filter_out_tiny_gaps = True
z_seam_type = sharpest_corner
z_seam_corner = hide_seam
skin_outline_count = 1
infill_sparse_density = 20
infill_pattern = grid
connect_infill_polygons = True
infill_overlap = 0
infill_wipe_dist = 0
infill_before_walls = True
min_infill_area = 0
retraction_enable = True
retract_at_layer_change = False
retraction_amount = 2
retraction_speed = 25
switch_extruder_retraction_amount = 15
switch_extruder_retraction_speeds = 20
speed_print = 50
speed_wall = 20
speed_wall_0 = 20
speed_wall_x = 20
speed_topbottom = 25
speed_travel = 200
speed_layer_0 = 25
speed_support = 40
speed_travel_layer_0 = 45
speed_slowdown_layers = 1
speed_equalize_flow_enabled = True
speed_equalize_flow_max = 150
retraction_combing = all
travel_avoid_other_parts = True
travel_avoid_supports = True
retraction_hop_enabled = False
retraction_hop_after_extruder_switch_height = 2
cool_fan_enabled = True
cool_fan_speed = 100
cool_fan_speed_min = 100
cool_fan_speed_max = 100
cool_min_layer_time_fan_speed_max = 5
cool_fan_speed_0 = 0
cool_fan_full_at_height = 0.5
cool_fan_full_layer = 4
cool_min_layer_time = 5
cool_min_speed = 5
support_interface_enable = False
support_angle = 50
support_pattern = zigzag
support_connect_zigzags = False
support_infill_rate = 20
support_z_distance = 0.3
support_xy_distance = 0.7
support_xy_distance_overhang = 0.4
support_bottom_stair_step_height = 0.3
support_bottom_stair_step_width = 5
support_join_distance = 2
support_tower_diameter = 3
support_tower_roof_angle = 65
adhesion_type = skirt
skirt_line_count = 3
skirt_gap = 1
skirt_brim_minimal_length = 250
prime_tower_enable = True
prime_tower_size = 20
prime_tower_min_volume = 6
prime_tower_position_x = 169
prime_tower_position_y = 25
prime_tower_wipe_enabled = True
prime_tower_brim_enable = True

View File

@ -0,0 +1,12 @@
[general]
name = Brass 0.4
version = 4
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = variant
hardware_type = nozzle
[values]
machine_nozzle_size = 0.4

View File

@ -0,0 +1,12 @@
[general]
name = NozzleX 0.4
version = 4
definition = leapfrog_bolt_pro
[metadata]
setting_version = 10
type = variant
hardware_type = nozzle
[values]
machine_nozzle_size = 0.4

View File

@ -70,9 +70,12 @@ def test_validateOverridingDefaultValue(file_path: str):
if "overrides" not in doc:
return # No settings are being overridden. No need to check anything.
parent_settings = getInheritedSettings(doc["inherits"])
faulty_keys = set()
for key, val in doc["overrides"].items():
if key in parent_settings and "value" in parent_settings[key]:
assert "default_value" not in val, "Unnecessary default_value for {key} in {file_name}".format(key = key, file_name = file_path) # If there is a value in the parent settings, then the default_value is not effective.
if "default_value" in val:
faulty_keys.add(key)
assert not faulty_keys, "Unnecessary default_values for {faulty_keys} in {file_name}".format(faulty_keys = sorted(faulty_keys), file_name = file_path) # If there is a value in the parent settings, then the default_value is not effective.
## Get all settings and their properties from a definition we're inheriting
# from.