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.
Przeliczone na s i zaczynające się od
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ą do analizy, a czerwona powierzchnia przedstawia płaszczyznę przekroju, która jest zdefiniowana przez punktPres i wektor kierunku
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.
- kod.vb#
Sub selection_test2 ()
- Dim nr_linii As Integer
- Dim powierzchnia_nr As Integer
- Dim nr przypadku_obciążenia As Integer
- Dim d_tol As Double
- linia nr = 11
- powierzchnia_nr = 1
- nr_przypadku_obciążeń = 1
- d_tol = 0,001
- ' pobierz interfejs z otwartego modelu i zablokuj licencję/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
- /kod#
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.
- kod.vb#
- ' pobierz linię
- Dim ILin As RFEM5.ILine
- Ustaw ILin = iModelData.GetLine(line_no, AtNo)
- Dim lin As RFEM5.RfLine
- lin = IIn.GetData
- ' pobierz węzły z linii
- Dim n (0 do 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
- Zbiór iNd = Nic
- /kod#
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.
Z podanych teraz punktów linii
- kod.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 As RFEM5.Point3D
- AX = N(0).X
- AY = N (0) .Y
- AZ = N (0) .Z
- Dim v2 As Double
- v2 = vX^2 + vY^2 + vZ^2
- Dim P_res As RFEM5.Point3D
- Dim s As Double
- Dim d As Double
- /kod#
Staje się on wektorem kierunku
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).
- kod.vb#
- ' uzyskaj wyniki w węzłach fe
- Dim iCalc As ICalculation2
- Set iCalc = iModel.GetCalculation
- Dim iRes As RFEM5.IResults
- Ustaw iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
- Dim surfBaStr () As RFEM5.SurfaceBasicNaprężenia
- surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
- ' wykonaj pętlę przez naprężenia i oblicz odległość od linii
- Dim i As Integer
- For i = 0 To UBound(surfBaStr, 1)
- P_res.X = surfBaStr(i).Współrzędne.X
- P_res.Y = surfBaStr(i).Coordinates.Y
- P_res.Z = surfBaStr(i).Coordinates.Z
- ' współczynnik obliczania dla równania przecięcia linii
- s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
- Jeżeli s <= 1 + d_tol And s >= 0 - d_tol Wtedy
- ' oblicz odległość punktu przecięcia i węzła 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
- Jeżeli (d < d_tol) To
- 'tutaj można przetworzyć znaleziony punkt result
- End If
- End If
- Następny i
- /kod#
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,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 |
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.
Uwagi końcowe
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.