1783x
001617
2020-01-10

Wybór węzłów wzdłuż linii za pomocą interfejsu 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. Aby uzyskać wyniki na krawędzi powierzchni lub wzdłuż linii wewnątrz powierzchni, należy odfiltrować wyniki w obszarze linii. Poniższy artykuł opisuje funkcję, jakiej można użyć w tym celu.

Teoretyczne podstawy obliczania odległości

Aby znaleźć węzły ES znajdujące się w sąsiedztwie linii lub na niej, należy obliczyć odległość węzła od tej linii. Dana jest linia z punktem początkowym i końcowym (N0 i N1 ) oraz punkt P, którego odległość od linii ma zostać określona. Często stosowaną metodą obliczania tej odległości jest konstruowanie płaszczyzny przebiegającej przez punkt P i prostopadłej do analizowanej linii. W tym celu należy najpierw utworzyć odpowiednie równanie liniowe. W takim przypadku zaleca się stosowanie formy parametrycznej, który zawiera wektor kierunku v. Można go użyć, aby rozpisać równanie płaszczyzny.

W przypadku wektora podporowego A używany jest punkt początkowy (wektor lokalizacji) linii, a w przypadku wektora kierunku v - różnica między dwoma wektorami lokalizacji. Z powodu wspomnianego wcześniej, jako równanie płaszczyzny została zastosowana postać normalna.

Wektor podporowy P jest analizowanym punktem wyników Pres. Wektor normalny jest wektorem kierunku linii prostej, ponieważ płaszczyzna jest prostopadła do tej linii. Przed obliczeniem odległości należy określić współczynnik s linii, w której płaszczyzna ją przecina. W tym celu wektor lokalizacji X w równaniu płaszczyzny zostaje zastąpiony równaniem linii prostej.

Po skorygowaniu zgodnie z s i za pomocą

powstaje następujące równanie.

Umożliwia to wyznaczenie punktu przecięcia S za pomocą równania 1.

Odległość d pomiędzy S i Pres jest określana za pomocą długości wektorowej różnicy między nimi.

Rysunek 01 przedstawia schematycznie wszystkie wyszczególnione elementy. Niebieska powierzchnia jest powierzchnią, która ma być analizowana, a czerwona powierzchnia przedstawia płaszczyznę przekroju utworzoną za pomocą punktuPre i wektora kierunku

. Współczynnik s wynosi na rysunku zaledwie 0,5, więc przecięcie płaszczyzny i linii znajduje się dokładnie w środku linii.

Wprowadzenie obliczeń odległości do programu

Gdy formuły są już określone, można utworzyć odpowiedni program. Do konwersji wykorzystuje się EXCEL VBA. Rysunek 02 przedstawia numerację elementów.

Najpierw, konieczne jest połączenie z RFEM. Następnie należy pobrać interfejs dla danych modelu. Ponieważ procedura ta została już opisana w wielu innych artykułach (patrz linki), nie zostanie tu szczegółowo opisana. Poniżej znajduje się kod źródłowy do uruchomienia programu.

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

Przed uruchomieniem programu należy najpierw zdefiniować parametry zmienne. Należą do nich line_no, w której mają być wyszukiwane wyniki, oraz oczywiście numer powierzchni surface_no, na której znajduje się linia. Ponadto potrzebny jest numer przypadku obciążenia (loadcase_no), do którego należą wyniki. Ponieważ jest to obliczenie numeryczne z ograniczoną dokładnością, wymagana jest tolerancja d_tol, określająca maksymalną odległość między linią a węzłem. W tym przykładzie wykorzystana jest tolerancja jednego milimetra.

Ponieważ interfejs dla danych modelu (IModelData) jest już dostępny, najpierw można wyszukać linię, a tym samym jej punkt początkowy i końcowy.

' get line
Dim ILin As RFEM5.ILine
Set ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
   
    
' get nodes from line
Dim n(0 To 1) As RFEM5.Node
    
Dim ints() As Integer
ints = strToIntArr(lin.NodeList)
    
Dim iNd As RFEM5.INode
Set iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
    
Set iNd = Nothing

Otrzymujemy osobno zarówno węzły, jak i linię, bezpośrednio przez ich interfejs (INode lub ILine). Aby pobrać numery węzłów z ciągu (RfLine.NodeList), należy użyć funkcji strToIntArr opisanej w innym artykule (patrz linki). Ciąg znaków jest przekształcany w pole liczby całkowitej.

Mając teraz podane punkty na linii (punkt początkowy) i (punkt końcowy) można ustawić pierwsze parametry równania.

Dim v As RFEM5.Point3D
v.X = N(1).X - N(0).X
v.Y = N(1).Y - N(0).Y
v.Z = N(1).Z - N(0).Z
    
Dim A As RFEM5.Point3D
A.X = N(0).X
A.Y = N(0).Y
A.Z = N(0).Z
    
Dim v2 As Double
v2 = v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2
    
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d As Double

Wektor kierunku

(v), wektor podpory (A) oraz iloczyn skali wektora kierunku (v2) są obliczane lub przygotowywane. Ponadto, z równania liniowego (1) definiowane są również zmienne Pres (P_res) dla punktu wyniku oraz współczynnik s.

Obliczanie odległości w pętli

W tym przykładzie wybrano przetwarzanie wyników na podstawie węzłów ES. Kontrola odległości odbywa się w pętli operującej na przestrzeni tych wyników. Wyniki należy najpierw uzyskać poprzez interfejs ICalculation2, a następnie IResults. W ramach pętli najpierw zostaje opisany punkt Pres wraz ze współrzędnymi wartości wyniku (dla zachowania przejrzystości). Następnie można przeprowadzić bezpośrednie obliczenia równania (4). Po obliczeniu s można sprawdzić, czy wartość jest mniejsza niż zero lub większa niż jeden, ponieważ wartości te leżą na zewnątrz lub przed i za linią prostą. Jeżeli wartość znajduje się w tym zakresie, odległość jest obliczana za pomocą równania (6).

' otrzymujesz wyniki w fe-węzłach
Dim iCalc As ICalculation2
Set iCalc = iModel.GetCalculation
    
Dim iRes As RFEM5.IResults
Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
    
Dim surfBaStr() As RFEM5.SurfaceBasicStresses
surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
    
' loop through stresses and calculate distance to line
Dim i As Integer
For i = 0 To UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).Coordinates.Z
' calculate factor for line equation of intersection
s = ((P_res.X-A.X)*v.X + (P_res.Y-A.Y)*v.Y + (P_res.Z-A.Z)*v.Z) / v2
        
If s <= 1 + d_tol And s >= 0 - d_tol Then
' calculate distance of intersection point and fe-node
d = ((P_res.X-(A.X+s*v.X))^2
+(P_res.Y-(A.Y+s*v.Y))^2
+(P_res.Z-(A.Z+s*v.Z))^2)^0.5
            
If (d < d_tol) Then
' here you can process the found result point
End If
End If
        
Next i

Tolerancja jest stosowana zarówno do sprawdzenia współczynnika s, jak i odległości d, dzięki czemu niewielkie niedokładności nie prowadzą do wykluczenia wyniku.

Wyniki programu

Wartości znalezione przez program są wyświetlane w tabeli i są zaokrąglane do dwóch miejsc po przecinku.

σy + [N/mm²]Współczynnik 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

Dla porównania wartości z wykresu wyników w odpowiedniej linii są wyświetlane na rysunku 03.

Jak widać, wartości są takie same i istnieje 100% zbieżność wyników lub że wszystkie wartości zostały znalezione w obrębie linii.

Podsumowanie

Za pomocą obliczeń wektorowych został utworzony program do znajdowania węzłów wzdłuż linii. Dzięki temu algorytmowi można wyszukiwać nie tylko wyniki, ale również wszystkie inne elementy geometryczne. Jest to szczególnie pomocne, ponieważ wybór graficzny nie jest oczywiście możliwy za pomocą interfejsu COM, ale jest możliwy w inny sposób, za pomocą funkcji. Automatyczne obliczanie wyników jest możliwe, szczególnie w przypadku programów działających całkowicie w tle.


Autor

Pan Günthel zapewnia wsparcie techniczne klientom firmy Dlubal Software i zajmuje się ich zapytaniami.

Odnośniki
Pobrane