Files

123 lines
4.0 KiB
Python

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")
template_dir = os.environ.get("PROJECT_TEMPLATE", "//ssg.local/freigaben/RuleDesigner/Templates/CreateAssemblies")
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(template_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.")