From cfab70ac55526b2e7492caf3908b9e787cbd31a0 Mon Sep 17 00:00:00 2001 From: "Tammo.Weber" Date: Sun, 8 Feb 2026 17:51:55 +0100 Subject: [PATCH] =?UTF-8?q?Meldung=20wenn=20Berechung=20fehlschl=C3=A4gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard.py | 346 +++++++++++++++++++++++++++++---------------------- 1 file changed, 196 insertions(+), 150 deletions(-) diff --git a/dashboard.py b/dashboard.py index a203ff7..9a7f595 100644 --- a/dashboard.py +++ b/dashboard.py @@ -5,6 +5,7 @@ import dash_bootstrap_components as dbc import builtins from dash.exceptions import PreventUpdate +import traceback import webbrowser 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) +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"): 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 - ell = EllipsoidTriaxial(ax, ay, b) - beta_rad = wu.deg2rad(float(beta0)) - lamb_rad = wu.deg2rad(float(lamb0)) - alpha_rad = wu.deg2rad(float(a0)) - _, _, alpha_rad_para = alpha_ell2para(ell, beta_rad, lamb_rad, alpha_rad) - s_val = float(s) + try: + ell = EllipsoidTriaxial(ax, ay, b) + beta_rad = wu.deg2rad(float(beta0)) + lamb_rad = wu.deg2rad(float(lamb0)) + alpha_rad = wu.deg2rad(float(a0)) + _, _, alpha_rad_para = alpha_ell2para(ell, beta_rad, lamb_rad, alpha_rad) + s_val = float(s) - P0 = ell.ell2cart(beta_rad, lamb_rad) - P1_ana, alpha2_para = gha1_ana(ell, P0, alpha_rad_para, s_val, n_in) - u1, v1 = ell.cart2para(P1_ana) - alpha2 = alpha_para2ell(ell, u1, v1, alpha2_para) - beta2_ana, lamb2_ana = ell.cart2ell(P1_ana) + P0 = ell.ell2cart(beta_rad, lamb_rad) + P1_ana, alpha2_para = gha1_ana(ell, P0, alpha_rad_para, s_val, n_in) + u1, v1 = ell.cart2para(P1_ana) + alpha2 = alpha_para2ell(ell, u1, v1, alpha2_para) + beta2_ana, lamb2_ana = ell.cart2ell(P1_ana) - out = html.Div([ - html.Strong("Analytisch: "), - 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.Br(), - html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_ana, 4)}, {aus.gms('λ₁', lamb2_ana, 4)}"), - html.Br(), - ]) + out = html.Div([ + html.Strong("Analytisch: "), + 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.Br(), + html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_ana, 4)}, {aus.gms('λ₁', lamb2_ana, 4)}"), + html.Br(), + ]) - store = { - "points": [("P0", P0, "black"), ("P1 (ana)", P1_ana, "red")], - "polyline": None, - "name": "Analytisch", - "color": "red" - } - return out, store + store = { + "points": [("P0", P0, "black"), ("P1 (ana)", P1_ana, "red")], + "polyline": None, + "name": "Analytisch", + "color": "red" + } + return out, store + + except Exception as e: + return method_failed("Analytisch", e), None @app.callback( 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)) 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) - beta2_num, lamb2_num = ell.cart2ell(P1_num) + 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) - out = html.Div([ - html.Strong("Numerisch: "), - 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.Br(), - html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_num, 4)}, {aus.gms('λ₁', lamb2_num, 4)}"), - html.Br(), - ]) + out = html.Div([ + html.Strong("Numerisch: "), + 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.Br(), + html.Span(f"ellipsoidisch: {aus.gms('β₁', beta2_num, 4)}, {aus.gms('λ₁', lamb2_num, 4)}"), + html.Br(), + ]) - polyline = [[x1, y1, z1] for x1, _, y1, _, z1, _ in werte] + polyline = [[x1, y1, z1] for x1, _, y1, _, z1, _ in werte] - store = { - "points": [("P0", P0, "black"), ("P1 (num)", P1_num, "#ff8c00")], - "polyline": polyline, - "name": "Numerisch", - "color": "#ff8c00" - } - return out, store + store = { + "points": [("P0", P0, "black"), ("P1 (num)", P1_num, "#ff8c00")], + "polyline": polyline, + "name": "Numerisch", + "color": "#ff8c00" + } + return out, store + + except Exception as e: + return method_failed("Numerisch", e), None @app.callback( 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 - ell = EllipsoidTriaxial(ax, ay, b) - beta_rad = wu.deg2rad(float(beta0)) - lamb_rad = wu.deg2rad(float(lamb0)) - alpha_rad = wu.deg2rad(float(a0)) - s_val = float(s) + try: + ell = EllipsoidTriaxial(ax, ay, b) + beta_rad = wu.deg2rad(float(beta0)) + lamb_rad = wu.deg2rad(float(lamb0)) + 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) - beta1_stoch, lamb1_stoch = ell.cart2ell(P1_stoch) + P0 = ell.ell2cart(beta_rad, lamb_rad) + beta1_stoch, lamb1_stoch = ell.cart2ell(P1_stoch) - out = html.Div([ - html.Strong("Stochastisch: "), - 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.Br(), - html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_stoch, 4)}, {aus.gms('λ₁', lamb1_stoch, 4)}"), - ]) + out = html.Div([ + html.Strong("Stochastisch: "), + 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.Br(), + html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_stoch, 4)}, {aus.gms('λ₁', lamb1_stoch, 4)}"), + ]) - store = { - "points": [("P0", P0, "black"), ("P1 (ES)", P1_stoch, "#1fa342")], - "polyline": points, - "name": "Stochastisch (ES)", - "color": "#1fa342" - } - return out, store + store = { + "points": [("P0", P0, "black"), ("P1 (ES)", P1_stoch, "#1fa342")], + "polyline": points, + "name": "Stochastisch (ES)", + "color": "#1fa342" + } + return out, store + + except Exception as e: + return method_failed("Stochastisch (ES)", e), None @app.callback( 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 - ell = EllipsoidTriaxial(ax, ay, b) - beta_rad = wu.deg2rad(float(beta0)) - lamb_rad = wu.deg2rad(float(lamb0)) - alpha_rad = wu.deg2rad(float(a0)) - s_val = float(s) + try: + ell = EllipsoidTriaxial(ax, ay, b) + beta_rad = wu.deg2rad(float(beta0)) + lamb_rad = wu.deg2rad(float(lamb0)) + alpha_rad = wu.deg2rad(float(a0)) + s_val = float(s) - 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) + 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) - beta1_app, lamb1_app = ell.cart2ell(P1_app) + beta1_app, lamb1_app = ell.cart2ell(P1_app) - out = html.Div([ - html.Strong("Approximiert: "), - 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.Br(), - html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_app, 4)}, {aus.gms('λ₁', lamb1_app, 4)}"), - ]) + out = html.Div([ + html.Strong("Approximiert: "), + 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.Br(), + html.Span(f"ellipsoidisch: {aus.gms('β₁', beta1_app, 4)}, {aus.gms('λ₁', lamb1_app, 4)}"), + ]) - store = { - "points": [("P0", P0, "black"), ("P1 (approx)", P1_app, "#00c2fc")], - "polyline": points, - "name": "Approximiert", - "color": "#00c2fc" - } - return out, store + store = { + "points": [("P0", P0, "black"), ("P1 (approx)", P1_app, "#00c2fc")], + "polyline": points, + "name": "Approximiert", + "color": "#00c2fc" + } + return out, store + + except Exception as e: + return method_failed("Approximiert", e), None # --- 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 - ell = EllipsoidTriaxial(ax, ay, b) + try: + ell = EllipsoidTriaxial(ax, ay, b) - beta0_rad = wu.deg2rad(float(beta0)) - lamb0_rad = wu.deg2rad(float(lamb0)) - beta1_rad = wu.deg2rad(float(beta1)) - lamb1_rad = wu.deg2rad(float(lamb1)) + beta0_rad = wu.deg2rad(float(beta0)) + lamb0_rad = wu.deg2rad(float(lamb0)) + beta1_rad = wu.deg2rad(float(beta1)) + lamb1_rad = wu.deg2rad(float(lamb1)) - P0 = ell.ell2cart(beta0_rad, lamb0_rad) - P1 = ell.ell2cart(beta1_rad, lamb1_rad) + P0 = ell.ell2cart(beta0_rad, lamb0_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 = [] - for b_rad, l_rad in zip(beta_arr, lamb_arr): - x, y, z = ell.ell2cart(b_rad, l_rad) - polyline.append([float(x), float(y), float(z)]) + polyline = [] + for b_rad, l_rad in zip(beta_arr, lamb_arr): + x, y, z = ell.ell2cart(b_rad, l_rad) + polyline.append([float(x), float(y), float(z)]) - out = html.Div([ - html.Strong("Numerisch: "), - html.Span(f"{aus.gms('α₀', a0_num, 4)}, {aus.gms('α₁', a1_num, 4)}, s = {s_num:.4f} m"), - ]) + out = html.Div([ + html.Strong("Numerisch: "), + html.Span(f"{aus.gms('α₀', a0_num, 4)}, {aus.gms('α₁', a1_num, 4)}, s = {s_num:.4f} m"), + ]) - store = { - "points": [("P0", P0, "black"), ("P1", P1, "black")], - "polyline": polyline, - "name": "Numerisch", - "color": "#ff8c00", - } - return out, store + store = { + "points": [("P0", P0, "black"), ("P1", P1, "black")], + "polyline": polyline, + "name": "Numerisch", + "color": "#ff8c00", + } + return out, store + + except Exception as e: + return method_failed("Numerisch", e), None @app.callback( 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 - ell = EllipsoidTriaxial(ax, ay, b) + try: + ell = EllipsoidTriaxial(ax, ay, b) - beta0_rad = wu.deg2rad(float(beta0)) - lamb0_rad = wu.deg2rad(float(lamb0)) - beta1_rad = wu.deg2rad(float(beta1)) - lamb1_rad = wu.deg2rad(float(lamb1)) + beta0_rad = wu.deg2rad(float(beta0)) + lamb0_rad = wu.deg2rad(float(lamb0)) + beta1_rad = wu.deg2rad(float(beta1)) + lamb1_rad = wu.deg2rad(float(lamb1)) - P0 = ell.ell2cart(beta0_rad, lamb0_rad) - P1 = ell.ell2cart(beta1_rad, lamb1_rad) + P0 = ell.ell2cart(beta0_rad, lamb0_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([ - html.Strong("Stochastisch (ES): "), - html.Span(f"{aus.gms('α₀', a0_stoch, 4)}, {aus.gms('α₁', a1_stoch, 4)}, s = {s_stoch:.4f} m"), - ]) + out = html.Div([ + html.Strong("Stochastisch (ES): "), + html.Span(f"{aus.gms('α₀', a0_stoch, 4)}, {aus.gms('α₁', a1_stoch, 4)}, s = {s_stoch:.4f} m"), + ]) - store = { - "points": [("P0", P0, "black"), ("P1", P1, "black")], - "polyline": points, - "name": "Stochastisch (ES)", - "color": "#1fa342", - } + store = { + "points": [("P0", P0, "black"), ("P1", P1, "black")], + "polyline": points, + "name": "Stochastisch (ES)", + "color": "#1fa342", + } - return out, store + return out, store + + except Exception as e: + return method_failed("Stochastisch (ES)", e), None @app.callback( 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 - ell = EllipsoidTriaxial(ax, ay, b) + try: + ell = EllipsoidTriaxial(ax, ay, b) - beta0_rad = wu.deg2rad(float(beta0)) - lamb0_rad = wu.deg2rad(float(lamb0)) - beta1_rad = wu.deg2rad(float(beta1)) - lamb1_rad = wu.deg2rad(float(lamb1)) + beta0_rad = wu.deg2rad(float(beta0)) + lamb0_rad = wu.deg2rad(float(lamb0)) + beta1_rad = wu.deg2rad(float(beta1)) + lamb1_rad = wu.deg2rad(float(lamb1)) - P0 = ell.ell2cart(beta0_rad, lamb0_rad) - P1 = ell.ell2cart(beta1_rad, lamb1_rad) + P0 = ell.ell2cart(beta0_rad, lamb0_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([ - html.Strong("Approximiert: "), - html.Span(f"{aus.gms('α₀', a0_app, 4)}, {aus.gms('α₁', a1_app, 4)}, s = {s_app:.4f} m"), - ]) + out = html.Div([ + html.Strong("Approximiert: "), + html.Span(f"{aus.gms('α₀', a0_app, 4)}, {aus.gms('α₁', a1_app, 4)}, s = {s_app:.4f} m"), + ]) - store = { - "points": [("P0", P0, "black"), ("P1", P1, "black")], - "polyline": points, - "name": "Approximiert", - "color": "#00c2fc", - } + store = { + "points": [("P0", P0, "black"), ("P1", P1, "black")], + "polyline": points, + "name": "Approximiert", + "color": "#00c2fc", + } - return out, store + return out, store + + except Exception as e: + return method_failed("Stochastisch (ES)", e), None # --- Plot --- @app.callback(