Skip to content

Commit c73dd57

Browse files
committed
improved typing and simplified track nodes
1 parent ce20b43 commit c73dd57

File tree

3 files changed

+17
-29
lines changed

3 files changed

+17
-29
lines changed

yaramo/edge.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
from typing import List, Optional, Tuple
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING, List, Optional, Tuple
24

35
from yaramo.base_element import BaseElement
46
from yaramo.geo_node import GeoNode
57
from yaramo.node import Node
68
from yaramo.vacancy_section import VacancySection
79

10+
if TYPE_CHECKING:
11+
from yaramo.signal import Signal, SignalDirection
12+
813

914
class Edge(BaseElement):
1015
"""This class is one of two Elements (Edge and Node) comprising the base of the yaramo Topology.
@@ -22,7 +27,7 @@ def __init__(
2227
vacancy_section: Optional[VacancySection] = None,
2328
length: float = None,
2429
intermediate_geo_nodes: List[GeoNode] = None,
25-
signals: list["Signal"] = None,
30+
signals: list[Signal] = None,
2631
maximum_speed: int = None,
2732
**kwargs
2833
):
@@ -86,7 +91,7 @@ def __get_length(self) -> float:
8691
)
8792
return total_length
8893

89-
def get_direction_based_on_start_node(self, start: "Node") -> "SignalDirection":
94+
def get_direction_based_on_start_node(self, start: Node) -> SignalDirection:
9095
from yaramo.signal import SignalDirection
9196

9297
if self.node_a.uuid == start.uuid:
@@ -95,7 +100,7 @@ def get_direction_based_on_start_node(self, start: "Node") -> "SignalDirection":
95100
return SignalDirection.GEGEN
96101
return None
97102

98-
def get_direction_based_on_nodes(self, node_a: "Node", node_b: "Node") -> "SignalDirection":
103+
def get_direction_based_on_nodes(self, node_a: Node, node_b: Node) -> SignalDirection:
99104
"""Returns the direction according to whether the order of node_a and node_b is the same as in self
100105
101106
Parameters
@@ -119,7 +124,7 @@ def get_direction_based_on_nodes(self, node_a: "Node", node_b: "Node") -> "Signa
119124
return SignalDirection.GEGEN
120125
return None
121126

122-
def get_signals_with_direction_in_order(self, direction: "SignalDirection") -> List["Signal"]:
127+
def get_signals_with_direction_in_order(self, direction: SignalDirection) -> List[Signal]:
123128
"""Returns all the signals (with that direction) on that Edge ordered by the given direction
124129
125130
This only consideres Signals of SignalFunction type Einfahr_Signal, Ausfahr_Signal and Block_Signal that have the same direction as requested.
@@ -150,7 +155,7 @@ def get_signals_with_direction_in_order(self, direction: "SignalDirection") -> L
150155
result.sort(key=lambda x: x.distance_edge, reverse=(direction == SignalDirection.GEGEN))
151156
return result
152157

153-
def get_opposite_node(self, node: "Node") -> "Node":
158+
def get_opposite_node(self, node: Node) -> Node:
154159
"""Returns the opposite Node of the given Node
155160
156161
Parameters
@@ -168,7 +173,7 @@ def get_opposite_node(self, node: "Node") -> "Node":
168173
return self.node_b
169174
return self.node_a
170175

171-
def get_next_geo_node(self, node: "Node") -> "GeoNode":
176+
def get_next_geo_node(self, node: Node) -> GeoNode:
172177
"""Returns the next GeoNode on Edgeof the given Top Node
173178
174179
Parameters

yaramo/signal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import logging
21
from enum import Enum, auto
2+
import logging
33
from typing import Set, Tuple
44
from uuid import uuid4
55

yaramo/track.py

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ def add_edge_section(self, edge: Edge, section_start: float, section_end: float)
3333
def edges(self) -> List[Edge]:
3434
return list(self.edge_sections.keys())
3535

36+
@property
37+
def nodes(self) -> List[Node]:
38+
return list({node for edge in self.edges for node in (edge.node_a, edge.node_b)})
39+
3640
def get_edges_in_order(self) -> List[Edge]:
3741
if len(self.edges) <= 1:
3842
return self.edges
@@ -83,24 +87,3 @@ def is_node_in_track(self, node: Node):
8387
if edge.is_node_connected(node):
8488
return True
8589
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)