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)