| import gradio as gr |
| import numpy as np |
| import matplotlib.pyplot as plt |
| import versDV as dv |
| import deviatoire as dev |
| from math import pi |
| import pandas as pd |
| import io |
| import base64 |
|
|
| def calculate_simulation(sigma1, omega, fin, pasTemps, point_size, show_grid): |
| """Fonction ultra-simple et robuste""" |
| try: |
| |
| points_uniaxial = dv.nuage(sigma1, omega, pasTemps, fin) |
| points_torsion = dv.nuageOrt(sigma1, omega, pasTemps, fin) |
| |
| |
| fig, ax = plt.subplots(figsize=(10, 6)) |
| ax.scatter(points_uniaxial[:, 0], points_uniaxial[:, 1], |
| s=point_size, alpha=0.7, label='Traction-Compression', c='red') |
| ax.scatter(points_torsion[:, 0], points_torsion[:, 1], |
| s=point_size, alpha=0.7, label='Torsion', c='blue') |
| |
| ax.set_xlabel("Pression hydrostatique (MPa)") |
| ax.set_ylabel("Amplitude de cisaillement max (MPa)") |
| ax.set_title("Diagramme de Dang Van") |
| ax.legend() |
| if show_grid: |
| ax.grid(True, alpha=0.3) |
| |
| |
| buf = io.BytesIO() |
| fig.savefig(buf, format='png', dpi=100, bbox_inches='tight') |
| buf.seek(0) |
| plot_data = base64.b64encode(buf.read()).decode() |
| plt.close(fig) |
| |
| |
| stats = f""" |
| **Paramètres:** |
| - σ₁ = {sigma1} MPa |
| - ω = {omega:.2f} rad/s |
| - Points uniaxiaux = {len(points_uniaxial)} |
| - Points torsion = {len(points_torsion)} |
| """ |
| |
| |
| df_u = pd.DataFrame(points_uniaxial, columns=['Pression', 'Cisaillement']) |
| df_t = pd.DataFrame(points_torsion, columns=['Pression', 'Cisaillement']) |
| |
| return ( |
| f'<img src="data:image/png;base64,{plot_data}" style="max-width: 100%;">', |
| stats, |
| df_u.to_csv(index=False), |
| df_t.to_csv(index=False), |
| buf.getvalue() |
| ) |
| |
| except Exception as e: |
| error_msg = f"Erreur: {str(e)}" |
| return ( |
| f"<p style='color: red;'>{error_msg}</p>", |
| error_msg, |
| "error", |
| "error", |
| None |
| ) |
|
|
| |
| with gr.Blocks() as demo: |
| gr.HTML(""" |
| <div style="background: #D52B1E; color: white; padding: 2rem; text-align: center;"> |
| <h1>ÉCOLE CENTRALE LYON</h1> |
| <h2>Critère de Dang Van - Analyse de Fatigue</h2> |
| </div> |
| """) |
| |
| with gr.Row(): |
| with gr.Column(): |
| gr.Markdown("## Paramètres") |
| sigma1 = gr.Slider(10, 200, 100, label="Contrainte σ₁ (MPa)") |
| omega = gr.Slider(0.1, 10.0, float(2*pi), label="Fréquence ω (rad/s)") |
| fin = gr.Slider(0.1, 2.0, 1.0, label="Temps final") |
| pasTemps = gr.Slider(0.001, 0.1, 0.1, label="Pas de temps") |
| point_size = gr.Slider(10, 100, 30, label="Taille des points") |
| show_grid = gr.Checkbox(True, label="Grille") |
| |
| btn = gr.Button("Lancer simulation", variant="primary", size="lg") |
| |
| with gr.Column(): |
| gr.Markdown("## Résultats") |
| plot_output = gr.HTML() |
| stats_output = gr.Markdown() |
| |
| gr.Markdown("## Export des données") |
| file_u = gr.File(label="Traction-Compression (.csv)") |
| file_t = gr.File(label="Torsion (.csv)") |
| file_plot = gr.File(label="Graphique (.png)") |
| |
| gr.HTML(""" |
| <div style="background: #333; color: white; padding: 1rem; text-align: center; margin-top: 2rem;"> |
| <p>© 2026 - École Centrale Lyon | Mécanique des Matériaux</p> |
| </div> |
| """) |
| |
| btn.click( |
| fn=calculate_simulation, |
| inputs=[sigma1, omega, fin, pasTemps, point_size, show_grid], |
| outputs=[plot_output, stats_output, file_u, file_t, file_plot] |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch(server_name="0.0.0.0", server_port=7860) |