1+ import simplejson as json
2+
13from yaramo .base_element import BaseElement
24from yaramo .edge import Edge
5+ from yaramo .geo_node import Wgs84GeoNode
36from yaramo .node import Node
47from yaramo .route import Route
58from yaramo .signal import Signal
@@ -54,7 +57,7 @@ def to_serializable(self):
5457 A serializable dictionary of all the objects belonging to the Topology.
5558 """
5659 nodes , edges , signals , routes , vacancy_sections = [], [], [], [], []
57- objects = {}
60+ objects = dict ()
5861
5962 for items , _list in [
6063 (list (self .signals .values ()), signals ),
@@ -76,3 +79,57 @@ def to_serializable(self):
7679 "objects" : objects ,
7780 "vacany_sections" : vacancy_sections ,
7881 }, {}
82+
83+ @classmethod
84+ def from_json (cls , json_str : str ):
85+ obj = json .loads (json_str )
86+ topology = cls ()
87+ for node in obj ["nodes" ]:
88+ node_obj = Node (** node )
89+ topology .add_node (node_obj )
90+ if "geo_node" in node and node ["geo_node" ] is not None :
91+ geo_node = obj ["objects" ][node ["geo_node" ]]
92+ geo_node_obj = Wgs84GeoNode (
93+ obj ["objects" ][geo_node ["geo_point" ]]["x" ],
94+ obj ["objects" ][geo_node ["geo_point" ]]["y" ],
95+ name = geo_node ["name" ],
96+ uuid = geo_node ["uuid" ],
97+ )
98+ node_obj .geo_node = geo_node_obj
99+
100+ for signal in obj ["signals" ]:
101+ topology .add_signal (Signal (** signal ))
102+ for edge in obj ["edges" ]:
103+ node_a = topology .nodes [edge ["node_a" ]]
104+ node_b = topology .nodes [edge ["node_b" ]]
105+ node_a .connected_nodes .append (node_b )
106+ node_b .connected_nodes .append (node_a )
107+ geo_node_strings = [
108+ obj ["objects" ][geo_node_uuid ]
109+ for geo_node_uuid in edge ["intermediate_geo_nodes" ]
110+ if geo_node_uuid in obj ["objects" ]
111+ ]
112+ topology .add_edge (
113+ Edge (
114+ ** {
115+ ** edge ,
116+ "node_a" : node_a ,
117+ "node_b" : node_b ,
118+ "signals" : [
119+ topology .signals [signal_uuid ] for signal_uuid in edge ["signals" ]
120+ ],
121+ "intermediate_geo_nodes" : [
122+ Wgs84GeoNode (
123+ obj ["objects" ][geo_node ["geo_point" ]]["x" ],
124+ obj ["objects" ][geo_node ["geo_point" ]]["y" ],
125+ name = geo_node ["name" ],
126+ uuid = geo_node ["uuid" ],
127+ )
128+ for geo_node in geo_node_strings
129+ ],
130+ }
131+ )
132+ )
133+ for signal in obj ["signals" ]:
134+ topology .signals [signal ["uuid" ]].edge = topology .edges [signal ["edge" ]]
135+ return topology
0 commit comments