Alle Programme so weit angepasst, dass Programmkette läuft.

This commit is contained in:
2025-05-20 15:34:29 +02:00
parent a48c39018c
commit bf6cb53c2e
6 changed files with 6764 additions and 15624 deletions
+3 -2
View File
@@ -109,14 +109,15 @@
}, },
{ {
"name": "routing for easy_positions.json", "name": "routing for easy.json",
"type": "debugpy", "type": "debugpy",
"request": "launch", "request": "launch",
"program": "${file}", "program": "${file}",
"console": "integratedTerminal", "console": "integratedTerminal",
"args": [ "args": [
"--filename", "--filename",
"easy_positions.json" "easy.json",
"-g"
] ]
} }
] ]
+1 -1
View File
@@ -12,4 +12,4 @@ for /F %%i in ("%1") do set FILENAME=%%~ni
getpositions.bat --filename %1 -s -r -w %1 getpositions.bat --filename %1 -s -r -w %1
routing.bat --filename %FILENAME%.json -w todraw.json routing.bat --filename %FILENAME%.json -w todraw.json
REM draw.bat --filename todraw.json --new -o %FILENAME%_cables.dxf draw.bat --filename todraw.json --new %FILENAME%_cables.dxf
+5 -5
View File
@@ -84,14 +84,14 @@ def check_file_in_work(work_dir, filename):
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description='draws a dxf file with the given cable coordinates', prog='drawdxf') parser = argparse.ArgumentParser(description='draws a dxf file with the given cable coordinates', prog='drawdxf')
parser.add_argument('-j', '--jsonfile', action='store', required=True, help='this json file contains all cables and its coordinates which should be drawn. Saved with an unique timestamp', metavar='myfile.json') parser.add_argument('-f', '--filename', action='store', required=True, help='this json file contains all cables and its coordinates which should be drawn. Saved with an unique timestamp', metavar='myfile.json')
parser.add_argument('-d', '--dxf', action='store', help='this dxf drawing will be copied and the new layer with the cables will be added', metavar='myfile.dxf') parser.add_argument('-d', '--dxf', action='store', help='this dxf drawing will be copied and the new layer with the cables will be added', metavar='myfile.dxf')
parser.add_argument('-n', '--new', action='store_true', help='create a new dxf file with cables in it. Name is basename and a timtestamp') parser.add_argument('-n', '--new', action='store', help='create a new dxf file with cables in it. Name is basename and a timtestamp')
args = parser.parse_args() args = parser.parse_args()
work_dir = os.fspath(os.environ.get('PROJECT_WORK')) work_dir = os.fspath(os.environ.get('PROJECT_WORK'))
jfile = args.jsonfile jfile = args.filename
(json_path, jexists) = check_file_in_work(work_dir, jfile) (json_path, jexists) = check_file_in_work(work_dir, jfile)
if not jexists: if not jexists:
print("file %s does not exit", jfile) print("file %s does not exit", jfile)
@@ -112,8 +112,8 @@ if __name__ == '__main__':
# erzeuge eine neue dxf Datei mit aktuellen Zeitstempel im Namen # erzeuge eine neue dxf Datei mit aktuellen Zeitstempel im Namen
#basename = os.path.splitext(dxf_path)[0] #basename = os.path.splitext(dxf_path)[0]
#timestamp = datetime.now().strftime(basename+"_%Y%m%d-%H%M%S.dxf") #timestamp = datetime.now().strftime(basename+"_%Y%m%d-%H%M%S.dxf")
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S.dxf") #timestamp = datetime.now().strftime("%Y%m%d-%H%M%S.dxf")
out_path = os.path.join(work_dir, timestamp) out_path = os.path.join(work_dir, args.new)
res_pos = new_dxf(json_path, out_path) res_pos = new_dxf(json_path, out_path)
+29 -17
View File
@@ -6,7 +6,7 @@ from collections import defaultdict
import bisect import bisect
import networkx as nx import networkx as nx
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from itertools import pairwise, combinations from itertools import pairwise, combinations, permutations
import re import re
class PointSorter: class PointSorter:
@@ -108,10 +108,9 @@ class NodeIDs():
def show(self): def show(self):
return self._id2cord return self._id2cord
class RackIDs(): class RackIDs():
def __init__(self, racks=dict(), tol_snap = 1): def __init__(self, tol_snap = 200):
self._point2rack = dict() self._point2rack = dict()
self._rack2begend = dict() self._rack2begend = dict()
self.add_racks(racks)
# Toleranzen zur Rack anbindung aneinander (Rack Snap) # Toleranzen zur Rack anbindung aneinander (Rack Snap)
self._tol_snap = tol_snap self._tol_snap = tol_snap
@@ -192,15 +191,21 @@ class RackIDs():
self.add_point_to_rack(inter, rnames[l1]) self.add_point_to_rack(inter, rnames[l1])
self.add_point_to_rack(inter, rnames[l2]) self.add_point_to_rack(inter, rnames[l2])
for (l1, l2) in combinations(allracks,2): for (l1, l2) in permutations(allracks,2):
first = Point(l2.coords[0]) first = Point(l2.coords[0])
last = Point(l2.coords[1]) last = Point(l2.coords[1])
if l1.distance(first) <= self._tol_snap: if l1.distance(first) <= self._tol_snap:
snap_point = l1.interpolate(l1.project(first)) snap_point = l1.interpolate(l1.project(first))
self.add_point_to_rack(snap_point, rnames[l1]) self.add_point_to_rack(snap_point, rnames[l1])
# Füge zusätzliches Rack als Verbindung zwischen Endpunkt und snap_point ein
connrackname = f"c-{rnames[l2]}"
self.add_rack(first, snap_point, connrackname)
if l1.distance(last) <= self._tol_snap: if l1.distance(last) <= self._tol_snap:
snap_point = l1.interpolate(l1.project(last)) snap_point = l1.interpolate(l1.project(last))
self.add_point_to_rack(snap_point, rnames[l1]) self.add_point_to_rack(snap_point, rnames[l1])
# Füge zusätzliches Rack als Verbindung zwischen Endpunkt und snap_point ein
connrackname = f"c-{rnames[l2]}"
self.add_rack(last, snap_point, connrackname)
def rack_is_horizontal(self, name): def rack_is_horizontal(self, name):
[pa, pe] = self._rack2begend[name] [pa, pe] = self._rack2begend[name]
@@ -260,9 +265,9 @@ class Anlage():
""" """
def __init__(self, tol_snap=200, snap_step=10, tol_connect=2, tol_connect_step=0.5): def __init__(self, tol_snap=200, snap_step=10, tol_connect=1000, tol_connect_step=50):
# Container für alle Racks # Container für alle Racks
self._racks = RackIDs() self._racks = RackIDs(tol_snap=tol_snap)
# zuordnung zwischen KnotenID und Punkt # zuordnung zwischen KnotenID und Punkt
self._nodeids = NodeIDs() self._nodeids = NodeIDs()
# Container für alle Sensoren # Container für alle Sensoren
@@ -282,7 +287,6 @@ class Anlage():
# Infos zum zeichnen des Graphen # Infos zum zeichnen des Graphen
self._node_positions = dict() self._node_positions = dict()
def set_racks(self, racks:dict[str, list[Point]]): def set_racks(self, racks:dict[str, list[Point]]):
r""" r"""
Fügt racks aus eingelsener Datei zu Anlage hinzu. Fügt racks aus eingelsener Datei zu Anlage hinzu.
@@ -348,7 +352,7 @@ class Anlage():
def connect_sensors_to_racks(self): def connect_sensors_to_racks(self):
for sname, pos in self._sensors.items(): for sname, pos in self._sensors.items():
rack_borders = self._racks.get_racks_borders() rack_borders = self._racks.get_racks_borders()
onpoint, rack_name = self.find_nearest_rack_from_point(2, 0.5, pos, rack_borders) onpoint, rack_name = self.find_nearest_rack_from_point(self._tol_connect, self._connect_step, pos, rack_borders)
self._sensor_onpoints[sname] = (onpoint, rack_name) self._sensor_onpoints[sname] = (onpoint, rack_name)
self.add_point_to_rack(onpoint, rack_name) self.add_point_to_rack(onpoint, rack_name)
# Füge "virtuelle Racks" von Sensor zu Aufpunkt von Sensor auf Rack hinzu. # Füge "virtuelle Racks" von Sensor zu Aufpunkt von Sensor auf Rack hinzu.
@@ -576,12 +580,17 @@ class Anlage():
def create_cable_paths(self, G): def create_cable_paths(self, G):
pfade = dict() pfade = dict()
pfade["kabel"] = list()
for sname, dname in self._sensor2dist.items(): for sname, dname in self._sensor2dist.items():
pfad_nodes, pfad_length = self.create_cable_path(G, sname, dname) pfad_nodes, pfad_length = self.create_cable_path(G, sname, dname)
pfad_coords = self._nodeids.get_points(pfad_nodes) pfad_coords = self._nodeids.get_points(pfad_nodes)
pfade[f"{dname}-{sname}"] = {"path_nodes": pfad_nodes, tuplecoords = [(p.x, p.y) for p in pfad_coords]
"path_coords": pfad_coords, ld = dict()
"path_length": pfad_length} ld['id'] = f"{dname}-{sname}"
ld["coords"]= [{"x":round(p.x,1), "y":round(p.y,1)} for p in pfad_coords]
ld["length"]= round(pfad_length,1)
ld["nodes"]=pfad_nodes
pfade["kabel"].append(ld)
return pfade return pfade
@@ -645,16 +654,17 @@ class TestLinesweep(unittest.TestCase):
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() 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
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)])
@@ -666,7 +676,8 @@ class TestLinesweep(unittest.TestCase):
'Rack_2-1': [Point(0, 10), Point(5, 10)]} 'Rack_2-1': [Point(0, 10), Point(5, 10)]}
point2rack = RackIDs(res_rack_seg) point2rack = RackIDs()
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"])
@@ -681,7 +692,8 @@ class TestLinesweep(unittest.TestCase):
'Rack_2-1': [Point(0, 10), Point(5, 10)]} 'Rack_2-1': [Point(0, 10), Point(5, 10)]}
point2rack = RackIDs(res_rack_seg) point2rack = RackIDs()
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)])
@@ -757,7 +769,7 @@ class TestLinesweep(unittest.TestCase):
rack_segs = {'Rack_1': [Point(0, 0), Point(0, 10)], rack_segs = {'Rack_1': [Point(0, 0), Point(0, 10)],
'Rack_2': [Point(10, -2), Point(10, 5)], 'Rack_2': [Point(10, -2), Point(10, 5)],
'Rack_2': [Point(0, 3), Point(10, 3)]} '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),
@@ -770,7 +782,7 @@ class TestLinesweep(unittest.TestCase):
'Dist_2': ['Sens_3']} 'Dist_2': ['Sens_3']}
# Erstelle Anlage # Erstelle Anlage
an = Anlage() an = Anlage(tol_snap=1)
# Füge racks aus Daten hinzu # Füge racks aus Daten hinzu
an.set_racks(rack_segs) an.set_racks(rack_segs)
# Verbinde Racks miteinander (ggf. verlängere ungenaue Racks) # Verbinde Racks miteinander (ggf. verlängere ungenaue Racks)
+24 -9
View File
@@ -85,21 +85,36 @@ def draw_graph(G:nx.Graph, an:Anlage):
edge_colors = [G[u][v].get('color', 'black') for u, v in G.edges()] 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) nx.draw(G, pos, with_labels=True, node_size=10, font_size=8, edge_color=edge_colors, node_color='none')
nx.draw_networkx_nodes(G, pos, linewidths= 0.5, edgecolors = 'red', node_color = 'none')
plt.show() plt.show()
def prepare_data(rawdata:dict): def prepare_data(rawdata:dict):
sensors = rawdata["sensors"] sensors = rawdata["sensors"]
dsensors = dict()
for sname, sdata in sensors.items():
dsensors[sname] = Point(sdata["pos"])
subdists = rawdata["distributors"] subdists = rawdata["distributors"]
dsubdists = dict()
for dname, pos in subdists.items():
dsubdists[dname] = Point(pos)
racks = rawdata["racks"] racks = rawdata["racks"]
mapping = rawdata["mapping"]
dracks = dict() dracks = dict()
for rname,lp in racks: for rname,lp in racks.items():
if rname not in dracks: # if rname not in dracks:
dracks[rname] = list() # dracks[rname] = list()
dracks[rname].append(Point(lp)) # dracks[rname].append(Point(lp))
ltemp = list()
for p in lp:
ltemp.append(Point(p))
dracks[rname] = ltemp
mapping = rawdata["mappings"]
return (sensors, subdists, dracks, mapping)
return (dracks, dsensors, dsubdists, mapping)
if __name__ == "__main__": if __name__ == "__main__":
@@ -130,8 +145,8 @@ if __name__ == "__main__":
# Ausgabe schreiben # Ausgabe schreiben
if args.write: if args.write:
basename = os.path.splitext(args.write)[0] basename = os.path.splitext(args.write)[0]
write_results(to_json(cable_paths), work_dir, f"{basename}.json") write_results(to_json(cable_paths), work_dir, f"{basename}.json")
+6702 -15590
View File
File diff suppressed because it is too large Load Diff