diff --git a/CAD/Code/bin/create_assemblies.bat b/CAD/Code/bin/create_assemblies.bat new file mode 100644 index 0000000..68992d6 --- /dev/null +++ b/CAD/Code/bin/create_assemblies.bat @@ -0,0 +1,10 @@ +@echo off +REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt + +call setenv.bat + +REM Beispielaufruf mit Parametern: +REM --in: Ordner mit .par-Dateien +REM --out: Zielverzeichnis (optional) + +python %PROJECT_LIB%\create_assemblies.py %* \ No newline at end of file diff --git a/CAD/Code/bin/get_cmd.bat b/CAD/Code/bin/get_cmd.bat new file mode 100644 index 0000000..4dab2dd --- /dev/null +++ b/CAD/Code/bin/get_cmd.bat @@ -0,0 +1,4 @@ +@echo off +call setenv.bat +start + diff --git a/CAD/Code/bin/setenv.bat b/CAD/Code/bin/setenv.bat new file mode 100644 index 0000000..51f2be7 --- /dev/null +++ b/CAD/Code/bin/setenv.bat @@ -0,0 +1,13 @@ +@echo off +REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt +pushd %~dp0\.. + +set PROJECT_DIR=%cd% + +set PROJECT_LIB=%PROJECT_DIR%\lib +set PROJECT_WORK=%PROJECT_DIR%\work +set PROJECT_DATA=%PROJECT_DIR%\data +set PROJECT_INPUT=%PROJECT_DIR%\input + +popd +goto :eof \ No newline at end of file diff --git a/CAD/Code/data/dummy.asm b/CAD/Code/data/dummy.asm new file mode 100644 index 0000000..e651758 Binary files /dev/null and b/CAD/Code/data/dummy.asm differ diff --git a/CAD/Code/data/dummy.cfg b/CAD/Code/data/dummy.cfg new file mode 100644 index 0000000..2edbded Binary files /dev/null and b/CAD/Code/data/dummy.cfg differ diff --git a/CAD/Code/data/dummy.par b/CAD/Code/data/dummy.par new file mode 100644 index 0000000..ec5b007 Binary files /dev/null and b/CAD/Code/data/dummy.par differ diff --git a/CAD/Code/lib/create_assemblies.py b/CAD/Code/lib/create_assemblies.py new file mode 100644 index 0000000..5314795 --- /dev/null +++ b/CAD/Code/lib/create_assemblies.py @@ -0,0 +1,111 @@ +import os +import sys +import shutil +import argparse +import win32com.client + + +def start_solid_edge(): + """Startet Solid Edge über COM.""" + print("Starting instance of SolidEdge...") + se = win32com.client.Dispatch("SolidEdge.Application") + se.Visible = True + print("done") + return se.Documents + + +def find_placeholder_occurrence(occurrences, placeholder_name): + """Sucht die Occurrence mit dem Namen placeholder_name.""" + for occ in occurrences: + filename = os.path.basename(occ.OccurrenceFileName) + if filename.lower() == placeholder_name.lower(): + return occ + return None + + +def process_part(par_name, par_path, dummy_asm_path, placeholder_name, work_dir, output_dir, documents): + """Kopiert Dummy-ASM, ersetzt Platzhalter mit .par, speichert Ergebnis.""" + temp_asm = os.path.join(work_dir, "_temp.asm") + temp_cfg = os.path.splitext(temp_asm)[0] + ".cfg" + + shutil.copyfile(dummy_asm_path, temp_asm) + + asm_doc = documents.Open(temp_asm) + occurrences = asm_doc.Occurrences + + target_occ = find_placeholder_occurrence(occurrences, placeholder_name) + + if not target_occ: + print(f"[{par_name}] Placeholder '{placeholder_name}' not found in 'dummy.asm'. Skipping.") + asm_doc.Close(False) + + # Cleanup bei Fehler + if os.path.exists(temp_asm): + os.remove(temp_asm) + if os.path.exists(temp_cfg): + os.remove(temp_cfg) + return + + print(f"[{par_name}] Replacing '{placeholder_name}' with '{par_name}'...") + target_occ.Replace(par_path, True) + + ziel_name = os.path.splitext(par_name)[0] + ".asm" + ziel_path = os.path.join(output_dir, ziel_name) + + asm_doc.SaveAs(ziel_path) + print(f"Saved: {ziel_path}") + + asm_doc.Close(False) + + # Lösche ggf. erzeugte .cfg-Datei zur Ziel-ASM + ziel_cfg = os.path.splitext(ziel_path)[0] + ".cfg" + if os.path.exists(ziel_cfg): + os.remove(ziel_cfg) + + # Lösche temporäre ASM und deren CFG + if os.path.exists(temp_asm): + os.remove(temp_asm) + if os.path.exists(temp_cfg): + os.remove(temp_cfg) + + +if __name__ == "__main__": + # Argumente parsen + parser = argparse.ArgumentParser(description="Solid Edge Occurrence-Replacer") + parser.add_argument("--in", dest="input_dir", required=False, help="Path to .par files (Standard: INPUT env or ./input)") + parser.add_argument("--out", dest="output_dir", required=False, help="Optional target-directory for .asm files (Standard: ./work)") + + if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"): + parser.print_help() + sys.exit(0) + + args = parser.parse_args() + + # Umgebungsvariablen & Ordner + work_dir = os.environ.get("PROJECT_WORK", "../work") + data_dir = os.environ.get("PROJECT_DATA", "./data") + input_dir = args.input_dir if args.input_dir else os.environ.get("PROJECT_INPUT", "./input") + output_dir = args.output_dir if args.output_dir else work_dir + + os.makedirs(work_dir, exist_ok=True) + os.makedirs(output_dir, exist_ok=True) + + dummy_asm_path = os.path.join(data_dir, "dummy.asm") + placeholder_name = "dummy.par" + + documents = start_solid_edge() + + par_dateien = [f for f in os.listdir(input_dir) if f.lower().endswith(".par")] + + if not par_dateien: + print("No .par-files found in input-directory. Exiting...") + exit(1) + + for par_name in par_dateien: + par_path = os.path.join(input_dir, par_name) + process_part(par_name, par_path, dummy_asm_path, placeholder_name, work_dir, output_dir, documents) + + if output_dir == work_dir: + print("\nNo output folder (--out) specified. Files saved into 'work' folder.") + else: + print("\nAll .par files processed and saved into target folder.")