Tutorial per WebService e API in C#

Articolo tecnico sul tema Analisi strutturale con Dlubal Software

  • Knowledge Base

Articolo tecnico

Questo articolo è stato tradotto da Google Traduttore

Visualizza il testo originale

Il nostro WebService offre agli utenti l'opportunità di comunicare con RFEM 6 e RSTAB 9 utilizzando vari linguaggi di programmazione. Le funzioni di alto livello (HLF) di Dlubal consentono di espandere e semplificare le funzionalità del WebService. L'utilizzo del nostro WebService in collegamento con RFEM 6 e RSTAB 9, rende il lavoro dell'ingegnere più facile e veloce. Scoprilo da solo! Questo tutorial mostra come utilizzare la libreria C# attraverso un semplice esempio.

La libreria HLF per C# fornisce numerose funzioni utili per la creazione di strutture in RFEM e RSTAB, alcune delle quali saranno utilizzate nel seguente esempio.

Per implementare il codice programmato, è necessario prima un collegamento al programma. Una delle porte disponibili deve essere specificata come indirizzo. L'indirizzo predefinito di RFEM/RSTAB è http://localhost:8081. Se necessario, può essere modificato nelle opzioni del programma.

Nella fase successiva, è possibile creare vari oggetti come nodi, linee e aste utilizzando le funzioni disponibili nella libreria C#. La libreria include classi per tutti gli oggetti disponibili. In base ai parametri, le proprietà degli oggetti possono essere definite e specificate. Il numero di parametri può variare a seconda del caso d'uso. Quanto segue mostra come gli oggetti possono essere definiti utilizzando l'esempio di un nodo:

        
nodo nuovoNodo = nuovo()
{
    no = nodeId,
    coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
    tipo_sistema_di_coordinate = tipo_sistema_di_coordinate_nodo.COordinate_sistema_cartesiane,
    coordinate_system_typeSpecified = true,
    commento = "nodo per trave"
};

        
    

Linee, superfici e altri oggetti sono definiti allo stesso modo. Si noti che un attributo "Specificato" corrispondente deve essere definito e impostato su "vero" per determinati attributi.

Esempio pratico

Questo esempio mostra come creare una trave continua con un carico lineare costante. Il numero di campate, la campata della trave e l'entità del carico della linea possono essere impostati in modo variabile tramite input dell'utente. Innanzitutto, le variabili richieste sono definite dall'utente nella console. Il programma verifica se l'input dell'utente è compatibile con il tipo di dati della rispettiva variabile. Se la voce è errata o vuota, nella console apparirà un messaggio di errore. Durante la programmazione, è stata prestata particolare attenzione al fatto che i numeri decimali possono essere inseriti utilizzando sia la notazione per punti che la notazione decimale per ridurre al minimo la suscettibilità all'errore.

Collegamento a RFEM/RSTAB

Il seguente codice tenta di stabilire una connessione con RFEM/RSTAB all'interno di un blocco try-catch:

        
var logger = LogManager.GetCurrentClassLogger();
string CurrentDirectory = Directory.GetCurrentDirectory ();
prova
{
    application_information ApplicationInfo;

    prova
    {
        //connetti all'applicazione RFEM 6 o RSTAB 9
        applicazione = new ApplicationClient(Binding, Indirizzo);
    }
    catch (Eccezione Eccezione)
    {
        if (applicazione != zero)
        {
            if (Application.State != CommunicationState.Faulted)
            {
                application.Close();
                logger.Error(exception, "È successo qualcosa:" + eccezione.Message);
            }
            altro
            {
                application.Abort();
                Recorder.Error(Exception, "Comunicazione con RFEM in errore:" + Exception.Message);
            }
        }
        Console.WriteLine(exception.ToString());
    }
    Infine
    {
        ApplicationInfo = application.get_information();
        logger.Info("Nome: {0}, versione:{1}, tipo: {2}, lingua: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
        Console.WriteLine("Nome: {0}, versione:{1}, tipo: {2}, lingua: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
    }
}

string modelName = "MyTestModel";
stringa modelloURL = "";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelURL));


        
    

Per creare una connessione, il programma deve essere aperto prima di eseguire il codice. Dopo una connessione riuscita, le informazioni sul programma vengono visualizzate nella console e in RFEM/RSTAB viene creato un nuovo modello con un nome definito dall'utente.

Definizione degli oggetti di base

Nel passaggio successivo, è possibile definire il materiale e la sezione trasversale della trave continua. È importante che la descrizione corrisponda al nome memorizzato nella libreria dei materiali o delle sezioni trasversali di RFEM.

        
materiale materialeConcrete = nuovo materiale
{
    nr = 1,
    nome = "C20/25 | EN 1992-1-1:2004/A1:2014"
};

