Skip to content

Commit 9b87344

Browse files
committed
Attribute Converter : handle deserialization of converters
1 parent f66bf0d commit 9b87344

3 files changed

Lines changed: 39 additions & 16 deletions

File tree

meshroom/core/attribute.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ def _handleLinkValue(self, value) -> bool:
324324
self._linkExpression = value
325325
return True
326326

327-
def _applyExpr(self):
327+
def _applyExpr(self, converterMap: dict = None):
328328
"""
329329
For string parameters with an expression (when loaded from file),
330330
this function convert the expression into a real edge in the graph
@@ -353,7 +353,13 @@ def _applyExpr(self):
353353
attr = node.attribute(linkAttrName) if node.hasAttribute(linkAttrName) else node.internalAttribute(linkAttrName)
354354
if attr is None:
355355
raise InvalidEdgeError(self.fullName, link, "Source attribute does not exist.")
356-
attr.connectTo(self)
356+
connectedEdge, _ = attr.connectTo(self)
357+
if connectedEdge:
358+
src, dst = connectedEdge[0]
359+
if converterMap and (converterName:=converterMap.get((src.fullName, dst.fullName))):
360+
logging.info(f"Edge: {src.fullName}->{dst.fullName} set converter to {converterName}")
361+
edge = self.node.graph.edge(dst)
362+
edge.setConverter(converterName)
357363
except InvalidEdgeError as err:
358364
logging.warning(err)
359365
except Exception as err:
@@ -1039,9 +1045,9 @@ def _setValue(self, value):
10391045
self.requestGraphUpdate()
10401046

10411047
# Override
1042-
def _applyExpr(self):
1048+
def _applyExpr(self, converterMap: dict = None):
10431049
if self._linkExpression:
1044-
super()._applyExpr()
1050+
super()._applyExpr(converterMap)
10451051
else:
10461052
for value in self._value:
10471053
value._applyExpr()
@@ -1288,12 +1294,12 @@ def _setValue(self, exportedValue):
12881294
raise AttributeError(f"Failed to set on GroupAttribute: {str(value)}")
12891295

12901296
# Override
1291-
def _applyExpr(self):
1297+
def _applyExpr(self, converterMap: dict = None):
12921298
if self._linkExpression:
1293-
super()._applyExpr()
1299+
super()._applyExpr(converterMap)
12941300
else:
12951301
for value in self._value:
1296-
value._applyExpr()
1302+
value._applyExpr(converterMap)
12971303

12981304
# Override
12991305
def resetToDefaultValue(self):

meshroom/core/graph.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,8 @@ def _deserialize(self, graphData: dict):
401401
self.header = graphData.get(GraphIO.Keys.Header, {})
402402
fileVersion = Version(self.header.get(GraphIO.Keys.FileVersion, "0.0"))
403403
graphContent = self._normalizeGraphContent(graphData, fileVersion)
404+
graphConverters = graphData.get(GraphIO.Keys.Converters, {})
405+
converterMap = {tuple(v): k for k, v in graphConverters.items()}
404406
isTemplate = self.header.get(GraphIO.Keys.Template, False)
405407
explicitCachePaths = self.header.get(GraphIO.Keys.CacheDir)
406408
if explicitCachePaths:
@@ -414,7 +416,7 @@ def _deserialize(self, graphData: dict):
414416
self._deserializeNode(nodeData, nodeName, self)
415417

416418
# Create graph edges by resolving attributes expressions
417-
self._applyExpr()
419+
self._applyExpr(converterMap)
418420

419421
# Templates are specific: they contain only the minimal amount of
420422
# serialized data to describe the graph structure.
@@ -571,15 +573,30 @@ def importGraphContent(self, graph: "Graph") -> list[Node]:
571573
Returns:
572574
The list of newly created Nodes.
573575
"""
576+
577+
edgesWithConverters = [e for e in graph.edges if e._converter]
578+
converterMap = {
579+
(e.src.fullName, e.dst.fullName): e._converter.getName()
580+
for e in edgesWithConverters
581+
}
574582

575-
def _renameClashingNodes():
583+
def replaceKey(src, dst, oldName, newName):
584+
return (src.replace(oldName, newName, 1), dst.replace(oldName, newName, 1))
585+
586+
def _renameClashingNodes(converterMap):
576587
if not self.nodes:
577588
return
578589
unavailableNames = set(self.nodes.keys())
579590
for node in graph.nodes:
580-
if node._name in unavailableNames:
591+
oldName = node._name
592+
if oldName in unavailableNames:
581593
node._name = self._createUniqueNodeName(node.nodeType, unavailableNames)
594+
converterMap = {
595+
replaceKey(src, dst, oldName, node._name): value
596+
for (src, dst), value in converterMap.items()
597+
}
582598
unavailableNames.add(node._name)
599+
return converterMap
583600

584601
def _importNodesAndEdges() -> list[Node]:
585602
importedNodes = []
@@ -590,10 +607,10 @@ def _importNodesAndEdges() -> list[Node]:
590607
for srcNode in nodes:
591608
node = self._deserializeNode(srcNode.toDict(), srcNode.name, graph)
592609
importedNodes.append(node)
593-
self._applyExpr()
610+
self._applyExpr(converterMap)
594611
return importedNodes
595612

596-
_renameClashingNodes()
613+
converterMap = _renameClashingNodes(converterMap)
597614
importedNodes = _importNodesAndEdges()
598615
return importedNodes
599616

@@ -1489,10 +1506,10 @@ def discoverVertex(self, vertex, graph):
14891506
self.dfs(visitor=visitor, startNodes=[startNode])
14901507
return visitor.canCompute + (2 * visitor.canSubmit)
14911508

1492-
def _applyExpr(self):
1509+
def _applyExpr(self, converterMap: dict = None):
14931510
with GraphModification(self):
14941511
for node in self._nodes:
1495-
node._applyExpr()
1512+
node._applyExpr(converterMap)
14961513

14971514
def toDict(self):
14981515
nodes = {k: node.toDict() for k, node in self._nodes.objects.items()}

meshroom/core/node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,9 +1106,9 @@ def hasInternalAttribute(self, name):
11061106
return p[0][0] in self._internalAttributes.keys() or p[0][1] in self._internalAttributes.keys()
11071107
return name in self._internalAttributes.keys()
11081108

1109-
def _applyExpr(self):
1109+
def _applyExpr(self, converterMap: dict = None):
11101110
for attr in self._attributes:
1111-
attr._applyExpr()
1111+
attr._applyExpr(converterMap)
11121112
for attr in self._internalAttributes:
11131113
attr._applyExpr()
11141114

0 commit comments

Comments
 (0)