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\n") 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") if args.input_dir: input_dir = args.input_dir print("Using provided input directory.") else: input_dir = os.environ.get("PROJECT_INPUT", "../input") print("No input directory provided. Using standard input directory.") if args.output_dir: output_dir = args.output_dir else: output_dir = 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 given target folder.")