Esempio applicativo in EXCEL dell'opzione API di Straus7
Application Programming Interface

L'esempio che segue illustra passo-passo uno dei possibili utilizzi delle Api di Straus7. In linea generale le API di Straus7 si caratterizzano per:

Ecco alcuni esempi di procedure che sono state automatizzate con l'impiego delle API, realizzando un significativo risparmio di tempo nell'attivita' della progettazione:

  1. Applicazione automatica di forze al contorno per analisi di dettaglio. Spesso, quando si dispone di una struttura il cui modello ha dimensioni notevoli si cerca di cogliere il comportamento d'insieme dal modello globale, riservando una più accurata analisi tensionale a modelli di dettaglio (l'analisi per sotto-modelli non è infatti applicabile a strutture con comportamento non lineare). Senza l'ausilio delle API, le forze al contorno del modello di dettaglio, per ogni condizione di carico, dovrebbero essere trasformate una per una in un sistema di riferimento globale e poi applicate al modello di dettaglio. Tale procedura, oltre ad essere particolarmente onerosa in termini di tempo, espone l'operatore anche all'insidia dell'errore materiale, se computata a mano.

  2. Generazione di propri criteri di post-processing. Tramite le API di Straus7 e' possibile creare criteri di resistenza definiti dall'utente, in funzione della verifica strutturale da svolgere. Le verifiche strutturali più comuni possono essere automatizzate e rese disponibili ogni volta che siano richieste, pervenendo ad un notevole risparmio di tempo.

  3. Determinazione iterativa dello stato di tensione per strutture a cavi. Uno dei problemi più comuni nella progettazione di strutture a cavi accoppiati è quello di decidere il livello di pre-tensione da applicare per ottenere, nei singoli cavi, uno stato di tensione assiale finale noto. Data la generalità del problema, solitamente (anche in relazione all'accuratezza voluta) e' necessario un numero notevole di iterazioni per ottenere un risultato accettabile. Lo svolgimento manuale delle iterazioni è del tutto ripetitivo ed e' possibile fonte di errori.

  4. Ottimizzazione strutturale. Procedure che minimizzino il peso di una struttura, operando su cataloghi precostituiti di profili, possono essere facilmente implementate utilizzando le API di Straus7.

Nell'esempio presentato nel seguito si descrive una semplice procedura utilizzata per risolvere un esempio applicativo costituito da una mensola incastrata:

  1. L'utente inserisce i parametri di riferimento per la geometria della mensola e chiede al foglio Excel di eseguire il calcolo.

  2. Il Foglio Excel, tramite le API di Straus7 compie le seguenti operazioni:
    • crea in automatico il modello Straus7;
    • assegna le proprietà di interesse;
    • applica carichi e vincoli alla struttura;
    • lancia il solutore;
    • recupera i risultati voluti;
    • restituisce i risultati nelle celle indicate nel foglio Excel di partenza.

Eventuali errori incontrati dalla macro, vengono segnalati con i relativi messaggi.

La seguente figura illustra l'organizzazione del foglio di lavoro.

Segue la macro commentata in Excel che illustra lo svolgimento delle operazioni suddette. Sono state utilizzate le seguenti convenzioni per i contenuti:

Sub calcolo()
' calcolo Macro
' Macro registrata il 12/12/2003 da Giorgio Galvan - EnginSoft Padova
'
' Dichiarazione delle variabili utilizzate
' Variabili di ciclo
Dim I As Integer, J As Integer
' Variabile errore che contiene i messaggi di errore generati dalle API di Straus7.
Dim errore As Integer
' Stringa contenente il percorso del file.
Dim percorso As String
' Stringa contenente il nome del modello.
Dim modello As String
' Altra stringa contenente il nome del modello
Dim nome_modello As String
' Stringa contenente il percorso per la direcory dei files temporanei.
Dim temporaneo As String
' Vettore per le coordinate dei nodi.
Dim XYZ(2) As Double
' Numero intero conenente il numero del nodo.
Dim nodo As Long
' Numeri interi contenenti numero e tipo di proprietà
Dim numeroproprieta As Integer, tipoproprieta As Integer
' Stringa contenente il nome della proprietà.
Dim nomeproprieta As String
' Numero intero conenente l'indice del tipo di sezione
Dim tiposezione As Integer
' Vettori per i parametri da inserire
Dim parametri(5) As Double
Dim materiale(3) As Double
' Indice di elementi e nodi
Dim elemento As Long, nodi(3) As Long
Dim vincoli(6) As Long
Dim cedimenti(6) As Double
Dim nodo_vincolato As Long
Dim nodo_caricato As Long
Dim forze(10) As Double, momenti(10) As Double
Dim modalita As Long, attesa As Long
Dim tot_nodi As Long, tot_beam As Long
Dim sezione(100) As Double
Dim nome_analisi As String
Dim reazioni(10) As Double, spostamenti(10) As Double
' Vettori conenenti le posizioni ed i risultati per elementi trave.
Dim beam_pos(10) As Double
Dim beam_res(100) As Double

' Vettore dove inserire i parametri geometrici.
Dim sistema(5) As Long

' Ciclo di salvataggio dei dati inseriti nel foglio di calcolo nel vettore sistema.
For I = 0 To 5
sistema(I) = Cells(I + 9, 4).Value
Next I

' Lettura dei nomi dei files e della directory per ii files temporanei

percorso = Cells(3, 3).Value
temporaneo = Cells(4, 3).Value
modello = Cells(5, 3).Value

nome_modello = percorso & modello & ".st7"
nome_analisi = percorso & modello & ".lsa"

' pulizia valori calcolati
Range("T4:U24").Select
Selection.ClearContents

Range("L3:L5").Select
Selection.ClearContents

Range("L8:P8").Select
Selection.ClearContents

Range("K12:Q12").Select
Selection.ClearContents

Range("K16:Q16").Select
Selection.ClearContents

Range("K21:Q22").Select
Selection.ClearContents

Range("A1").Select

' Chiamata di inizializzazione alle API di Straus7.
' Tale chiamata dovrà essere sempre presente all'inizio di ogni procedura
' scritta con le API di Straus7

St7Init

' apertura nuovo file
errore = St7NewFile(1, nome_modello, temporaneo)
Cells(4, 20).Value = errore

' scrittura unità di misura
errore = St7SetUnits(1, sistema(0))
Cells(5, 20).Value = errore

' lettura coordinate nodi
For I = 1 To 2
nodo = Cells(I + 19, 1).Value

For J = 0 To 2
XYZ(J) = Cells(I + 19, J + 2).Value
Next J

errore = St7SetNodeXYZ(1, nodo, XYZ(0))
Cells(6, I + 19).Value = errore
Next I

' definizione proprietà beam
numeroproprieta = Cells(26, 1).Value
nomeproprieta = Cells(26, 2).Value
tipoproprieta = 6

errore = St7NewBeamProperty(1, numeroproprieta, tipoproprieta, nomeproprieta)
Cells(7, 20).Value = errore

' definizione sezione beam
tiposezione = 2
parametri(0) = Cells(26, 3).Value
parametri(3) = Cells(26, 4).Value

errore = St7SetBeamSectionGeometry(1, numeroproprieta, tiposezione, parametri(0))
Cells(8, 20).Value = errore

' calcolo proprietà sezione beam
errore = St7CalcBeamSectionProperties(1, numeroproprieta, 1)
Cells(9, 20).Value = errore

' definizione materiale
materiale(0) = Cells(31, 2).Value
materiale(2) = Cells(31, 3).Value
materiale(3) = Cells(31, 4).Value

errore = St7SetBeamMaterialData(1, numeroproprieta, materiale(0))
Cells(10, 20).Value = errore

' definizione elemento beam
elemento = Cells(37, 1).Value
nodi(0) = Cells(37, 2).Value
nodi(1) = Cells(37, 3).Value
nodi(2) = Cells(37, 4).Value

errore = St7SetElementConnection(1, 1, elemento, numeroproprieta, nodi(0))
Cells(11, 20).Value = errore

' assegnazione vincoli
nodo_vincolato = Cells(43, 1).Value
For I = 0 To 5
vincoli(I) = Cells(43, I + 2).Value
cedimenti(I) = 0
Next I

errore = St7SetNodeRestraint6(1, nodo_vincolato, 1, 1, vincoli(0), cedimenti(0))
Cells(12, 20).Value = errore

' assegnazione carichi nodali
nodo_caricato = Cells(49, 1).Value

For I = 0 To 2
forze(I) = Cells(49, I + 2).Value
momenti(I) = Cells(49, I + 5).Value
Next I

errore = St7SetNodeForce3(1, nodo_caricato, 1, forze(0))
Cells(13, 20).Value = errore

errore = St7SetNodeMoment3(1, nodo_caricato, 1, momenti(0))
Cells(14, 20).Value = errore

' impostazione calcolo reazioni vincolari
errore = St7SetEntityResult(1, 11, 1)
Cells(15, 20).Value = errore

' salvataggio file
St7SaveFile(1)

' lancio analisi
modalita = Cells(54, 2).Value
attesa = Cells(54, 5).Value

errore = St7RunSolver(1, 1, modalita, attesa)
Cells(16, 20).Value = errore


' lettura numero di nodi
errore = St7GetTotal(1, 0, tot_nodi)
Cells(18, 20).Value = errore
Cells(3, 12).Value = tot_nodi

' lettura numero di elementi
errore = St7GetTotal(1, 1, tot_beam)
Cells(19, 20).Value = errore
Cells(5, 12).Value = tot_beam

' lettura proprietà beam
errore = St7GetBeamProperty(1, numeroproprieta, 6, 2, 0, sezione(0), materiale(0))
Cells(20, 20).Value = errore
Cells(8, 12).Value = numeroproprieta
For J = 0 To 3
Cells(8, J + 13).Value = sezione(J)
Next J

' apertura risultati analisi
errore = St7OpenResultFile(1, nome_analisi, "", 0, 1, 0)
Cells(22, 20).Value = errore

' lettura reazioni vincolari al nodo vincolato
errore = St7GetNodeResult(1, 5, 1, 1, reazioni(0))
Cells(23, 20).Value = errore

Cells(12, 11).Value = 1
For I = 0 To 5
Cells(12, I + 12).Value = reazioni(I)
Next I

For I = 1 To 10
Cells(I, 30).Value = reazioni(I)
Next I

' lettura spostamenti al nodo libero
errore = St7GetNodeResult(1, 1, 2, 1, spostamenti(0))
Cells(23, 21).Value = errore

Cells(16, 11).Value = 2
For I = 0 To 5
Cells(16, I + 12).Value = spostamenti(I)
Next I

' lettura parametri di sollecitazione beam
errore = St7GetBeamResult(1, 1, 1, 2, 1, 2, 6, beam_pos(0), beam_res(0))
Cells(24, 20).Value = errore

Cells(21, 11).Value = beam_pos(0)
Cells(22, 11).Value = beam_pos(1)

For I = 0 To 5
Cells(21, I + 12).Value = beam_res(I)
Cells(22, I + 12).Value = beam_res(I + 6)
Next I

' Chiusura file analisi
St7CloseResultFile(1)

' Chiusura file modello
St7CloseFile(1)

End Sub

La seguente figura illustra un'immagine del semplice modello creato attraverso le API:

Concludiamo questa breve nota rimarcando che le API di Straus7 sono ben documentate nel manuale a corredo con un congruo numero di esempi applicativi. Oltre al Visual Basic for Application di Excel, le API di Straus7 supportano i seguenti compilatori: