1784x
001617
2020-01-10

Selezione dei nodi lungo la linea tramite l'interfaccia COM

Wenn man über die COM-Schnittstelle die Ergebnisse einer Fläche ausliest, so erhält man ein eindimensionales Feld mit allen Ergebnissen an den FE-Knoten oder Rasterpunkten. Per ottenere i risultati sul bordo di una superficie o lungo una linea all'interno delle superfici, è necessario filtrare i risultati nell'area della linea. Il seguente articolo descrive una funzione per questo passaggio.

Background teorico per il calcolo della distanza

Per trovare i nodi EF che sono vicini o sulla linea, è necessario calcolare la distanza del nodo dalla linea. Sono dati la linea con il punto iniziale e finale (N0 e N1 ) e il punto P di cui si deve determinare la distanza dalla linea. Un modo comune per calcolare questa distanza è quello di coprire un piano che passa per il punto P ed è perpendicolare alla retta. A tale scopo, è necessario impostare prima un'equazione lineare adatta. In questo caso, si consiglia di utilizzare il modulo dei parametri, che contiene un vettore di direzione v. Puoi usarlo per impostare l'equazione del piano.

Per il vettore del vincolo esterno A, viene utilizzato il punto iniziale (vettore di posizione) della linea e per il vettore di direzione v, viene utilizzata la differenza dei due vettori di posizione. La forma normale viene utilizzata come equazione del piano per il motivo sopra menzionato.

Il vettore del vincolo esterno P è il punto risultante Pres da analizzare. Il vettore normale è il vettore di direzione della retta perché il piano è ortogonale alla retta. Prima di poter calcolare la distanza, è necessario determinare il coefficiente s della linea in cui il piano interseca la linea. A tale scopo, il vettore di posizione X nell'equazione del piano è sostituito dall'equazione della retta.

Regolata secondo s e con

, si ottiene la seguente equazione.

Pertanto, è possibile determinare il punto di intersezione S utilizzando l'equazione 1.

La distanza d tra S e Pres è determinata mediante la quantità vettoriale della differenza tra i due.

L'immagine 01 mostra la rappresentazione schematica di tutti gli elementi elencati. La superficie blu è la superficie da analizzare e la superficie rossa rappresenta il piano di sezione, che è stato impostato con il punto Pres e il vettore di direzione

. Il fattore s è solo 0,5 nell'immagine, quindi l'intersezione del piano e della linea è esattamente al centro della linea.

Implementazione del calcolo della distanza nel programma

Una volta che le formule sono disponibili, è possibile creare il programma corrispondente. EXCEL VBA è utilizzato per la conversione. L'immagine 02 mostra la numerazione degli elementi.

Innanzitutto, è necessario un collegamento a RFEM. Quindi, ottieni l'interfaccia per i dati del modello. Poiché questa procedura è già stata descritta in vari altri articoli (vedi Link), non sarà descritta in dettaglio qui. Di seguito è riportato il codice sorgente per l'avvio del programma.

Sottoselezione_test2()
    
Dim line_no As Integer
Dim surface_no As Integer
Dim loadcase_no As Integer
Dim d_tol As Double
linea_no = 11
superficie_no = 1
loadcase_no = 1
d_tol = 0,001
    
' get interface from the opened model and lock the licence/program
Dim iModel come RFEM5.IModel2
Set iModel = GetObject(, "RFEM5.Model")
iModel.GetApplication.LockLicense
    
On Error GoTo e
    
Dim iModelData come RFEM5.IModelData2
Imposta iModelData = iModel.GetModelData

Prima di avviare il programma, definire i parametri della variabile. Questi includono il numero della linea (line_no) della linea in cui si desidera cercare i risultati e, naturalmente, il numero della superficie (surface_no) della superficie in cui si trova la linea. Inoltre, è necessario il numero del caso di carico (loadcase_no) a cui appartengono i risultati. Poiché si tratta di un calcolo numerico con precisione limitata, è necessaria una tolleranza (d_tol) che specifica la distanza massima tra linea e nodo. In questo esempio, viene utilizzata una tolleranza di un millimetro.

Poiché l'interfaccia per i dati del modello (IModelData) è ora disponibile, è possibile cercare prima la linea e, quindi, anche i suoi punti iniziale e finale.

' ottieni linea
Dim ILin As RFEM5.ILine
Imposta ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
   
    
' ottiene nodi dalla linea
Dim n(0 a 1) As RFEM5.Node
    
Dim ints() As Integer
ints = strToIntArr(lin.NodeList)
    
