diff --git a/lib/portalexport.py b/lib/portalexport.py index 3b210d0..08f3fc1 100644 --- a/lib/portalexport.py +++ b/lib/portalexport.py @@ -254,7 +254,7 @@ class ExcelConverter: 'Name': name, 'NameOriginal': bmk_zahl_raw, 'NameConstant': name_constant, - 'Kommentar': "Fehlerhafte BMK", # Zeile von Lorenz eingefügt, da sonst pandas mit Fehler, da kein Kommentar + 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", # Zeile von Lorenz eingefügt, da sonst pandas mit Fehler, da kein Kommentar 'Zahl': i, # Original PowerShell uses 'i' for Zahl in Fehler, not bmk_numeric 'Zeile': i }) @@ -398,7 +398,7 @@ class ExcelConverter: ausgaenge.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) else: name = bmk_formatted - fehler.append({'Name': name, 'Kommentar': kommentar, 'Zeile': i, 'Bezug': bezug}) + fehler.append({'Name': name, 'Kommentar': f"Fehlerhafte BMK '{bmk_zahl_raw}'", 'Zeile': i, 'Bezug': bezug}) eingaenge = self._anschluesse_ergaenzen(eingaenge) ausgaenge = self._anschluesse_ergaenzen(ausgaenge) @@ -459,19 +459,8 @@ class ExcelConverter: # Ausgaenge direkt drunter schreiben (ohne Header) df_ausgaenge.to_excel(writer, sheet_name='Ein-, Ausgaenge', index=False, startrow=start_row, header=False) - # Sheet mit Duplikaten - start_row = 0 - # Gleiche Eingänge - if not df_gleiche_eingaenge.empty: - df_gleiche_eingaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row) - start_row += len(df_gleiche_eingaenge) + 2 # Leerzeile - # Gleiche Ausgänge - if not df_gleiche_ausgaenge.empty: - df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False) - - # Fehler in eigenem Sheet - if not df_fehler.empty: - df_fehler.to_excel(writer, sheet_name='Fehler', index=False) + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) elif export_type == "TIA": df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_consts, df_tags = dataframes @@ -483,20 +472,9 @@ class ExcelConverter: # 2. 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) - # Duplikate in "Duplikate" Sheet - start_row = 0 - if not df_gleiche_eingaenge.empty or not df_gleiche_ausgaenge.empty: - # Gleiche Eingänge - if not df_gleiche_eingaenge.empty: - df_gleiche_eingaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row) - start_row += len(df_gleiche_eingaenge) + 2 - # Gleiche Ausgänge - if not df_gleiche_ausgaenge.empty: - df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False) + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) - # Fehler in eigenem Sheet - if not df_fehler.empty: - df_fehler.to_excel(writer, sheet_name='Fehler', index=False) elif export_type == "WSCAD": df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes @@ -525,8 +503,12 @@ class ExcelConverter: with pd.ExcelWriter(export_path, engine="openpyxl") as writer: df_result.to_excel(writer, index=False, sheet_name="WSCAD") + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) + elif export_type == "WSCAD mit Bezug": + df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = dataframes # Basis-Template @@ -547,13 +529,15 @@ class ExcelConverter: ] ) - df_result = self._append_df(df_result, df_fehler) - df_result = self._append_df(df_result, df_eingaenge) - df_result = self._append_df(df_result, df_ausgaenge) + df_result = self._append_df(df_result, df_fehler, include_bezug=True) + df_result = self._append_df(df_result, df_eingaenge, include_bezug=True) + df_result = self._append_df(df_result, df_ausgaenge, include_bezug=True) with pd.ExcelWriter(export_path, engine="openpyxl") as writer: df_result.to_excel(writer, index=False, sheet_name="WSCAD") - + # Duplikate und Errors + self._write_duplicates_errors(writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler) + 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 @@ -563,7 +547,7 @@ class ExcelConverter: "Anschluss": source_df["Name"], "Kommentar": source_df["Kommentar"], "Symboltext": "", - "Bezug": source_df["Bezug"] if include_bezug else "", + "Bezug": source_df["Bezug"].apply(lambda x: f"'{x}" if pd.notna(x) else "") if include_bezug else "", "Sondertext 1": "", "Sondertext 2": "", "Sondertext 3": "", @@ -576,6 +560,30 @@ class ExcelConverter: tmp = pd.DataFrame(data) return pd.concat([target_df, tmp], ignore_index=True) + def _write_duplicates_errors(self, writer, df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler): + """ + Schreibt optional die Sheets 'Duplikate' und 'Fehler', falls Inhalte vorhanden sind. + """ + # Bezug-Spalte für Excel Darstellung vorbereiten + for df in [df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler]: + if "Bezug" in df.columns: + df["Bezug"] = df["Bezug"].apply(lambda x: f"'{x}" if pd.notnull(x) else x) + + + # Duplikate-Sheet + if not df_gleiche_eingaenge.empty or not df_gleiche_ausgaenge.empty: + start_row = 0 + if not df_gleiche_eingaenge.empty: + df_gleiche_eingaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row) + start_row += len(df_gleiche_eingaenge) + 2 # Abstand + if not df_gleiche_ausgaenge.empty: + df_gleiche_ausgaenge.to_excel(writer, sheet_name='Duplikate', index=False, startrow=start_row, header=False) + + # Fehler-Sheet + if not df_fehler.empty: + df_fehler.to_excel(writer, sheet_name='Fehler', index=False) + + class IOConverterApp: def __init__(self, master): self.master = master @@ -1147,10 +1155,10 @@ class TestPlant(unittest.TestCase): df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "Simpel") - print("\n Eingänge:\n") - print(df_eingaenge) - print("\n Ausgänge:\n") - print(df_ausgaenge) + # print("\n Eingänge:\n") + # print(df_eingaenge) + # print("\n Ausgänge:\n") + # print(df_ausgaenge) # print("\n gleiche Eingänge:\n") # print(df_gleiche_eingaenge) @@ -1162,8 +1170,6 @@ class TestPlant(unittest.TestCase): self.assertEqual(len(df_eingaenge), 4 - len(df_gleiche_eingaenge)) # 4 Eingänge in Liste, einer davon als Duplikat self.assertEqual(len(df_ausgaenge), 5 - len(df_gleiche_ausgaenge)) # 5 Ausgänge in Liste, einer davon Duplikat - - def test_TIA(self): textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' 'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' @@ -1219,10 +1225,10 @@ class TestPlant(unittest.TestCase): df_gleiche_eingaenge, df_gleiche_ausgaenge, df_fehler, df_eingaenge, df_ausgaenge = call_portal_to_excel(self, textarray, "WSCAD mit Bezug") - # print("\n Eingänge:\n") - # print(df_eingaenge) - # print("\n Ausgänge:\n") - # print(df_ausgaenge) + print("\n Eingänge:\n") + print(df_eingaenge) + print("\n Ausgänge:\n") + print(df_ausgaenge) # print("\n Fehler") # print(df_fehler) @@ -1243,7 +1249,7 @@ if __name__ == "__main__": runner = unittest.TextTestRunner() runner.run(suite) - export_type_arr = ("Simpel", "TIA", "WSCAD", "WSCAD mit Bezug") # oder "WSCAD", etc. + export_type_arr = ("Simpel", "TIA", "WSCAD", "WSCAD mit Bezug") textlines = """'DI0023','STEUERSPANNUNG 24V UC200 OK','24V OK','=A01+UH000-KF02i','STEUERSPANNUNG 24V UC200 OK','CONTROL VOLTAGE 24V UC200 OK','TENSION DE MANIOBRA 24V UC200 OK','' 'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK','' 'DI0020','STEUERSPANNUNG 24V UH000 OK','24V OK UH000','=A01+UH000-KF02i','STEUERSPANNUNG 24V UH000 OK','CONTROL VOLTAGE 24V UH000 OK','TENSION DE MANIOBRA 24V UH000 OK',''