ErrorCollector standarisiert. Warnings werden von getpositions zur routing zu draw durchgereicht.
This commit is contained in:
+103
-9
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user