mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-05-17 19:16:26 +02:00
[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:
parent
0c3426250a
commit
020dbecc68
6 changed files with 37 additions and 29 deletions
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue