diff --git a/cura/PrinterOutput/Models/PrinterConfigurationModel.py b/cura/PrinterOutput/Models/PrinterConfigurationModel.py index 85c69abcd3..d42be47b41 100644 --- a/cura/PrinterOutput/Models/PrinterConfigurationModel.py +++ b/cura/PrinterOutput/Models/PrinterConfigurationModel.py @@ -1,9 +1,12 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2025 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal from typing import List +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.DefinitionContainer import DefinitionContainer + MYPY = False if MYPY: from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel @@ -68,6 +71,15 @@ class PrinterConfigurationModel(QObject): return True return False + @pyqtProperty("QStringList", constant=True) + def validCoresForPrinterType(self) -> List[str]: + printers = ContainerRegistry.getInstance().findContainersMetadata( + ignore_case=True, type="machine", name=self._printer_type, container_type=DefinitionContainer) + id = printers[0]["id"] if len(printers) > 0 and "id" in printers[0] else "" + definitions = ContainerRegistry.getInstance().findContainersMetadata( + ignore_case=True, type="variant", definition=id+"*") + return [x["name"] for x in definitions] + def __str__(self): message_chunks = [] message_chunks.append("Printer type: " + self._printer_type) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml index bcbb6d7679..7b4479cdc3 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2025 UltiMaker // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -12,7 +12,7 @@ Button id: configurationItem property var configuration: null - hoverEnabled: isValidMaterial + hoverEnabled: isValidMaterial && isValidCore property bool isValidMaterial: { @@ -25,7 +25,6 @@ Button for (var index in extruderConfigurations) { var name = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : "" - if (name == "" || name == "Unknown") { return false @@ -34,6 +33,25 @@ Button return true } + property bool isValidCore: + { + if (configuration === null) + { + return false + } + var extruderConfigurations = configuration.extruderConfigurations + var coresList = configuration.validCoresForPrinterType + for (var index in extruderConfigurations) + { + var name = extruderConfigurations[index].hotendID ? extruderConfigurations[index].hotendID : "" + if (name != "" && ! coresList.includes(name)) + { + return false + } + } + return true + } + background: Rectangle { color: parent.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") @@ -72,11 +90,11 @@ Button { width: Math.round(parent.width / (configuration !== null ? configuration.extruderConfigurations.length : 1)) printCoreConfiguration: modelData - visible: configurationItem.isValidMaterial + visible: configurationItem.isValidMaterial && configurationItem.isValidCore } } - // Unknown material + // Unknown material or core ('variant') Item { id: unknownMaterial @@ -86,7 +104,7 @@ Button anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("thin_margin").width / 2 - visible: !configurationItem.isValidMaterial + visible: ! (configurationItem.isValidMaterial && configurationItem.isValidCore) UM.ColorImage { @@ -102,13 +120,9 @@ Button UM.Label { id: unknownMaterialMessage - text: - { - if (configuration === null) - { - return "" - } + function whenUnknownMaterial() + { var extruderConfigurations = configuration.extruderConfigurations var unknownMaterials = [] for (var index in extruderConfigurations) @@ -135,9 +149,35 @@ Button unknownMaterials = "" + unknownMaterials + "" var draftResult = catalog.i18nc("@label", "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."); - var result = draftResult.arg(unknownMaterials).arg("" + catalog.i18nc("@label","Marketplace") + " ") + return draftResult.arg(unknownMaterials).arg("" + catalog.i18nc("@label","Marketplace") + " ") + } - return result + function whenMismatchedCore() + { + var extruderConfigurations = configuration.extruderConfigurations + var coresList = configuration.validCoresForPrinterType + var mismatchedCores = [] + for (var index in extruderConfigurations) + { + var name = extruderConfigurations[index].hotendID ? extruderConfigurations[index].hotendID : "" + if (name != "" && ! coresList.includes(name)) + { + mismatchedCores.push(name) + } + } + + mismatchedCores = "" + mismatchedCores + "" + var draftResult = catalog.i18nc("@label", "This configuration is not available because %1 is either mismatched, or unrecognized. Please visit %2 to check with cores this printer-type supports."); + return draftResult.arg(mismatchedCores).arg("" + catalog.i18nc("@label","WEBSITE") + " ") + } + + text: + { + if (configuration === null) + { + return "" + } + return isValidMaterial ? whenMismatchedCore() : whenUnknownMaterial() } width: extruderRow.width @@ -225,7 +265,7 @@ Button onClicked: { - if(isValidMaterial) + if (isValidMaterial && isValidCore) { toggleContent() Cura.MachineManager.applyRemoteConfiguration(configuration)