Skript zur automatischen erzeugung von asm Dateien aus bestehenden .pars

This commit is contained in:
2025-06-30 11:14:17 +02:00
parent 190b17f2e0
commit a3e2905ac4
7 changed files with 138 additions and 0 deletions
+10
View File
@@ -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 %*
+4
View File
@@ -0,0 +1,4 @@
@echo off
call setenv.bat
start
+13
View File
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
+111
View File
@@ -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.")