diff --git a/meshroom/core/attribute.py b/meshroom/core/attribute.py index 35e983aa..de4ec8a4 100644 --- a/meshroom/core/attribute.py +++ b/meshroom/core/attribute.py @@ -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) diff --git a/meshroom/core/custom.py b/meshroom/core/custom.py new file mode 100644 index 00000000..fe00ac89 --- /dev/null +++ b/meshroom/core/custom.py @@ -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) diff --git a/meshroom/core/desc.py b/meshroom/core/desc.py index ad63d50b..42f7ff26 100644 --- a/meshroom/core/desc.py +++ b/meshroom/core/desc.py @@ -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): """ """ diff --git a/meshroom/nodes/test/TestAttributeType.py b/meshroom/nodes/test/TestAttributeType.py new file mode 100644 index 00000000..4db1277f --- /dev/null +++ b/meshroom/nodes/test/TestAttributeType.py @@ -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() \ No newline at end of file