Example of custom attribute inheriting existing classes

This commit is contained in:
Candice Bentéjac 2024-08-06 12:33:42 +02:00
parent eb60ad0389
commit 4702906925
4 changed files with 74 additions and 2 deletions

View file

@ -25,7 +25,11 @@ def attributeFactory(description, value, isOutput, node, root=None, parent=None)
root: (optional) parent Attribute (must be ListAttribute or GroupAttribute)
parent (BaseObject): (optional) the parent BaseObject if any
"""
if isinstance(description, desc.GroupAttribute):
if description.attrType:
cls = description.attrType
elif isinstance(description, desc.GroupAttribute):
cls = GroupAttribute
elif isinstance(description, desc.ListAttribute):
cls = ListAttribute
@ -35,6 +39,7 @@ def attributeFactory(description, value, isOutput, node, root=None, parent=None)
cls = PushButtonParam
else:
cls = Attribute
attr = cls(node, description, isOutput, root, parent)
if value is not None:
attr._set_value(value, emitSignals=False)
@ -417,7 +422,6 @@ class Attribute(BaseObject):
# Emit if the enable status has changed
self.setEnabled(self.getEnabled())
name = Property(str, getName, constant=True)
fullName = Property(str, getFullName, constant=True)
fullNameToNode = Property(str, getFullNameToNode, constant=True)

24
meshroom/core/custom.py Normal file
View file

@ -0,0 +1,24 @@
from meshroom.common import BaseObject, Property, Variant, VariantList, JSValue
from meshroom.core import attribute, desc
class JobAttribute(attribute.ChoiceParam):
def __init__(self, node, attributeDesc, isOutput, root=None, parent=None):
super(JobAttribute, self).__init__(node, attributeDesc, isOutput, root, parent)
print("Constructor for JobParam")
def update(self):
print("Updating in JobParam, about to replace list of available params")
newValues = ["c", "d", "e", "f"]
self.setValues(newValues)
class JobParam(desc.ChoiceParam):
def __init__(self, name, label, description, value, values, exclusive, uid, group='allParams', joinChar=' ', advanced=False, semantic='',
enabled=True, validValue=True, errorMessage="", visible=True):
assert values
super(JobParam, self).__init__(name=name, label=label, description=description, value=value, values=values, exclusive=exclusive, uid=uid, group=group, joinChar=joinChar, advanced=advanced, semantic=semantic, enabled=enabled, validValue=validValue, errorMessage=errorMessage, visible=visible)
self._attrType = JobAttribute
type = Property(str, lambda self: self.__class__.__base__.__name__, constant=True)

View file

@ -35,6 +35,8 @@ class Attribute(BaseObject):
self._isDynamicValue = (self._value is None)
self._valueType = None
self._attrType = None
name = Property(str, lambda self: self._name, constant=True)
label = Property(str, lambda self: self._label, constant=True)
description = Property(str, lambda self: self._description, constant=True)
@ -58,6 +60,8 @@ class Attribute(BaseObject):
visible = Property(bool, lambda self: self._visible, constant=True)
type = Property(str, lambda self: self.__class__.__name__, constant=True)
attrType = Property(Variant, lambda self: self._attrType, constant=True)
def validateValue(self, value):
""" Return validated/conformed 'value'. Need to be implemented in derived classes.
@ -405,6 +409,7 @@ class ChoiceParam(Param):
joinChar = Property(str, lambda self: self._joinChar, constant=True)
class StringParam(Param):
"""
"""

View file

@ -0,0 +1,39 @@
""" Input node that creates custom attributes inheriting from existing ones.
"""
__version__ = "1.0"
# Meshroom
from meshroom.core import desc, custom
class TestAttributeType(desc.InputNode):
documentation = """ Test node to access the frame that is currently selected in the gallery from a node. """
category = 'Test/Bidule'
# Inputs to the node
inputs = [
custom.JobParam(
name="jobParam",
label="Test Job Param",
description="Random choice param with a hard-coded default list that will be updated dynamically\n"
"with a global update function defined at the attribute level.",
value="a",
values=["a", "b"],
exclusive=True,
uid=[0],
)
]
# Output which the node provides
outputs = [
desc.File(
name="fullPath",
label="Current Frame Full Path",
description="Full path of the frame that is currently selected in the gallery.",
value="",
uid=[],
),
]
def onJobParamChanged(self, node):
print("On JobParamChanged")
node.jobParam.update()