|
1 | | -from enum import Enum, auto |
| 1 | +from collections import Counter |
| 2 | +from enum import IntEnum, auto |
2 | 3 | from typing import Dict, List, Tuple |
3 | 4 |
|
4 | 5 | from yaramo.base_element import BaseElement |
5 | 6 | from yaramo.edge import Edge |
6 | 7 | from yaramo.node import Node |
7 | 8 |
|
8 | 9 |
|
9 | | -class TrackType(Enum): |
10 | | - Hauptgleis = auto() |
| 10 | +class TrackType(IntEnum): |
11 | 11 | Durchgehendes_Hauptgleis = auto() |
| 12 | + Hauptgleis = auto() |
12 | 13 | Streckengleis = auto() |
13 | 14 | Anschlussgleis = auto() |
14 | 15 | Nebengleis = auto() |
@@ -82,3 +83,24 @@ def is_node_in_track(self, node: Node): |
82 | 83 | if edge.is_node_connected(node): |
83 | 84 | return True |
84 | 85 | 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