import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import warnings
warnings.filterwarnings('ignore')

# Leer el archivo manualmente
data = []
with open('resultados1.txt', 'r', encoding='utf-8') as f:
    header = f.readline().strip().split('\t')
    for line in f:
        values = line.strip().split()
        if len(values) >= 15:
            data.append(values)

# Convertir datos
def convert_value(x):
    try:
        return float(x.replace(',', '.').strip())
    except:
        return np.nan

tf = np.array([convert_value(row[2]) for row in data])
tw = np.array([convert_value(row[3]) for row in data])
flecha = np.array([convert_value(row[8]) for row in data])

# Filtrar NaN
valid = ~(np.isnan(tf) | np.isnan(tw) | np.isnan(flecha))
tf = tf[valid]
tw = tw[valid]
flecha = flecha[valid]

# Crear figura con 4 subplots
fig = plt.figure(figsize=(18, 14))

# Colores basados en la deflexión
colors = plt.cm.RdYlGn_r((np.abs(flecha) - np.abs(flecha).min()) / (np.abs(flecha).max() - np.abs(flecha).min()))

# 1. Vista 3D principal
ax1 = fig.add_subplot(2, 2, 1, projection='3d')
scatter1 = ax1.scatter(tf, tw, flecha, c=np.abs(flecha), cmap='RdYlGn_r', 
                       s=100, alpha=0.6, edgecolors='black', linewidth=0.5)
ax1.set_xlabel('tf (ala)', fontweight='bold')
ax1.set_ylabel('tw (alma)', fontweight='bold')
ax1.set_zlabel('Flecha', fontweight='bold')
ax1.set_title('Vista 3D Principal - Coloreado por |Deflexión|', fontweight='bold', fontsize=11)
ax1.view_init(elev=20, azim=45)
cbar1 = plt.colorbar(scatter1, ax=ax1, pad=0.1, shrink=0.8)
cbar1.set_label('|Deflexión|', fontweight='bold')

# 2. Vista 3D desde otro ángulo
ax2 = fig.add_subplot(2, 2, 2, projection='3d')
scatter2 = ax2.scatter(tf, tw, flecha, c=np.abs(flecha), cmap='RdYlGn_r',
                       s=100, alpha=0.6, edgecolors='black', linewidth=0.5)
ax2.set_xlabel('tf (ala)', fontweight='bold')
ax2.set_ylabel('tw (alma)', fontweight='bold')
ax2.set_zlabel('Flecha', fontweight='bold')
ax2.set_title('Vista 3D Alternativa - Ángulo 225°', fontweight='bold', fontsize=11)
ax2.view_init(elev=10, azim=225)

# 3. Proyección 2D: tf vs tw (coloreado por flecha)
ax3 = fig.add_subplot(2, 2, 3)
scatter3 = ax3.scatter(tf, tw, c=np.abs(flecha), cmap='RdYlGn_r', 
                       s=150, alpha=0.7, edgecolors='black', linewidth=0.5)
ax3.set_xlabel('tf - Espesor ala (mm)', fontweight='bold', fontsize=11)
ax3.set_ylabel('tw - Espesor alma (mm)', fontweight='bold', fontsize=11)
ax3.set_title('Proyección 2D: tf vs tw', fontweight='bold', fontsize=11)
ax3.grid(True, alpha=0.3)
cbar3 = plt.colorbar(scatter3, ax=ax3)
cbar3.set_label('|Deflexión| (mm)', fontweight='bold')

# 4. Gráfico de contorno 3D: Deflexión vs tf y tw
ax4 = fig.add_subplot(2, 2, 4)

# Crear grid para contorno
tf_unique = np.sort(np.unique(tf))
tw_unique = np.sort(np.unique(tw))

# Crear matriz de valores Z (flecha)
Z = np.full((len(tw_unique), len(tf_unique)), np.nan)
for i, t_f in enumerate(tf_unique):
    for j, t_w in enumerate(tw_unique):
        mask = (tf == t_f) & (tw == t_w)
        if np.any(mask):
            Z[j, i] = np.abs(flecha[mask][0])

# Graficar contorno
X_grid, Y_grid = np.meshgrid(tf_unique, tw_unique)
contour = ax4.contourf(X_grid, Y_grid, Z, levels=20, cmap='RdYlGn_r')
contour_lines = ax4.contour(X_grid, Y_grid, Z, levels=10, colors='black', alpha=0.3, linewidths=0.5)
ax4.clabel(contour_lines, inline=True, fontsize=8)

ax4.set_xlabel('tf - Espesor ala (mm)', fontweight='bold', fontsize=11)
ax4.set_ylabel('tw - Espesor alma (mm)', fontweight='bold', fontsize=11)
ax4.set_title('Mapa de Contorno: |Deflexión|', fontweight='bold', fontsize=11)
cbar4 = plt.colorbar(contour, ax=ax4)
cbar4.set_label('|Deflexión| (mm)', fontweight='bold')

plt.suptitle('Análisis Completo de la Frontera de Pareto - Sección de Viga', 
             fontsize=14, fontweight='bold', y=0.995)
