[core] attribute: new initValue, independant from the resetToDefaultValue

Avoid to evaluate the default value if we don't need to.
This commit is contained in:
Fabien Castan 2024-06-13 23:55:53 +02:00
parent 0c3426250a
commit 020dbecc68
6 changed files with 37 additions and 29 deletions

View file

@ -38,6 +38,8 @@ def attributeFactory(description, value, isOutput, node, root=None, parent=None)
attr = cls(node, description, isOutput, root, parent) attr = cls(node, description, isOutput, root, parent)
if value is not None: if value is not None:
attr.value = value attr.value = value
else:
attr.resetToDefaultValue()
return attr return attr
@ -72,8 +74,7 @@ class Attribute(BaseObject):
self._invalidationValue = "" self._invalidationValue = ""
self._value = None self._value = None
# do not emit value changed on initialization self.initValue()
self.resetValue(emitSignals=False)
@property @property
def node(self): def node(self):
@ -240,7 +241,11 @@ class Attribute(BaseObject):
def upgradeValue(self, exportedValue): def upgradeValue(self, exportedValue):
self._set_value(exportedValue) self._set_value(exportedValue)
def resetValue(self, emitSignals=True): def initValue(self):
if self.desc._valueType is not None:
self._value = self.desc._valueType()
def resetToDefaultValue(self, emitSignals=True):
self._set_value(copy.copy(self.defaultValue()), emitSignals=emitSignals) self._set_value(copy.copy(self.defaultValue()), emitSignals=emitSignals)
def requestGraphUpdate(self): def requestGraphUpdate(self):
@ -321,7 +326,7 @@ class Attribute(BaseObject):
return return
if isinstance(v, Attribute): if isinstance(v, Attribute):
g.addEdge(v, self) g.addEdge(v, self)
self.resetValue() self.resetToDefaultValue()
elif self.isInput and Attribute.isLinkExpression(v): elif self.isInput and Attribute.isLinkExpression(v):
# value is a link to another attribute # value is a link to another attribute
link = v[1:-1] link = v[1:-1]
@ -330,7 +335,7 @@ class Attribute(BaseObject):
g.addEdge(g.node(linkNode).attribute(linkAttr), self) g.addEdge(g.node(linkNode).attribute(linkAttr), self)
except KeyError as err: except KeyError as err:
logging.warning('Connect Attribute from Expression failed.\nExpression: "{exp}"\nError: "{err}".'.format(exp=v, err=err)) logging.warning('Connect Attribute from Expression failed.\nExpression: "{exp}"\nError: "{err}".'.format(exp=v, err=err))
self.resetValue() self.resetToDefaultValue()
def getExportValue(self): def getExportValue(self):
if self.isLink: if self.isLink:
@ -504,7 +509,10 @@ class ListAttribute(Attribute):
def index(self, item): def index(self, item):
return self._value.indexOf(item) return self._value.indexOf(item)
def resetValue(self, emitSignals=True): def initValue(self):
self.resetToDefaultValue(emitSignals=False)
def resetToDefaultValue(self, emitSignals=True):
self._value = ListModel(parent=self) self._value = ListModel(parent=self)
if emitSignals: if emitSignals:
self.valueChanged.emit() self.valueChanged.emit()
@ -650,14 +658,6 @@ class GroupAttribute(Attribute):
def __init__(self, node, attributeDesc, isOutput, root=None, parent=None): def __init__(self, node, attributeDesc, isOutput, root=None, parent=None):
super(GroupAttribute, self).__init__(node, attributeDesc, isOutput, root, parent) super(GroupAttribute, self).__init__(node, attributeDesc, isOutput, root, parent)
subAttributes = []
for subAttrDesc in self.attributeDesc.groupDesc:
childAttr = attributeFactory(subAttrDesc, None, self.isOutput, self.node, self)
subAttributes.append(childAttr)
childAttr.valueChanged.connect(self.valueChanged)
self._value.reset(subAttributes)
def __getattr__(self, key): def __getattr__(self, key):
try: try:
return super(GroupAttribute, self).__getattr__(key) return super(GroupAttribute, self).__getattr__(key)
@ -696,10 +696,18 @@ class GroupAttribute(Attribute):
else: else:
raise AttributeError("Failed to set on GroupAttribute: {}".format(str(value))) raise AttributeError("Failed to set on GroupAttribute: {}".format(str(value)))
def resetValue(self, emitSignals=True): def initValue(self):
self._value = DictModel(keyAttrName='name', parent=self) self._value = DictModel(keyAttrName='name', parent=self)
if emitSignals: subAttributes = []
self.valueChanged.emit() for subAttrDesc in self.attributeDesc.groupDesc:
childAttr = attributeFactory(subAttrDesc, None, self.isOutput, self.node, self)
subAttributes.append(childAttr)
childAttr.valueChanged.connect(self.valueChanged)
self._value.reset(subAttributes)
def resetToDefaultValue(self, emitSignals=True):
for attrDesc in self.desc._groupDesc:
self._value.get(attrDesc.name).resetToDefaultValue()
@Slot(str, result=Attribute) @Slot(str, result=Attribute)
def childAttribute(self, key): def childAttribute(self, key):

View file

