100 lines
4.1 KiB
Python
100 lines
4.1 KiB
Python
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.
|
|
'''
|
|
|
|
|
|
|