Rettangolare della sezione della sezione = Nuova sezione
{
    nr = 1,
    materiale = materialeConcrete.no,
    materialSpecified = vero,
    tipo = tipo_sezione.TYPE_PARAMETERC_MASSIVE_I,
    typeSpecified = true,
    tipo_parametrizzazione = tipo_parametrizzazione_sezione.PARAMETERI_MASSIVE_I__MASSIVE_RECtangle__R_M1,
    parametriization_typeSpecified = true,
    nome = "R_M1 0.5/1.0"
};

        
    

Con l'aiuto di loop, vari oggetti (nodi, linee, aste) vengono creati e organizzati in elenchi. I nodi sono definiti in base al numero di campate definito dall'utente e trasferiti all'elenco "lineDefinitionNodes". L'elenco sarà successivamente utilizzato per creare linee in base ai loro nodi di definizione. Quando si crea un modello RSTAB, l'elenco viene utilizzato per definire le aste in base ai loro nodi di definizione. In RFEM, tuttavia, le aste sono definite da linee.

        
Elencoordinato nodi = nuovo SortedList ();
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeId = 1;
doppio xvettore = 0.0;

for (int i = 0; i < spanNumero + 1; i++)
{
    nodo nuovoNodo = nuovo()
    {
        no = nodeId,
        coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
        tipo_sistema_di_coordinate = tipo_sistema_di_coordinate_nodo.COordinate_sistema_cartesiane,
        coordinate_system_typeSpecified = true,
        commento = "parte in calcestruzzo"
    };
    nodes.Add(nodeId, newNode);
    lineDefinitionNodes [i] = nodeId;
    xVettore = xVettore + campata;
    IDnodo ++;
}

//crea linee
int lineId = 1;
Elencoordinato linee = nuovo SortedList ();

for (int i = 0; i < spanNumber; i++)
{
    linea nuovaLinea = nuova()
    {
        no = lineId,
        definizione_nodi = nuovo int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
        comment = "Linee per travi",
        tipo = tipo_linea.TYPE_POLYLINE,
        typeSpecified = true,
    };
    lines.Add(lineId, newLine);
    lineId ++;
}

        
    

Dopo aver creato tutti gli oggetti di base, vengono definiti due diversi vincoli esterni dei nodi. Il vincolo esterno del nodo al primo nodo dovrebbe essere definito come fisso, mentre i restanti vincoli dovrebbero essere mobili nella direzione X. I nodi di definizione per i vari tipi di vincolo sono riepilogati ciascuno in un elenco separato.

        
supporto_nodo supporto1 = nuovo()
{
    nr = 1,
    nodi = supportatiNodi1.ToArray(),
    primavera = nuovo vettore_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
    vincolo_rotazionale = nuovo vettore_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }
};

vincolo esterno del nodo vincolo esterno2 = nuovo()
{
    no = 2,
    nodi = SupportedNodes2.ToArray(),
    molla = nuovo vettore_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
    vincolo_rotazionale = nuovo vettore_3d() { x = 0.0, y = 0.0, z = double.PositiveInfinity }
};

nodeSupports.Add(support1);
nodeSupports.Add(support2);

        
    

Trasferimento di oggetti in RFEM

Per rendere disponibili gli oggetti creati in RFEM/RSTAB, è necessario prima trasferirli al programma. Questo viene fatto tra due funzioni, cioè "model.begin_modification" e "model.end_modification", per mezzo delle funzioni specifiche degli oggetti della libreria HLF. I cicli Foreach vengono utilizzati per passare tutti gli oggetti di un tipo al programma.

        
prova
{
    model.begin_modification("Geometria");
    model.set_material(materialConcrete);
    model.set_section(sectionRectangle);

    Foreach (KeyValuePair , elemento nodo nei nodi)
    {
        model.set_node (nodeItem.Value);
    }
    foreach (KeyValuePair lineItem nelle linee)
    {
        model.set_line (lineItem.Value);
    }
    foreach (KeyValuePair MemberItem nelle aste)
    {
       	model.set_member(memberItem.Value);
    }
    foreach (var nodalSupport in nodalSupports)
    {
        model.set_nodal_support(nodalSupport);
    }
}
catch (Eccezione Eccezione)
{
    model.cancel_modification();
    logger.Error(exception, "Si è verificato qualcosa durante la creazione della geometria" + eccezione.Message);
    lancio;
}
Infine
{
    prova
    {
       	model.finish_modification();
    }
    catch (Eccezione Eccezione)
    {
        logger.Error(exception, "Si è verificato un problema durante la modifica della geometria\n" + eccezione.Message + "\n");
         model.reset();
    }
}

        
    

Definizione dei carichi

