v2.1.1-custom-jl

This commit is contained in:
Eduard Gerlitz 2025-04-04 14:48:00 +02:00
parent bd13ca3a74
commit efe8d987f6
9 changed files with 265 additions and 101 deletions

View File

@ -1,4 +1,7 @@
# CHANGELOG
v2.1.1-custom-jl
- changes by jl
v2.1.1
- Installer und Run Skripte als BAT (ehemals als PS1)
- Bugfix funct_gen: WP_NUM

40
MAIN.py
View File

@ -17,7 +17,7 @@ file_def = "def.yml"
file_jobs = "jobs.yml"
name_newparset = "<new parset>"
name_newjob = "<new job>"
pic_sizelimit = 200
pic_sizelimit = 250
def setup_group(frame, group_name, data, input_vars, selected_params, group_widgets):
@ -162,10 +162,10 @@ def setup_group(frame, group_name, data, input_vars, selected_params, group_widg
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")
ttk.Label(frame_var, text=VarDescription(var_name), font=("TkDefaultFont", 8)).grid(row=row, column=col, padx=5, pady=5, sticky="e")
var = tk.StringVar()
group_vars[var_name] = var
ttk.Entry(frame_var, textvariable=var, font=("TkDefaultFont", 7), width=7).grid(row=row, column=col + 1, padx=5, pady=5, sticky="w")
ttk.Entry(frame_var, textvariable=var, font=("TkDefaultFont", 8), width=7).grid(row=row, column=col + 1, padx=5, pady=5, sticky="w")
row += 1
input_vars[group_name] = group_vars
@ -186,7 +186,6 @@ def setup_group(frame, group_name, data, input_vars, selected_params, group_widg
update_inlay_picture()
def setup_jobs(frame, data, selected_job, selected_params, input_vars, group_widgets):
# Load existing jobs from the jobs.yml file
job_values = get_existing_parameters("jobs", folder_parsets)
@ -276,33 +275,32 @@ def setup_evaluation(root, folder_pictures, data, folder_output, input_vars, sel
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)
# Function to generate configuration file based on current parameters
def btn_gen_cfg_dmuaut1():
gen_cfg_dmuaut(folder_output, input_vars, selected_params)
def btn_gen_cfg_dmuaut2():
gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=True)
def btn_gen_cfg_inlay1():
gen_cfg_inlay(folder_output, input_vars, selected_params)
def btn_gen_cfg_inlay2():
gen_cfg_inlay(folder_output, input_vars, selected_params, filetransfer=True)
# def btn_gen_cfg_dmuaut2():
# gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=True)
# def btn_gen_cfg_inlay1():
# gen_cfg_inlay(folder_output, input_vars, selected_params)
# def btn_gen_cfg_inlay2():
# gen_cfg_inlay(folder_output, input_vars, selected_params, filetransfer=True)
# Place buttons in the vertical frame for operations
button_frame = ttk.Frame(frame)
button_frame.grid(row=0, column=1, padx=10, pady=10, sticky="n")
button1 = ttk.Button(button_frame, text="GEN CFG_DMUAUT.SPF FILE", width=45, command=btn_gen_cfg_dmuaut1)
button1.grid(row=0, column=0, padx=10, pady=5)
button2 = ttk.Button(button_frame, text="GEN+TRANSFER CFG_DMUAUT.SPF FILE", width=45, command=btn_gen_cfg_dmuaut2)
button2.grid(row=0, column=1, padx=10, pady=5)
button3 = ttk.Button(button_frame, text="GEN CFG_INLAY.SPF FILE", width=45, command=btn_gen_cfg_inlay1)
button3.grid(row=1, column=0, padx=5, pady=5)
button4 = ttk.Button(button_frame, text="GEN+TRANSFER CFG_INLAY.SPF FILE", width=45, command=btn_gen_cfg_inlay2)
button4.grid(row=1, column=1, padx=5, pady=5)
root.grid_columnconfigure(0, weight=1)
# button2 = ttk.Button(button_frame, text="GEN+TRANSFER CFG_DMUAUT.SPF FILE", width=45, command=btn_gen_cfg_dmuaut2)
#button2.grid(row=0, column=1, padx=10, pady=5)
#button3 = ttk.Button(button_frame, text="GEN CFG_INLAY.SPF FILE", width=45, command=btn_gen_cfg_inlay1)
#button3.grid(row=1, column=0, padx=5, pady=5)
#button4 = ttk.Button(button_frame, text="GEN+TRANSFER CFG_INLAY.SPF FILE", width=45, command=btn_gen_cfg_inlay2)
#button4.grid(row=1, column=1, padx=5, pady=5)
# Drag-and-Drop File Field
def main():
# Tkinter root setup
@ -327,7 +325,7 @@ def main():
# ---- Create the UI for each group
for col_idx, group_name in enumerate(data['groups']):
frame_group = ttk.LabelFrame(root, text=group_name, padding=(10, 10))
frame_group = ttk.LabelFrame(root, text=VarDescription(group_name), padding=(10, 10))
frame_group.grid(row=1, column=col_idx, padx=10, pady=10, sticky="nsew")
selected_params[group_name] = tk.StringVar()

15
def.yml
View File

@ -7,25 +7,29 @@ groups:
inlay:
parameter:
INL_X_NUM: int
INL_X_LENGTH: double
INL_X_OFFSET: double
INL_Y_NUM: int
INL_Y_LENGTH: double
INL_Y_OFFSET: double
PRT_NUM: int
cfg:
picture_name: img_inlay.png
multicolumn_idx: []
multicolumn_idx: [4]
wp:
parameter:
WPR_X: double
WPR_Y: double
WPR_Z: double
WP_CLP_OFFSET_X: double
WPF_X: double
WPF_Y: double
WPF_Z: double
WP_CLP_OFFSET_X: double
WPF_Z: doublE
WP_CLP_OFFSET_Y: double
WP_GRP_OFFSET_Z: double
cfg:
picture_name: img_wp.png
multicolumn_idx: [7]
multicolumn_idx: [5]
clp:
parameter:
CLP_BACKENWEITE: double
@ -51,8 +55,9 @@ groups:
PRB_SEI_VO_Z: double
PRB_VERS_X_Y: double
PRB_VERS_X_Z: double
PRB_VERS_X_TOL: double
cfg:
picture_name: img_probe.png
multicolumn_idx: [5]
multicolumn_idx: [6]

View File

@ -4,13 +4,19 @@ from functions import *
def generate_picture_clp(all_group_vars, picture_path, DEBUG=False):
vars = all_group_vars['clp']
CLP_BACKENWEITE, CLP_BACKENHOHE, CLP_SPANNHOHE, CLP_AUFLAGETIEFE = (float(vars[k]) for k in
CLP_BACKENWEITE, CLP_BACKENHOHE, CLP_SPANNHOHE, CLP_AUFLAGETIEFE,MESSPOS_Z = (float(vars[k]) for k in
['CLP_BACKENWEITE', 'CLP_BACKENHOHE',
'CLP_SPANNHOHE', 'CLP_AUFLAGETIEFE'])
'CLP_SPANNHOHE', 'CLP_AUFLAGETIEFE',
'MESSPOS_Z'])
WPR_X = CLP_BACKENWEITE/2
WPR_Y = CLP_BACKENWEITE/2
WPR_Z = CLP_BACKENWEITE
try:
WPR_X, WPR_Y, WPR_Z = (
float(all_group_vars['wp'][k]) for k in ['WPR_X', 'WPR_Y', 'WPR_Z']
)
except (KeyError, ValueError):
WPR_X = CLP_BACKENWEITE/2
WPR_Y = CLP_BACKENWEITE/2
WPR_Z = CLP_BACKENWEITE
if min(WPR_X, WPR_Y, WPR_Z) <= 0:
raise ValueError("Dimensions must be positive.")
@ -18,7 +24,7 @@ def generate_picture_clp(all_group_vars, picture_path, DEBUG=False):
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# Define raw workpiece dimensions
x_cube, y_cube, z_cube = 2 * WPR_X, 2 * WPR_Y, WPR_Z
x_cube, y_cube, z_cube = WPR_X,WPR_Y, WPR_Z
vertices_raw = np.array([[0, 0, 0], [x_cube, 0, 0], [x_cube, y_cube, 0], [0, y_cube, 0],
[0, 0, WPR_Z], [x_cube, 0, WPR_Z], [x_cube, y_cube, WPR_Z], [0, y_cube, WPR_Z]])
faces_raw = [vertices_raw[[0, 1, 2, 3]], vertices_raw[[4, 5, 6, 7]], vertices_raw[[0, 3, 7, 4]],
@ -45,8 +51,8 @@ def generate_picture_clp(all_group_vars, picture_path, DEBUG=False):
# Draw CLP coordinate system
axis_len = max(x_cube, y_cube, z_cube) * 0.15
colors = ['r', 'g', 'b']
origin_x = WPR_X
origin_y = WPR_Y
origin_x = WPR_X/2
origin_y = WPR_Y/2
origin_z = 0
for i, vec in enumerate(np.eye(3)):
ax.quiver(origin_x, origin_y, origin_z, *(axis_len * vec), color=colors[i], linewidth=3)
@ -54,8 +60,8 @@ def generate_picture_clp(all_group_vars, picture_path, DEBUG=False):
va='top')
# Define clamping block dimensions
clp_deep = y_cube * 0.3
base_x = WPR_X - CLP_BACKENWEITE / 2
clp_deep = MESSPOS_Z
base_x = WPR_X/2 - CLP_BACKENWEITE / 2
alpha = 0.35
color = 'blue'
linewidth = 1
@ -76,10 +82,10 @@ def generate_picture_clp(all_group_vars, picture_path, DEBUG=False):
alpha=alpha, linewidth=linewidth, inverty=True)
# Draw text for geometry values
ax.text(0, 2*WPR_Y+clp_deep, CLP_SPANNHOHE/2, f'{CLP_SPANNHOHE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(0, 2*WPR_Y+clp_deep, -CLP_BACKENHOHE/2, f'{CLP_BACKENHOHE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(WPR_X, 2*WPR_Y+clp_deep, CLP_SPANNHOHE, f'{CLP_BACKENWEITE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(WPR_X*2, 2*WPR_Y-CLP_AUFLAGETIEFE/2, 0, f'{CLP_AUFLAGETIEFE}mm', color='blue', fontsize=9, weight='bold', ha='left', va='bottom')
ax.text(0, WPR_Y+clp_deep, CLP_SPANNHOHE/2, f'{CLP_SPANNHOHE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(0, WPR_Y+clp_deep, -CLP_BACKENHOHE/2, f'{CLP_BACKENHOHE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(WPR_X, WPR_Y+clp_deep, CLP_SPANNHOHE, f'{CLP_BACKENWEITE}mm', color='blue', fontsize=9, weight='bold', ha='right', va='center')
ax.text(WPR_X, WPR_Y-CLP_AUFLAGETIEFE/2, 0, f'{CLP_AUFLAGETIEFE}mm', color='blue', fontsize=9, weight='bold', ha='left', va='bottom')
# Set view properties
z_trans = WPR_Z*0.3
@ -113,4 +119,4 @@ if __name__ == "__main__":
'CLP_SPANNHOHE': 3,
'CLP_AUFLAGETIEFE': 3
}
generate_picture_clp({'clp': all_group_vars}, "cfg_picture/TEST_wpraw.jpg", DEBUG=True)
generate_picture_clp({'clp': all_group_vars}, "cfg_picture/TEST_wpraw.jpg", DEBUG=True)

View File

@ -1,5 +1,5 @@
# funct_gen.py
from functions import *
import os
import time
import pandas as pd
@ -32,7 +32,7 @@ def gen_cfg_dmuaut(folder_output, input_vars, selected_params, filetransfer=Fals
# Iterate over the input variables (each group), and write them into the file
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(f"{var_name.upper()} = {var_value.get()} ; {VarDescription(var_name)} \n")
spf_file.write("; ---------------------------------------------------\n")
spf_file.write(f"M17\n")

View File

@ -4,14 +4,13 @@ import numpy as np
def generate_picture_inlay(all_group_vars, picture_path, DEBUG=False):
try:
vars = all_group_vars['inlay']
x_num, y_num = int(vars['INL_X_NUM']), int(vars['INL_Y_NUM'])
x_offset_mm, y_offset_mm = float(vars['INL_X_OFFSET']), float(vars['INL_Y_OFFSET'])
x_num, y_num, prt_num = int(vars['INL_X_NUM']), int(vars['INL_Y_NUM']),int(vars['PRT_NUM'])
x_offset_mm, y_offset_mm,y_wide_mm,x_wide_mm = float(vars['INL_X_OFFSET']), float(vars['INL_Y_OFFSET']),float(vars['INL_Y_LENGTH']),float(vars['INL_X_LENGTH'])
if x_num <= 0 or y_num <= 0:
raise ValueError("INL_X_NUM and INL_Y_NUM must be positive integers.")
rect_realsize_factor = 0.90
rect_realsize_factor = 0.9
canvas_height_mm = x_num * x_offset_mm - x_offset_mm * (1-rect_realsize_factor)
canvas_width_mm = y_num * y_offset_mm - y_offset_mm * (1-rect_realsize_factor)
@ -19,13 +18,16 @@ def generate_picture_inlay(all_group_vars, picture_path, DEBUG=False):
y_offset = y_offset_mm / canvas_width_mm # Swapping due to axis swap
x_wide = x_offset * rect_realsize_factor
y_wide = y_offset * rect_realsize_factor
x_wide = x_wide_mm / canvas_height_mm
y_wide = y_wide_mm / canvas_width_mm
fig, ax = plt.subplots(figsize=(12, 8))
ax.set_facecolor('black')
rect = plt.Rectangle((-1, -1),2+y_offset*y_num,2+x_offset*x_num, color='lightgrey')
ax.add_patch(rect)
for xxx in range(x_num):
for yyy in range(y_num):
# Mirroring horizontally
@ -35,19 +37,30 @@ def generate_picture_inlay(all_group_vars, picture_path, DEBUG=False):
rect = plt.Rectangle((y_start, x_start), y_wide, x_wide, color='white')
ax.add_patch(rect)
triangle_sizefactor = 0.2
triangle = plt.Polygon([
(y_start+y_wide, x_start), # Bottom right of the rectangle
(y_start+y_wide, x_start + triangle_sizefactor * y_wide), # Left along the bottom
(y_start+y_wide - triangle_sizefactor * y_wide, x_start ) # Up from the bottom right
], color='black')
ax.add_patch(triangle)
for parts in range(prt_num):
col='black'
if parts ==0:
rect = plt.Rectangle((y_start+y_wide-y_wide*0.3, x_start), y_wide*0.3,x_wide*0.3, color=col)
ax.add_patch(rect)
elif parts ==1:
rect = plt.Rectangle((y_start,x_start+x_wide-x_wide*0.3), y_wide*0.3,x_wide*0.3, color=col)
ax.add_patch(rect)
elif parts ==2:
rect = plt.Rectangle((y_start+y_wide-y_wide*0.3, x_start+x_wide-x_wide*0.3), y_wide*0.3,x_wide*0.3, color=col)
ax.add_patch(rect)
elif parts ==3:
rect = plt.Rectangle((y_start, x_start), y_wide*0.3,x_wide*0.3, color=col)
ax.add_patch(rect)
# Arrows with adjusted margins
ax.arrow(1.0, 0.0, -0.3, 0, head_width=0.03, head_length=0.02, fc='green', ec='green', linewidth=2, edgecolor='white')
ax.arrow(1.0, 0.0, 0, 0.3, head_width=0.02, head_length=0.03, fc='red', ec='red', linewidth=2, edgecolor='white')
margin = 0.03
margin = 0.06
ax.set_xlim(0-margin, 1+margin)
ax.set_ylim(0-margin, 1+margin)
ax.set_xticks([]), ax.set_yticks([])
@ -67,6 +80,6 @@ def generate_picture_inlay(all_group_vars, picture_path, DEBUG=False):
print(f"Error generating matrix: {e}")
if __name__ == "__main__":
vars = {'INL_X_NUM': 8, 'INL_Y_NUM': 12, 'INL_X_OFFSET': 100, 'INL_Y_OFFSET': 125}
vars = {'INL_X_NUM': 8, 'INL_Y_NUM': 12, 'INL_X_OFFSET': 100, 'INL_Y_OFFSET': 125, 'PRT_NUM': 1, 'INL_X_LENGTH':50, 'INL_Y_LENGTH':50}
picture_path = "cfg_picture/TEST_inlay.jpg"
generate_picture_inlay({'inlay': vars}, picture_path, DEBUG=True)

View File

@ -13,9 +13,9 @@ def generate_picture_probe(all_group_vars, picture_path, DEBUG=False):
'PRB_VERS_X_Y', 'PRB_VERS_X_Z'])
try:
CLP_BACKENWEITE, CLP_BACKENHOHE, CLP_SPANNHOHE, CLP_AUFLAGETIEFE = (
CLP_BACKENWEITE, CLP_BACKENHOHE, CLP_SPANNHOHE, CLP_AUFLAGETIEFE, MESSPOSZ = (
float(all_group_vars['clp'][k]) for k in
['CLP_BACKENWEITE', 'CLP_BACKENHOHE', 'CLP_SPANNHOHE', 'CLP_AUFLAGETIEFE']
['CLP_BACKENWEITE', 'CLP_BACKENHOHE', 'CLP_SPANNHOHE', 'CLP_AUFLAGETIEFE','MESSPOS_Z']
)
except (KeyError, ValueError):
CLP_BACKENWEITE = 100
@ -35,7 +35,7 @@ def generate_picture_probe(all_group_vars, picture_path, DEBUG=False):
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# Define raw workpiece dimensions
x_cube, y_cube, z_cube = 2 * WPR_X, 2 * WPR_Y, WPR_Z
x_cube, y_cube, z_cube = WPR_X,WPR_Y, WPR_Z
vertices_raw = np.array([[0, 0, 0], [x_cube, 0, 0], [x_cube, y_cube, 0], [0, y_cube, 0],
[0, 0, WPR_Z], [x_cube, 0, WPR_Z], [x_cube, y_cube, WPR_Z], [0, y_cube, WPR_Z]])
faces_raw = [vertices_raw[[0, 1, 2, 3]], vertices_raw[[4, 5, 6, 7]], vertices_raw[[0, 3, 7, 4]],
@ -62,8 +62,8 @@ def generate_picture_probe(all_group_vars, picture_path, DEBUG=False):
# Draw CLP coordinate system
axis_len = max(x_cube, y_cube, z_cube) * 0.15
colors = ['r', 'g', 'b']
origin_x = WPR_X
origin_y = WPR_Y
origin_x = WPR_X/2
origin_y = WPR_Y/2
origin_z = 0
for i, vec in enumerate(np.eye(3)):
ax.quiver(origin_x, origin_y, origin_z, *(axis_len * vec), color=colors[i], linewidth=3)
@ -71,8 +71,8 @@ def generate_picture_probe(all_group_vars, picture_path, DEBUG=False):
va='top')
# Define clamping block dimensions
clp_deep = y_cube * 0.3
base_x = WPR_X - CLP_BACKENWEITE / 2
clp_deep = MESSPOSZ
base_x = WPR_X/2 - CLP_BACKENWEITE / 2
alpha = 0.35
color = 'blue'
linewidth = 1
@ -105,22 +105,22 @@ def generate_picture_probe(all_group_vars, picture_path, DEBUG=False):
txt_offs = max(x_cube, y_cube, z_cube) * 0.05
#BODEN
boden_colr = "red"
drawball(x_cube-PRB_BOD_RE_X, WPR_Y+PRB_BOD_RE_Y, 0, boden_colr, 0.03)
ax.text( x_cube-PRB_BOD_RE_X, WPR_Y+PRB_BOD_RE_Y, 0+txt_offs, f'PRB_BOD_RE', color=boden_colr, fontsize=7, weight='bold', ha='center', va='bottom')
drawball(0+PRB_BOD_LI_X, WPR_Y+PRB_BOD_LI_Y, 0, boden_colr, 0.03)
ax.text( 0+PRB_BOD_LI_X, WPR_Y+PRB_BOD_LI_Y, 0-txt_offs, f'PRB_BOD_LI', color=boden_colr, fontsize=7, weight='bold', ha='center', va='top')
drawball(x_cube-PRB_BOD_RE_X, WPR_Y/2+PRB_BOD_RE_Y, 0, boden_colr, 0.03)
ax.text( x_cube-PRB_BOD_RE_X, WPR_Y/2+PRB_BOD_RE_Y, 0+txt_offs, f'PRB_BOD_RE', color=boden_colr, fontsize=7, weight='bold', ha='center', va='bottom')
drawball(0+PRB_BOD_LI_X, WPR_Y/2+PRB_BOD_LI_Y*-1, 0, boden_colr, 0.03)
ax.text( 0+PRB_BOD_LI_X, WPR_Y/2+PRB_BOD_LI_Y*-1, 0-txt_offs, f'PRB_BOD_LI', color=boden_colr, fontsize=7, weight='bold', ha='center', va='top')
#SEITE
seiten_colr = "green"
drawball(WPR_X+PRB_SEI_HI_X, y_cube, PRB_SEI_HI_Z, seiten_colr, 0.03)
ax.text(WPR_X+PRB_SEI_HI_X, y_cube, PRB_SEI_HI_Z+txt_offs, f'PRB_SEI_HI', color=seiten_colr, fontsize=7, weight='bold', ha='right', va='bottom')
drawball(WPR_X+PRB_SEI_VO_X, 0, PRB_SEI_VO_Z, seiten_colr, 0.03)
ax.text(WPR_X+PRB_SEI_VO_X, 0, PRB_SEI_VO_Z+txt_offs, f'PRB_SEI_VO', color=seiten_colr, fontsize=7, weight='bold', ha='left', va='bottom')
drawball(WPR_X/2+PRB_SEI_HI_X*-1, y_cube, PRB_SEI_HI_Z*-1, seiten_colr, 0.03)
ax.text(WPR_X/2+PRB_SEI_HI_X*-1, y_cube, PRB_SEI_HI_Z*-1+txt_offs, f'PRB_SEI_HI', color=seiten_colr, fontsize=7, weight='bold', ha='right', va='bottom')
drawball(WPR_X/2+PRB_SEI_VO_X, 0, PRB_SEI_VO_Z*-1, seiten_colr, 0.03)
ax.text(WPR_X/2+PRB_SEI_VO_X, 0, PRB_SEI_VO_Z*-1+txt_offs, f'PRB_SEI_VO', color=seiten_colr, fontsize=7, weight='bold', ha='left', va='bottom')
#VERSATZ Y
vers_colr = "blue"
drawball(0, WPR_Y+PRB_VERS_X_Y, PRB_VERS_X_Z, vers_colr, 0.03)
ax.text( 0, WPR_Y+PRB_VERS_X_Y, PRB_VERS_X_Z+txt_offs, f'PRB_VERS_X', color=vers_colr, fontsize=7, weight='bold', ha='center', va='bottom')
drawball(0, WPR_Y/2+PRB_VERS_X_Y*-1, PRB_VERS_X_Z*-1, vers_colr, 0.03)
ax.text( 0, WPR_Y/2+PRB_VERS_X_Y*-1, PRB_VERS_X_Z+txt_offs, f'PRB_VERS_X', color=vers_colr, fontsize=7, weight='bold', ha='center', va='bottom')
# Set view properties

View File

@ -9,13 +9,13 @@ def generate_picture_wp(all_group_vars, picture_path, DEBUG=False):
'WPF_Y', 'WPF_Z', 'WP_CLP_OFFSET_X',
'WP_GRP_OFFSET_Z'])
if min(WPR_X, WPR_Y, WPR_Z, WPF_X, WPF_Y, WPF_Z) <= 0:
if min(WPR_X, WPR_Y, WPR_Z) < 0:
raise ValueError("Dimensions must be positive.")
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# Define raw workpiece dimensions
x_cube, y_cube, z_cube = 2 * WPR_X, 2 * WPR_Y, WPR_Z
x_cube, y_cube, z_cube = WPR_X,WPR_Y, WPR_Z
vertices_raw = np.array([[0, 0, 0], [x_cube, 0, 0], [x_cube, y_cube, 0], [0, y_cube, 0],
[0, 0, WPR_Z], [x_cube, 0, WPR_Z], [x_cube, y_cube, WPR_Z], [0, y_cube, WPR_Z]])
faces_raw = [vertices_raw[[0, 1, 2, 3]], vertices_raw[[4, 5, 6, 7]], vertices_raw[[0, 3, 7, 4]],
@ -41,10 +41,10 @@ def generate_picture_wp(all_group_vars, picture_path, DEBUG=False):
# Draw gripping point
u, v = np.mgrid[0:2 * np.pi:20j, 0:np.pi:20j]
ball_radius = min(WPR_X, WPR_Y, WPR_Z) * 0.1
ball_radius = min(WPR_X, WPR_Y, WPR_Z) * 0.05
ax.plot_surface(
WPR_X + ball_radius * np.cos(u) * np.sin(v),
WPR_Y + ball_radius * np.sin(u) * np.sin(v),
WPR_X/2 + ball_radius * np.cos(u) * np.sin(v),
WPR_Y/2 + ball_radius * np.sin(u) * np.sin(v),
WPR_Z + ball_radius * np.cos(v),
color='r'
)
@ -65,15 +65,15 @@ def generate_picture_wp(all_group_vars, picture_path, DEBUG=False):
)
# Define finished workpiece dimensions
x_cube2, y_cube2, z_cube2 = 2 * WPF_X, 2 * WPF_Y, WPF_Z
x_cube2, y_cube2, z_cube2 = WPR_X + WPF_X,WPR_Y + WPF_Y,WPR_Z + WPF_Z
# Draw gripping point for finished workpiece
u, v = np.mgrid[0:2 * np.pi:20j, 0:np.pi:20j]
ball_radius = min(WPF_X, WPF_Y, WPF_Z) * 0.08
ball_radius = min(WPR_X, WPR_Y, WPR_Z) * 0.05
ax.plot_surface(
WPF_X + ball_radius * np.cos(u) * np.sin(v),
WPF_Y + ball_radius * np.sin(u) * np.sin(v),
WPF_Z + ball_radius * np.cos(v),
WPR_X/2+WPF_X + ball_radius * np.cos(u) * np.sin(v),
WPR_Y/2+WPF_Y + ball_radius * np.sin(u) * np.sin(v),
WPR_Z+WPF_Z + ball_radius * np.cos(v),
color='g'
)
@ -83,46 +83,57 @@ def generate_picture_wp(all_group_vars, picture_path, DEBUG=False):
GRP_ALPHA2 = .25
yyy2 = [-gripper_thickness2, y_cube2] if WPF_Y < WPR_Y else [-gripper_thickness2 + (WPF_Y - WPR_Y) * 2, y_cube]
bars = [
((x_cube2 - gripper_wide2) * 0.5, yyy2[0], WPF_Z - WP_GRP_OFFSET_Z),
((x_cube2 - gripper_wide2) * 0.5, yyy2[1], WPF_Z - WP_GRP_OFFSET_Z),
((x_cube2 - gripper_wide2) * 0.5, yyy2[0],WPR_Z + WPF_Z - WP_GRP_OFFSET_Z),
((x_cube2 - gripper_wide2) * 0.5, yyy2[1], WPR_Z +WPF_Z - WP_GRP_OFFSET_Z),
]
for (x, y, z) in bars:
ax.bar3d(
x, y, z,
gripper_wide2, gripper_thickness2, 5 * WPF_Z + WP_GRP_OFFSET_Z,
gripper_wide2, gripper_thickness2, 5 *WPR_Z +WPF_Z + WP_GRP_OFFSET_Z,
color='g', alpha=GRP_ALPHA2, edgecolor='k', linewidth=0.5
)
# Draw CLP coordinate system
axis_len = max(x_cube, y_cube, z_cube) * 0.15
colors = ['r', 'g', 'b']
origin_x = WPR_X - WP_CLP_OFFSET_X
origin_y = WPR_Y
origin_x = WPR_X/2 - WP_CLP_OFFSET_X
origin_y = WPR_Y/2
origin_z = 0
for i, vec in enumerate(np.eye(3)):
ax.quiver(origin_x, origin_y, origin_z, *(axis_len * vec), color=colors[i], linewidth=3)
ax.text(origin_x, origin_y, origin_z - axis_len * 0.3, 'CLP', color='blue', fontsize=9, weight='bold', ha='center',
va='top')
try:
CLP_BACKENWEITE, CLP_BACKENHOHE, CLP_SPANNHOHE, CLP_AUFLAGETIEFE,MESSPOS_Z = (
float(all_group_vars['clp'][k]) for k in
['CLP_BACKENWEITE', 'CLP_BACKENHOHE', 'CLP_SPANNHOHE', 'CLP_AUFLAGETIEFE','MESSPOS_Z']
)
except (KeyError, ValueError):
CLP_BACKENWEITE = 100
CLP_BACKENHOHE = 50
CLP_SPANNHOHE = 5
CLP_AUFLAGETIEFE = 5
MESSPOS_Z = 5
# Define clamping block dimensions
clp_height = z_cube * 0.2
clp_width = 0.6 * x_cube
clp_deep = y_cube * 0.3
clp_supportdeep = 3
base_x = WPR_X - clp_width / 2
clp_deep = MESSPOS_Z
base_x = WPR_X/2 - CLP_BACKENWEITE / 2
alpha = 0.35
color = 'blue'
linewidth = 1
# Draw clamping blocks
x = base_x - WP_CLP_OFFSET_X
dx = clp_width
x = base_x
dx = CLP_BACKENWEITE
y = 0
dy1 = clp_deep
dy2 = clp_supportdeep
dy2 = CLP_AUFLAGETIEFE
z = 0
dz1 = z_cube * 0.2
dz2 = z_cube * 0.6
dz1 = CLP_SPANNHOHE
dz2 = CLP_BACKENHOHE
plot_clamping(ax, x, y, z, dx, dy1, dy2, dz1, dz2, color=color,
alpha=alpha, linewidth=linewidth)
y = y_cube

View File

@ -128,3 +128,131 @@ def plot_clamping(ax, x, y, z, dx, dy1, dy2, dz1, dz2, color='blue', alpha=0.5,
except Exception as e:
print(f"Trimesh union failed: {e}")
def VarDescription(Name):
#Workpiece
if Name == "wp":
return "Rohmaterial"
elif Name == "WPR_X":
return "Rohmass X"
elif Name == "WPR_Y":
return "Rohmass Y"
elif Name == "WPR_Z":
return "Rohmass Z"
elif Name == "WPF_X":
return "Griffversatz fertig X"
elif Name == "WPF_Y":
return "Griffversatz fertig Y"
elif Name == "WPF_Z":
return "Griffversatz fertig Z"
elif Name == "WP_CLP_OFFSET_X":
return "Einlegeposition X"
elif Name == "WP_CLP_OFFSET_Y":
return "Einlegeposition Y"
elif Name == "WP_GRP_OFFSET_Z":
return "Greiftiefe"
#CLP
elif Name == "clp":
return "Schraubstock Backen"
elif Name == "CLP_BACKENWEITE":
return "Backenbreite"
elif Name == "CLP_BACKENHOHE":
return "Backenhöhe"
elif Name == "CLP_SPANNHOHE":
return "Backen Spanntiefe"
elif Name == "CLP_AUFLAGETIEFE":
return "Auflagebreite"
elif Name == "MESSPOS_X":
return "Messposition X"
elif Name == "MESSPOS_Y":
return "Messposition Y"
elif Name == "MESSPOS_Z":
return "Abstand Teil-Backe"
elif Name == "MESSPOS_TOL":
return "Toleranz Spannen"
#PROBE
elif Name == "probe":
return "Messen"
elif Name == "PRB_BOD_RE_X":
return "Boden Rechts X"
elif Name == "PRB_BOD_RE_Y":
return "Boden Rechts Y"
elif Name == "PRB_BOD_LI_X":
return "Boden Links X"
elif Name == "PRB_BOD_LI_Y":
return "Boden Links Y"
elif Name == "PRB_SEI_HI_X":
return "Hinten X"
elif Name == "PRB_SEI_HI_Z":
return "Hinten Z"
elif Name == "PRB_SEI_VO_X":
return "Vorne X"
elif Name == "PRB_SEI_VO_Z":
return "Vorne Z"
elif Name == "PRB_VERS_X_Y":
return "X Mess Pos Y"
elif Name == "PRB_VERS_X_Z":
return "X Mess Pos Z"
elif Name == "PRB_VERS_X_TOL":
return "Pos Toleranz X"
#INL
elif Name == "inlay":
return "Inlay"
elif Name == "INL_X_NUM":
return "Felder in X"
elif Name == "INL_X_LENGTH":
return "Feldlänge X"
elif Name == "INL_X_OFFSET":
return "Abstand Felder X"
elif Name == "INL_Y_NUM":
return "Felder in Y"
elif Name == "INL_Y_LENGTH":
return "Feldlänge in Y"
elif Name == "INL_Y_OFFSET":
return "Abstand Felder Y"
elif Name == "PRT_NUM":
return "Teile pro Feld"
elif Name != "":
return Name