diff --git a/meshroom/core/attribute.py b/meshroom/core/attribute.py index 86b39fc6..0c9bb563 100644 --- a/meshroom/core/attribute.py +++ b/meshroom/core/attribute.py @@ -62,6 +62,7 @@ class Attribute(BaseObject): self._value = copy.copy(attributeDesc.value) self._label = attributeDesc.label self._enabled = True + self._validValue = True # invalidation value for output attributes self._invalidationValue = "" @@ -147,6 +148,24 @@ class Attribute(BaseObject): """ Value for which the attribute should be ignored during the UID computation. """ return self.attributeDesc.uidIgnoreValue + def getValidValue(self): + """ + Get the status of _validValue: + - If it is a function, execute it and return the result + - Otherwise, simply return its value + """ + if isinstance(self.desc.validValue, types.FunctionType): + try: + return self.desc.validValue(self.node) + except Exception: + return True + return self._validValue + + def setValidValue(self, value): + if self._validValue == value: + return + self._validValue = value + def _get_value(self): if self.isLink: return self.getLinkParam().value @@ -338,6 +357,8 @@ class Attribute(BaseObject): enabledChanged = Signal() enabled = Property(bool, getEnabled, setEnabled, notify=enabledChanged) uidIgnoreValue = Property(Variant, getUidIgnoreValue, constant=True) + validValueChanged = Signal() + validValue = Property(bool, getValidValue, setValidValue, notify=validValueChanged) def raiseIfLink(func): diff --git a/meshroom/core/desc.py b/meshroom/core/desc.py index d62c0c21..05d9478a 100644 --- a/meshroom/core/desc.py +++ b/meshroom/core/desc.py @@ -14,7 +14,8 @@ class Attribute(BaseObject): """ """ - def __init__(self, name, label, description, value, advanced, semantic, uid, group, enabled, uidIgnoreValue=None): + def __init__(self, name, label, description, value, advanced, semantic, uid, group, enabled, uidIgnoreValue=None, + validValue=True, errorMessage=""): super(Attribute, self).__init__() self._name = name self._label = label @@ -26,6 +27,8 @@ class Attribute(BaseObject): self._enabled = enabled self._semantic = semantic self._uidIgnoreValue = uidIgnoreValue + self._validValue = validValue + self._errorMessage = errorMessage name = Property(str, lambda self: self._name, constant=True) label = Property(str, lambda self: self._label, constant=True) @@ -37,6 +40,8 @@ class Attribute(BaseObject): 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) type = Property(str, lambda self: self.__class__.__name__, constant=True) def validateValue(self, value): @@ -205,9 +210,9 @@ class GroupAttribute(Attribute): class Param(Attribute): """ """ - def __init__(self, name, label, description, value, uid, group, advanced, semantic, enabled, uidIgnoreValue=None): + def __init__(self, name, label, description, value, uid, group, advanced, semantic, enabled, uidIgnoreValue=None, validValue=True, errorMessage=""): super(Param, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled, - uidIgnoreValue=uidIgnoreValue) + uidIgnoreValue=uidIgnoreValue, validValue=validValue, errorMessage=errorMessage) class File(Attribute): @@ -253,9 +258,10 @@ class BoolParam(Param): class IntParam(Param): """ """ - def __init__(self, name, label, description, value, range, uid, group='allParams', advanced=False, semantic='', enabled=True): + def __init__(self, name, label, description, value, range, uid, group='allParams', advanced=False, semantic='', enabled=True, validValue=True, errorMessage=""): self._range = range - super(IntParam, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled) + super(IntParam, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled, + validValue=validValue, errorMessage=errorMessage) def validateValue(self, value): # handle unsigned int values that are translated to int by shiboken and may overflow @@ -275,9 +281,10 @@ class IntParam(Param): class FloatParam(Param): """ """ - def __init__(self, name, label, description, value, range, uid, group='allParams', advanced=False, semantic='', enabled=True): + def __init__(self, name, label, description, value, range, uid, group='allParams', advanced=False, semantic='', enabled=True, validValue=True, errorMessage=""): self._range = range - super(FloatParam, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled) + super(FloatParam, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled, + validValue=validValue, errorMessage=errorMessage) def validateValue(self, value): try: @@ -334,9 +341,9 @@ class ChoiceParam(Param): class StringParam(Param): """ """ - def __init__(self, name, label, description, value, uid, group='allParams', advanced=False, semantic='', enabled=True, uidIgnoreValue=None): + def __init__(self, name, label, description, value, uid, group='allParams', advanced=False, semantic='', enabled=True, uidIgnoreValue=None, validValue=True, errorMessage=""): super(StringParam, self).__init__(name=name, label=label, description=description, value=value, uid=uid, group=group, advanced=advanced, semantic=semantic, enabled=enabled, - uidIgnoreValue=uidIgnoreValue) + uidIgnoreValue=uidIgnoreValue, validValue=validValue, errorMessage=errorMessage) def validateValue(self, value): if not isinstance(value, str):