v2.1.1-custom-jl-update1
This commit is contained in:
parent
efe8d987f6
commit
c523016377
100
MAIN.py
100
MAIN.py
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
12
functions.py
12
functions.py
@ -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."""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user