import os import json import argparse import heapq import math import matplotlib.pyplot as plt import networkx as nx from shapely.geometry import LineString, Point from shapely.ops import nearest_points # Funktionen 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] 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)) return(rack_segments) 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))) 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.''' 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('-c', '--console', action='store_true', help='Ausgabe auf Konsole') args = parser.parse_args() # Umgebungsvariablen work_dir = os.environ.get("PROJECT_WORK") config_dir = os.environ.get("PROJECT_CFG") # Pfade zu JSON-Dateien jsonfilename = args.inputfile sensors_path = os.path.join(work_dir, jsonfilename) # Einlesen 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 ''' # 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. '''