Einlesen der Dateien in routing.py angepasst, sodass plant.py Daten verarbeiten kann.
This commit is contained in:
+80
-60
@@ -7,42 +7,92 @@ import matplotlib.pyplot as plt
|
||||
import networkx as nx
|
||||
from shapely.geometry import LineString, Point
|
||||
from shapely.ops import nearest_points
|
||||
from plant import Anlage
|
||||
|
||||
# Funktionen
|
||||
def load_json(jsonfilename):
|
||||
with open(jsonfilename, encoding='utf-8') as fh:
|
||||
return json.load(fh)
|
||||
|
||||
def rack_segmentation(racks):
|
||||
''' Racks werden zu LineString konvertiert. Racks bestehend aus Polylinine werden in einzelne Segmente zerlegt.'''
|
||||
rack_segments = []
|
||||
for rack_id, nodes in racks.items():
|
||||
# Sortiere Node_1, Node_2, ...
|
||||
sorted_keys = sorted(nodes.keys(), key=lambda k: int(k.split("_")[1]))
|
||||
coords = [tuple(nodes[k]) for k in sorted_keys]
|
||||
|
||||
def create_plant(racks:dict, sensors:dict, distributors:dict, mapping:dict):
|
||||
|
||||
# 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)]}
|
||||
|
||||
for i in range(len(coords) - 1):
|
||||
p1, p2 = coords[i], coords[i+1]
|
||||
line = LineString([p1, p2])
|
||||
rack_segments.append((rack_id, i, line))
|
||||
# sensors = {'Sens_1': Point(1, 1),
|
||||
# 'Sens_2': Point(2, 4),
|
||||
# 'Sens_3': Point(9, 2)}
|
||||
|
||||
return(rack_segments)
|
||||
# distributors = {'Dist_1': Point(-1, 9),
|
||||
# 'Dist_2': Point(11, 0)}
|
||||
|
||||
# mapping = {'Dist_1': ['Sens_1', 'Sens_2'],
|
||||
# 'Dist_2': ['Sens_3']}
|
||||
|
||||
def rack_endpoints(rack_segments)
|
||||
''' Endpunkte der Racks werden in Points konvertiert'''
|
||||
segment_endpoints = []
|
||||
for rack_id, idx, line in rack_segments:
|
||||
for pt in [line.coords[0], line.coords[1]]:
|
||||
segment_endpoints.append((rack_id, idx, Point(pt)))
|
||||
# "mapping": {
|
||||
# "UC0101": [
|
||||
# "BG3241",
|
||||
# "BG3240",
|
||||
# "MA0062",
|
||||
# "FC0062"
|
||||
# ]
|
||||
# }
|
||||
|
||||
an = Anlage()
|
||||
# Füge racks aus Daten hinzu
|
||||
an.set_racks(racks)
|
||||
# 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
|
||||
G = nx.Graph()
|
||||
# Fülle eben erstellten Graphen mit Daten
|
||||
an.generate_graph(G)
|
||||
|
||||
# Ermittle kürzeste Wege von Unterverteilern zu zugehörigen Sensoren
|
||||
paths = an.create_cable_paths(G)
|
||||
if args.graph:
|
||||
draw_graph(G,an)
|
||||
|
||||
return(segment_endpoints)
|
||||
|
||||
def pin_rack_endpoints(rack_segments, segment_endpoints)
|
||||
'''Erstellung eines Dicts, welches unter dem Key "Rack_id - Index" die Endpunkte der Racks speichert. Endpunkte von Racks innerhalb der Toleranz werden an nahegelegenes Rack gepinnt.'''
|
||||
def draw_graph(G:nx.Graph, an:Anlage):
|
||||
pos = an.get_node_positions()
|
||||
|
||||
edge_colors = [G[u][v].get('color', 'black') for u, v in G.edges()]
|
||||
|
||||
nx.draw(G, pos, with_labels=False, node_size=10, font_size=8, edge_color=edge_colors)
|
||||
plt.show()
|
||||
|
||||
def prepare_data(rawdata:dict):
|
||||
sensors = data["sensors"]
|
||||
subdists = data["distributors"]
|
||||
racks = data["racks"]
|
||||
mapping = data["mapping"]
|
||||
dracks = dict()
|
||||
for rname,lp in racks:
|
||||
if rname not in dracks:
|
||||
dracks[rname] = list()
|
||||
dracks[rname].append(Point(lp))
|
||||
|
||||
return (sensors, subdists, dracks, mapping)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Berechne Wege von Sensoren zu Verteilern über Kabeltrassen')
|
||||
parser.add_argument('-i', '--inputfile', action='store', required=True, default="easy_position.json", help='file with all informations about positions gathered from getpositions', metavar='my_positions.json')
|
||||
parser.add_argument('-f', '--filename', action='store', required=True, default="easy_position.json", help='file with all informations about positions gathered from getpositions', metavar='my_positions.json')
|
||||
parser.add_argument('-c', '--console', action='store_true', help='Ausgabe auf Konsole')
|
||||
parser.add_argument('-g', '--graph', action='store_true', help='Zeichnet den Graphen der Anlage')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@@ -51,50 +101,20 @@ if __name__ == "__main__":
|
||||
config_dir = os.environ.get("PROJECT_CFG")
|
||||
|
||||
# Pfade zu JSON-Dateien
|
||||
jsonfilename = args.inputfile
|
||||
jsonfilename = args.filename
|
||||
sensors_path = os.path.join(work_dir, jsonfilename)
|
||||
|
||||
# Einlesen
|
||||
rawdata = load_json(sensors_path)
|
||||
|
||||
(racks, sensors, subdists, mapping) = prepare_data(rawdata)
|
||||
|
||||
data = load_json(sensors_path)
|
||||
sensors = data["sensors"]
|
||||
subdists = data["distributors"]
|
||||
racks = data["racks"]
|
||||
|
||||
|
||||
# 1. Alle Kreuzungspunkte der Racks ermitteln
|
||||
''' Funktion linesweep_circle wird aufgerufen.
|
||||
Eingabe für Funktion: Nummerierte Racks aus getpositions.py. Reine Liste aus Koordinaten [((Anfang), (Ende)), ((Anfang), (Ende)), ... ] wird in Funktion erstellt
|
||||
Racks werden abgelaufen und tatsächliche Schnittpunkte sowie Nahezu-Schnitte erfasst.
|
||||
Ausgabe von Linesweep Circle: Liste von Endpunkten der Racks aus .dxf & Liste von SP von Rack_a mit Rack_b
|
||||
plant = create_plant(racks, sensors, subdists, mapping)
|
||||
|
||||
# Erstelle Anlage
|
||||
|
||||
|
||||
'''
|
||||
|
||||
# 2. Graph aus Racks erstellen
|
||||
''' Zunächst leeren Graph erstellen.
|
||||
Endpunkte der Racks wie in .dxf als Knoten hinzufügen. Kanten zwischen den Knoten ebenso hinzufügen.
|
||||
Mittels ausgabe von linesweep_cirle: weitere Knoten auf Kanten hinzufügen und graph vollständig verknüpfen
|
||||
|
||||
Frage: Problematisch, wenn Knoten sehr nahe beieinander liegen also teoretischen "Doppelt" sind? -> lieber Endpunkte von Racks, die über linesweep_circle gefunden werden überschreiben?
|
||||
|
||||
Zusätzlich: über shapely und distance funktion sämtliche Distanzen bestimmen und Graph gewichten
|
||||
'''
|
||||
|
||||
# 3. Sensoren mit nächstgelegenen Racks verknüpfen
|
||||
''' Für jeden Sensor: Sensor pos aus json zu Graph hinzufügen
|
||||
Für jeden Sensor: shapely.distance aufrufen und distance zu allen Racks bzw. Edges ermitteln. (if distance(a) > distance(b) -> Circle_methode um Sensor und Schnittpunkt zu Rack_b ermitteln)
|
||||
SP von Sensor mit Rack als Node hinzufügen und Connection zwischen Sensor, Node, Edge herstellen
|
||||
'''
|
||||
|
||||
# 4. Unterverteiler mit nächstegelegenen Racks verknüpfen
|
||||
''' siehe 3.
|
||||
'''
|
||||
|
||||
# 5. Bestimmung des küzesten Wegs
|
||||
''' über Graphen-Toolbox z.B. nx wird für jeden Knoten zu dessen zugehörigen Unterverteilung der kürzeste Weg gefunden.
|
||||
Schreiben der Ergebnisse in eine seperate kabel.json z.B.
|
||||
'''
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user