Meldung wenn Berechung fehlschlägt

This commit is contained in:
Tammo.Weber
2026-02-08 17:51:55 +01:00
parent ee85e8b0e6
commit cfab70ac55

View File

@@ -5,6 +5,7 @@ import dash_bootstrap_components as dbc
import builtins import builtins
from dash.exceptions import PreventUpdate from dash.exceptions import PreventUpdate
import traceback
import webbrowser import webbrowser
from threading import Timer from threading import Timer
@@ -117,6 +118,23 @@ def method_row(label, cb_id, input_id=None, value="", info=""):
return html.Div(children, style=base_row_style) return html.Div(children, style=base_row_style)
def method_failed(method_label: str, exc: Exception):
return html.Div([
html.Strong(f"{method_label}: "),
html.Span("konnte nicht berechnet werden. ", style={"color": "red"}),
#html.Span(f"({type(exc).__name__}: {exc})", style={"color": "#b02a37"}),
html.Details([
html.Summary("Details"),
html.Pre(traceback.format_exc(), style={
"whiteSpace": "pre-wrap",
"fontSize": "12px",
"color": "#6c757d",
"marginTop": "6px"
})
], style={"marginTop": "6px"})
])
def ellipsoid_figure(ell: EllipsoidTriaxial, title="Dreiachsiges Ellipsoid"): def ellipsoid_figure(ell: EllipsoidTriaxial, title="Dreiachsiges Ellipsoid"):
fig = go.Figure() fig = go.Figure()
@@ -634,35 +652,39 @@ def compute_gha1_ana(n1, cb_ana, n_in, beta0, lamb0, s, a0, ax, ay, b):
n_in = int(n_in) if n_in else 70 n_in = int(n_in) if n_in else 70
ell = EllipsoidTriaxial(ax, ay, b) try:
beta_rad = wu.deg2rad(float(beta0)) ell = EllipsoidTriaxial(ax, ay, b)
lamb_rad = wu.deg2rad(float(lamb0)) beta_rad = wu.deg2rad(float(beta0))
alpha_rad = wu.deg2rad(float(a0)) lamb_rad = wu.deg2rad(float(lamb0))
_, _, alpha_rad_para = alpha_ell2para(ell, beta_rad, lamb_rad, alpha_rad) alpha_rad = wu.deg2rad(float(a0))
s_val = float(s) _, _, alpha_rad_para = alpha_ell2para(ell, beta_rad, lamb_rad, alpha_rad)
s_val = float(s)
P0 = ell.ell2cart(beta_rad, lamb_rad) P0 = ell.ell2cart(beta_rad, lamb_rad)
P1_ana, alpha2_para = gha1_ana(ell, P0, alpha_rad_para, s_val, n_in) P1_ana, alpha2_para = gha1_ana(ell, P0, alpha_rad_para, s_val, n_in)
u1, v1 = ell.cart2para(P1_ana) u1, v1 = ell.cart2para(P1_ana)
alpha2 = alpha_para2ell(ell, u1, v1, alpha2_para) alpha2 = alpha_para2ell(ell, u1, v1, alpha2_para)
beta2_ana, lamb2_ana = ell.cart2ell(P1_ana) beta2_ana, lamb2_ana = ell.cart2ell(P1_ana)
out = html.Div([ out = html.Div([
html.Strong("Analytisch: "), html.Strong("Analytisch: "),
html.Br(), html.Br(),
html.Span(f"kartesisch: x₁={P1_ana[0]:.4f} m, y₁={P1_ana[1]:.4f} m, z₁={P1_ana[2]:.4f} m"), html.Span(f"kartesisch: x₁={P1_ana[0]:.4f} m, y₁={P1_ana[1]:.4f} m, z₁={P1_ana[2]:.4f} m"),
html.Br(), html.Br(),
html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_ana, 4)}, {aus.gms('λ₁', lamb2_ana, 4)}"), html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_ana, 4)}, {aus.gms('λ₁', lamb2_ana, 4)}"),
html.Br(), html.Br(),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1 (ana)", P1_ana, "red")], "points": [("P0", P0, "black"), ("P1 (ana)", P1_ana, "red")],
"polyline": None, "polyline": None,
"name": "Analytisch", "name": "Analytisch",
"color": "red" "color": "red"
} }
return out, store return out, store
except Exception as e:
return method_failed("Analytisch", e), None
@app.callback( @app.callback(
Output("output-gha1-num", "children"), Output("output-gha1-num", "children"),
@@ -693,29 +715,33 @@ def compute_gha1_num(n1, cb_num, n_in, beta0, lamb0, s, a0, ax, ay, b):
alpha_rad = wu.deg2rad(float(a0)) alpha_rad = wu.deg2rad(float(a0))
s_val = float(s) s_val = float(s)
P0 = ell.ell2cart(beta_rad, lamb_rad) try:
P0 = ell.ell2cart(beta_rad, lamb_rad)
P1_num, alpha1, werte = gha1_num(ell, P0, alpha_rad, s_val, n_in, all_points=True) P1_num, alpha1, werte = gha1_num(ell, P0, alpha_rad, s_val, n_in, all_points=True)
beta2_num, lamb2_num = ell.cart2ell(P1_num) beta2_num, lamb2_num = ell.cart2ell(P1_num)
out = html.Div([ out = html.Div([
html.Strong("Numerisch: "), html.Strong("Numerisch: "),
html.Br(), html.Br(),
html.Span(f"kartesisch: x₁={P1_num[0]:.4f} m, y₁={P1_num[1]:.4f} m, z₁={P1_num[2]:.4f} m"), html.Span(f"kartesisch: x₁={P1_num[0]:.4f} m, y₁={P1_num[1]:.4f} m, z₁={P1_num[2]:.4f} m"),
html.Br(), html.Br(),
html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_num, 4)}, {aus.gms('λ₁', lamb2_num, 4)}"), html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_num, 4)}, {aus.gms('λ₁', lamb2_num, 4)}"),
html.Br(), html.Br(),
]) ])
polyline = [[x1, y1, z1] for x1, _, y1, _, z1, _ in werte] polyline = [[x1, y1, z1] for x1, _, y1, _, z1, _ in werte]
store = { store = {
"points": [("P0", P0, "black"), ("P1 (num)", P1_num, "#ff8c00")], "points": [("P0", P0, "black"), ("P1 (num)", P1_num, "#ff8c00")],
"polyline": polyline, "polyline": polyline,
"name": "Numerisch", "name": "Numerisch",
"color": "#ff8c00" "color": "#ff8c00"
} }
return out, store return out, store
except Exception as e:
return method_failed("Numerisch", e), None
@app.callback( @app.callback(
Output("output-gha1-stoch", "children"), Output("output-gha1-stoch", "children"),
@@ -740,32 +766,36 @@ def compute_gha1_stoch(n1, cb_stoch, n_in, beta0, lamb0, s, a0, ax, ay, b):
n_in = int(n_in) if n_in else 1000 n_in = int(n_in) if n_in else 1000
ell = EllipsoidTriaxial(ax, ay, b) try:
beta_rad = wu.deg2rad(float(beta0)) ell = EllipsoidTriaxial(ax, ay, b)
lamb_rad = wu.deg2rad(float(lamb0)) beta_rad = wu.deg2rad(float(beta0))
alpha_rad = wu.deg2rad(float(a0)) lamb_rad = wu.deg2rad(float(lamb0))
s_val = float(s) alpha_rad = wu.deg2rad(float(a0))
s_val = float(s)
P1_stoch, alpha, points = gha1_ES(ell, beta0=beta_rad, omega0=lamb_rad, alpha0=alpha_rad, s_total=s_val, maxSegLen=n_in, all_points=True) P1_stoch, alpha, points = gha1_ES(ell, beta0=beta_rad, omega0=lamb_rad, alpha0=alpha_rad, s_total=s_val, maxSegLen=n_in, all_points=True)
P0 = ell.ell2cart(beta_rad, lamb_rad) P0 = ell.ell2cart(beta_rad, lamb_rad)
beta1_stoch, lamb1_stoch = ell.cart2ell(P1_stoch) beta1_stoch, lamb1_stoch = ell.cart2ell(P1_stoch)
out = html.Div([ out = html.Div([
html.Strong("Stochastisch: "), html.Strong("Stochastisch: "),
html.Br(), html.Br(),
html.Span(f"kartesisch: x₁={P1_stoch[0]:.4f} m, y₁={P1_stoch[1]:.4f} m, z₁={P1_stoch[2]:.4f} m"), html.Span(f"kartesisch: x₁={P1_stoch[0]:.4f} m, y₁={P1_stoch[1]:.4f} m, z₁={P1_stoch[2]:.4f} m"),
html.Br(), html.Br(),
html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_stoch, 4)}, {aus.gms('λ₁', lamb1_stoch, 4)}"), html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_stoch, 4)}, {aus.gms('λ₁', lamb1_stoch, 4)}"),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1 (ES)", P1_stoch, "#1fa342")], "points": [("P0", P0, "black"), ("P1 (ES)", P1_stoch, "#1fa342")],
"polyline": points, "polyline": points,
"name": "Stochastisch (ES)", "name": "Stochastisch (ES)",
"color": "#1fa342" "color": "#1fa342"
} }
return out, store return out, store
except Exception as e:
return method_failed("Stochastisch (ES)", e), None
@app.callback( @app.callback(
Output("output-gha1-approx", "children"), Output("output-gha1-approx", "children"),
@@ -790,32 +820,36 @@ def compute_gha1_approx(n1, cb_approx, ds_in, beta0, lamb0, s, a0, ax, ay, b):
ds_in = int(ds_in) if ds_in else 1000 ds_in = int(ds_in) if ds_in else 1000
ell = EllipsoidTriaxial(ax, ay, b) try:
beta_rad = wu.deg2rad(float(beta0)) ell = EllipsoidTriaxial(ax, ay, b)
lamb_rad = wu.deg2rad(float(lamb0)) beta_rad = wu.deg2rad(float(beta0))
alpha_rad = wu.deg2rad(float(a0)) lamb_rad = wu.deg2rad(float(lamb0))
s_val = float(s) alpha_rad = wu.deg2rad(float(a0))
s_val = float(s)
P0 = ell.ell2cart(beta_rad, lamb_rad) P0 = ell.ell2cart(beta_rad, lamb_rad)
P1_app, alpha1_app, points, alphas = gha1_approx(ell, P0, alpha_rad, s_val, ds=ds_in, all_points=True) P1_app, alpha1_app, points, alphas = gha1_approx(ell, P0, alpha_rad, s_val, ds=ds_in, all_points=True)
beta1_app, lamb1_app = ell.cart2ell(P1_app) beta1_app, lamb1_app = ell.cart2ell(P1_app)
out = html.Div([ out = html.Div([
html.Strong("Approximiert: "), html.Strong("Approximiert: "),
html.Br(), html.Br(),
html.Span(f"kartesisch: x₁={P1_app[0]:.4f} m, y₁={P1_app[1]:.4f} m, z₁={P1_app[2]:.4f} m"), html.Span(f"kartesisch: x₁={P1_app[0]:.4f} m, y₁={P1_app[1]:.4f} m, z₁={P1_app[2]:.4f} m"),
html.Br(), html.Br(),
html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_app, 4)}, {aus.gms('λ₁', lamb1_app, 4)}"), html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_app, 4)}, {aus.gms('λ₁', lamb1_app, 4)}"),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1 (approx)", P1_app, "#00c2fc")], "points": [("P0", P0, "black"), ("P1 (approx)", P1_app, "#00c2fc")],
"polyline": points, "polyline": points,
"name": "Approximiert", "name": "Approximiert",
"color": "#00c2fc" "color": "#00c2fc"
} }
return out, store return out, store
except Exception as e:
return method_failed("Approximiert", e), None
# --- GHA 2 --- # --- GHA 2 ---
@@ -842,35 +876,39 @@ def compute_gha2_num(n2, cb_num, n_in, beta0, lamb0, beta1, lamb1, ax, ay, b):
n_in = int(n_in) if n_in else 2000 n_in = int(n_in) if n_in else 2000
ell = EllipsoidTriaxial(ax, ay, b) try:
ell = EllipsoidTriaxial(ax, ay, b)
beta0_rad = wu.deg2rad(float(beta0)) beta0_rad = wu.deg2rad(float(beta0))
lamb0_rad = wu.deg2rad(float(lamb0)) lamb0_rad = wu.deg2rad(float(lamb0))
beta1_rad = wu.deg2rad(float(beta1)) beta1_rad = wu.deg2rad(float(beta1))
lamb1_rad = wu.deg2rad(float(lamb1)) lamb1_rad = wu.deg2rad(float(lamb1))
P0 = ell.ell2cart(beta0_rad, lamb0_rad) P0 = ell.ell2cart(beta0_rad, lamb0_rad)
P1 = ell.ell2cart(beta1_rad, lamb1_rad) P1 = ell.ell2cart(beta1_rad, lamb1_rad)
a0_num, a1_num, s_num, beta_arr, lamb_arr = gha2_num(ell, beta0_rad, lamb0_rad, beta1_rad, lamb1_rad, all_points=True, n=n_in) a0_num, a1_num, s_num, beta_arr, lamb_arr = gha2_num(ell, beta0_rad, lamb0_rad, beta1_rad, lamb1_rad, all_points=True, n=n_in)
polyline = [] polyline = []
for b_rad, l_rad in zip(beta_arr, lamb_arr): for b_rad, l_rad in zip(beta_arr, lamb_arr):
x, y, z = ell.ell2cart(b_rad, l_rad) x, y, z = ell.ell2cart(b_rad, l_rad)
polyline.append([float(x), float(y), float(z)]) polyline.append([float(x), float(y), float(z)])
out = html.Div([ out = html.Div([
html.Strong("Numerisch: "), html.Strong("Numerisch: "),
html.Span(f"{aus.gms('α₀', a0_num, 4)}, {aus.gms('α₁', a1_num, 4)}, s = {s_num:.4f} m"), html.Span(f"{aus.gms('α₀', a0_num, 4)}, {aus.gms('α₁', a1_num, 4)}, s = {s_num:.4f} m"),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1", P1, "black")], "points": [("P0", P0, "black"), ("P1", P1, "black")],
"polyline": polyline, "polyline": polyline,
"name": "Numerisch", "name": "Numerisch",
"color": "#ff8c00", "color": "#ff8c00",
} }
return out, store return out, store
except Exception as e:
return method_failed("Numerisch", e), None
@app.callback( @app.callback(
Output("output-gha2-stoch", "children"), Output("output-gha2-stoch", "children"),
@@ -895,31 +933,35 @@ def compute_gha2_stoch(n2, cb_stoch, n_in, beta0, lamb0, beta1, lamb1, ax, ay, b
n_in = int(n_in) if n_in else 1000 n_in = int(n_in) if n_in else 1000
ell = EllipsoidTriaxial(ax, ay, b) try:
ell = EllipsoidTriaxial(ax, ay, b)
beta0_rad = wu.deg2rad(float(beta0)) beta0_rad = wu.deg2rad(float(beta0))
lamb0_rad = wu.deg2rad(float(lamb0)) lamb0_rad = wu.deg2rad(float(lamb0))
beta1_rad = wu.deg2rad(float(beta1)) beta1_rad = wu.deg2rad(float(beta1))
lamb1_rad = wu.deg2rad(float(lamb1)) lamb1_rad = wu.deg2rad(float(lamb1))
P0 = ell.ell2cart(beta0_rad, lamb0_rad) P0 = ell.ell2cart(beta0_rad, lamb0_rad)
P1 = ell.ell2cart(beta1_rad, lamb1_rad) P1 = ell.ell2cart(beta1_rad, lamb1_rad)
a0_stoch, a1_stoch, s_stoch, points = gha2_ES(ell, P0, P1, maxSegLen=n_in, all_points=True) a0_stoch, a1_stoch, s_stoch, points = gha2_ES(ell, P0, P1, maxSegLen=n_in, all_points=True)
out = html.Div([ out = html.Div([
html.Strong("Stochastisch (ES): "), html.Strong("Stochastisch (ES): "),
html.Span(f"{aus.gms('α₀', a0_stoch, 4)}, {aus.gms('α₁', a1_stoch, 4)}, s = {s_stoch:.4f} m"), html.Span(f"{aus.gms('α₀', a0_stoch, 4)}, {aus.gms('α₁', a1_stoch, 4)}, s = {s_stoch:.4f} m"),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1", P1, "black")], "points": [("P0", P0, "black"), ("P1", P1, "black")],
"polyline": points, "polyline": points,
"name": "Stochastisch (ES)", "name": "Stochastisch (ES)",
"color": "#1fa342", "color": "#1fa342",
} }
return out, store return out, store
except Exception as e:
return method_failed("Stochastisch (ES)", e), None
@app.callback( @app.callback(
Output("output-gha2-approx", "children"), Output("output-gha2-approx", "children"),
@@ -944,31 +986,35 @@ def compute_gha2_approx(n2, cb_approx, ds_in, beta0, lamb0, beta1, lamb1, ax, ay
ds_in = int(ds_in) if ds_in else 1000 ds_in = int(ds_in) if ds_in else 1000
ell = EllipsoidTriaxial(ax, ay, b) try:
ell = EllipsoidTriaxial(ax, ay, b)
beta0_rad = wu.deg2rad(float(beta0)) beta0_rad = wu.deg2rad(float(beta0))
lamb0_rad = wu.deg2rad(float(lamb0)) lamb0_rad = wu.deg2rad(float(lamb0))
beta1_rad = wu.deg2rad(float(beta1)) beta1_rad = wu.deg2rad(float(beta1))
lamb1_rad = wu.deg2rad(float(lamb1)) lamb1_rad = wu.deg2rad(float(lamb1))
P0 = ell.ell2cart(beta0_rad, lamb0_rad) P0 = ell.ell2cart(beta0_rad, lamb0_rad)
P1 = ell.ell2cart(beta1_rad, lamb1_rad) P1 = ell.ell2cart(beta1_rad, lamb1_rad)
a0_app, a1_app, s_app, points = gha2_approx(ell, P0, P1, ds=ds_in, all_points=True) a0_app, a1_app, s_app, points = gha2_approx(ell, P0, P1, ds=ds_in, all_points=True)
out = html.Div([ out = html.Div([
html.Strong("Approximiert: "), html.Strong("Approximiert: "),
html.Span(f"{aus.gms('α₀', a0_app, 4)}, {aus.gms('α₁', a1_app, 4)}, s = {s_app:.4f} m"), html.Span(f"{aus.gms('α₀', a0_app, 4)}, {aus.gms('α₁', a1_app, 4)}, s = {s_app:.4f} m"),
]) ])
store = { store = {
"points": [("P0", P0, "black"), ("P1", P1, "black")], "points": [("P0", P0, "black"), ("P1", P1, "black")],
"polyline": points, "polyline": points,
"name": "Approximiert", "name": "Approximiert",
"color": "#00c2fc", "color": "#00c2fc",
} }
return out, store return out, store
except Exception as e:
return method_failed("Stochastisch (ES)", e), None
# --- Plot --- # --- Plot ---
@app.callback( @app.callback(