plt.tight_layout(rect=[0, 0, 1, 0.99])
plt.savefig('analisis_completo_pareto.png', dpi=300, bbox_inches='tight')
print("✓ Visualización completa guardada como 'analisis_completo_pareto.png'")

# Crear gráfico de superficies de respuesta
fig2 = plt.figure(figsize=(16, 12))

# 1. Superficie 3D de deflexión
ax5 = fig2.add_subplot(2, 2, 1, projection='3d')
surf1 = ax5.plot_surface(X_grid, Y_grid, Z, cmap='RdYlGn_r', alpha=0.8, 
                         edgecolor='none', antialiased=True)
ax5.scatter(tf, tw, np.abs(flecha), c='black', s=20, alpha=0.3)
ax5.set_xlabel('tf (mm)', fontweight='bold')
ax5.set_ylabel('tw (mm)', fontweight='bold')
ax5.set_zlabel('|Deflexión| (mm)', fontweight='bold')
ax5.set_title('Superficie de Respuesta: |Deflexión|', fontweight='bold', fontsize=11)
ax5.view_init(elev=25, azim=45)
cbar5 = plt.colorbar(surf1, ax=ax5, pad=0.1, shrink=0.8)
cbar5.set_label('|Deflexión| (mm)', fontweight='bold')

# 2. Superficie 3D desde otro ángulo
ax6 = fig2.add_subplot(2, 2, 2, projection='3d')
surf2 = ax6.plot_surface(X_grid, Y_grid, Z, cmap='RdYlGn_r', alpha=0.8,
                         edgecolor='none', antialiased=True)
ax6.set_xlabel('tf (mm)', fontweight='bold')
ax6.set_ylabel('tw (mm)', fontweight='bold')
ax6.set_zlabel('|Deflexión| (mm)', fontweight='bold')
ax6.set_title('Superficie de Respuesta - Vista Lateral', fontweight='bold', fontsize=11)
ax6.view_init(elev=10, azim=120)

# 3. Gráfico de dispersión con líneas de iso-deflexión
ax7 = fig2.add_subplot(2, 2, 3)
scatter7 = ax7.scatter(tf, tw, s=200, c=np.abs(flecha), cmap='RdYlGn_r',
                       alpha=0.7, edgecolors='black', linewidth=1)
contour7 = ax7.contour(X_grid, Y_grid, Z, levels=15, colors='gray', alpha=0.4, linewidths=0.8)
ax7.clabel(contour7, inline=True, fontsize=7)
ax7.set_xlabel('tf - Espesor ala (mm)', fontweight='bold', fontsize=11)
ax7.set_ylabel('tw - Espesor alma (mm)', fontweight='bold', fontsize=11)
ax7.set_title('Puntos de Diseño con Líneas de Iso-Deflexión', fontweight='bold', fontsize=11)
ax7.grid(True, alpha=0.3)
cbar7 = plt.colorbar(scatter7, ax=ax7)
cbar7.set_label('|Deflexión| (mm)', fontweight='bold')

# 4. Gráfico de efectos principales
ax8 = fig2.add_subplot(2, 2, 4)
tf_effect = [np.abs(flecha[tf == t_f]).mean() for t_f in tf_unique]
tw_effect = [np.abs(flecha[tw == t_w]).mean() for t_w in tw_unique]

ax8_2 = ax8.twinx()
ax8.plot(tf_unique, tf_effect, 'b-o', linewidth=2, markersize=6, label='Efecto de tf')
ax8_2.plot(tw_unique, tw_effect, 'r-s', linewidth=2, markersize=6, label='Efecto de tw')
ax8.set_xlabel('Valor del parámetro (mm)', fontweight='bold', fontsize=11)
ax8.set_ylabel('Deflexión media (tf)', color='b', fontweight='bold')
ax8_2.set_ylabel('Deflexión media (tw)', color='r', fontweight='bold')
ax8.set_title('Gráficos de Efectos Principales', fontweight='bold', fontsize=11)
ax8.grid(True, alpha=0.3)
ax8.tick_params(axis='y', labelcolor='b')
ax8_2.tick_params(axis='y', labelcolor='r')
lines1, labels1 = ax8.get_legend_handles_labels()
lines2, labels2 = ax8_2.get_legend_handles_labels()
ax8.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

plt.suptitle('Superficies de Respuesta y Análisis de Sensibilidad', 
             fontsize=14, fontweight='bold', y=0.995)
plt.tight_layout(rect=[0, 0, 1, 0.99])
plt.savefig('superficies_respuesta.png', dpi=300, bbox_inches='tight')
print("✓ Superficies de respuesta guardadas como 'superficies_respuesta.png'")

print("\n✓ Análisis completado exitosamente")
print(f"  - {len(tf)} puntos analizados")
print(f"  - Valores tf: {tf.min():.4f} a {tf.max():.4f} mm")
print(f"  - Valores tw: {tw.min():.4f} a {tw.max():.4f} mm")
print(f"  - Deflexión: {np.abs(flecha).min():.2f} a {np.abs(flecha).max():.2f} mm")

plt.show()
