Del archivo de texto al diagrama de esfuerzos

En el artículo anterior mostramos cómo los archivos de texto de los programas CSI (el .s2k de SAP2000) permiten automatizar la creación del modelo: grupos, section cuts, todo generado por rutinas escritas con ayuda de la IA. Hoy cerramos el ciclo por el lado opuesto: la consulta de resultados.

La observación de partida es simple y, para muchos usuarios, sorprendente: cuando se exporta un modelo calculado a .s2k con las tablas de resultados incluidas, ese archivo de texto pasa a contener todo: la geometría, los section cuts, los esfuerzos de las combinaciones, estación a estación. No hace falta API, no hace falta un Excel intermedio, no hace falta siquiera abrir SAP2000. Es un archivo que cualquier programa (o cualquier IA) puede leer.

 
Y aquí está una ventaja de los programas CSI que conviene subrayar. El .s2k, como el .e2k de ETABS o el .f2k de SAFE, no es una exportación parcial ni un informe para lectura: es el modelo completo, con geometría, asignaciones, casos, combinaciones y todas las tablas de resultados, en texto legible y documentado, que el propio programa vuelve a importar. Son pocos los programas de cálculo que ofrecen esta vía de doble sentido: lo habitual es que el modelo quede cerrado en formato binario y que los resultados salgan únicamente en exportaciones parciales, informes o a través de una API. En los programas CSI, el modelo y sus resultados están siempre al alcance de quien los quiera automatizar, sin licencias adicionales, sin intermediarios, con un simple archivo de texto.

 

El alcance de la herramienta

Lo que pedimos a la IA fue una rutina de consulta con una regla de interacción clara: primero se elige el elemento estructural, solo después se genera la vista de esfuerzos. El resultado es un único archivo HTML que se abre en el navegador, con la planta del edificio dibujada automáticamente a partir de la geometría del propio .s2k: contorno de la losa, vigas, pilares y muros, cada uno identificado por el tipo de elemento finito que lo modela.

Mejor que describirla es dejar que se pruebe: la herramienta real está aquí abajo, incrustada en el artículo.

 

La planta se reconstruye a partir de las tablas de geometría del .s2k — muros = áreas verticales, pilares = frames verticales, vigas y contorno de la losa en gris. Haga clic en el círculo naranja (núcleo) o en uno de los cuadrados (pilares) y elija el caso de carga. (Los gráficos se cargan desde la CDN de Plotly; es necesaria conexión a internet.)

 

A partir de ahí, cada clic genera la vista correspondiente, con dos comportamientos distintos y deliberados:

Núcleo y muros: los esfuerzos provienen de los section cuts definidos en el modelo (la convención de nombres del artículo anterior: PAR_P3_inf, etc.). Son los seis esfuerzos integrados F1, F2, F3, M1, M2, M3 en altura, con envolvente Max/Min de las combinaciones.

Pilares: aquí no usamos section cuts. Cada pilar se puede pulsar individualmente y el diagrama (P, V2, V3, T, M2, M3) proviene directamente de los esfuerzos de los frames, estación a estación. Curiosamente, la rutina detectó que el section cut de "pilares" del modelo original cortaba todos los pilares a la vez, lo que es útil como corte global de planta pero redundante cuando cada pilar tiene diagrama propio, y por eso se oculta automáticamente (con opción de mantenerlo).

 

Lo sencillo que resulta, en la práctica

Aquí está el punto que queremos recalcar: no escribimos ni una línea de código. El "código fuente" de esta herramienta fueron peticiones como estas:

 
"Crea una rutina en la que se pueda elegir el elemento estructural y solo después se genere la vista de esfuerzos."

"Necesito que se muestre la planta para poder identificar y seleccionar el elemento."

"Para los pilares no uses el section cut: muestra un diagrama independiente para cada pilar."

 

Tres iteraciones en lenguaje natural, cada una refinando la anterior. La IA se encargó de leer las tablas, reconstruir la planta, tratar las convenciones de signos y generar la interfaz. El archivo de prueba tenía 374 MB; la rutina lo procesa en unos 1,5 segundos, sin instalar nada más que Python.

 

La anatomía del archivo .s2k

Para entender cómo el algoritmo obtiene los resultados, conviene mirar dentro del archivo. Un .s2k exportado con el modelo calculado es simplemente una secuencia de tablas, las mismas que se ven en SAP2000 en Display > Show Tables, escritas en texto, con registros clave=valor. Primero la definición del modelo, al final los resultados:

 
TABLE: "PROGRAM CONTROL" ProgramName=SAP2000 Version=27.1.0 CurrUnits="KN, m, C" ... ← unidades
TABLE: "JOINT COORDINATES" ← geometría: nudos…
   Joint=1 GlobalX=-15 GlobalY=-6 GlobalZ=0 ...
