ErrorCollector standarisiert. Warnings werden von getpositions zur routing zu draw durchgereicht.

This commit is contained in:
2025-12-18 16:34:04 +01:00
parent a731889561
commit 9b9d3a8f7c
6 changed files with 235 additions and 28 deletions
+103 -9
View File
@@ -383,19 +383,33 @@ class ExcelConverter:
else:
raise ValueError("Unbekannter Export-Typ")
def export_excel(self, data, export_type, export_path):
def export_excel(self, data, export_type, export_path, getpos_errors=None, getpos_warnings=None):
"""
Wrapper, der aufgerufen wird und in sich die Aufbereitung der Daten und das Abspeichern als Excel abruft.
Args:
data: Die zu exportierenden Daten.
export_type (str): Art des Exports (EA, TIA, WSCAD).
export_path (str): Pfad zur Ausgabedatei.
getpos_errors (dict, optional): Fehler-Dictionary aus getpositions.py.
getpos_warnings (dict, optional): Warnungen-Dictionary aus getpositions.py.
"""
# Daten vorbereiten
dataframes = self._prep_data(data, export_type)
# Excel Datei schreiben und speichern
self._write_excel(dataframes, export_type, export_path)
def _write_excel(self, dataframes, export_type, export_path):
# Excel Datei schreiben und speichern
self._write_excel(dataframes, export_type, export_path, getpos_errors, getpos_warnings)
def _write_excel(self, dataframes, export_type, export_path, getpos_errors=None, getpos_warnings=None):
"""
Erzeugung der Excel-Datei im gewünschten Muster
Args:
dataframes: Die vorbereiteten DataFrames für den Export.
export_type (str): Art des Exports (EA, TIA, WSCAD).
export_path (str): Pfad zur Ausgabedatei.
getpos_errors (dict, optional): Fehler-Dictionary aus getpositions.py.
getpos_warnings (dict, optional): Warnungen-Dictionary aus getpositions.py.
"""
if export_type == "EA":
# Format für Simpel-Ausgabe
@@ -406,26 +420,32 @@ class ExcelConverter:
start_row = 0
df_eingaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row)
start_row += len(df_eingaenge) + 2 # Leerzeile dazwischen
# Ausgaenge direkt drunter schreiben (ohne Header)
df_ausgaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row, header=False)
# Duplikate und Errors
self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler)
# Fehler und Warnungen aus getpositions.py
self._write_getpositions_errors(writer, getpos_errors, getpos_warnings)
elif export_type == "TIA":
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = dataframes
with pd.ExcelWriter(export_path, engine='openpyxl', mode='w') as writer:
# 1. PLC Tags Sheet mit Header. Spalten: Name, Path, Data Type, Logical Address, Comment, Hmi Visible, Hmi Accessible, Hmi Writeable, Typeobject ID, Version ID
df_tags.to_excel(writer, sheet_name='PLC Tags', index=False)
# 2. Constants Sheet mit Header. Spalten: Name, Path, Data Type, Value, Comment
df_consts.to_excel(writer, sheet_name='Constants', index=False)
# Duplikate und Errors
self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler)
# Fehler und Warnungen aus getpositions.py
self._write_getpositions_errors(writer, getpos_errors, getpos_warnings)
elif export_type in ["WSCAD", "WSCAD mit Bezug"]:
df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes
@@ -470,6 +490,9 @@ class ExcelConverter:
# Duplikate und Errors
self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler)
# Fehler und Warnungen aus getpositions.py
self._write_getpositions_errors(writer, getpos_errors, getpos_warnings)
def _append_df(self, target_df, source_df, include_bezug=False):
"""
Hilfsfunktion, die Dataframes für WSCAD Export aneinander reiht und entweder Bezug inkludiert oder nicht
@@ -515,6 +538,77 @@ class ExcelConverter:
if not df_fehler.empty:
df_fehler.to_excel(writer, sheet_name='Fehler', index=False)
def _write_getpositions_errors(self, writer, errors_dict=None, warnings_dict=None):
"""
Schreibt Fehler und Warnungen aus getpositions.py in separate Excel-Sheets.
Diese Methode erstellt ähnliche Sheets wie in drawdxf.py für den getexdraw-Workflow.
Args:
writer (pd.ExcelWriter): Der Excel-Writer für die Ausgabedatei.
errors_dict (dict, optional): Dictionary mit Fehlern aus getpositions.
warnings_dict (dict, optional): Dictionary mit Warnungen aus getpositions.
"""
if not errors_dict and not warnings_dict:
return
# Sheet: ERR-Equipment-Connection (nur für ioconverter relevant)
if errors_dict:
errors_sensors = errors_dict.get('sensors_connection', [])
errors_dists = errors_dict.get('dists_connection', [])
if errors_sensors or errors_dists:
data = []
for error in errors_sensors:
data.append({
"Type": "Sensor / Actuator",
"ID": error['name'],
"x": int(error['coords']['x']),
"y": int(error['coords']['y'])
})
for error in errors_dists:
data.append({
"Type": "Subdistributor",
"ID": error['name'],
"x": int(error['coords']['x']),
"y": int(error['coords']['y'])
})
df = pd.DataFrame(data)
df.to_excel(writer, sheet_name='ERR-Equipment-Connection', index=False)
# Sheet: Duplicate IDs
errors_duplicates = errors_dict.get('duplicate_ids', {})
if errors_duplicates:
data = []
for id_name, positions in errors_duplicates.items():
for pos in positions:
data.append({
"ID": id_name,
"x": int(pos[0]),
"y": int(pos[1])
})
df = pd.DataFrame(data)
df.to_excel(writer, sheet_name='ERR-Duplicate-IDs', index=False)
# Sheet: Tunnel Errors
errors_tunnels = errors_dict.get('overdefined_tunnel', [])
if errors_tunnels:
df = pd.DataFrame({"Tunnel ID": errors_tunnels})
df.to_excel(writer, sheet_name='ERR-Tunnels', index=False)
# Sheet: Warnungen (fehlende Attribute)
if warnings_dict:
missing_attributes = warnings_dict.get('missing_attributes', {})
if missing_attributes:
data = []
for id_name, error_msg in missing_attributes.items():
data.append({
"ID": id_name,
"Error Detail": error_msg
})
df = pd.DataFrame(data)
df.to_excel(writer, sheet_name='WARN-Attributes', index=False)
def call_portal_to_excel(self, textlines, konvertierungsart):
ec = ExcelConverter()