2411x
001659
2020-10-13

Aggiornamento dei modelli e regolazione dei dati strutturali utilizzando l'interfaccia COM

Per alcune strutture, è necessaria una verifica con diverse configurazioni. Può darsi che una piattaforma di sollevamento debba essere analizzata nella sua posizione sul terreno, nonché nella posizione centrale ed estesa. Poiché tali attività richiedono la creazione di diversi modelli, che sono quasi identici, l'aggiornamento di tutti i modelli con un solo clic del mouse è un ottimo aiuto.

Nel testo seguente, si presume che tu abbia una conoscenza di base dell'interfaccia COM. I collegamenti portano ad articoli sulle basi della programmazione.

Task

Facendo clic su un determinato pulsante, il programma dovrebbe regolare automaticamente tutti i dati strutturali come nodi, linee, aste, ecc. Ad esempio, le coordinate del nodo 1 dovrebbero essere trasferite dal modello principale a vari modelli e varianti secondari. Tuttavia, non tutti i valori dovrebbero essere trasferiti; solo quelli che sono stati precedentemente definiti liberamente dall'utente.

Esempio di modello

Come esempio per la funzione del programma descritto, è stata modellata una semplice piattaforma di lavoro aereo. Il seguente modello è considerato il modello principale.

Questa piattaforma non è parametrizzata ed è disponibile in tre tipologie: completamente esteso, a terra e in posizione centrale. Il tipo completamente esteso è definito come modello principale, quello centrale di tipo 1 e quello a terra di tipo 2.

Considerazioni

Per raggiungere l'obiettivo, è necessario un tipo di file di configurazione o un'interfaccia utente grafica per definire quali modelli devono essere confrontati tra loro.

Per definire le coordinate libere o variabili di un nodo, si dovrebbe usare la funzione di commento del rispettivo elemento. Il programma cerca una stringa specifica nel commento e, se trovata, modifica o lascia le coordinate corrispondenti. Inoltre, sarebbe utile creare automaticamente nuovi elementi in tutti i sottomodelli. Pertanto, la struttura dovrebbe essere realizzata in modo tale che l'utente attivi il modello desiderato in RFEM (modificato in primo piano) e il programma quindi apra i modelli richiesti, confrontandoli con il modello principale.

interfaccia grafica utente

Il seguente design semplice è stato selezionato per l'interfaccia utente grafica.

L'utente può digitare un percorso nella casella di testo o inserirlo copiandolo e incollandolo. Con "Aggiungi nuovo modello" può essere aggiunto alla lista dei modelli da regolare. Utilizzare il pulsante "Rimuovi modello selezionato" per rimuovere un modello selezionato nell'elenco. Il pulsante "Modifica modelli" avvia quindi il programma.

Flusso del programma di base

All'inizio, il programma ha solo i percorsi dei modelli e delle varianti secondarie e necessita prima del collegamento a RFEM. Se viene stabilita la connessione a RFEM, dovrebbe essere eseguito un loop sui modelli secondari. Poiché il programma dovrebbe creare anche elementi, la gerarchia deve essere rispettata. Pertanto, vengono confrontati prima i nodi, quindi le linee, i materiali, le sezioni trasversali e, infine, le aste. I nodi rappresentano un'eccezione, perché qui le direzioni x, y e z dovrebbero essere adottate, se necessario, o lasciate così come sono. Tutti gli altri elementi vengono ripresi completamente o lasciati così come sono. Tuttavia, dovrebbe essere lo stesso per tutti gli elementi che ne vengono creati di nuovi.

Struttura di base del programma

Il metodo eseguito quando si fa clic sul pulsante "Modifica modelli" ha la seguente struttura di base.

private void button_mod_click (oggetto mittente, EventArgs e)
{
//RFEM
//##########################
Dlubal.RFEM5.IModel3 iModel_org = null;
Dlubal.RFEM5.IApplication iApp = null;
try
{
//ottiene l'interfaccia per l'applicazione e apre il modello
iApp = Marshal.GetActiveObject ("RFEM5.Application") come Dlubal.RFEM5.IApplication;
iApp.LockLicense ();
iModel_org = iApp.GetActiveModel () come Dlubal.RFEM5.IModel3;
  
//loop sui modelli trovati
Dlubal.RFEM5.IModel iModel_cpy = null;
  
for (int i = 0; i <listBox_models.Items.Count; ++ i)
{
//apri il modello
iModel_cpy = iApp.OpenModel (listBox_models.Items [i] .ToString ());
   
//recupera i dati strutturali
Dlubal.RFEM5.IModelData2 iModData_org
= iModel_org.GetModelData () come Dlubal.RFEM5.IModelData2;
Dlubal.RFEM5.IModelData2 iModData_cpy
= iModel_cpy.GetModelData () come Dlubal.RFEM5.IModelData2;
   
//confronta/cambia i nodi
//confronta/cambia le linee
//confronta/cambia materiali
//confronta/cambia le sezioni trasversali
//confronta/cambia le aste
}
  
}
cattura (eccezione ex)
{
MessageBox.Show (ex.Message, ex.Source);
}
finally
{
se (iApp! = null)
{
iApp.UnlockLicense ();
   
//Rilascia l'oggetto COM - non più necessario
//Marshal.ReleaseComObject (iApp);
iApp = null;
}
  
iModel_org = null;
  
//Pulisce il Garbage Collector per il rilascio di tutte le interfacce e gli oggetti COM.
System.GC.Collect ();
System.GC.WaitForPendingFinalizers ();
}
}