I casi di carico, le combinazioni di carico e le situazioni di progetto vengono creati in modo simile agli oggetti di base e quindi trasferiti al programma. Quindi, è possibile creare il carico dell'asta, che è stato precedentemente specificato dall'utente:

        
Elencoordinato aste_carichi = nuovo SortedList ();
int id_carico_asta = 1;

for (int i = 0; i < spanNumber; i++)
{
    Member_load nuovoMemberLoad = nuovo()
    {
        no = i + 1,
        Members_string = (i + 1).ToString(),
        aste = new int[] {i + 1},
        distribuzione_carico = distribuzione_carico_asta.LOAD_Distribution_Uniform,
        load_distributionSpecificato = vero,
        grandezza = carico dell'asta * 1.000,
        grandezzaSpecificata=true,
        load_is_over_total_length = vero,
        load_is_over_total_lengthSpecified = true,
    };
    Member_loads.Add(i + 1, newMemberLoad);
    id_carico_asta++;
}  

        
    

Oltre ai carichi distribuiti uniformemente, sono possibili anche carichi trapezoidali e parabolici.

Calcolo e output dei risultati

Tramite la funzione model.calculate(all) tutti i calcoli vengono eseguiti in RFEM. Dopo un calcolo riuscito, i risultati in questo esempio vengono visualizzati nella console. La libreria HLF per C#consente anche l'esportazione dei risultati in file XML o CSV. Infine, la funzione model.save() può essere utilizzata per salvare il modello nel percorso del file indicato tra parentesi:

        
//salva il modello prima della chiusura
model.save (CurrentDirectory +@"\TestModels\");
application.close_model (0, true);

        
    

Conclusione

Nell'esempio mostrato, sono stati chiaritii vantaggi e la facile gestione della libreria C#. La struttura può essere adattata rapidamente per mezzo di voci definite dall'utente, il che consente di risparmiare molto tempo durante l'inserimento di sistemi strutturali in RFEM 6 e RSTAB 9. La libreria HLF per C# offre anche molte altre funzioni, che consentono la creazione di sistemi complessi.

Autore

Dipl.-Ing. Rebecca Göbel

Dipl.-Ing. Rebecca Göbel

Ingegneria del prodotto e assistenza clienti

La signora Göbel si occupa degli utenti Dlubal nell'assistenza clienti

Parole chiave

WebService e API RFEM 6 RSTAB 9 Software di analisi strutturale Analisi agli elementi finiti BIM Programmazione C#

Link

Scrivi un commento...

Scrivi un commento...

  • Visualizzazioni 1349x
  • Aggiornato 17. agosto 2023

Contattaci

Contatta Dlubal

Ha altre domande o ha bisogno di consigli? Contattaci tramite telefono, e-mail, chat o forum, oppure effettua una ricerca nella pagina delle FAQ, disponibile 24 ore su 24, 7 giorni su 7.

+39 051 9525 443

[email protected]

Analisi delle tensioni dei modelli di scale in RFEM 6

Analisi delle tensioni dei modelli di scale in RFEM 6

Webinar 21. dicembre 2023 14:00 - 15:00 CET

Novità in RFEM 6 e RSTAB 9

Novità in RFEM 6 e RSTAB 9

Webinar 25. gennaio 2024 14:00 - 15:00 CET

RFEM 6 | Studenti | Introduzione alla verifica delle aste

Corsi di formazione online 10. aprile 2024 16:00 - 19:00 CEST

RFEM 6 | Studenti | Introduzione alla verifica delle aste

Corsi di formazione online 10. aprile 2024 16:00 - 19:00 CEST

RSECTION 1 | Studenti | Introduzione alla resistenza dei materiali

Corsi di formazione online 17. aprile 2024 16:00 - 17:00 CEST

RSECTION 1 | Studenti | Resistenza dei materiali

Corsi di formazione online 17. aprile 2024 16:00 - 17:00 CEST

RFEM 6 | Studenti | Introduzione alla FEA

Corsi di formazione online 24. aprile 2024 16:00 - 19:00 CEST

RFEM 6 | Studenti | Introduzione alla FEA

Corsi di formazione online 24. aprile 2024 16:00 - 19:00 CEST

RFEM 6 | Studenti | Introduzione alla verifica delle strutture di legno

Corsi di formazione online 30. aprile 2024 16:00 - 17:00 CEST

RFEM 6 | Studenti | Introduzione alla verifica del calcestruzzo armato

Corsi di formazione online 8. maggio 2024 16:00 - 17:00 CEST

RFEM 6 | Studenti | Introduzione alla verifica acciaio

Corsi di formazione online 15. maggio 2024 16:00 - 17:00 CEST

Come integrare l'IA in RFEM utilizzando l'API

Webinar 5. dicembre 2023 14:00 - 15:00 CET