diff --git a/plugins/BlackBeltPlugin/BlackBeltPlugin.py b/plugins/BlackBeltPlugin/BlackBeltPlugin.py index 5dc4ac0334..cfa55d6648 100644 --- a/plugins/BlackBeltPlugin/BlackBeltPlugin.py +++ b/plugins/BlackBeltPlugin/BlackBeltPlugin.py @@ -12,12 +12,13 @@ i18n_catalog = i18nCatalog("BlackBeltPlugin") from . import BuildVolumePatches from . import CuraEngineBackendPatches -from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject +from PyQt5.QtCore import pyqtSignal, pyqtSlot, pyqtProperty, QObject from PyQt5.QtQml import qmlRegisterSingletonType import math import os.path import json +import re class BlackBeltPlugin(Extension): def __init__(self): @@ -98,23 +99,62 @@ class BlackBeltPlugin(Extension): preferences.setValue("cura/categories_expanded", expanded_settings) self._application.expandedCategoriesChanged.emit() +## QML-accessible singleton for access to extended data on definition and variants class BlackBeltSingleton(QObject): def __init__(self): super().__init__() - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) - def _onGlobalContainerStackChanged(self): - self.activeMachineChanged.emit() + self._application = Application.getInstance() + self._machine_manager = self._application.getMachineManager() + self._global_container_stack = None + + self._variants_terms_pattern = "" + self._variants_terms = [] + + self._application.globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) + self._onGlobalContainerStackChanged(emit = False) + self._machine_manager.activeVariantChanged.connect(self._onActiveVariantChanged) + self._onActiveVariantChanged(emit = False) + + def _onGlobalContainerStackChanged(self, emit = True): + self._global_container_stack = self._application.getGlobalContainerStack() + + self._variants_terms_pattern = self._global_container_stack.getMetaDataEntry("variants_id_pattern", "") + self._variants_terms_pattern = self._variants_terms_pattern.replace("{definition_id}", self._global_container_stack.getBottom().getId()) + self._variants_terms_pattern = self._variants_terms_pattern.replace("{term}", "(.*?)") + + if emit: + self.activeMachineChanged.emit() + + def _onActiveVariantChanged(self, emit = True): + active_variant_id = self._machine_manager.activeVariantId + + result = re.match("^%s$" % self._variants_terms_pattern, active_variant_id) + if result: + self._variants_terms = list(result.groups()) + else: + self._variants_terms = [] + + if emit: + self.activeVariantChanged.emit() activeMachineChanged = pyqtSignal() + activeVariantChanged = pyqtSignal() @pyqtProperty(str, notify = activeMachineChanged) def variantsTerms(self): - return json.dumps(Application.getInstance().getGlobalContainerStack().getMetaDataEntry("variants_terms", [])) + return json.dumps(self._global_container_stack.getMetaDataEntry("variants_terms", [])) + + @pyqtProperty("QVariantList", notify = activeVariantChanged) + def activeVariantTerms(self): + return self._variants_terms + + @pyqtSlot(int, str) + def setActiveVariantTerm(self, index, term): + self._variants_terms[index] = term + variant_id = self._variants_terms_pattern.replace("(.*?)", "%s") % tuple(self._variants_terms) + self._machine_manager.setActiveVariant(variant_id) - @pyqtProperty(str, notify = activeMachineChanged) - def variantsPattern(self): - return Application.getInstance().getGlobalContainerStack().getMetaDataEntry("variants_pattern", "") ## Get the singleton instance for this class. @classmethod @@ -126,6 +166,7 @@ class BlackBeltSingleton(QObject): __instance = None # type: "BlackBeltSingleton" + ## Decorator for easy access to gantry angle and transform matrix. class BlackBeltDecorator(SceneNodeDecorator): def __init__(self): diff --git a/resources/definitions/blackbelt.def.json b/resources/definitions/blackbelt.def.json index 2077050868..3b2c16ce9c 100644 --- a/resources/definitions/blackbelt.def.json +++ b/resources/definitions/blackbelt.def.json @@ -22,7 +22,7 @@ "preferred_variant": "*45_04*", "preferred_quality": "*Normal*", "preferred_material": "*ngen*", - "variants_id_pattern": "{definition_id}_{term_0}_{term_1}", + "variants_id_pattern": "{definition_id}_{term}_{term}", "variants_name": "Configuration", "variants_terms": [ diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 8db395e0b8..cae979b0b0 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -280,8 +280,10 @@ Column ToolButton { id: termSelectionButton - text: "%1: %2".arg(model.modelData.name).arg(model.modelData.values[Object.keys(model.modelData.values)[0]]) + text: "%1: %2".arg(model.modelData.name).arg(model.modelData.values[activeVariantTerm]) property var values: model.modelData.values + property string activeVariantTerm: Cura.BlackBeltPlugin && Cura.BlackBeltPlugin.activeVariantTerms.length > index ? Cura.BlackBeltPlugin.activeVariantTerms[index] : "" + property int termIndex: index width: (variantTermsSelection.width - (variantTermsRepeater.count-1) * UM.Theme.getSize("default_margin").width) / variantTermsRepeater.count height: UM.Theme.getSize("setting_control").height @@ -297,13 +299,18 @@ Column MenuItem { text: termSelectionButton.values[model.modelData] + checkable: true + checked: activeVariantTerm == model.modelData + exclusiveGroup: variantTermGroup onTriggered: { + Cura.BlackBeltPlugin.setActiveVariantTerm(termSelectionButton.termIndex, model.modelData) } } onObjectAdded: variantTermMenu.insertItem(index, object) onObjectRemoved: variantTermMenu.removeItem(object) } + ExclusiveGroup { id: variantTermGroup } } } }