1839x
001617
2020-01-10

Selezione dei nodi lungo la linea tramite l'interfaccia COM

Se si leggono i risultati di una superficie tramite l'interfaccia COM, si ottiene un campo unidimensionale con tutti i risultati nei nodi EF o nei punti della griglia. 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.

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

otteniamo la seguente equazione.

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

. Il coefficiente 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 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.

  1. code.vb#

Sottoselezione_test2()

  1. Dim line_no As Integer
  2. Dim surface_no As Integer
  3. Dim loadcase_no As Integer
  4. Dim d_tol come doppio
  5. linea_no = 11
  6. superficie_nr = 1
  7. loadcase_no = 1
  8. d_tol = 0,001
  9. ' get interface from the opened model and lock the licence/program
  10. Dim iModel come RFEM5.IModel2
  11. Set iModel = GetObject(, "RFEM5.Model")
  12. iModel.GetApplication.LockLicense

On Error GoTo e

  1. Dim iModelData come RFEM5.IModelData2
  2. Imposta iModelData = iModel.GetModelData
  3. /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.

  1. code.vb#
  2. ' prendi la linea
  3. Dim ILin As RFEM5.ILe
  4. Imposta ILin = iModelData.GetLine(line_no, AtNo)
  5. Dim lin As RFEM5.RfLine
  6. lin = ILin.GetData
  7. ' ottiene nodi dalla linea
  8. Dim n(0 a 1) come RFEM5.Node
  9. Dim ints() As Integer
  10. ints = strToIntArr(lin.NodeList)
  11. Dim iNd come RFEM5.INode
  12. Imposta iNd = iModelData.GetNode(ints(0), AtNo)
  13. n(0) = iNd.GetData
  14. Imposta iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
  15. n(1) = iNd.GetData
  16. Imposta iNd = Niente
  17. /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

(punto iniziale) e (Punto finale) è possibile impostare i primi parametri dell'equazione.

  1. code.vb#
  2. Dim v As RFEM5.Point3D
  3. vX = N(1).X - N(0).X
  4. vY = N(1).Y - N(0).Y
  5. vZ = N(1).Z - N(0).Z
  6. Dim A come RFEM5.Point3D
  7. AX = N(0).X
  8. AY = N(0).Y
  9. AZ = N(0).Z
  10. Dim v2 come doppio
  11. v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
  12. Dim P_res As RFEM5.Point3D
  13. Dim s come doppio
  14. Dim d come doppio
  15. /codice#

Diventa il vettore di direzione

(v), il vettore del vincolo esterno (A) e il prodotto di scala del vettore di direzione (v2) è calcolato o preparato. Inoltre, sono definite anche le variabili Pres (P_res) per il punto del risultato e s per il coefficiente dall'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 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).

  1. code.vb#
  2. ' ottiene risultati nei nodi fe
  3. Dim iCalc come ICalculation2
  4. Imposta iCalc = iModel.GetCalculation
  5. Dim iRes as RFEM5.IResults
  6. Imposta iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
  7. Dim surfBaStr() As RFEM5.SurfaceBasicStresses
  8. surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
  9. ' passa attraverso le tensioni e calcola la distanza dalla linea
  10. Dim i come intero
  11. Per i = 0 A UBound(surfBaStr, 1)
  12. P_res.X = surfBaStr(i).Coordinates.X
  13. P_res.Y = surfBaStr(i).Coordinates.Y
  14. P_res.Z = surfBaStr(i).Coordinates.Z
  15. ' calcola il coefficiente per l'equazione della linea di intersezione
  16. s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
  17. Se s <= 1 + d_tol And s >= 0 - d_tol Allora
  18. ' calcola la distanza del punto di intersezione e del nodo fe
  19. d = ((P_res.X-(A.X+s*vX))^2
  20. +(P_res.Y-(A.Y+s*vY))^2
  21. +(P_res.Z-(A.Z+s*vZ))^2)^0.5
  22. Se (d < d_tol) Allora
  23. ' qui è possibile elaborare il punto risultante trovato
  24. End If
  25. End If
  26. Avanti i
  27. /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.


Autore

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

Link
Download


;