diff --git a/meshroom/core/graph.py b/meshroom/core/graph.py index 05f90aba..24469557 100644 --- a/meshroom/core/graph.py +++ b/meshroom/core/graph.py @@ -380,7 +380,7 @@ class Graph(BaseObject): Returns: OrderedDict[Node, Node]: the source->duplicate map """ - srcNodes, srcEdges = self.dfsOnDiscover(startNodes=[fromNode]) + srcNodes, srcEdges = self.dfsOnDiscover(startNodes=[fromNode], reverse=True) # use OrderedDict to keep duplicated nodes creation order duplicates = OrderedDict() @@ -714,9 +714,9 @@ class Graph(BaseObject): self.dfs(visitor=visitor, startNodes=startNodes) return nodes, edges - def dfsOnDiscover(self, startNodes, filterTypes=None, longestPathFirst=False, reverse=True): + def dfsOnDiscover(self, startNodes, filterTypes=None, longestPathFirst=False, reverse=False): """ - Return the node chain from startNodes to the graph leaves. + Return the node chain from startNodes to the graph roots/leaves. Args: startNodes (Node list): the nodes to start the visit from. @@ -725,10 +725,10 @@ class Graph(BaseObject): longestPathFirst (bool): (optional) if multiple paths, nodes belonging to the longest one will be visited first. reverse (bool): (optional) direction of visit. - True is for getting nodes depending on the startNode. - False is for getting nodes required for the startNode. + True is for getting nodes depending on the startNodes (to leaves). + False is for getting nodes required for the startNodes (to roots). Returns: - The list of nodes and edges, from startNodes to the graph leaves following edges. + The list of nodes and edges, from startNodes to the graph roots/leaves following edges. """ nodes = [] edges = [] @@ -1074,7 +1074,7 @@ class Graph(BaseObject): See Also: Graph.update, Graph.updateInternals, Graph.updateStatusFromCache """ - nodes, edges = self.dfsOnDiscover(startNodes=[fromNode]) + nodes, edges = self.dfsOnDiscover(startNodes=[fromNode], reverse=True) for node in nodes: node.dirty = True @@ -1098,7 +1098,7 @@ class Graph(BaseObject): @Slot(Node) def clearDataFrom(self, startNode): - for node in self.dfsOnDiscover(startNodes=[startNode])[0]: + for node in self.dfsOnDiscover(startNodes=[startNode], reverse=True)[0]: node.clearData() def iterChunksByStatus(self, status): diff --git a/meshroom/core/taskManager.py b/meshroom/core/taskManager.py index 78296235..1d0aceed 100644 --- a/meshroom/core/taskManager.py +++ b/meshroom/core/taskManager.py @@ -69,7 +69,7 @@ class TaskThread(Thread): break else: logging.error("Error on node computation: {}".format(e)) - nodesToRemove, _ = self._manager._graph.dfsOnDiscover(startNodes=[node]) + nodesToRemove, _ = self._manager._graph.dfsOnDiscover(startNodes=[node], reverse=True) # remove following nodes from the task queue for n in nodesToRemove[1:]: # exclude current node try: diff --git a/meshroom/ui/graph.py b/meshroom/ui/graph.py index a3334ca6..00dfa8d5 100644 --- a/meshroom/ui/graph.py +++ b/meshroom/ui/graph.py @@ -526,7 +526,7 @@ class UIGraph(QObject): with self.groupedGraphModification("Remove Nodes from {}".format(startNode.name)): # Perform nodes removal from leaves to start node so that edges # can be re-created in correct order on redo. - [self.removeNode(node) for node in reversed(self._graph.dfsOnDiscover(startNodes=[startNode])[0])] + [self.removeNode(node) for node in reversed(self._graph.dfsOnDiscover(startNodes=[startNode], reverse=True)[0])] @Slot(Attribute, Attribute) def addEdge(self, src, dst): diff --git a/meshroom/ui/reconstruction.py b/meshroom/ui/reconstruction.py index 2d3cd677..0d444855 100755 --- a/meshroom/ui/reconstruction.py +++ b/meshroom/ui/reconstruction.py @@ -473,7 +473,7 @@ class Reconstruction(UIGraph): def onCameraInitChanged(self): # Update active nodes when CameraInit changes - nodes = self._graph.dfsOnDiscover(startNodes=[self._cameraInit])[0] + nodes = self._graph.dfsOnDiscover(startNodes=[self._cameraInit], reverse=True)[0] self.setActiveNodes(nodes) @Slot() @@ -651,7 +651,7 @@ class Reconstruction(UIGraph): """ if not startNode: return None - nodes = self._graph.dfsOnDiscover(startNodes=[startNode], filterTypes=nodeTypes)[0] + nodes = self._graph.dfsOnDiscover(startNodes=[startNode], filterTypes=nodeTypes, reverse=True)[0] if not nodes: return None node = nodes[-1] diff --git a/tests/test_graph.py b/tests/test_graph.py index 6e0024b1..9ad6c6b1 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -174,16 +174,16 @@ def test_graph_reverse_dfsOnDiscover(): F = graph.addNewNode('AppendText', input=A.output, inputText=E.output) # Get all nodes from A (use set, order not guaranteed) - nodes = graph.dfsOnDiscover(startNodes=[A])[0] + nodes = graph.dfsOnDiscover(startNodes=[A], reverse=True)[0] assert set(nodes) == {A, B, D, C, E, F} # Get all nodes from B - nodes = graph.dfsOnDiscover(startNodes=[B])[0] + nodes = graph.dfsOnDiscover(startNodes=[B], reverse=True)[0] assert set(nodes) == {B, D, C, E, F} # Get all nodes of type AppendText from B - nodes = graph.dfsOnDiscover(startNodes=[B], filterTypes=['AppendText'])[0] + nodes = graph.dfsOnDiscover(startNodes=[B], filterTypes=['AppendText'], reverse=True)[0] assert set(nodes) == {B, D, C, F} # Get all nodes from C (order guaranteed) - nodes = graph.dfsOnDiscover(startNodes=[C])[0] + nodes = graph.dfsOnDiscover(startNodes=[C], reverse=True)[0] assert nodes == [C, E, F]