Come già descritto, la connessione a RFEM viene stabilita prima tramite GetActiveObject ("RFEM5.Application"). Quindi, viene stabilita una connessione al modello attivo tramite GetActiveModel (). Per poter effettuare il confronto, i sottomodelli ed i loro dati strutturali sono aperti uno dopo l'altro in un loop tramite le voci nella casella di riepilogo (GetModelData ()). A questo punto, tutti i dati geometrici sono disponibili e possono essere confrontati.

Se si verifica un problema (ad esempio, un modello non può essere aperto), l'errore viene rilevato dal blocco try-catch, visualizzato e il programma sarà sbloccato.

Confronto nodale

Il confronto tra i nodi tra il modello principale e quello secondario procede come segue.

Innanzitutto, vengono presi tutti i nodi del modello principale e viene avviato un ciclo su questi nodi. In questo ciclo, il sistema cerca prima di ottenere i dati del nodo con lo stesso numero nel modello secondario. Se questo fallisce perché il nodo non esiste, l'errore viene rilevato con un altro blocco try-catch e nel modello secondario il nodo viene creato con i dati del modello principale.

Se il nodo esiste, il commento viene letto e smontato tramite il separatore ";". Se ci sono meno di tre parti, i dati saranno presi dal modello principale. Se ci sono tre o più parti, saranno valutate. Una "f" sta per un valore fisso che non deve essere sovrascritto. Se non è una "f", il valore viene sovrascritto dal valore del modello principale.

Un breve esempio è la stringa "f ;; f1; kkl" nel commento di un nodo. Una volta smontato, risultano le stringhe "f", "", "f1" e "kkl". Così, il valore x è lasciato per il nodo ed i valori y e z sono sovrascritti, poiché c'è una stringa vuota per y e non esattamente "f" ma "f1" per z.

//confronta/cambia i nodi
Dlubal.RFEM5.Node [] nodes_org = iModData_org.GetNodes ();
for (int j = 0; j <nodes_org.Length; ++ j)
{
try
{
Dlubal.RFEM5.INode iNode = iModData_cpy.GetNode (nodes_org [j] .No, Dlubal.RFEM5.ItemAt.AtNo);
Nodo Dlubal.RFEM5.Node = nuovo Dlubal.RFEM5.Node ();
nodo = iNode.GetData ();
  
//controlla se ci sono componenti fissi
List <stringa> defs = (node.Comment) .Split (';'). ToList <string> ();
  
if (defs.Count> = 3)
{
if (defs [0]! = "f")
node.X = nodes_org [j] .X;
   
if (defs [1]! = "f")
nodo.Y = nodes_org [j] .Y;
    
if (defs [2]! = "f")
node.Z = nodes_org [j] .Z;
}
else
{
node.X = nodes_org [j] .X;
nodo.Y = nodes_org [j] .Y;
node.Z = nodes_org [j] .Z;
}
  
//imposta il nodo
iModData_cpy.PrepareModification ();
iNode.SetData (nodo);
iModData_cpy.FinishModification ();
  
}
cattura (eccezione ex)
{
//se i nodi non esistono, creali;
iModData_cpy.PrepareModification ();
iModData_cpy.SetNode (nodes_org [j]);
iModData_cpy.FinishModification ();
}
 
}

Linee, materiali e altri confronti

Gli altri elementi sono leggermente diversi dal confronto dei nodi ma identici tra loro.

//confronta/cambia le linee
Dlubal.RFEM5.Line [] lines_org = iModData_org.GetLines ();
for (int j = 0; j <lines_org.Length; ++ j)
{
try
{
Dlubal.RFEM5.ILine iLine = iModData_cpy.GetLine (lines_org [j] .No, Dlubal.RFEM5.ItemAt.AtNo);
Dlubal.RFEM5.Line line = new Dlubal.RFEM5.Line ();
riga = iLine.GetData ();
  
//controlla se la linea è corretta
List <stringa> defs = (line.Comment) .Split (';'). ToList <string> ();
  
if (defs [0]! = "f")
{
linea = linee_org [j];
}
  
//imposta la linea
iModData_cpy.PrepareModification ();
iLine.SetData (linea);
iModData_cpy.FinishModification ();
  
}
cattura (eccezione ex)
{
//se i nodi non esistono, creali;
iModData_cpy.PrepareModification ();
iModData_cpy.SetLine (lines_org [j]);
iModData_cpy.FinishModification ();
}
 
}

La differenza dal confronto dei nodi è che l'elemento viene completamente sovrascritto se non si trova una "f" nel commento smontato (smontato da ";"). Gli altri elementi vengono creati e confrontati esattamente nello stesso modo. Vedere il codice sorgente nel progetto di Visual Studio allegato.

Valutazione

Il programma è in grado di implementare le modifiche desiderate nei modelli secondari. Il video per l'articolo mostra come funziona. Il problema più grande attualmente è che le voci errate non vengono intercettate o solo leggermente intercettate.

Riepilogo e prospettive

Il programma qui presentato è in grado di aggiornare i modelli secondari sulla base di un modello principale. Le modifiche sui nodi e su altri elementi fino alle aste vengono trasferite correttamente.

Ciò che manca sono le routine per intercettare le voci errate, che potrebbero ancora essere aggiunte. Ulteriori ottimizzazioni sarebbero, ad esempio, la chiusura opzionale dei modelli secondari, che può portare all'elaborazione in background. Può essere utile anche aggiungere ulteriori dati strutturali, carichi e combinazioni.


Autore

Il signor Günthel fornisce supporto tecnico per i clienti di Dlubal Software e si prende cura delle loro richieste.

Link
Download