Dim in As RFEM5.INode
Imposta iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Imposta iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
    
Imposta iNd = Nulla

Ottieni sia i nodi che la linea individualmente, direttamente tramite la loro interfaccia (INode o ILine). Per estrarre i numeri dei nodi dalla stringa (RfLine.NodeList), utilizzare la funzione strToIntArr descritta in un altro articolo (vedere Collegamenti). Converte la stringa in un campo intero.

Con i punti ora dati della linea (punto iniziale) e (punto finale), è possibile impostare i primi parametri dell'equazione.

Dim v As RFEM5.Point3D
vX = N(1).X - N(0).X
vY = N(1).Y - N(0).Y
vZ = N(1).Z - N(0).Z
    
Dim A come RFEM5.Point3D
AX = N(0).X
AY = N(0).Y
AZ = N(0).Z
    
Dim v2 come doppio
v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
    
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d come doppio

Vengono calcolati o preparati il vettore di direzione

(v), il vettore del vincolo esterno (A) e il prodotto di scala del vettore di direzione (v2). Inoltre, sono definite anche le variabili Pres (P_res) per il punto del risultato e s per il coefficiente dell'equazione lineare (1).

Calcolo della distanza nel loop

In questo esempio, è stata selezionata l'elaborazione dei risultati sulla base dei nodi EF. Il controllo della distanza avviene ad anello sul campo di questi risultati. Innanzitutto, è necessario ottenere questi risultati tramite l'interfaccia ICalculation2, quindi IResults. All'interno del loop, il punto Pres viene prima descritto con le coordinate del valore del risultato (per chiarezza). Quindi, è possibile eseguire il calcolo diretto dell'equazione (4). Dopo che s è stato calcolato, è possibile verificare se il valore è minore di zero o maggiore di uno, perché questi valori si trovano all'esterno o prima e dopo la retta. Se un valore è all'interno di questo intervallo, la distanza viene calcolata con l'equazione (6).

' ottieni risultati in fe-nodi
Oscura iCalc come ICalcolo2
Imposta iCalc = iModel.GetCalculation
    
Dim iRes As RFEM5.IResults
Imposta iRes = iCalc.GetResultsInFeNodes (LoadCaseType, loadcase_no)
    
Dim surfBaStr() As RFEM5.SurfaceBasicStresses
surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
    
' loop attraverso le tensioni e calcola la distanza dalla linea
Dim i As Integer
Per i = 0 a UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).Coordinates.Z
' calcola il coefficiente per l'equazione della linea di intersezione
s = ((P_ris.XA.X)*vX + (P_ris.YA.Y)*vY + (P_ris.ZA.Z)*vZ)/v2
        
Se s <= 1 + d_tol Ed s >= 0 - d_tol Allora
' calcola la distanza del punto di intersezione e del nodo fen
d = ((P_res.X-(A.X+s*vX))^2
+(P_res.Y-(A.Y+s*vY))^2
+(P_res.Z-(A.Z+s*vZ))^2)^0.5
            
Se (d < d_tol) Allora
' qui è possibile elaborare il punto risultato trovato
End If
End If
        
Avanti i

La tolleranza si applica sia alla verifica del coefficiente s che alla distanza d, in modo che eventuali piccole imprecisioni non portino all'esclusione di un risultato.

Risultati del programma

I valori rilevati dal programma sono riportati nella tabella, con i valori arrotondati alla seconda cifra decimale.

y+ [N/mm²]Fattore s [-]
21,900,0
17,280,1
12,790.2
8,430,3
4.170.4
-0.040.5
-4.250.6
-8.510.7
-12,870.8
-17.360.9
-21,981,0

Come confronto, i valori del diagramma dei risultati sulla riga corrispondente sono visualizzati nell'immagine 03.

È chiaramente evidente che i valori sono gli stessi e che c'è una corrispondenza del 100%, o che tutti i valori sono stati trovati sulla linea.

Sommario

Con l'aiuto del calcolo vettoriale, è stato creato un programma in grado di trovare i nodi lungo una linea. Con questo algoritmo, è anche possibile cercare non solo i risultati, ma tutti gli altri elementi geometrici. Ciò è particolarmente utile perché la selezione visiva è, ovviamente, impossibile tramite l'interfaccia COM, ma è quindi possibile tramite una funzione in un altro modo. È possibile eseguire una valutazione automatica dei risultati in particolare per i programmi che vengono eseguiti completamente in background.


Autore

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

Link
Download