Skript zur automatischen erzeugung von asm Dateien aus bestehenden .pars
This commit is contained in:
@@ -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.")
|
||||
Reference in New Issue
Block a user