From 17e8e3e315ad358dc8daa837dfd9d10e28d4e7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Candice=20Bent=C3=A9jac?= Date: Tue, 13 Aug 2024 15:34:17 +0200 Subject: [PATCH 1/2] [core] Add reference to attribute's instance type in descriptions --- meshroom/core/attribute.py | 12 +----------- meshroom/core/desc.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/meshroom/core/attribute.py b/meshroom/core/attribute.py index 35e983aa..a43f8e9b 100644 --- a/meshroom/core/attribute.py +++ b/meshroom/core/attribute.py @@ -25,17 +25,7 @@ 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): - cls = GroupAttribute - elif isinstance(description, desc.ListAttribute): - cls = ListAttribute - elif isinstance(description, desc.ChoiceParam): - cls = ChoiceParam - elif isinstance(description, desc.PushButtonParam): - cls = PushButtonParam - else: - cls = Attribute - attr = cls(node, description, isOutput, root, parent) + attr = description.instanceType(node, description, isOutput, root, parent) if value is not None: attr._set_value(value, emitSignals=False) else: diff --git a/meshroom/core/desc.py b/meshroom/core/desc.py index ad63d50b..c347e9a0 100644 --- a/meshroom/core/desc.py +++ b/meshroom/core/desc.py @@ -58,6 +58,12 @@ class Attribute(BaseObject): visible = Property(bool, lambda self: self._visible, constant=True) type = Property(str, lambda self: self.__class__.__name__, constant=True) + def getInstanceType(self): + """ Return the correct Attribute instance corresponding to the description. """ + # Import within the method to prevent cyclic dependencies + from meshroom.core.attribute import Attribute + return Attribute + def validateValue(self, value): """ Return validated/conformed 'value'. Need to be implemented in derived classes. @@ -88,6 +94,10 @@ class Attribute(BaseObject): return False return True + # instanceType + # Attribute instance corresponding to the description + instanceType = Property(Variant, lambda self: self.getInstanceType(), constant=True) + class ListAttribute(Attribute): """ A list of Attributes """ @@ -103,6 +113,11 @@ class ListAttribute(Attribute): uid = Property(Variant, lambda self: self.elementDesc.uid, constant=True) joinChar = Property(str, lambda self: self._joinChar, constant=True) + def getInstanceType(self): + # Import within the method to prevent cyclic dependencies + from meshroom.core.attribute import ListAttribute + return ListAttribute + def validateValue(self, value): if value is None: return value @@ -144,6 +159,11 @@ class GroupAttribute(Attribute): groupDesc = Property(Variant, lambda self: self._groupDesc, constant=True) + def getInstanceType(self): + # Import within the method to prevent cyclic dependencies + from meshroom.core.attribute import GroupAttribute + return GroupAttribute + def validateValue(self, value): if value is None: return value @@ -336,11 +356,18 @@ class PushButtonParam(Param): super(PushButtonParam, self).__init__(name=name, label=label, description=description, value=None, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled, visible=visible) self._valueType = None + def getInstanceType(self): + # Import within the method to prevent cyclic dependencies + from meshroom.core.attribute import PushButtonParam + return PushButtonParam + def validateValue(self, value): return value + def checkValueTypes(self): pass + class ChoiceParam(Param): """ """ @@ -362,6 +389,11 @@ class ChoiceParam(Param): else: self._valueType = type(self._value) + def getInstanceType(self): + # Import within the method to prevent cyclic dependencies + from meshroom.core.attribute import ChoiceParam + return ChoiceParam + def conformValue(self, value): """ Conform 'value' to the correct type and check for its validity """ # We do not check that the value is in the list of values. From cc88120a9878bb09922e7c1decd7d93030abe42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Candice=20Bent=C3=A9jac?= Date: Wed, 7 Aug 2024 11:54:30 +0200 Subject: [PATCH 2/2] [core] desc: Group properties together at the end of their class --- meshroom/core/desc.py | 56 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/meshroom/core/desc.py b/meshroom/core/desc.py index c347e9a0..d3bd4df2 100644 --- a/meshroom/core/desc.py +++ b/meshroom/core/desc.py @@ -35,29 +35,6 @@ class Attribute(BaseObject): self._isDynamicValue = (self._value is None) self._valueType = 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) - value = Property(Variant, lambda self: self._value, constant=True) - # isExpression: - # The default value of the attribute's descriptor is a static string expression that should be evaluated at runtime. - # This property only makes sense for output attributes. - isExpression = Property(bool, lambda self: self._isExpression, constant=True) - # isDynamicValue - # The default value of the attribute's descriptor is None, so it's not an input value, - # but an output value that is computed during the Node's process execution. - isDynamicValue = Property(bool, lambda self: self._isDynamicValue, constant=True) - uid = Property(Variant, lambda self: self._uid, constant=True) - group = Property(str, lambda self: self._group, constant=True) - advanced = Property(bool, lambda self: self._advanced, constant=True) - enabled = Property(Variant, lambda self: self._enabled, constant=True) - semantic = Property(str, lambda self: self._semantic, constant=True) - uidIgnoreValue = Property(Variant, lambda self: self._uidIgnoreValue, constant=True) - validValue = Property(Variant, lambda self: self._validValue, constant=True) - errorMessage = Property(str, lambda self: self._errorMessage, constant=True) - visible = Property(bool, lambda self: self._visible, constant=True) - type = Property(str, lambda self: self.__class__.__name__, constant=True) - def getInstanceType(self): """ Return the correct Attribute instance corresponding to the description. """ # Import within the method to prevent cyclic dependencies @@ -94,6 +71,28 @@ class Attribute(BaseObject): return False return True + 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) + value = Property(Variant, lambda self: self._value, constant=True) + # isExpression: + # The default value of the attribute's descriptor is a static string expression that should be evaluated at runtime. + # This property only makes sense for output attributes. + isExpression = Property(bool, lambda self: self._isExpression, constant=True) + # isDynamicValue + # The default value of the attribute's descriptor is None, so it's not an input value, + # but an output value that is computed during the Node's process execution. + isDynamicValue = Property(bool, lambda self: self._isDynamicValue, constant=True) + uid = Property(Variant, lambda self: self._uid, constant=True) + group = Property(str, lambda self: self._group, constant=True) + advanced = Property(bool, lambda self: self._advanced, constant=True) + enabled = Property(Variant, lambda self: self._enabled, constant=True) + semantic = Property(str, lambda self: self._semantic, constant=True) + uidIgnoreValue = Property(Variant, lambda self: self._uidIgnoreValue, constant=True) + validValue = Property(Variant, lambda self: self._validValue, constant=True) + errorMessage = Property(str, lambda self: self._errorMessage, constant=True) + visible = Property(bool, lambda self: self._visible, constant=True) + type = Property(str, lambda self: self.__class__.__name__, constant=True) # instanceType # Attribute instance corresponding to the description instanceType = Property(Variant, lambda self: self.getInstanceType(), constant=True) @@ -109,10 +108,6 @@ class ListAttribute(Attribute): self._joinChar = joinChar super(ListAttribute, self).__init__(name=name, label=label, description=description, value=[], uid=(), group=group, advanced=advanced, semantic=semantic, enabled=enabled, visible=visible) - elementDesc = Property(Attribute, lambda self: self._elementDesc, constant=True) - uid = Property(Variant, lambda self: self.elementDesc.uid, constant=True) - joinChar = Property(str, lambda self: self._joinChar, constant=True) - def getInstanceType(self): # Import within the method to prevent cyclic dependencies from meshroom.core.attribute import ListAttribute @@ -145,6 +140,10 @@ class ListAttribute(Attribute): return self._elementDesc.matchDescription(value[0], strict) return True + elementDesc = Property(Attribute, lambda self: self._elementDesc, constant=True) + uid = Property(Variant, lambda self: self.elementDesc.uid, constant=True) + joinChar = Property(str, lambda self: self._joinChar, constant=True) + class GroupAttribute(Attribute): """ A macro Attribute composed of several Attributes """ @@ -157,8 +156,6 @@ class GroupAttribute(Attribute): self._brackets = brackets super(GroupAttribute, self).__init__(name=name, label=label, description=description, value={}, uid=(), group=group, advanced=advanced, semantic=semantic, enabled=enabled, visible=visible) - groupDesc = Property(Variant, lambda self: self._groupDesc, constant=True) - def getInstanceType(self): # Import within the method to prevent cyclic dependencies from meshroom.core.attribute import GroupAttribute @@ -240,6 +237,7 @@ class GroupAttribute(Attribute): allUids.extend(desc.uid) return allUids + groupDesc = Property(Variant, lambda self: self._groupDesc, constant=True) uid = Property(Variant, retrieveChildrenUids, constant=True) joinChar = Property(str, lambda self: self._joinChar, constant=True) brackets = Property(str, lambda self: self._brackets, constant=True)