Set variant id from multiple variant terms

This commit is contained in:
fieldOfView 2017-10-09 18:25:57 +02:00
parent 9f0020c168
commit 92e39c7a71
3 changed files with 58 additions and 10 deletions

View file

@ -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):

View file

@ -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":
[

View file

@ -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 }
}
}
}