Methode für Erstellung des Trees implementiert (build_rack_strtree). Methode zur findung von nächsten Rack von Tree implementiert (find_nearest_rack_from_point_tree). Methode zur verknüpfung von Sensor oder Dist mittels zuvor genannter methode (connect_equipment_to_racks). Unittests für Methoden erfolgreich implementiert. Versuch der Implementierung einer vektorisierten Form mit Tree aber nocht nicht erfolgreich.

This commit is contained in:
2025-05-23 12:54:02 +02:00
parent a242345ab4
commit a1a7587290
+358 -150
View File
@@ -8,6 +8,8 @@ import networkx as nx
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from itertools import pairwise, combinations, permutations from itertools import pairwise, combinations, permutations
import re import re
from shapely.strtree import STRtree
import shapely
class PointSorter: class PointSorter:
def __init__(self): def __init__(self):
@@ -355,7 +357,6 @@ class Anlage():
def get_sensor_point(self, sname:str) -> Point: def get_sensor_point(self, sname:str) -> Point:
return self._sensors[sname] return self._sensors[sname]
def connect_sensors_to_racks(self) -> list: def connect_sensors_to_racks(self) -> list:
'''verbindet die Sensoren mit den Racks. '''verbindet die Sensoren mit den Racks.
die Rückgabe enthält ein Tuple, welche Sensoren keinem Rack zugeordnet werden konnten die Rückgabe enthält ein Tuple, welche Sensoren keinem Rack zugeordnet werden konnten
@@ -405,6 +406,94 @@ class Anlage():
def join_racks(self): def join_racks(self):
self._racks.join_racks() self._racks.join_racks()
def _build_rack_strtree(self):
self._rack_lines = []
self._rack_map = {}
for r_name, pts in self._racks.get_racks_borders().items():
line = LineString([pts[0], pts[-1]])
self._rack_lines.append(line)
self._rack_map[line] = r_name
self._rack_tree = STRtree(self._rack_lines)
def find_nearest_rack_from_point_tree(self, max_dist, sensor:Point) -> tuple[Point, str]:
if not hasattr(self, "_rack_tree"):
self._build_rack_strtree()
result = self._rack_tree.query_nearest(sensor, return_distance=True)
if result == None:
return None, None
index_array, dist_array = result
nearest_index = index_array[0]
distance = dist_array[0]
#nearest_line, distance = result
if distance > max_dist:
return None, None
nearest_line = self._rack_lines[nearest_index]
rack_name = self._rack_map[nearest_line]
nearest_point = nearest_line.interpolate(nearest_line.project(sensor))
return(nearest_point, rack_name)
def connect_equipment_to_racks(self, equipment: dict, onpoints: dict) -> list:
'''Verbindet Peripherie (Sensoren / Aktoren/ Unterverteiler) mit dem nächsten Rack.
Eingabe: Dict des Equipments (Sensoren o. Dists), Dict der Aufpunkte von Sensoren o. Dists
Rückgabe: Liste der nicht zugeordneten Geräte
'''
errors = []
for name, pos in equipment.items():
onpoint, rackname = self.find_nearest_rack_from_point_tree(self._tol_connect, pos)
if onpoint == None or rackname == None:
errors.append((name, pos))
continue
onpoints[name] = (onpoint, rackname)
self.add_point_to_rack(onpoint, rackname)
virtual_rackname = f"v-{name}-{rackname}"
self._racks.add_rack(pos, onpoint, virtual_rackname)
return errors
def connect_equipment_batch(self, equipment:dict, onpoints:dict) -> list:
if not hasattr(self, "_rack_tree"):
self._build_rack_strtree()
devices = list(equipment.items())
device_names = [name for name, _ in devices]
device_points = [pos for _, pos in devices]
idx_rack, distances = self._rack_tree.query_nearest(device_points, return_distance=True, all_matches=True)
# !!! Problem !!!: query gibt mehrere Ergebnisse zurück -> kann dann nicht zugeordnet werden
# Greifen des ersten ergebnisses nicht zielführend, da nicht das näheste
errors = []
for i, (rack_idxs, dist) in enumerate(zip(idx_rack, distances)):
# Nehme ersten Treffer
rack_idx = int(rack_idxs[0])
dist = float(dist)
if dist > self._tol_connect:
errors.append(devices[i])
continue
eqname, eqpos = devices[i]
nearest_line = self._rack_lines[rack_idx]
rackname = self._rack_map[nearest_line]
onpoint = nearest_line.interpolate(nearest_line.project(eqpos))
onpoints[eqname] = (onpoint, rackname)
self.add_point_to_rack(onpoint, rackname)
virtual_rackname = f"v-{eqname}-{rackname}"
self._racks.add_rack(eqpos, onpoint, virtual_rackname)
return errors
def find_nearest_rack_from_point(self, max_dist, coarse_step, sensor:Point, racks:dict) -> tuple[Point, str]: def find_nearest_rack_from_point(self, max_dist, coarse_step, sensor:Point, racks:dict) -> tuple[Point, str]:
# 1. grobe Kandidatensuche # 1. grobe Kandidatensuche
candidate_lines = [] candidate_lines = []
@@ -625,132 +714,161 @@ class Anlage():
class TestLinesweep(unittest.TestCase): class TestLinesweep(unittest.TestCase):
def test_duplicate_points(self): # def test_duplicate_points(self):
''' Testet das Nicht-Hinzufügen von doppelten Punkten''' # ''' Testet das Nicht-Hinzufügen von doppelten Punkten'''
# Initialisiere die Liste an Knoten # # Initialisiere die Liste an Knoten
nodeids = NodeIDs() # nodeids = NodeIDs()
# Setze gleichen Knoten doppelt # # Setze gleichen Knoten doppelt
nodeids.add_point(Point(1,1)) # nodeids.add_point(Point(1,1))
nodeids.add_point(Point(1,1)) # nodeids.add_point(Point(1,1))
self.assertEqual(nodeids.size_of(), 1) # self.assertEqual(nodeids.size_of(), 1)
def test_cut_rack_in_segments(self): # def test_cut_rack_in_segments(self):
''' Teilt Rack aus Polyline in mehrere Segmente automatisch auf.''' # ''' Teilt Rack aus Polyline in mehrere Segmente automatisch auf.'''
racks_data = { # racks_data = {
'Rack_1': [Point(0, 0), Point(0, 10), Point (10, 10)], # 'Rack_1': [Point(0, 0), Point(0, 10), Point (10, 10)],
'Rack_2': [Point(-5, 5), Point(5, 5)] # 'Rack_2': [Point(-5, 5), Point(5, 5)]
} # }
# Initialisiere Racks # # Initialisiere Racks
rack = RackIDs() # rack = RackIDs()
# Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf # # Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf
rack.add_racks(racks_data) # rack.add_racks(racks_data)
self.assertEqual(rack.get_rack_names(), ['Rack_1-1', 'Rack_1-2', 'Rack_2']) # self.assertEqual(rack.get_rack_names(), ['Rack_1-1', 'Rack_1-2', 'Rack_2'])
def test_intersect_segments(self): # def test_intersect_segments(self):
''' Stellt Schnittpunkte zwischen Racks fest und fügt Schnittpunkt zu Rack hinzu. ''' # ''' Stellt Schnittpunkte zwischen Racks fest und fügt Schnittpunkt zu Rack hinzu. '''
racks_data = { # racks_data = {
'Rack_1': [Point(0, 0), Point(0, 10), Point (10, 10)], # 'Rack_1': [Point(0, 0), Point(0, 10), Point (10, 10)],
'Rack_2': [Point(-5, 5), Point(5, 5)], # 'Rack_2': [Point(-5, 5), Point(5, 5)],
} # }
# Initialisiere Racks # # Initialisiere Racks
rack = RackIDs() # rack = RackIDs()
# Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf # # Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf
rack.add_racks(racks_data) # rack.add_racks(racks_data)
# Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu # # Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
rack.join_racks() # rack.join_racks()
self.assertEqual(rack.get_points_from_rack("Rack_1-1"), [Point(0, 0), Point(0, 5), Point (0, 10)]) # self.assertEqual(rack.get_points_from_rack("Rack_1-1"), [Point(0, 0), Point(0, 5), Point (0, 10)])
def test_snap_segments(self): # def test_snap_segments(self):
''' Verlängert Anfangs und Endpunkte von Racks, sodass sie auf naheliegenden Racks liegen''' # ''' Verlängert Anfangs und Endpunkte von Racks, sodass sie auf naheliegenden Racks liegen'''
racks_data = { # racks_data = {
'Rack_1': [Point(0, 0), Point(0, 10)], # 'Rack_1': [Point(0, 0), Point(0, 10)],
'Rack_2': [Point(1, 5), Point(5, 5)], # 'Rack_2': [Point(1, 5), Point(5, 5)],
'Rack_3': [Point(1.5, 7.5), Point(5, 7.5)] # 'Rack_3': [Point(1.5, 7.5), Point(5, 7.5)]
} # }
# Initialisiere Racks # # Initialisiere Racks
rack = RackIDs(tol_snap=1) # rack = RackIDs(tol_snap=1)
# Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf # # Füge Racks aus gegebenen Daten hinzu und teile Rack_1 bestehend aus 3 Punkten in 2 Racks auf
rack.add_racks(racks_data) # rack.add_racks(racks_data)
# Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu # # Verknüpfe Racks mit echten Schnittpunkten und füge Schnittpunkte (exakt & beinahe) zu jeweiligem Rack hinzu
rack.join_racks() # rack.join_racks()
#Rack 2 wird verlängert auf SP mit Rack 1. Rack 3 ausserhalb der Toleranz # #Rack 2 wird verlängert auf SP mit Rack 1. Rack 3 ausserhalb der Toleranz
self.assertEqual(rack.get_points_from_rack("Rack_1"), [Point(0, 0), Point(0, 5), Point (0, 10)]) # self.assertEqual(rack.get_points_from_rack("Rack_1"), [Point(0, 0), Point(0, 5), Point (0, 10)])
def test_ids_to_point(self): # def test_ids_to_point(self):
''' Testet, ob gefragter Punkt auf Racks a, b, c liegt''' # ''' Testet, ob gefragter Punkt auf Racks a, b, c liegt'''
res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)], # res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)],
'Rack_2-0': [Point(1, 8), Point(1, 0)], # 'Rack_2-0': [Point(1, 8), Point(1, 0)],
'Rack_2-1': [Point(0, 10), Point(5, 10)]} # 'Rack_2-1': [Point(0, 10), Point(5, 10)]}
point2rack = RackIDs() # point2rack = RackIDs()
point2rack.add_racks(res_rack_seg) # point2rack.add_racks(res_rack_seg)
self.assertEqual(point2rack.get_racks_from_point(Point(1, 0)), ["Rack_1-0", "Rack_2-0"]) # self.assertEqual(point2rack.get_racks_from_point(Point(1, 0)), ["Rack_1-0", "Rack_2-0"])
self.assertEqual(point2rack.get_racks_from_point(Point(5, 6)), ["Rack_1-0"]) # self.assertEqual(point2rack.get_racks_from_point(Point(5, 6)), ["Rack_1-0"])
self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1, 8)]) # self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1, 8)])
def test_add_point_interim(self): # def test_add_point_interim(self):
''' Testet das hinzufügen und einsortieren eines Zwischenpunktes zwischen Rack-Anfang und Rack-Ende''' # ''' Testet das hinzufügen und einsortieren eines Zwischenpunktes zwischen Rack-Anfang und Rack-Ende'''
res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)], # res_rack_seg = {'Rack_1-0': [Point(1, 0), Point(5, 6)],
'Rack_2-0': [Point(1, 8), Point(1, 0)], # 'Rack_2-0': [Point(1, 8), Point(1, 0)],
'Rack_2-1': [Point(0, 10), Point(5, 10)]} # 'Rack_2-1': [Point(0, 10), Point(5, 10)]}
point2rack = RackIDs() # point2rack = RackIDs()
point2rack.add_racks(res_rack_seg) # point2rack.add_racks(res_rack_seg)
point2rack.add_point_to_rack(Point(1,4), "Rack_2-0") # point2rack.add_point_to_rack(Point(1,4), "Rack_2-0")
self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1,4), Point(1, 8)]) # self.assertEqual(point2rack.get_points_from_rack("Rack_2-0"), [Point(1, 0), Point(1,4), Point(1, 8)])
def test_add_sensor(self): # def test_add_sensor(self):
''' Erzeugt Aufpunkt an dem Sensor nähesten Rack und fügt diesen auf Rack ein (sortiert).''' # ''' Erzeugt Aufpunkt an dem Sensor nähesten Rack und fügt diesen auf Rack ein (sortiert).'''
rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)], # rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
'Rack_2-0': [Point(10, -2), Point(10, 5)], # 'Rack_2-0': [Point(10, -2), Point(10, 5)],
'Rack_2-1': [Point(0, 3), Point(10, 3)]} # 'Rack_2-1': [Point(0, 3), Point(10, 3)]}
sensors = {'Sens_1': Point(1, 1), # sensors = {'Sens_1': Point(1, 1),
'Sens_2': Point(2, 4), # 'Sens_2': Point(2, 4),
'Sens_3': Point(9, 2)} # 'Sens_3': Point(9, 2)}
an = Anlage() # an = Anlage()
point2rack = an.set_racks(rack_segs) # point2rack = an.set_racks(rack_segs)
an.add_sensors(sensors) # an.add_sensors(sensors)
plist1 = an.get_points_from_rack("Rack_1-0") # plist1 = an.get_points_from_rack("Rack_1-0")
an.connect_sensors_to_racks() # an.connect_sensors_to_racks()
plist2 = an.get_points_from_rack("Rack_1-0") # plist2 = an.get_points_from_rack("Rack_1-0")
self.assertEqual(plist1, [Point(0, 0), Point(0, 10)]) # self.assertEqual(plist1, [Point(0, 0), Point(0, 10)])
self.assertEqual(plist2, [Point(0, 0), Point(0,1), Point(0, 10)]) # self.assertEqual(plist2, [Point(0, 0), Point(0,1), Point(0, 10)])
def test_generate_graph(self): # def test_add_equipment_w_tree(self):
'''Generiert einen Graphen in 3 unterschiedlichen Ausbaustufen (nur Racks, Racks+Sensoren, Racks+Sensoren+Unterverteiler)'''
rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)], # racks = {'Rack_1': [Point(0, 0), Point(0, 10)],
'Rack_2-0': [Point(10, -2), Point(10, 5)], # 'Rack_2': [Point(10, -2), Point(10, 5)],
'Rack_2-1': [Point(0, 3), Point(10, 3)]} # 'Rack_3': [Point(0, 3), Point(10, 3)]}
# sensors = {'Sens_1': Point(1, 1),
# 'Sens_2': Point(2, 4),
# 'Sens_3': Point(9, 2)}
# distributors = {'Dist_1': Point(-1, 9),
# 'Dist_2': Point(11, 0)}
# an = Anlage(tol_snap=1)
# an.set_racks(racks)
# an.join_racks()
# an.add_sensors(sensors)
# an.add_distributors(distributors)
# an.connect_equipment_to_racks(an._sensors, an._sensor_onpoints)
# an.connect_equipment_to_racks(an._distributors, an._distributors_onpoints)
# plist1 = an.get_points_from_rack("Rack_1")
# plist2 = an.get_points_from_rack("Rack_2")
# self.assertEqual(plist1, [Point(0, 0), Point(0, 1), Point(0, 3), Point(0, 9), Point(0, 10)])
# self.assertEqual(plist2, [Point(10, -2), Point(10, 0), Point(10, 2), Point(10, 3), Point(10, 5)])
def test_add_equipment_w_tree_batch(self):
racks = {'Rack_1': [Point(0, 0), Point(0, 10)],
'Rack_2': [Point(10, -2), Point(10, 5)],
'Rack_3': [Point(0, 3), Point(10, 3)]}
sensors = {'Sens_1': Point(1, 1), sensors = {'Sens_1': Point(1, 1),
'Sens_2': Point(2, 4), 'Sens_2': Point(2, 4),
@@ -759,89 +877,179 @@ class TestLinesweep(unittest.TestCase):
distributors = {'Dist_1': Point(-1, 9), distributors = {'Dist_1': Point(-1, 9),
'Dist_2': Point(11, 0)} 'Dist_2': Point(11, 0)}
an = Anlage() an = Anlage(tol_snap=1)
an.set_racks(rack_segs) an.set_racks(racks)
an.join_racks an.join_racks()
an.add_sensors(sensors)
an.add_distributors(distributors)
an.connect_equipment_batch(an._sensors, an._sensor_onpoints)
an.connect_equipment_batch(an._distributors, an._distributors_onpoints)
plist1 = an.get_points_from_rack("Rack_1")
plist2 = an.get_points_from_rack("Rack_2")
G1 = nx.Graph() G1 = nx.Graph()
pos = an.generate_graph(G1) pos = an.generate_graph(G1)
nx.draw(G1, pos, with_labels=False, node_size=10, font_size=8) nx.draw(G1, pos, with_labels=False, node_size=10, font_size=8)
plt.show() plt.show()
an.add_sensors(sensors)
an.connect_sensors_to_racks()
G2 = nx.Graph()
pos = an.generate_graph(G2)
edge_colors = [G2[u][v].get('color', 'black') for u, v in G2.edges()]
nx.draw(G2, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
plt.show()
an.add_distributors(distributors) self.assertEqual(plist1, [Point(0, 0), Point(0, 1), Point(0, 3), Point(0, 9), Point(0, 10)])
an.connect_distributor_to_racks() self.assertEqual(plist2, [Point(10, -2), Point(10, 0), Point(10, 2), Point(10, 3), Point(10, 5)])
G3 = nx.Graph()
pos = an.generate_graph(G3)
edge_colors = [G3[u][v].get('color', 'black') for u, v in G3.edges()]
nx.draw(G3, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
plt.show()
def test_Wegsuche(self): # def test_wegsuche_w_tree(self):
''' Erstellt Graphen mit Racks, Sensoren und Unterverteilern und sucht kürzeste Wege von Unterverteiler zu zugehörigen Sensoren''' # racks = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
# 'Rack_2-0': [Point(10, -2), Point(10, 5)],
# 'Rack_2-1': [Point(0, 3), Point(10, 3)]}
rack_segs = {'Rack_1': [Point(0, 0), Point(0, 10)], # sensors = {'Sens_1': Point(1, 1),
'Rack_2': [Point(10, -2), Point(10, 5)], # 'Sens_2': Point(2, 4),
'Rack_3': [Point(0, 3), Point(10, 3)]} # 'Sens_3': Point(9, 2)}
sensors = {'Sens_1': Point(1, 1), # distributors = {'Dist_1': Point(-1, 9),
'Sens_2': Point(2, 4), # 'Dist_2': Point(11, 0)}
'Sens_3': Point(9, 2)}
distributors = {'Dist_1': Point(-1, 9), # mapping = {'Dist_1': ['Sens_1', 'Sens_2'],
'Dist_2': Point(11, 0)} # 'Dist_2': ['Sens_3']}
mapping = {'Dist_1': ['Sens_1', 'Sens_2'], # an = Anlage(tol_snap=1)
'Dist_2': ['Sens_3']} # an.set_racks(racks)
# an.join_racks()
# Erstelle Anlage # an.add_sensors(sensors)
an = Anlage(tol_snap=1) # an.add_distributors(distributors)
# Füge racks aus Daten hinzu # an.connect_equipment_to_racks(an._sensors, an._sensor_onpoints)
an.set_racks(rack_segs) # an.connect_equipment_to_racks(an._distributors, an._distributors_onpoints)
# Verbinde Racks miteinander (ggf. verlängere ungenaue Racks)
an.join_racks()
# Füge Sensoren als Knoten hinzu
an.add_sensors(sensors)
# Verbinde Sensoren mit deren naheliegendsten Racks
an.connect_sensors_to_racks()
# Füge UV hinzu
an.add_distributors(distributors)
# Verbinde UV mit deren naheliegendsten Racks
an.connect_distributor_to_racks()
# Verknüpfe Sensoren mit zugehörigem UV
an.map_distributors_to_sensors(mapping)
# Initialisiere Graph # an.map_distributors_to_sensors(mapping)
G3 = nx.Graph()
# Fülle eben erstellten Graphen mit Daten
pos = an.generate_graph(G3)
# Extrahiere Farb-Informationen der Kanten
edge_colors = [G3[u][v].get('color', 'black') for u, v in G3.edges()]
# Zeiche Graphen und zeige in
nx.draw(G3, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
plt.show()
# Ermittle kürzeste Wege von Unterverteilern zu zugehörigen Sensoren # G = nx.Graph()
paths = an.create_cable_paths(G3) # Fülle eben erstellten Graphen mit Daten
# pos = an.generate_graph(G)
# Extrahiere Farb-Informationen der Kanten
# edge_colors = [G[u][v].get('color', 'black') for u, v in G.edges()]
# Zeiche Graphen und zeige in
# nx.draw(G, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
# plt.show()
# Ermittle kürzeste Wege von Unterverteilern zu zugehörigen Sensoren
# paths = an.create_cable_paths(G)
# paths_by_id = {p['id']: p for p in paths["kabel"]}
self.assertEqual(paths['Dist_1-Sens_1']["path_coords"], [Point(-1, 9), Point(0, 9), Point(0, 3), Point(0, 1), Point(1, 1)]) # self.assertEqual(paths_by_id['Dist_1-Sens_1']["coords"], [{'x': -1.0, 'y': 9.0}, {'x': 0.0, 'y': 9.0}, {'x': 0.0, 'y': 3.0}, {'x': 0.0, 'y': 1.0}, {'x': 1.0, 'y': 1.0}])
self.assertEqual(paths['Dist_1-Sens_2']["path_coords"], [Point(-1, 9), Point(0, 9), Point(0, 3), Point(2, 3), Point(2, 4)]) # self.assertEqual(paths_by_id['Dist_1-Sens_2']["coords"], [{'x': -1.0, 'y': 9.0}, {'x': 0.0, 'y': 9.0}, {'x': 0.0, 'y': 3.0}, {'x': 2.0, 'y': 3.0}, {'x': 2.0, 'y': 4.0}])
self.assertEqual(paths['Dist_2-Sens_3']["path_coords"], [Point(11, 0), Point(10, 0), Point(10, 2), Point(9, 2)]) # self.assertEqual(paths_by_id['Dist_2-Sens_3']["coords"], [{'x': 11.0, 'y': 0.0}, {'x': 10.0, 'y': 0.0}, {'x': 10.0, 'y': 2.0}, {'x': 9.0, 'y': 2.0}])
self.assertEqual(paths['Dist_1-Sens_1']["path_length"], 10) # self.assertEqual(paths_by_id['Dist_1-Sens_1']["length"], 10)
self.assertEqual(paths['Dist_1-Sens_2']["path_length"], 10) # self.assertEqual(paths_by_id['Dist_1-Sens_2']["length"], 10)
self.assertEqual(paths['Dist_2-Sens_3']["path_length"], 4) # self.assertEqual(paths_by_id['Dist_2-Sens_3']["length"], 4)
# def test_generate_graph(self):
# '''Generiert einen Graphen in 3 unterschiedlichen Ausbaustufen (nur Racks, Racks+Sensoren, Racks+Sensoren+Unterverteiler)'''
# rack_segs = {'Rack_1-0': [Point(0, 0), Point(0, 10)],
# 'Rack_2-0': [Point(10, -2), Point(10, 5)],
# 'Rack_2-1': [Point(0, 3), Point(10, 3)]}
# sensors = {'Sens_1': Point(1, 1),
# 'Sens_2': Point(2, 4),
# 'Sens_3': Point(9, 2)}
# distributors = {'Dist_1': Point(-1, 9),
# 'Dist_2': Point(11, 0)}
# an = Anlage()
# an.set_racks(rack_segs)
# an.join_racks
# G1 = nx.Graph()
# pos = an.generate_graph(G1)
# nx.draw(G1, pos, with_labels=False, node_size=10, font_size=8)
# plt.show()
# an.add_sensors(sensors)
# an.connect_sensors_to_racks()
# G2 = nx.Graph()
# pos = an.generate_graph(G2)
# edge_colors = [G2[u][v].get('color', 'black') for u, v in G2.edges()]
# nx.draw(G2, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
# plt.show()
# an.add_distributors(distributors)
# an.connect_distributor_to_racks()
# G3 = nx.Graph()
# pos = an.generate_graph(G3)
# edge_colors = [G3[u][v].get('color', 'black') for u, v in G3.edges()]
# nx.draw(G3, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
# plt.show()
# def test_Wegsuche(self):
# ''' Erstellt Graphen mit Racks, Sensoren und Unterverteilern und sucht kürzeste Wege von Unterverteiler zu zugehörigen Sensoren'''
# rack_segs = {'Rack_1': [Point(0, 0), Point(0, 10)],
# 'Rack_2': [Point(10, -2), Point(10, 5)],
# 'Rack_3': [Point(0, 3), Point(10, 3)]}
# sensors = {'Sens_1': Point(1, 1),
# 'Sens_2': Point(2, 4),
# 'Sens_3': Point(9, 2)}
# distributors = {'Dist_1': Point(-1, 9),
# 'Dist_2': Point(11, 0)}
# mapping = {'Dist_1': ['Sens_1', 'Sens_2'],
# 'Dist_2': ['Sens_3']}
# Erstelle Anlage
# an = Anlage(tol_snap=1)
# Füge racks aus Daten hinzu
# an.set_racks(rack_segs)
# Verbinde Racks miteinander (ggf. verlängere ungenaue Racks)
# an.join_racks()
# Füge Sensoren als Knoten hinzu
# an.add_sensors(sensors)
# Verbinde Sensoren mit deren naheliegendsten Racks
# an.connect_sensors_to_racks()
# Füge UV hinzu
# an.add_distributors(distributors)
# Verbinde UV mit deren naheliegendsten Racks
# an.connect_distributor_to_racks()
# Verknüpfe Sensoren mit zugehörigem UV
# an.map_distributors_to_sensors(mapping)
# Initialisiere Graph
# G3 = nx.Graph()
# Fülle eben erstellten Graphen mit Daten
# pos = an.generate_graph(G3)
# Extrahiere Farb-Informationen der Kanten
# edge_colors = [G3[u][v].get('color', 'black') for u, v in G3.edges()]
# Zeiche Graphen und zeige in
# nx.draw(G3, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
# plt.show()
# Ermittle kürzeste Wege von Unterverteilern zu zugehörigen Sensoren
# paths = an.create_cable_paths(G3)
# paths_by_id = {p['id']: p for p in paths["kabel"]}
# self.assertEqual(paths_by_id['Dist_1-Sens_1']["coords"], [{'x': -1.0, 'y': 9.0}, {'x': 0.0, 'y': 9.0}, {'x': 0.0, 'y': 3.0}, {'x': 0.0, 'y': 1.0}, {'x': 1.0, 'y': 1.0}])
# self.assertEqual(paths_by_id['Dist_1-Sens_2']["coords"], [{'x': -1.0, 'y': 9.0}, {'x': 0.0, 'y': 9.0}, {'x': 0.0, 'y': 3.0}, {'x': 2.0, 'y': 3.0}, {'x': 2.0, 'y': 4.0}])
# self.assertEqual(paths_by_id['Dist_2-Sens_3']["coords"], [{'x': 11.0, 'y': 0.0}, {'x': 10.0, 'y': 0.0}, {'x': 10.0, 'y': 2.0}, {'x': 9.0, 'y': 2.0}])
# self.assertEqual(paths_by_id['Dist_1-Sens_1']["length"], 10)
# self.assertEqual(paths_by_id['Dist_1-Sens_2']["length"], 10)
# self.assertEqual(paths_by_id['Dist_2-Sens_3']["length"], 4)
if __name__ == '__main__': if __name__ == '__main__':
print(shapely.__file__)
print(shapely.__version__)
unittest.main() unittest.main()