ANpassung der Ausgabe todraw.json, sodass Fehler in Excel -Ausgabe besser ausgegeben werden können. 2 neue Worksheets in Excel Ausgabe angefügt(Auflistung von Fehlgeschlagener Anbindung + Auflistung von Routingfelern mit Grund

This commit is contained in:
2025-06-04 08:54:18 +02:00
parent 86d209b428
commit 4b1002ff7e
3 changed files with 70 additions and 15 deletions
+56 -10
View File
@@ -29,12 +29,24 @@ class Polyline:
def to_tuple(self):
ret = list()
for p in self.coords:
ret.append( (p.x,p.y) )
ret.append( (p.x, p.y) )
return ret
@dataclass
class Error_Connection:
name: str
coords: Point
@dataclass
class Error_Routing:
unterverteiler: str
sensoren: List[str]
@dataclass
class Polylines:
kabel: List[Polyline]
errors_routing: List[Error_Routing]
errors_sensors: List[Error_Connection]
errors_dists: List[Error_Connection]
def add_polyline(msp, points:Polyline, dxf_attribs):
@@ -73,9 +85,10 @@ def copy_layers_into_new(originaldxf, outpath, plines):
quelle = ezdxf.readfile(originaldxf)
ziel = ezdxf.new('R2018', setup=True)
create_cables(plines, ziel)
copy_layers_into_dxf_by_filter(quelle, ziel)
create_cables(plines, quelle)
ziel.saveas(out_path)
print("done")
@@ -134,7 +147,40 @@ def write_excel_from_json(plines:Polylines, outpath:str):
for rlength in sorted(length_summary):
ws2.append([int(rlength), length_summary[rlength]])
# Worksheet 3 - Nicht an Racks gekoppeltes Equipment
ws3 = wb.create_sheet("Equipment nicht angebunden")
ws3.append(["Typ", "Name", "x", "y"])
for error in plines.errors_sensors:
ws3.append(["Sensor / Aktor", error.name, error.coords.x, error.coords.y])
for error in plines.errors_dists:
ws3.append(["Unterverteiler", error.name, error.coords.x, error.coords.y])
# Worksheet 4 - Fehlgeschlagenes Routing
ws4 = wb.create_sheet("Routingfehler")
ws4.append(["Unterverteiler", "Sensor- / Aktorname", "Grund"])
nicht_angebunden = set(e.name for e in plines.errors_sensors + plines.errors_dists)
for routing_error in plines.errors_routing:
uv = routing_error.unterverteiler
uv_nicht_angebunden = uv in nicht_angebunden
for sensor in routing_error.sensoren:
sensor_nicht_angebunden = sensor in nicht_angebunden
if sensor_nicht_angebunden and uv_nicht_angebunden:
grund = "Sensor und Unterverteiler nicht angebunden"
elif sensor_nicht_angebunden:
grund = "Sensor / Aktor nicht angebunden"
elif uv_nicht_angebunden:
grund = "Unterverteiler nicht angebunden"
else:
grund = "Fehlgeschlagenes Routing trotz Anbindung"
ws4.append([uv, sensor, grund])
wb.save(outpath)
@@ -291,8 +337,8 @@ def copy_layers_into_dxf_by_filter(dxf_source: ezdxf.document.Drawing, dxf_targe
for ins in msp_source.query("INSERT"):
new_ins = ins.copy()
msp_target.add_entity(new_ins)
'''
# 4. Filter-Layernamen bestimmen
for layername in layernames:
@@ -313,13 +359,13 @@ def copy_layers_into_dxf_by_filter(dxf_source: ezdxf.document.Drawing, dxf_targe
for entity in entities:
msp_target.add_entity(entity.copy())
texts_source = collect_text_entities(msp_source)
texts_target = collect_text_entities(msp_target)
# texts_source = collect_text_entities(msp_source)
# texts_target = collect_text_entities(msp_target)
compare_texts(texts_source, texts_target)
# compare_texts(texts_source, texts_target)
used_block_names = set(insert.dxf.name for insert in dxf_source.modelspace().query("INSERT"))
compare_blocks(dxf_source, dxf_target, used_block_names)
# used_block_names = set(insert.dxf.name for insert in dxf_source.modelspace().query("INSERT"))
# compare_blocks(dxf_source, dxf_target, used_block_names)
if __name__ == '__main__':
+13 -4
View File
@@ -483,13 +483,13 @@ class Anlage():
Eingabe: Dict des Equipments ({'Name': Point}), Dict der Aufpunkte von Sensoren o. Dists (zu Beginn leer)
Rückgabe: Liste der nicht mit Racks verbundenen Geräte (z.B. Entfernung zu groß)
'''
errors = []
errors = list()
for name, pos in equipment.items():
try:
onpoint, rackname = self.find_nearest_rack_from_point_STR_bbox(self._tol_connect, pos)
onpoints[name] = (onpoint, rackname)
except LookupError:
errors.append((name, (pos.x, pos.y))) # Name des fehlgeschlagenenen und Position als Koodinaten zurückgeben
errors.append({"name": name, "coords": {"x":pos.x, "y":pos.y}}) # Name des fehlgeschlagenenen und Position als Koodinaten zurückgeben
continue
self.add_point_to_rack(onpoint, rackname)
@@ -586,12 +586,15 @@ class Anlage():
def create_cable_paths(self, G) -> dict:
pfade = dict()
pfade["kabel"] = list()
pfade["errors_routing"] = list() # Fehler Liste für fehlgeschlagene Kabelverbindungen
pfade["errors_routing"] = dict()
routing_errors = dict() # Fehler Liste für fehlgeschlagene Kabelverbindungen
for sname, dname in self._sensor2dist.items():
try:
pfad_nodes, pfad_length = self.create_cable_path(G, sname, dname)
except:
pfade["errors_routing"].append((sname, dname))
if dname not in routing_errors:
routing_errors[dname] = list()
routing_errors[dname].append(sname)
continue
pfad_coords = self._nodeids.get_points(pfad_nodes)
@@ -609,6 +612,12 @@ class Anlage():
pfade["kabel"].append(ld)
lOfDistErrors = list() # sammeln wo keine Verbindung zwischen Dist und Senor möglich war
for dname,lofSensornamen in routing_errors.items():
lOfDistErrors.append({"unterverteiler":dname, "sensoren":lofSensornamen})
pfade["errors_routing"] = lOfDistErrors
return pfade
def show_node_ids(self):
+1 -1
View File
@@ -94,7 +94,7 @@ def create_plant(racks:dict, sensors:dict, distributors:dict, mapping:dict, tunn
paths['errors_sensors'] = errors_sensors # Sensoren die nicht zu Racks verbunden werden konnten
paths['errors_dists'] = errors_dists # Distributoren, die nicht zu Racks verbunden werden konnten
paths['errors_tunnels'] = errors_tunnels # Tunnel, die nicht zu Racks verbunden werden konnten
# paths['errors_routing'] # Knoten des Graphen, die nicht verbunden werden konnten (Ausgabe wird in create_vable_paths() erstellt)
# paths['errors_routing'] # Knoten des Graphen, die nicht verbunden werden konnten (Ausgabe wird in create_cable_paths() erstellt)
return paths