DangVan / app_ultra_simple.py
tiffank1802
SOLUTION FINALE - Version ultra-robuste
dad5dde
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:
# ÉTAPE 1: Calcul des points
points_uniaxial = dv.nuage(sigma1, omega, pasTemps, fin)
points_torsion = dv.nuageOrt(sigma1, omega, pasTemps, fin)
# ÉTAPE 2: Graphique simple
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)
# ÉTAPE 3: Sauvegarde
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)
# ÉTAPE 4: Résultats simples
stats = f"""
**Paramètres:**
- σ₁ = {sigma1} MPa
- ω = {omega:.2f} rad/s
- Points uniaxiaux = {len(points_uniaxial)}
- Points torsion = {len(points_torsion)}
"""
# ÉTAPE 5: Données
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
)
# Interface ultra-simple
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)