Sfondo teorico per il calcolo della distanza
Per trovare i nodi EF vicini o sulla linea, è necessario calcolare la distanza del nodo dalla linea. Vengono forniti la linea con i punti 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 è misurare un piano che passa per il punto P ed è perpendicolare alla linea retta. A tale scopo, è necessario impostare prima un'equazione lineare adatta. In questo caso, si consiglia di utilizzare il modulo del parametro, 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 è utilizzata come equazione piana 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 linea retta perché il piano è ortogonale alla linea 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 piana è sostituito dall'equazione della linea retta.
Convertito in s e inizia con
Pertanto, è possibile determinare il punto di intersezione S utilizzando l'equazione 1.
La distanza d tra S e Pres è determinata dalla 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 è definito dal punto Pres e dal vettore di direzione
Implementazione del calcolo della distanza nel programma
Una volta che le formule sono disponibili, è possibile creare il programma corrispondente. EXCEL VBA viene 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.
- code.vb#
Sottoselezione_test2()
- Dim line_no As Integer
- Dim surface_no As Integer
- Dim loadcase_no As Integer
- Dim d_tol come doppio
- linea_no = 11
- superficie_nr = 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
- /codice#
Prima di avviare il programma, definire i parametri variabili. 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 accuratezza limitata, è necessaria una tolleranza (d_tol), che specifica la distanza massima tra la linea e il 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 iniziali e finali.
- code.vb#
- ' prendi la linea
- Dim ILin As RFEM5.ILe
- Imposta ILin = iModelData.GetLine(line_no, AtNo)
- Dim lin As RFEM5.RfLine
- lin = ILin.GetData
- ' ottiene nodi dalla linea
- Dim n(0 a 1) come RFEM5.Node
- Dim ints() As Integer
- ints = strToIntArr(lin.NodeList)
- Dim iNd come 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 = Niente
- /codice#
Si ottengono sia i nodi che la linea individualmente, direttamente tramite la loro interfaccia (INode o ILine). Per estrarre i numeri di nodo dalla stringa (RfLine.NodeList), utilizzare la funzione strToIntArr descritta in un altro articolo (vedi Link). Converte la stringa in un campo intero.
Con i punti ora dati della linea
- code.vb#
- 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 come doppio
- Dim d come doppio
- /codice#
Diventa 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 in un ciclo sul campo di questi risultati. Innanzitutto, devi 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 al di fuori o prima e dopo la linea retta. Se un valore rientra in questo intervallo, la distanza viene calcolata con l'equazione (6).
- code.vb#
- ' ottiene risultati nei nodi fe
- Dim iCalc come ICalculation2
- 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)
- ' passa attraverso le tensioni e calcola la distanza dalla linea
- Dim i come intero
- 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_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
- Se s <= 1 + d_tol And s >= 0 - d_tol Allora
- ' calcola la distanza del punto di intersezione e del nodo fe
- 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 risultante trovato
- End If
- End If
- Avanti i
- /codice#
La tolleranza viene applicata sia alla verifica del coefficiente s che della distanza d, in modo che eventuali imprecisioni minori non portino all'esclusione di un risultato.
Risultati del programma
I valori trovati dal programma sono mostrati nella tabella, con i valori arrotondati a due cifre decimali.
σy+ [N/mm²] | Coefficiente 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 linea corrispondente sono visualizzati nell'immagine 03.
È chiaramente evidente che i valori sono gli stessi e c'è una corrispondenza del 100%, o che tutti i valori sono stati trovati sulla linea.
Conclusione
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 anche 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.