1+ from __future__ import annotations
2+
13import sys
24from enum import Enum
35from itertools import permutations
46from math import atan2 , cos , sin
5- from typing import List
7+ from typing import TYPE_CHECKING
68
79from yaramo .base_element import BaseElement
810from yaramo .geo_node import GeoNode
911
12+ if TYPE_CHECKING :
13+ from yaramo .edge import Edge
14+
1015
1116class EdgeConnectionDirection (Enum ):
1217 Spitze = 0
@@ -33,17 +38,17 @@ def __init__(self, turnout_side=None, **kwargs):
3338 """
3439
3540 super ().__init__ (** kwargs )
36- self .connected_edge_on_head = None
37- self .connected_edge_on_right = None
38- self .connected_edge_on_left = None
41+ self .connected_edge_on_head : Edge = None
42+ self .connected_edge_on_right : Edge = None
43+ self .connected_edge_on_left : Edge = None
3944 self .maximum_speed_on_left = None
4045 self .maximum_speed_on_right = None
41- self .connected_edges : list [" Edge" ] = []
46+ self .connected_edges : list [Edge ] = []
4247 self .geo_node : GeoNode = kwargs .get ("geo_node" , None )
4348 self .turnout_side : str = turnout_side
4449 self .drive_amount = 0
4550
46- def maximum_speed (self , node_a : " Node" , node_b : " Node" ):
51+ def maximum_speed (self , node_a : Node , node_b : Node ):
4752 """Return the maximum allowed speed for traversing this node,
4853 coming from node_a and going to node_b
4954 """
@@ -56,49 +61,49 @@ def maximum_speed(self, node_a: "Node", node_b: "Node"):
5661 return None
5762
5863 @property
59- def connected_nodes (self ):
64+ def connected_nodes (self ) -> list [ Node ] :
6065 return [edge .get_opposite_node (self ) for edge in self .connected_edges ]
6166
6267 @property
63- def connected_on_head (self ):
68+ def connected_on_head (self ) -> Node :
6469 if self .connected_edge_on_head is None :
6570 self .calc_anschluss_of_all_edges ()
6671 if self .connected_edge_on_head is None :
6772 return None
6873 return self .connected_edge_on_head .get_opposite_node (self )
6974
7075 @property
71- def connected_on_left (self ):
76+ def connected_on_left (self ) -> Node :
7277 if self .connected_edge_on_head is None :
7378 self .calc_anschluss_of_all_edges ()
7479 if self .connected_edge_on_left is None :
7580 return None
7681 return self .connected_edge_on_left .get_opposite_node (self )
7782
7883 @property
79- def connected_on_right (self ):
84+ def connected_on_right (self ) -> Node :
8085 if self .connected_edge_on_head is None :
8186 self .calc_anschluss_of_all_edges ()
8287 if self .connected_edge_on_right is None :
8388 return None
8489 return self .connected_edge_on_right .get_opposite_node (self )
8590
86- def set_connection_head_edge (self , edge : " Edge" ):
91+ def set_connection_head_edge (self , edge : Edge ):
8792 self .connected_edge_on_head = edge
8893 if edge not in self .connected_edges :
8994 self .connected_edges .append (edge )
9095
91- def set_connection_left_edge (self , edge : " Edge" ):
96+ def set_connection_left_edge (self , edge : Edge ):
9297 self .connected_edge_on_left = edge
9398 if edge not in self .connected_edges :
9499 self .connected_edges .append (edge )
95100
96- def set_connection_right_edge (self , edge : " Edge" ):
101+ def set_connection_right_edge (self , edge : Edge ):
97102 self .connected_edge_on_right = edge
98103 if edge not in self .connected_edges :
99104 self .connected_edges .append (edge )
100105
101- def remove_edge (self , edge : " Edge" ):
106+ def remove_edge (self , edge : Edge ):
102107 self .connected_edges .remove (edge )
103108 if self .connected_edge_on_head == edge :
104109 self .connected_edge_on_head = None
@@ -107,7 +112,7 @@ def remove_edge(self, edge: "Edge"):
107112 if self .connected_edge_on_right == edge :
108113 self .connected_edge_on_right = None
109114
110- def remove_edge_to_node (self , node : " Node" ):
115+ def remove_edge_to_node (self , node : Node ):
111116 """Removes the edge to the given node and removes the node from the connected_nodes list."""
112117 edge = self .get_edge_to_node (node )
113118 self .remove_edge (edge )
@@ -116,7 +121,7 @@ def get_edge_to_node(self, node):
116121 """Returns the edge to the given neighbor node."""
117122 return next (edge for edge in self .connected_edges if edge .get_opposite_node (self ) == node )
118123
119- def get_possible_followers (self , source : " Edge" ) -> List [ " Edge" ]:
124+ def get_possible_followers (self , source : Edge ) -> list [ Edge ]:
120125 """Returns the `Edge`s that could follow (head, left, right) when comming from a source `Edge` connected to this `Node`."""
121126 if source is None :
122127 return self .connected_edges
@@ -131,7 +136,7 @@ def get_possible_followers(self, source: "Edge") -> List["Edge"]:
131136 return [self .connected_edge_on_left , self .connected_edge_on_right ]
132137 return [self .connected_edge_on_head ]
133138
134- def get_anschluss_for_edge (self , edge : " Edge" ) -> EdgeConnectionDirection :
139+ def get_anschluss_for_edge (self , edge : Edge ) -> EdgeConnectionDirection :
135140 """Gets the Anschluss (Ende, Links, Rechts, Spitze) of other node.
136141 Idea: We assume, the current node is a point and we want to estimate the Anschluss of the other node.
137142
@@ -203,7 +208,7 @@ def get_rad_between_nodes(geo_node_a: GeoNode, geo_node_b: GeoNode) -> float:
203208 self .connected_edge_on_right = right
204209 break
205210
206- def is_point (self ):
211+ def is_point (self ) -> bool :
207212 """
208213 Returns true if this node is a point.
209214 A point is a `Node` with at least 3 connected tracks (yaramo only supports three edges at the moment)
0 commit comments