diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index 45a14587ef..427cc77e65 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -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 diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ac1cca8217..114e8528c2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -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) diff --git a/cura/Machines/Models/IntentCategoryModel.py b/cura/Machines/Models/IntentCategoryModel.py index a968d12b7a..a09d6ce3c4 100644 --- a/cura/Machines/Models/IntentCategoryModel.py +++ b/cura/Machines/Models/IntentCategoryModel.py @@ -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) diff --git a/cura/Machines/Models/IntentTranslations.py b/cura/Machines/Models/IntentTranslations.py new file mode 100644 index 0000000000..fd6a2db9ee --- /dev/null +++ b/cura/Machines/Models/IntentTranslations.py @@ -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.") +} \ No newline at end of file diff --git a/cura/Machines/Models/QualityManagementModel.py b/cura/Machines/Models/QualityManagementModel.py index d8b0785778..74dc8649d0 100644 --- a/cura/Machines/Models/QualityManagementModel.py +++ b/cura/Machines/Models/QualityManagementModel.py @@ -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 diff --git a/cura/Machines/VariantNode.py b/cura/Machines/VariantNode.py index b93be9773e..b2115ca099 100644 --- a/cura/Machines/VariantNode.py +++ b/cura/Machines/VariantNode.py @@ -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, diff --git a/cura/UI/CuraSplashScreen.py b/cura/UI/CuraSplashScreen.py index 77c9ad1427..05231c106d 100644 --- a/cura/UI/CuraSplashScreen.py +++ b/cura/UI/CuraSplashScreen.py @@ -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) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index a1540c22ab..56b4d3e3b6 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -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 { diff --git a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py index 51b6a70b7a..c89bd31e21 100644 --- a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py @@ -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? diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index 15b0fdbe12..0c62dd01cf 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -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 } } -} \ No newline at end of file +} diff --git a/plugins/SimulationView/SimulationSliderLabel.qml b/plugins/SimulationView/SimulationSliderLabel.qml index 06c6a51b44..a241a50145 100644 --- a/plugins/SimulationView/SimulationSliderLabel.qml +++ b/plugins/SimulationView/SimulationSliderLabel.qml @@ -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 { } } diff --git a/plugins/SimulationView/SimulationViewMainComponent.qml b/plugins/SimulationView/SimulationViewMainComponent.qml index 3b70c69e82..bfd8799673 100644 --- a/plugins/SimulationView/SimulationViewMainComponent.qml +++ b/plugins/SimulationView/SimulationViewMainComponent.qml @@ -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 diff --git a/plugins/Toolbox/resources/qml/Toolbox.qml b/plugins/Toolbox/resources/qml/Toolbox.qml index f70dab03d8..03fd3468f6 100644 --- a/plugins/Toolbox/resources/qml/Toolbox.qml +++ b/plugins/Toolbox/resources/qml/Toolbox.qml @@ -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 diff --git a/plugins/Toolbox/resources/qml/RatingWidget.qml b/plugins/Toolbox/resources/qml/components/RatingWidget.qml similarity index 100% rename from plugins/Toolbox/resources/qml/RatingWidget.qml rename to plugins/Toolbox/resources/qml/components/RatingWidget.qml diff --git a/plugins/Toolbox/resources/qml/SmallRatingWidget.qml b/plugins/Toolbox/resources/qml/components/SmallRatingWidget.qml similarity index 100% rename from plugins/Toolbox/resources/qml/SmallRatingWidget.qml rename to plugins/Toolbox/resources/qml/components/SmallRatingWidget.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxActionButtonStyle.qml b/plugins/Toolbox/resources/qml/components/ToolboxActionButtonStyle.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxActionButtonStyle.qml rename to plugins/Toolbox/resources/qml/components/ToolboxActionButtonStyle.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml b/plugins/Toolbox/resources/qml/components/ToolboxBackColumn.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxBackColumn.qml rename to plugins/Toolbox/resources/qml/components/ToolboxBackColumn.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/components/ToolboxCompatibilityChart.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml rename to plugins/Toolbox/resources/qml/components/ToolboxCompatibilityChart.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailList.qml b/plugins/Toolbox/resources/qml/components/ToolboxDetailList.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxDetailList.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDetailList.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTile.qml b/plugins/Toolbox/resources/qml/components/ToolboxDetailTile.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxDetailTile.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDetailTile.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml b/plugins/Toolbox/resources/qml/components/ToolboxDetailTileActions.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDetailTileActions.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGrid.qml b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsGrid.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxDownloadsGrid.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDownloadsGrid.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsGridTile.qml similarity index 97% rename from plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDownloadsGridTile.qml index 73dd593336..78cdf1562a 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsGridTile.qml @@ -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 diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcaseTile.qml similarity index 97% rename from plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml rename to plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcaseTile.qml index 89348b18de..f6e32b2d84 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml +++ b/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcaseTile.qml @@ -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 diff --git a/plugins/Toolbox/resources/qml/ToolboxFooter.qml b/plugins/Toolbox/resources/qml/components/ToolboxFooter.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxFooter.qml rename to plugins/Toolbox/resources/qml/components/ToolboxFooter.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxHeader.qml b/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxHeader.qml rename to plugins/Toolbox/resources/qml/components/ToolboxHeader.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml b/plugins/Toolbox/resources/qml/components/ToolboxInstalledTile.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml rename to plugins/Toolbox/resources/qml/components/ToolboxInstalledTile.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml b/plugins/Toolbox/resources/qml/components/ToolboxInstalledTileActions.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml rename to plugins/Toolbox/resources/qml/components/ToolboxInstalledTileActions.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml b/plugins/Toolbox/resources/qml/components/ToolboxProgressButton.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxProgressButton.qml rename to plugins/Toolbox/resources/qml/components/ToolboxProgressButton.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxShadow.qml b/plugins/Toolbox/resources/qml/components/ToolboxShadow.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxShadow.qml rename to plugins/Toolbox/resources/qml/components/ToolboxShadow.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxTabButton.qml b/plugins/Toolbox/resources/qml/components/ToolboxTabButton.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxTabButton.qml rename to plugins/Toolbox/resources/qml/components/ToolboxTabButton.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml b/plugins/Toolbox/resources/qml/dialogs/ToolboxConfirmUninstallResetDialog.qml similarity index 96% rename from plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml rename to plugins/Toolbox/resources/qml/dialogs/ToolboxConfirmUninstallResetDialog.qml index 81649fdfef..1b5e4d1d46 100644 --- a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/ToolboxConfirmUninstallResetDialog.qml @@ -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 diff --git a/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml b/plugins/Toolbox/resources/qml/dialogs/ToolboxLicenseDialog.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml rename to plugins/Toolbox/resources/qml/dialogs/ToolboxLicenseDialog.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxAuthorPage.qml similarity index 98% rename from plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxAuthorPage.qml index 08ac1f83a5..d1abe48de1 100644 --- a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml +++ b/plugins/Toolbox/resources/qml/pages/ToolboxAuthorPage.qml @@ -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 { diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxDetailPage.qml similarity index 99% rename from plugins/Toolbox/resources/qml/ToolboxDetailPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxDetailPage.qml index 1773ef9053..6d34e23f42 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/pages/ToolboxDetailPage.qml @@ -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 } } diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxDownloadsPage.qml similarity index 98% rename from plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxDownloadsPage.qml index 57fb3a9279..9be8cbe2b9 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml +++ b/plugins/Toolbox/resources/qml/pages/ToolboxDownloadsPage.qml @@ -5,6 +5,8 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import UM 1.1 as UM +import "../components" + ScrollView { clip: true diff --git a/plugins/Toolbox/resources/qml/ToolboxErrorPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxErrorPage.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxErrorPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxErrorPage.qml diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml similarity index 99% rename from plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml index f4a9e634c4..99590c712c 100644 --- a/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml +++ b/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml @@ -6,6 +6,8 @@ import QtQuick.Controls 2.3 import UM 1.1 as UM +import "../components" + ScrollView { id: page diff --git a/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml b/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml similarity index 100% rename from plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml rename to plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml diff --git a/plugins/Toolbox/resources/qml/pages/WelcomePage.qml b/plugins/Toolbox/resources/qml/pages/WelcomePage.qml new file mode 100644 index 0000000000..cbfdf8f402 --- /dev/null +++ b/plugins/Toolbox/resources/qml/pages/WelcomePage.qml @@ -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 + } +} + diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 08b6c80b1d..c8c809cc82 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -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.") diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index c4929fc2d1..ccc64f8073 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -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) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py deleted file mode 100644 index 3a1a9f0e0f..0000000000 --- a/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py +++ /dev/null @@ -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) diff --git a/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py index a5a77a91e0..1151d7101a 100644 --- a/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py +++ b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py @@ -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"]) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 90d6c8e2d8..2df14c4948 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -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": { diff --git a/resources/definitions/leapfrog_bolt_pro.def.json b/resources/definitions/leapfrog_bolt_pro.def.json new file mode 100644 index 0000000000..7f6e8ec2ec --- /dev/null +++ b/resources/definitions/leapfrog_bolt_pro.def.json @@ -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 } + } +} \ No newline at end of file diff --git a/resources/definitions/skriware_2.def.json b/resources/definitions/skriware_2.def.json new file mode 100644 index 0000000000..584cdd1708 --- /dev/null +++ b/resources/definitions/skriware_2.def.json @@ -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" + } + } +} diff --git a/resources/extruders/leapfrog_bolt_pro_extruder_left.def.json b/resources/extruders/leapfrog_bolt_pro_extruder_left.def.json new file mode 100644 index 0000000000..f4ea1729fb --- /dev/null +++ b/resources/extruders/leapfrog_bolt_pro_extruder_left.def.json @@ -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"} + } +} \ No newline at end of file diff --git a/resources/extruders/leapfrog_bolt_pro_extruder_right.def.json b/resources/extruders/leapfrog_bolt_pro_extruder_right.def.json new file mode 100644 index 0000000000..2a6662ab2f --- /dev/null +++ b/resources/extruders/leapfrog_bolt_pro_extruder_right.def.json @@ -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"} + } +} \ No newline at end of file diff --git a/resources/extruders/skriware_2_extruder_0.def.json b/resources/extruders/skriware_2_extruder_0.def.json new file mode 100644 index 0000000000..0569600094 --- /dev/null +++ b/resources/extruders/skriware_2_extruder_0.def.json @@ -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 } + } +} diff --git a/resources/extruders/skriware_2_extruder_1.def.json b/resources/extruders/skriware_2_extruder_1.def.json new file mode 100644 index 0000000000..d6fa76e1a0 --- /dev/null +++ b/resources/extruders/skriware_2_extruder_1.def.json @@ -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 } + } +} diff --git a/resources/images/cura.png b/resources/images/cura.png index 4fef842ff4..2d6a75f571 100644 Binary files a/resources/images/cura.png and b/resources/images/cura.png differ diff --git a/resources/meshes/leapfrog_bolt_pro_platform.stl b/resources/meshes/leapfrog_bolt_pro_platform.stl new file mode 100644 index 0000000000..be006a5ee3 Binary files /dev/null and b/resources/meshes/leapfrog_bolt_pro_platform.stl differ diff --git a/resources/meshes/skriware_2_platform.stl b/resources/meshes/skriware_2_platform.stl new file mode 100644 index 0000000000..b85b33ad94 Binary files /dev/null and b/resources/meshes/skriware_2_platform.stl differ diff --git a/resources/qml/Dialogs/AboutDialog.qml b/resources/qml/Dialogs/AboutDialog.qml index 584903dd60..a5622aa2c9 100644 --- a/resources/qml/Dialogs/AboutDialog.qml +++ b/resources/qml/Dialogs/AboutDialog.qml @@ -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 diff --git a/resources/qml/MainWindow/ApplicationMenu.qml b/resources/qml/MainWindow/ApplicationMenu.qml index 7f343eb8f4..30e44d7d3b 100644 --- a/resources/qml/MainWindow/ApplicationMenu.qml +++ b/resources/qml/MainWindow/ApplicationMenu.qml @@ -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") } } } \ No newline at end of file diff --git a/resources/quality/Leapfrog_Bolt_Pro/Leapfrog_Bolt_Pro_global_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/Leapfrog_Bolt_Pro_global_standard.inst.cfg new file mode 100644 index 0000000000..b94b8ee547 --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/Leapfrog_Bolt_Pro_global_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg new file mode 100644 index 0000000000..15171b26b8 --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg new file mode 100644 index 0000000000..8bc19aa8c0 --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg new file mode 100644 index 0000000000..20642ff289 --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg new file mode 100644 index 0000000000..d68c3ade1a --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg new file mode 100644 index 0000000000..8540b72c2f --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg @@ -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 diff --git a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg new file mode 100644 index 0000000000..d79cfa51fa --- /dev/null +++ b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg @@ -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 diff --git a/resources/variants/Leapfrog_Bolt_Pro_Brass_0.4.inst.cfg b/resources/variants/Leapfrog_Bolt_Pro_Brass_0.4.inst.cfg new file mode 100644 index 0000000000..ee8b832034 --- /dev/null +++ b/resources/variants/Leapfrog_Bolt_Pro_Brass_0.4.inst.cfg @@ -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 diff --git a/resources/variants/Leapfrog_Bolt_Pro_NozzleX_0.4.inst.cfg b/resources/variants/Leapfrog_Bolt_Pro_NozzleX_0.4.inst.cfg new file mode 100644 index 0000000000..6f0adfb5e1 --- /dev/null +++ b/resources/variants/Leapfrog_Bolt_Pro_NozzleX_0.4.inst.cfg @@ -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 diff --git a/tests/Settings/TestDefinitionContainer.py b/tests/Settings/TestDefinitionContainer.py index 4487388b86..9e8e967692 100644 --- a/tests/Settings/TestDefinitionContainer.py +++ b/tests/Settings/TestDefinitionContainer.py @@ -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.