TABLE: "CONNECTIVITY - FRAME" ← …pilares y vigas…
TABLE: "CONNECTIVITY - AREA" ← …muros y losas (¡la planta!)
TABLE: "SECTION CUTS 1 - GENERAL" ← definición de los cortes
   CutName=PAR_P1_inf DefinedBy=Group Group=SC_PAR_P1_inf ...
        
TABLE: "ELEMENT FORCES - FRAMES" ← resultados de los pilares
   Frame=1 Station=0 OutputCase=DEAD P=-905.89 V2=-5.15 ...
TABLE: "SECTION CUT FORCES - ANALYSIS" ← resultados de los section cuts
   SectionCut=PAR_P1_inf OutputCase=COMB1 StepType=Max
        F1=3390.04 F2=2777.05 F3=12594.85 M1=25015.55 M2=39173.12 M3=9316.00 GlobalZ=0

 

Está todo a la vista: las tablas de geometría dan la planta, la convención de nombres (PAR_P1_inf = muro, planta 1, corte inferior) da la organización en altura, y las dos tablas de resultados dan los números. Por eso la validación es tan directa: lo que la herramienta dibuja es literalmente lo que está en estas líneas.

 

Una muestra del algoritmo

Con la estructura delante, el núcleo de la extracción, tal como la IA lo escribió, cabe en media docena de líneas: leer el archivo en streaming (por eso los 374 MB no asustan) y capturar la tabla adecuada:

 
# leer solo la tabla de resultados, línea a línea (streaming)
dentro = False
for linea in open("Modelo.s2k", errors="ignore"):
    if linea.startswith("TABLE:"):
        dentro = 'SECTION CUT FORCES - ANALYSIS' in linea
        continue
    if dentro and "SectionCut=" in linea:
        # cada línea es una lista de pares clave=valor; la expresión
        # (w+)=(S+) captura cada par; w+ = nombre del campo (letras/
        # dígitos), S+ = valor (todo hasta el espacio); y dict()
        # los transforma en un diccionario:
        r = dict(re.findall(r'(w+)=(S+)', linea))
        # r["SectionCut"] -> "PAR_P1_inf"
        # r["OutputCase"] -> "COMB1"
        # r["M2"] -> "39173.12"
        # r["M3"] -> "9316.00" (y así sucesivamente)

 

El resto sigue exactamente la misma lógica, y lo escribió todo la IA a partir de las peticiones anteriores: unir las líneas de continuación (terminadas en _), reconstruir la planta a partir de las tablas de geometría, leer los esfuerzos de los frames para los pilares y generar el HTML interactivo. No hay magia: hay un formato de texto bien documentado y una máquina paciente leyéndolo.

La utilidad es inmediata: consulta rápida de esfuerzos sin abrir el modelo, vistas que se pueden compartir con compañeros o revisores (es un HTML, se abre en cualquier equipo), y una base que se adapta a cualquier modelo que siga la misma convención de nombres en los section cuts.

 

Los riesgos y por qué aquí son trazables

Sería irresponsable presentar esto sin la otra mitad de la historia. Una rutina escrita por IA puede equivocarse, y en resultados estructurales un error silencioso es peligroso. En el desarrollo de esta herramienta encontramos ejemplos concretos: los cortes "sup" devuelven esfuerzos con el signo invertido (son el equilibrio del lado opuesto del corte), y en las envolventes esa inversión intercambia el Max con el Min, una sutileza que una implementación ingenua pasaría por alto sin que nadie se diera cuenta.

 
La salvaguarda esencial: en este tipo de herramienta, todo lo que la rutina muestra existe, número a número, en las tablas del propio SAP2000. La validación es trivial: se abren las tablas (Display > Show Tables), se comparan media docena de valores en puntos estratégicos (base del núcleo, base de un pilar, una envolvente Max/Min) y se confirma el diagrama. Así fue exactamente como validamos cada versión: muestreo directo contra la fuente.

 

Esta es la frontera que recomendamos: usar la IA para automatizar lectura, organización y visualización de resultados, donde cada número es trazable hasta su origen y la verificación cuesta minutos, y mantener al ingeniero como responsable de la validación y de la interpretación. La herramienta no decide nada; muestra, más deprisa y mejor, aquello que el modelo ya ha calculado. La responsabilidad del dimensionamiento no se delega.