proki-demo / processing /surface_plots.py
ifw-arz's picture
init
bcad657
raw
history blame
No virus
5.15 kB
import numpy as np
import csv
import plotly.graph_objects as go
from scipy.interpolate import griddata
import os
# Creates a 3D surface plot based on the selected CSV file
encoding = "utf-16"
sprint_kugel = 3
stegdicke = 6.5
tolerance = 12 #in µm
breite = 13.7
laenge = 39
x_values = [2.4, 3, 3.6, 4.2, 4.8, 5.4, 6, 6.6, 7.2, 7.8, 8.4, 9, 9.6, 10.2, 10.8, 11.4, 12, 12.6]
# Die Milltap hatte einen globalen Fehler von 20 µm. Dieser muss von den Messwerten abgezogen werden.
offset = 0
def surface_plot(csv_messung):
x = []
y = []
z = []
# Read CSV
with open(csv_messung, 'r', encoding=encoding) as file:
csv_reader = csv.reader(file)
for row in csv_reader:
if len(row) >= 2:
x.append(float(row[0]))
y.append(float(row[1]))
z.append(float(row[2]))
x = np.array(x)
y = np.array(y)
z = np.array(z)
# delete all data in x, y and z where y is not between -31 and -2:
x = x[(y > -31) & (y < -2)]
z = z[(y > -31) & (y < -2)]
y = y[(y > -31) & (y < -2)]
x = x +7.5
z = (np.array(z)-(sprint_kugel/2))
z = (z - (stegdicke/2) - offset)*1000
corner_limits = {
'plane_horizontal': {'x': [0, breite], 'y': [-laenge, 0]},
'plane_vertical': {'y': [-laenge, 0], 'z': [-10, 10], }
}
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
Xi, Yi = np.meshgrid(xi, yi)
Zi = griddata((x, y), z, (Xi, Yi), method='linear')
mask = np.logical_or(Zi > tolerance, Zi < -tolerance)
colorscale = [[0, 'rgba(0, 80, 155, 0.85)'], [1, 'rgba(0, 80, 155, 0.85)']]
# Messung
trace_surface = go.Surface(
x=Xi,
y=Yi,
z=Zi,
colorscale=colorscale,
surfacecolor=np.where(mask, 1, 0),
showscale=False,
)
# Ebene z = 0
trace_plane_0 = go.Surface(
x=corner_limits['plane_horizontal']['x'],
y=corner_limits['plane_horizontal']['y'],
z=np.zeros((2, 2)),
showscale=False,
opacity=0.5,
colorscale=[[0, 'rgba(0, 160, 0, 0.5)'], [1, 'rgba(0, 160, 0, 0.5)']],
)
# Plane at z = tolerance
trace_plane_tol = go.Surface(
x=corner_limits['plane_horizontal']['x'],
y=corner_limits['plane_horizontal']['y'],
z=np.full((2, 2), tolerance),
showscale=False,
opacity=0.3,
colorscale=[[0, 'rgba(255, 0, 0, 0.5)'], [1, 'rgba(255, 0, 0, 0.5)']],
)
# Plane at z = -tolerance
trace_plane_minus_tol = go.Surface(
x=corner_limits['plane_horizontal']['x'],
y=corner_limits['plane_horizontal']['y'],
z=np.full((2, 2), -tolerance),
showscale=False,
opacity=0.3,
colorscale=[[0, 'rgba(255, 0, 0, 0.5)'], [1, 'rgba(255, 0, 0, 0.5)']],
)
# Vertical plane trace
trace_plane_x = go.Surface(
x=np.full((2, 2), 4),
y=corner_limits['plane_vertical']['y'],
z=corner_limits['plane_vertical']['z'],
showscale=False,
opacity=0.3,
colorscale=[[0, 'rgba(255, 0, 0, 0.5)'], [1, 'rgba(255, 0, 0, 0.5)']],
)
titlefont=dict(family="Arial", size=20, color='black')
tickfont=dict(family="Arial", size=14, color='black')
layout = go.Layout(
scene=dict(
xaxis=dict(title='X [mm]', titlefont=titlefont, tickfont=tickfont),
yaxis=dict(title='Y [mm]', titlefont=titlefont, tickfont=tickfont),
zaxis=dict(title='Z [µm]', titlefont=titlefont, tickfont=tickfont),
aspectratio=dict(x=0.8, y=2.5, z=1),
camera=dict(
eye=dict(x=-1.5, y=2, z=0.4), # Set camera position
center=dict(x=0, y=0, z=-0.65))),
updatemenus=[
dict(
type='buttons',
buttons=[
dict(
label='Standard',
method='update',
args=[{'visible': [True, False, False, False, True]}]
),
dict(
label='Toleranzen einblenden',
method='update',
args=[{'visible': [True, True, True, True, True]}]
)
],
direction='down',
showactive=True,
x=0.1,
y=1.2
)]
)
# Set the 'visible' attribute for each trace
trace_surface.update(visible=True)
trace_plane_0.update(visible=False)
trace_plane_tol.update(visible=False)
trace_plane_minus_tol.update(visible=False)
trace_plane_x.update(visible=True)
fig = go.Figure(data=[trace_surface, trace_plane_0, trace_plane_tol, trace_plane_minus_tol, trace_plane_x], layout=layout)
#fig.update_layout(scene=dict(xaxis=dict(range=[0, 10]), yaxis=dict(range=[-40, 10]), zaxis=dict(range=[-40, 40])))
return(fig)