v2.1.1-custom-jl-update1

This commit is contained in:
Eduard Gerlitz 2025-04-28 14:20:52 +02:00
parent efe8d987f6
commit c523016377
3 changed files with 106 additions and 8 deletions

100
MAIN.py
View File

@ -10,9 +10,9 @@ import tkinter as tk
from tkinter import ttk from tkinter import ttk
import yaml import yaml
folder_parsets = "_cfg_parsets" folder_parsets = r"\\HOST-BL7\Mabi-Robotic-Produktion\40_PROJEKTE\30_Interne_Projekte\DMU50_Automation\40_SOFTWARE\CONFIGURATOR\DMU50_GUI_PY-main\dmu50_gui_py\_cfg_parsets"
folder_pictures = "cfg_picture" folder_pictures = "cfg_picture"
folder_output = "_out" folder_output = r"\\HOST-BL7\Mabi-Robotic-Produktion\40_PROJEKTE\30_Interne_Projekte\DMU50_Automation\40_SOFTWARE\CONFIGURATOR\DMU50_GUI_PY-main\dmu50_gui_py\_out"
file_def = "def.yml" file_def = "def.yml"
file_jobs = "jobs.yml" file_jobs = "jobs.yml"
name_newparset = "<new parset>" name_newparset = "<new parset>"
@ -20,6 +20,26 @@ name_newjob = "<new job>"
pic_sizelimit = 250 pic_sizelimit = 250
def _verify_job(job_name):
if job_name in ("", name_newjob):
messagebox.showwarning("No job selected",
"Please select (or save) a job first.")
return 0
else:
return 1
def _deep_copy(save_dir, gen_dir):
if os.path.isdir(save_dir):
for name in os.listdir(save_dir):
src = os.path.join(save_dir, name)
dst = os.path.join(gen_dir, name)
if os.path.isdir(src):
shutil.copytree(src, dst, dirs_exist_ok=True)
else:
shutil.copy2(src, dst)
def setup_group(frame, group_name, data, input_vars, selected_params, group_widgets): def setup_group(frame, group_name, data, input_vars, selected_params, group_widgets):
group_data = data['groups'][group_name] group_data = data['groups'][group_name]
picture_name = group_data['cfg']['picture_name'] # Picture name defined in def.yml picture_name = group_data['cfg']['picture_name'] # Picture name defined in def.yml
@ -243,12 +263,69 @@ def setup_jobs(frame, data, selected_job, selected_params, input_vars, group_wid
job_dropdown['values'] = job_values job_dropdown['values'] = job_values
load_selected_job() load_selected_job()
def upload_job_files():
job_name = selected_job.get()
if not _verify_job(job_name):
return
job_safe = make_windows_safe(job_name)
save_dir = os.path.join(folder_parsets, "files", job_safe)
os.makedirs(save_dir, exist_ok=True)
paths = filedialog.askopenfilenames(
parent=frame, title=f"Attach file(s) to job: {job_name}"
)
if not paths:
return
copied = 0
for src in paths:
try:
shutil.copy2(src, save_dir)
copied += 1
except Exception as exc:
messagebox.showerror("Copy failed",
f"Could not copy:\n{src}\n\n{exc}")
return
messagebox.showinfo("Upload complete",
f"{copied} file(s) copied to:\n{save_dir}")
def show_job_files():
job_name = selected_job.get()
if not _verify_job(job_name):
return
job_safe = make_windows_safe(job_name)
target = os.path.join(folder_parsets, "files", job_safe)
if not os.path.isdir(target) or not os.listdir(target):
messagebox.showinfo("No files",
f"No files found for job “{job_name}”.")
return
os.startfile(target)
# Job dropdown and buttons for save/load/delete # Job dropdown and buttons for save/load/delete
ttk.Label(frame, text="Job:").grid(row=0, column=0, padx=5, pady=5, sticky="w") ttk.Label(frame, text="Job:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
job_dropdown = ttk.Combobox(frame, textvariable=selected_job, values=job_values) job_dropdown = ttk.Combobox(frame, textvariable=selected_job, values=job_values)
job_dropdown.grid(row=0, column=1, padx=5, pady=5) job_dropdown.grid(row=0, column=1, padx=5, pady=5)
ttk.Button(frame, text="Save", command=save_current_job).grid(row=0, column=2, padx=5, pady=5, sticky="w")
ttk.Button(frame, text="Delete", command=delete_current_job).grid(row=0, column=3, padx=5, pady=5, sticky="w") ttk.Button(frame, text="Save", command=save_current_job) \
.grid(row=0, column=2, padx=5, pady=5, sticky="w")
ttk.Button(frame, text="Delete", command=delete_current_job) \
.grid(row=0, column=3, padx=5, pady=5, sticky="w")
sep = ttk.Separator(frame, orient="vertical")
sep.grid(row=0, column=4, sticky="ns", padx=8) # full height of the cell
frame.grid_columnconfigure(4, minsize=15) # width of the line
ttk.Button(frame, text="Upload Job-Files", command=upload_job_files) \
.grid(row=0, column=5, padx=5, pady=5, sticky="w")
ttk.Button(frame, text="Show Job-Files", command=show_job_files) \
.grid(row=0, column=6, padx=5, pady=5, sticky="w")
# Bind job selection to loading the selected job and updating the groups # Bind job selection to loading the selected job and updating the groups
job_dropdown.bind("<<ComboboxSelected>>", lambda event: load_selected_job()) job_dropdown.bind("<<ComboboxSelected>>", lambda event: load_selected_job())
@ -263,7 +340,7 @@ def setup_jobs(frame, data, selected_job, selected_params, input_vars, group_wid
def setup_evaluation(root, folder_pictures, data, folder_output, input_vars, selected_params): def setup_evaluation(root, folder_pictures, data, folder_output, input_vars, selected_params, selected_job):
# Create a frame for the EVALUATION section # Create a frame for the EVALUATION section
frame = ttk.LabelFrame(root, text="EVALUATION", padding=(10, 10)) frame = ttk.LabelFrame(root, text="EVALUATION", padding=(10, 10))
frame.grid(row=2, column=0, columnspan=5, padx=10, pady=10, sticky="nsew") frame.grid(row=2, column=0, columnspan=5, padx=10, pady=10, sticky="nsew")
@ -278,7 +355,16 @@ def setup_evaluation(root, folder_pictures, data, folder_output, input_vars, sel
# Function to generate configuration file based on current parameters # Function to generate configuration file based on current parameters
def btn_gen_cfg_dmuaut1(): def btn_gen_cfg_dmuaut1():
gen_cfg_dmuaut(folder_output, input_vars, selected_params) job_name = selected_job.get()
if not _verify_job(job_name):
return
job_safe = make_windows_safe(job_name)
save_dir = os.path.join(folder_parsets, "files", job_safe)
gen_dir = gen_cfg_dmuaut(folder_output, input_vars, selected_params)
print(save_dir)
print(gen_dir)
_deep_copy(save_dir, gen_dir)
# def btn_gen_cfg_dmuaut2(): # def btn_gen_cfg_dmuaut2():
# gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=True) # gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=True)
@ -335,7 +421,7 @@ def main():
root.grid_rowconfigure(0, weight=1) root.grid_rowconfigure(0, weight=1)
# ---- Setup the EVALUATION section # ---- Setup the EVALUATION section
setup_evaluation(root, folder_pictures, data, folder_output, input_vars, selected_params) setup_evaluation(root, folder_pictures, data, folder_output, input_vars, selected_params, selected_job)
# After the UI is fully set up, load the selected job to update parameter lists # After the UI is fully set up, load the selected job to update parameter lists
load_selected_job() # Ensure this is called to load the job parameters load_selected_job() # Ensure this is called to load the job parameters

View File

@ -54,6 +54,8 @@ def gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=Fals
else: else:
os.startfile(folder_path) os.startfile(folder_path)
return folder_path
def gen_cfg_inlay(folder_output, input_vars, selected_params, filetransfer=False): def gen_cfg_inlay(folder_output, input_vars, selected_params, filetransfer=False):

View File

@ -8,8 +8,10 @@ import os
import trimesh import trimesh
from mpl_toolkits.mplot3d.art3d import Poly3DCollection from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np import numpy as np
import re
import hashlib
# Function to load object definitions from YAML
# Load a specific parameter set from a YAML file for a group # Load a specific parameter set from a YAML file for a group
def load_yaml(group_name, param_name, folder_parsets): def load_yaml(group_name, param_name, folder_parsets):
@ -93,6 +95,14 @@ def create_new_param_popup(root, group_name, input_vars, param_values, param_dro
tk.Button(new_window, text="Create", command=create_param_set).pack(pady=10) tk.Button(new_window, text="Create", command=create_param_set).pack(pady=10)
def make_windows_safe(name: str) -> str:
suffix = hashlib.sha1(name.encode("utf-8")).hexdigest()[:4]
safe = re.sub(r'[<>:"/\\\\|?*]', "_", name).strip()
safe = safe.rstrip(". ")
return f"{safe}_{suffix}"
# ------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------
def plot_clamping(ax, x, y, z, dx, dy1, dy2, dz1, dz2, color='blue', alpha=0.5, linewidth=1, inverty=False): def plot_clamping(ax, x, y, z, dx, dy1, dy2, dz1, dz2, color='blue', alpha=0.5, linewidth=1, inverty=False):
"""Efficiently plots an L-shaped merged cube structure and draws only axis-aligned edges.""" """Efficiently plots an L-shaped merged cube structure and draws only axis-aligned edges."""