From 8d726ccaae3ce2666d8bd7531f3b1a348cf27932 Mon Sep 17 00:00:00 2001 From: Eduard Gerlitz Date: Thu, 13 Mar 2025 14:35:46 +0100 Subject: [PATCH] v2.0.1 --- CHANGELOG.md | 15 ++++++++++ EXEC_INSTALL.ps1 | 7 +++-- EXEC_MAIN.ps1 | 12 ++------ MAIN.py | 74 +++++++++++++++++++++++------------------------- README.md | 11 ++----- condaenv.yml | 6 ++-- def.yml | 20 +++++++++++++ funct_gen.py | 7 +++-- 8 files changed, 88 insertions(+), 64 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ecb9da7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# CHANGELOG +v2.0.1 + - Anpassung funct_gen.py + - Anpassung Layout + - Felder --> mehrzeilig möglich + - Anpassung INSTALLER und MAIN.ps1 + + +v2 + - Beschränkung nur auf Inlay, Werkstück, Schraubstock + - neue Parameter definiert und Abhängigkeit implementiert + - Generator für die Visualisierung komplett überarbeitet + - neue Platzhalter-Bilder + + diff --git a/EXEC_INSTALL.ps1 b/EXEC_INSTALL.ps1 index d07019a..c6f72ac 100644 --- a/EXEC_INSTALL.ps1 +++ b/EXEC_INSTALL.ps1 @@ -1,8 +1,9 @@ -# Construct the full path to the Python script -$ymlPath = "./_condaenv.yml" +#---------- USER DEFINE -------------- +$ymlPath = "./condaenv.yml" +#------------------------------------- # Execute the Python script & conda env create -f $ymlPath # Pause at the end of the script -Read-Host -Prompt "Press any key to exit" +# Read-Host -Prompt "Press any key to exit" diff --git a/EXEC_MAIN.ps1 b/EXEC_MAIN.ps1 index 2263491..3705ab0 100644 --- a/EXEC_MAIN.ps1 +++ b/EXEC_MAIN.ps1 @@ -3,14 +3,8 @@ $venvName = "dmu50_wingui" $scriptPath = "./MAIN.py" #------------------------------------- -# Get the current username -$username = [System.Environment]::UserName - -# Construct the path to the Python executable -$pythonExe = "C:\Users\user58\.conda\envs\$venvName\python.exe" - -# Execute the Python script -& $pythonExe $scriptPath +# Activate the Conda environment and execute the Python script +cmd.exe /c "conda activate $venvName && python $scriptPath" # Pause at the end of the script -Read-Host -Prompt "Press Enter to exit" +# Read-Host -Prompt "Press Enter to exit" diff --git a/MAIN.py b/MAIN.py index c6d6d96..8e17b15 100644 --- a/MAIN.py +++ b/MAIN.py @@ -16,8 +16,8 @@ folder_pictures = "cfg_picture" folder_output = "_out" file_def = "def.yml" file_jobs = "jobs.yml" -name_newparset = "<>" -name_newjob = "<>" +name_newparset = "" +name_newjob = "" pic_sizelimit = 200 @@ -26,18 +26,24 @@ def setup_group(frame, group_name, data, input_vars, selected_params, group_widg picture_name = group_data['cfg']['picture_name'] # Picture name defined in def.yml picture_path = os.path.join(folder_parsets, picture_name) # Full path to the picture - - # Dropdown for parameter sets param_values = get_existing_parameters(group_name, folder_parsets) param_values.append(name_newparset) param_var = selected_params[group_name] # Bind the dropdown to the corresponding selected_param entry - param_dropdown = ttk.Combobox(frame, textvariable=param_var, values=param_values) + + multicolumn_idx = group_data['cfg'].get('multicolumn_idx', []) + colspan = (len(multicolumn_idx)+1)*2 + + # Dropdown for parameter sets + frame_parset = ttk.Frame(frame) + frame_parset.grid(row=2, column=0, columnspan=colspan, pady=5, sticky="w") + param_dropdown = ttk.Combobox(frame_parset, textvariable=param_var, values=param_values, width=14) group_widgets[group_name] = {"param_dropdown": param_dropdown} # Save for later reference source_path = f"{folder_pictures}/{data['general']['notavailablepic_name']}" - # Handle missing picture case - # if not os.path.exists(picture_path): - # shutil.copy(source_path, picture_path) + # Dropdown field + ttk.Label(frame_parset, text="Parameter-Set:", width=14).grid(row=0, column=0, padx=5, pady=5, sticky="w") + param_dropdown.grid(row=0, column=1, padx=5, pady=5, sticky="w") + # Function to update the picture based on inputs or use the init picture @@ -134,30 +140,33 @@ def setup_group(frame, group_name, data, input_vars, selected_params, group_widg group_image_tk = load_image(source_path, pic_sizelimit) image_label = ttk.Label(frame, image=group_image_tk) image_label.image = group_image_tk # Keep a reference to avoid garbage collection - image_label.grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="") # Center the image in the middle + image_label.grid(row=0, column=0, columnspan=colspan, padx=10, pady=10, sticky="") # Center the image in the middle frame.grid_rowconfigure(0, minsize=230) # Add horizontal line - ttk.Separator(frame, orient='horizontal').grid(row=1, column=0, columnspan=2, sticky="ew", pady=10) + ttk.Separator(frame, orient='horizontal').grid(row=1, column=0, columnspan=colspan, sticky="ew", pady=10) - # Dropdown field and buttons for save/load/delete - ttk.Label(frame, text="Parameter Set:").grid(row=2, column=0, padx=5, pady=5, sticky="w") - param_dropdown.grid(row=2, column=1, padx=5, pady=5) - # ttk.Button(frame, text="Load", command=load_selected_param).grid(row=3, column=0, padx=5, pady=5, sticky="w") - ttk.Button(frame, text="Save", command=save_current_param).grid(row=3, column=0, padx=5, pady=5, sticky="w") - ttk.Button(frame, text="Delete", command=delete_current_param).grid(row=3, column=1, padx=5, pady=5, sticky="w") + # buttons for save/load/delete + ttk.Button(frame_parset, text="Save", width=12, command=save_current_param).grid(row=1, column=0, padx=5, pady=5, sticky="w") + ttk.Button(frame_parset, text="Delete", width=12, command=delete_current_param).grid(row=1, column=1, padx=5, pady=5, sticky="w") # Add horizontal line - ttk.Separator(frame, orient='horizontal').grid(row=4, column=0, columnspan=2, sticky="ew", pady=10) + ttk.Separator(frame, orient='horizontal').grid(row=3, column=0, columnspan=colspan, sticky="ew", pady=10) # Setup input fields below dropdown and buttons - row = 5 + row = 0 + col = 0 group_vars = {} - for var_name, _ in group_data['parameter'].items(): - ttk.Label(frame, text=var_name).grid(row=row, column=0, padx=5, pady=5, sticky="e") + frame_var = ttk.Frame(frame) # Kein Innenabstand mehr + frame_var.grid(row=4, column=0, columnspan=colspan, padx=5, pady=5, sticky="nsew") + for idx, (var_name, _) in enumerate(group_data['parameter'].items()): + if idx+1 in multicolumn_idx: + col += 2 + row = 0 + ttk.Label(frame_var, text=var_name, font=("TkDefaultFont", 7)).grid(row=row, column=col, padx=5, pady=5, sticky="e") var = tk.StringVar() group_vars[var_name] = var - ttk.Entry(frame, textvariable=var).grid(row=row, column=1, padx=5, pady=5, sticky="w") + ttk.Entry(frame_var, textvariable=var, font=("TkDefaultFont", 7), width=7).grid(row=row, column=col + 1, padx=5, pady=5, sticky="w") row += 1 input_vars[group_name] = group_vars @@ -210,20 +219,6 @@ def setup_jobs(frame, data, selected_job, selected_params, input_vars, group_wid for key in input_vars[group_name]: input_vars[group_name][key].set('') # Clear the input fields - # Function to load the selected parameter set for a group and update inputs - def load_selected_param_for_group(group_name, param_set): - try: - param_data = load_yaml(group_name, param_set, folder_parsets) - for key, value in param_data.items(): - input_vars[group_name][key].set(value) - # Trigger the picture update by generating the ComboboxSelected event - param_dropdown = group_widgets[group_name]["param_dropdown"] - param_dropdown.event_generate("<>") - except FileNotFoundError: - # Handle missing parameter set gracefully - selected_params[group_name].set(name_newparset) - clear_input_fields(group_name) - # Function to save the current job def save_current_job(): job_name = selected_job.get() @@ -254,8 +249,8 @@ def setup_jobs(frame, data, selected_job, selected_params, input_vars, group_wid 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.grid(row=0, column=1, padx=5, pady=5) - ttk.Button(frame, text="Save", command=save_current_job).grid(row=1, column=0, padx=5, pady=5, sticky="w") - ttk.Button(frame, text="Delete", command=delete_current_job).grid(row=1, column=1, 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") # Bind job selection to loading the selected job and updating the groups job_dropdown.bind("<>", lambda event: load_selected_job()) @@ -277,7 +272,7 @@ def setup_evaluation(root, folder_pictures, data, folder_output, input_vars, sel # Load and display the specific initial picture picture_path = f"{folder_pictures}/{data['general']['generatorpic_name']}" - group_image_tk = load_image(picture_path, 200) # Assuming a function load_image exists and works as expected + group_image_tk = load_image(picture_path, 100) # Assuming a function load_image exists and works as expected image_label = ttk.Label(frame, image=group_image_tk) image_label.image = group_image_tk # Keep a reference to avoid garbage collection image_label.grid(row=0, column=0, rowspan=2, padx=10, pady=10) @@ -309,6 +304,7 @@ def main(): # Tkinter root setup root = tk.Tk() root.title("DMU50") + root.geometry("+0+0") # Load object definitions from YAML with open(file_def, 'r') as file: @@ -322,7 +318,7 @@ def main(): def setup_ui(): # ---- Setup Jobs UI frame = ttk.LabelFrame(root, text="Jobs", padding=(10, 10)) - frame.grid(row=0, column=0, columnspan=5, padx=10, pady=10, sticky="nsew") + frame.grid(row=0, column=0, columnspan=len(data['groups']), padx=10, pady=10, sticky="nsew") load_selected_job = setup_jobs(frame, data, selected_job, selected_params, input_vars, group_widgets) # ---- Create the UI for each group diff --git a/README.md b/README.md index 919af2a..e308106 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,7 @@ Diese GUI dient zur Erfassung verschiedener Parameter für die Maschinenautomati 3. Job auswählen oder erstellen 4. G-Code-Datei generieren und optional auf die Steuerung übertragen ---- -# CHANGELOG -v2 - - Beschränkung nur auf Inlay, Werkstück, Schraubstock - - neue Parameter definiert und Abhängigkeit implementiert - - Generator für die Visualisierung komplett überarbeitet - - neue Platzhalter-Bilder - +## Systemvoraussetzung +- Windows +- Bildschirmauflösung ab: 1280 x 1024 \ No newline at end of file diff --git a/condaenv.yml b/condaenv.yml index c0897c8..96045e3 100644 --- a/condaenv.yml +++ b/condaenv.yml @@ -12,5 +12,7 @@ dependencies: - openpyxl - paramiko - matplotlib - - trimesh - - manifold3d \ No newline at end of file + - pip + - pip: + - trimesh + - manifold3d \ No newline at end of file diff --git a/def.yml b/def.yml index 938637f..3949ef4 100644 --- a/def.yml +++ b/def.yml @@ -12,6 +12,7 @@ groups: INL_Y_OFFSET: double cfg: picture_name: img_inlay.png + multicolumn_idx: [] wp: parameter: WPR_X: double @@ -24,6 +25,7 @@ groups: WP_GRP_OFFSET_Z: double cfg: picture_name: img_wp.png + multicolumn_idx: [7] clp: parameter: CLP_BACKENWEITE: double @@ -36,3 +38,21 @@ groups: MESSPOS_TOL: double cfg: picture_name: img_clp.png + multicolumn_idx: [5] +# probe: +# parameter: +# PRB_BOD_RE_Y: double +# PRB_BOD_RE_Z: double +# PRB_BOD_LI_Y: double +# PRB_BOD_LI_Z: double +# PRB_SEI_HI_X: double +# PRB_SEI_HI_Y: double +# PRB_SEI_VO_X: double +# PRB_SEI_VO_Y: double +# PRB_VERS_X_X: double +# PRB_VERS_X_Y: double +# cfg: +# picture_name: img_probe.png +# multicolumn_idx: [5] + + diff --git a/funct_gen.py b/funct_gen.py index a3d3777..35b36bf 100644 --- a/funct_gen.py +++ b/funct_gen.py @@ -31,9 +31,10 @@ def generate_config_spf(folder_output, input_vars, selected_params): for group_name, variables in input_vars.items(): for var_name, var_value in variables.items(): spf_file.write(f"{var_name.upper()} = {var_value.get()}\n") - spf_file.write("\n") spf_file.write("; ---------------------------------------------------\n") + spf_file.write(f"M17\n") + # Define the file path for the text file with selected parameter sets selected_params_file_path = os.path.join(folder_path, "selected_param_sets.txt") @@ -89,15 +90,15 @@ def generate_config_spf_custom1(folder_output, input_vars, selected_params, file # Write WP_X[i] and WP_Y[i] values cnt = 0 + spf_file.write(f"WP_NUM={cnt}\n") for j in range(y_num): # Rows for i in range(x_num): # Columns if df.iloc[i, j] == 1: # Consider only marked positions spf_file.write(f"WP_X[{cnt}]={x_offset * i}\n") spf_file.write(f"WP_Y[{cnt}]={y_offset * j}\n") cnt += 1 - spf_file.write(f"WP_NUM={cnt}\n") + spf_file.write("; ---------------------------------------------------\n") spf_file.write(f"M17\n") - spf_file.write("\n; ---------------------------------------------------\n") print(f"Configuration file saved at: {spf_file_path}")