Skip to content

Commit e97767d

Browse files
committed
add get_nodes_in_order
1 parent abc07e9 commit e97767d

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

yaramo/track.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
from enum import Enum, auto
1+
from collections import Counter
2+
from enum import IntEnum, auto
23
from typing import Dict, List, Tuple
34

45
from yaramo.base_element import BaseElement
56
from yaramo.edge import Edge
67
from yaramo.node import Node
78

89

9-
class TrackType(Enum):
10-
Hauptgleis = auto()
10+
class TrackType(IntEnum):
1111
Durchgehendes_Hauptgleis = auto()
12+
Hauptgleis = auto()
1213
Streckengleis = auto()
1314
Anschlussgleis = auto()
1415
Nebengleis = auto()
@@ -82,3 +83,24 @@ def is_node_in_track(self, node: Node):
8283
if edge.is_node_connected(node):
8384
return True
8485
return False
86+
87+
def get_nodes_in_order(self) -> List[Node]:
88+
nodes = [node for edge in self.edges for node in (edge.node_a, edge.node_b)]
89+
start_nodes = [node for node, count in Counter(nodes).items() if count == 1]
90+
91+
if len(start_nodes) != 2:
92+
raise ValueError("Edges of Track separated")
93+
94+
previous_node = start_nodes[0]
95+
start_edge = next(edge for edge in self.edges if previous_node in (edge.node_a, edge.node_b))
96+
97+
edges_in_order = self.get_edges_in_order()
98+
if edges_in_order[0] != start_edge:
99+
edges_in_order.reverse()
100+
101+
nodes_in_order: list[Node] = [previous_node]
102+
for edge in edges_in_order:
103+
previous_node = edge.get_other_node(previous_node)
104+
nodes_in_order.append(previous_node)
105+
106+
return nodes_in_order

0 commit comments

Comments
 (0)