@ -755,7 +755,7 @@ class InitNode:
""" """
for attrName in attributeNames: for attrName in attributeNames:
if node.hasAttribute(attrName): if node.hasAttribute(attrName):
node.attribute(attrName).resetValue() node.attribute(attrName).resetToDefaultValue()
def extendAttributes(self, node, attributesDict): def extendAttributes(self, node, attributesDict):
""" """

View file

@ -268,7 +268,7 @@ class Graph(BaseObject):
if not isinstance(graphData, dict): if not isinstance(graphData, dict):
raise RuntimeError('loadGraph error: Graph is not a dict. File: {}'.format(filepath)) raise RuntimeError('loadGraph error: Graph is not a dict. File: {}'.format(filepath))
self._fileDateVersion = os.path.getmtime(filepath) self._fileDateVersion = os.path.getmtime(filepath)
self.header = fileData.get(Graph.IO.Keys.Header, {}) self.header = fileData.get(Graph.IO.Keys.Header, {})
@ -551,13 +551,13 @@ class Graph(BaseObject):
# find top-level links # find top-level links
if Attribute.isLinkExpression(attr.value): if Attribute.isLinkExpression(attr.value):
skippedEdges[attr] = attr.value skippedEdges[attr] = attr.value
attr.resetValue() attr.resetToDefaultValue()
# find links in ListAttribute children # find links in ListAttribute children
elif isinstance(attr, ListAttribute): elif isinstance(attr, ListAttribute):
for child in attr.value: for child in attr.value:
if Attribute.isLinkExpression(child.value): if Attribute.isLinkExpression(child.value):
skippedEdges[child] = child.value skippedEdges[child] = child.value
child.resetValue() child.resetToDefaultValue()
return node, skippedEdges return node, skippedEdges
def duplicateNodes(self, srcNodes): def duplicateNodes(self, srcNodes):
@ -933,7 +933,7 @@ class Graph(BaseObject):
for edge in self.getEdges(dependenciesOnly=dependenciesOnly): for edge in self.getEdges(dependenciesOnly=dependenciesOnly):
nodeEdges[edge.src.node].add(edge.dst.node) nodeEdges[edge.src.node].add(edge.dst.node)
return nodeEdges return nodeEdges
def dfs(self, visitor, startNodes=None, longestPathFirst=False): def dfs(self, visitor, startNodes=None, longestPathFirst=False):
@ -1548,7 +1548,7 @@ class Graph(BaseObject):
@property @property
def fileDateVersion(self): def fileDateVersion(self):
return self._fileDateVersion return self._fileDateVersion
@fileDateVersion.setter @fileDateVersion.setter
def fileDateVersion(self, value): def fileDateVersion(self, value):
self._fileDateVersion = value self._fileDateVersion = value

View file

@ -378,12 +378,12 @@ class RemoveImagesCommand(GraphCommand):
def redoImpl(self): def redoImpl(self):
for i in range(len(self.cameraInits)): for i in range(len(self.cameraInits)):
# Reset viewpoints # Reset viewpoints
self.cameraInits[i].viewpoints.resetValue() self.cameraInits[i].viewpoints.resetToDefaultValue()
self.cameraInits[i].viewpoints.valueChanged.emit() self.cameraInits[i].viewpoints.valueChanged.emit()
self.cameraInits[i].viewpoints.requestGraphUpdate() self.cameraInits[i].viewpoints.requestGraphUpdate()
# Reset intrinsics # Reset intrinsics
self.cameraInits[i].intrinsics.resetValue() self.cameraInits[i].intrinsics.resetToDefaultValue()
self.cameraInits[i].intrinsics.valueChanged.emit() self.cameraInits[i].intrinsics.valueChanged.emit()
self.cameraInits[i].intrinsics.requestGraphUpdate() self.cameraInits[i].intrinsics.requestGraphUpdate()

View file

@ -924,10 +924,10 @@ class Reconstruction(UIGraph):
if rebuild: if rebuild:
# if rebuilding all intrinsics, for each Viewpoint: # if rebuilding all intrinsics, for each Viewpoint:
for vp in cameraInitCopy.viewpoints.value: for vp in cameraInitCopy.viewpoints.value:
vp.intrinsicId.resetValue() # reset intrinsic assignation vp.intrinsicId.resetToDefaultValue() # reset intrinsic assignation
vp.metadata.resetValue() # and metadata (to clear any previous 'SensorWidth' entries) vp.metadata.resetToDefaultValue() # and metadata (to clear any previous 'SensorWidth' entries)
# reset existing intrinsics list # reset existing intrinsics list
cameraInitCopy.intrinsics.resetValue() cameraInitCopy.intrinsics.resetToDefaultValue()
try: try:
self.setBuildingIntrinsics(True) self.setBuildingIntrinsics(True)

View file

@ -24,7 +24,7 @@ def test_formatting_listOfFiles():
n1.featuresFolders.extend("single value with space") n1.featuresFolders.extend("single value with space")
assert n1.featuresFolders.getValueStr() == '"single value with space"' assert n1.featuresFolders.getValueStr() == '"single value with space"'
n1.featuresFolders.resetValue() n1.featuresFolders.resetToDefaultValue()
assert n1.featuresFolders.getValueStr() == '' assert n1.featuresFolders.getValueStr() == ''
n1.featuresFolders.extend(inputImages) n1.featuresFolders.extend(inputImages)