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
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
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.
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
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,90 | 0,0 |
17,28 | 0,1 |
12,79 | 0.2 |
8,43 | 0,3 |
4.17 | 0.4 |
-0.04 | 0.5 |
-4.25 | 0.6 |
-8.51 | 0.7 |
-12,87 | 0.8 |
-17.36 | 0.9 |
-21,98 | 1,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.