Schalter --positions hinzugefügt, um die json Datei von getpositions.py einlesen zu können
This commit is contained in:
+116
-48
@@ -2,87 +2,155 @@ import os
|
||||
import sys
|
||||
import argparse
|
||||
from ioconverter import ExcelConverter
|
||||
import configparser
|
||||
import json
|
||||
|
||||
def prepare_data(rawdata:dict):
|
||||
sensors = rawdata["sensors"]
|
||||
dsensors = dict()
|
||||
lsensors = list()
|
||||
for sname, sdata in sensors.items():
|
||||
data = {
|
||||
"id": sdata.get("IO", ""),
|
||||
"bezeichnung": sdata.get("BEZEICHNUNG", ""),
|
||||
"verwendung": sdata.get("VERW", ""),
|
||||
"kennzeichnung": sdata.get("KENNZEICHNUNG", ""),
|
||||
"text_d": sdata.get("TEXT-D", ""),
|
||||
"text_e": sdata.get("TEXT-E", ""),
|
||||
"text_es": sdata.get("TEXT-ES", ""),
|
||||
"text_f": sdata.get("TEXT-F", ""),
|
||||
"sps": sdata.get("SPS", None),
|
||||
}
|
||||
reihenfolge = ["id", "bezeichnung", "verwendung", "kennzeichnung", "text_d", "text_e", "text_es", "text_f"]
|
||||
# CSV-String erzeugen
|
||||
csvstr = "','".join(str(data[key]) for key in reihenfolge)
|
||||
csvstr = "'"+csvstr+"'"
|
||||
|
||||
sps_nr = None
|
||||
if "SPS" in sdata:
|
||||
sps_nr = sdata.get("SPS", None)
|
||||
|
||||
if sps_nr:
|
||||
if sps_nr not in dsensors:
|
||||
dsensors[sps_nr] = list()
|
||||
dsensors[sps_nr].append(csvstr)
|
||||
else:
|
||||
lsensors.append(csvstr)
|
||||
|
||||
return (dsensors, lsensors)
|
||||
|
||||
|
||||
# Funktionen
|
||||
def load_json(jsonfilename):
|
||||
with open(jsonfilename, encoding='utf-8') as fh:
|
||||
return json.load(fh)
|
||||
|
||||
def check_file_in_work(work_dir, filename):
|
||||
fexists = True
|
||||
if not os.path.exists(filename):
|
||||
mypath = os.path.join(work_dir, filename)
|
||||
if not os.path.exists(mypath):
|
||||
fexists = False
|
||||
else:
|
||||
mypath = filename
|
||||
return (mypath, fexists)
|
||||
|
||||
# Helper für Export
|
||||
def do_export(mode_str, output_dir):
|
||||
def do_export(conv_obj:ExcelConverter, mode_str, output_dir, base_input, lines):
|
||||
# Für WSCAD Dateinamen anpassen (Export-Typ bleibt "WSCAD" oder "WSCAD mit Bezug")
|
||||
if mode_str == "WSCAD":
|
||||
export_type = "WSCAD" if args.no_bezug else "WSCAD mit Bezug"
|
||||
filename = f"{input_basename}_{'WSCAD_no_Bezug' if args.no_bezug else 'WSCAD'}.xlsx"
|
||||
filename = f"{base_input}_{'WSCAD_no_Bezug' if args.no_bezug else 'WSCAD'}.xlsx"
|
||||
else:
|
||||
export_type = mode_str
|
||||
filename = f"{input_basename}_{mode_str}.xlsx"
|
||||
filename = f"{base_input}_{mode_str}.xlsx"
|
||||
|
||||
if args.output and args.mode == mode_str:
|
||||
export_path = args.output
|
||||
else:
|
||||
export_path = os.path.join(output_dir, filename)
|
||||
|
||||
export_path = args.output if args.output and args.mode == mode_str else os.path.join(output_dir, filename)
|
||||
try:
|
||||
converter.export_excel(lines, export_type, export_path)
|
||||
conv_obj.export_excel(lines, export_type, export_path)
|
||||
print(f"Export '{export_type}' erfolgreich: {export_path}")
|
||||
except Exception as e:
|
||||
print(f"Fehler bei Export '{export_type}': {e}")
|
||||
|
||||
|
||||
def do_exports(export_mode, converter, output_dir, input_basename, lines):
|
||||
if export_mode:
|
||||
do_export(converter, export_mode, output_dir, input_basename, lines)
|
||||
else:
|
||||
# Kein Modus → alle drei exportieren
|
||||
do_export(converter, "EA", output_dir, input_basename, lines)
|
||||
do_export(converter, "TIA", output_dir, input_basename, lines)
|
||||
do_export(converter, "WSCAD", output_dir, input_basename, lines)
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Excel-Konverter für BMK-Daten")
|
||||
parser.add_argument("--mode", type=str, choices=["EA", "TIA", "WSCAD"],
|
||||
help="Art des Exports (EA, TIA, WSCAD). Wenn nicht gesetzt, werden alle drei erzeugt.")
|
||||
parser.add_argument("--input", type=str, required=True, help="Pfad zur Eingabedatei (.txt)")
|
||||
parser.add_argument("--input", type=str, help="Pfad zur Eingabedatei (.txt)")
|
||||
parser.add_argument("--positions", type=str, help="Json Datei von getpositions.py (.json)")
|
||||
parser.add_argument("--output", type=str, help="Pfad zur Zieldatei (.xlsx)")
|
||||
parser.add_argument("--no-bezug", action="store_true", help="(Nur bei WSCAD) Export ohne Bezugsinformationen")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
|
||||
|
||||
# Umgebungsvariablen
|
||||
work_dir = os.environ.get("PROJECT_WORK")
|
||||
config_dir = os.environ.get("PROJECT_CFG")
|
||||
|
||||
# Wenn Input Pfad kein absoluter Pfad, dann in work nach Dateinamen suchen
|
||||
if not os.path.isabs(args.input):
|
||||
if work_dir:
|
||||
args.input = os.path.join(work_dir, args.input)
|
||||
|
||||
# Converter initialisieren
|
||||
converter = ExcelConverter()
|
||||
output_dir = os.environ.get("PROJECT_WORK", os.getcwd())
|
||||
|
||||
# Konfigurationsdatei
|
||||
# config = configparser.ConfigParser(allow_no_value=True, delimiters=("="))
|
||||
# config.optionxform = lambda option: option # preserve case for letters
|
||||
# config.read(os.path.join(config_dir, "xxxx.cfg"))
|
||||
|
||||
# Datei einlesen
|
||||
try:
|
||||
with open(args.input, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen der Datei: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
# Converter initialisieren
|
||||
converter = ExcelConverter()
|
||||
input_basename = os.path.splitext(os.path.basename(args.input))[0]
|
||||
output_dir = os.environ.get("PROJECT_WORK", os.getcwd())
|
||||
|
||||
# Modus bestimmen
|
||||
export_mode = None
|
||||
if args.mode:
|
||||
export_mode = args.mode
|
||||
|
||||
if export_mode == "WSCAD":
|
||||
# WSCAD bleibt immer der Export-Typ
|
||||
export_type = "WSCAD" if args.no_bezug else "WSCAD mit Bezug"
|
||||
# Dateiname hängt vom --no-bezug-Flag ab
|
||||
filename_suffix = "WSCAD_no_Bezug" if args.no_bezug else "WSCAD"
|
||||
filename = f"{input_basename}_{filename_suffix}.xlsx"
|
||||
export_path = args.output if args.output else os.path.join(output_dir, filename)
|
||||
try:
|
||||
converter.export_excel(lines, export_type, export_path)
|
||||
print(f"Export {export_type} erfolgreich: {export_path}")
|
||||
except Exception as e:
|
||||
print(f"Fehler bei Export {export_type}: {e}")
|
||||
else:
|
||||
do_export(export_mode, output_dir)
|
||||
else:
|
||||
# Kein Modus → alle drei exportieren
|
||||
do_export("EA", output_dir)
|
||||
do_export("TIA", output_dir)
|
||||
do_export("WSCAD", output_dir)
|
||||
|
||||
# Datei einlesen
|
||||
if args.input:
|
||||
# Wenn Input Pfad kein absoluter Pfad, dann in work nach Dateinamen suchen
|
||||
if not os.path.isabs(args.input):
|
||||
if work_dir:
|
||||
args.input = os.path.join(work_dir, args.input)
|
||||
|
||||
input_basename = os.path.splitext(os.path.basename(args.input))[0]
|
||||
try:
|
||||
with open(args.input, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen der Datei: {e}")
|
||||
sys.exit(1)
|
||||
do_exports(export_mode, converter, output_dir, input_basename, lines)
|
||||
|
||||
elif args.positions:
|
||||
input_basename = os.path.splitext(os.path.basename(args.positions))[0]
|
||||
json_file = args.positions
|
||||
(json_path, dexists) = check_file_in_work(work_dir, json_file)
|
||||
if not dexists:
|
||||
print(f"file {json_file} does not exist")
|
||||
parser.print_help()
|
||||
exit()
|
||||
rawdata = load_json(json_path)
|
||||
(dsensors, lsensors) = prepare_data(rawdata)
|
||||
if len(dsensors) == 0:
|
||||
do_exports(export_mode, converter, output_dir, input_basename, lsensors)
|
||||
else:
|
||||
for sps_nr, lines in dsensors.items():
|
||||
name = f"{sps_nr}{input_basename}"
|
||||
do_exports(export_mode, converter, output_dir, name, lines)
|
||||
|
||||
else:
|
||||
parser.print_help()
|
||||
exit()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user