1783x
001617
10.1.2020

Výběr uzlů podél linie pomocí rozhraní COM

Pokud načteme pomocí rozhraní COM výsledky na ploše, dostaneme jednorozměrné pole se všemi výsledky v uzlech sítě konečných prvků nebo bodech rastru. Chceme-li získat výsledky na okraji plochy nebo podél určité linie na ploše, je třeba je pro oblast linie vyfiltrovat. V našem příspěvku představíme funkci, kterou lze pro tento problém použít.

Teoretické základy výpočtu vzdálenosti

Pro nalezení uzlů sítě KP, které se nacházejí v blízkosti linie nebo případně na ní, je třeba spočítat vzdálenost uzlu od linie. Je přitom dána linie s počátečním a koncovým bodem (N0 a N1) a bod P, jehož vzdálenost od linie se má určit. Při výpočtu vzdálenosti se běžně postupuje tak, že se vytvoří rovina, která prochází bodem P a je kolmá na přímku. K tomu je nejdříve třeba sestavit vhodnou rovnici pro přímku. V tomto případě se nabízí parametrické vyjádření, v jehož tvaru je obsažen směrový vektor v. Můžeme ho následně použít při sestavování rovnice pro rovinu.

Pro podpůrný vektor A se použije počáteční bod (polohový vektor) linie a pro směrový vektor v se použije rozdíl obou polohových vektorů. Rovnice pro rovinu bude mít z již uvedeného důvodu normálový tvar.

Podpůrný vektor P je zde hledaný výsledný bod Pres. Normálový vektor je směrový vektor přímky, protože rovina je kolmá k přímce. Před výpočtem vzdálenosti je třeba ještě stanovit faktor s přímky, v níž rovina přímku protíná. Pro tento účel se rovnicí přímky nahradí polohový vektor X v rovinné rovnici.

Posunem po s a pomocí

dostaneme následující rovnici.

Lze tak nyní stanovit průsečík S pomocí rovnice 1.

Vzdálenost d mezi S a Pres se stanoví na základě velikosti vektoru odpovídající rozdílu mezi nimi.

Na obr. 01 jsou schematicky znázorněny veškeré uvedené složky. Modrá plocha je vyšetřovaná plocha, zatímco červená plocha představuje protínající rovinu, která je dána bodem Pres a směrového vektoru

. Jak vidíme na obrázku, hodnota faktoru s je právě 0,5, takže průsečík roviny a linie leží přesně ve středu linie.

Výpočet vzdálenosti v programu

Po sestavení rovnic můžeme vytvořit příslušný program. Pro převod se používá EXCEL VBA. Na obr. 02 je znázorněno číslování prvků.

Prvním krokem je připojení k programu RFEM. Následně vyvoláme rozhraní k údajům o modelu. Vzhledem k tomu, že tento postup jsme již popsali v jiných příspěvcích (viz odkazy), nyní ho přeskočíme. Přejdeme ke zdrojovému kódu pro spuštění 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

Před spuštěním programu je třeba nejdříve zadat proměnné parametry. Patří k nim číslo linie line_no, na které se mají hledat výsledky, a samozřejmě číslo plochy surface_no, na které se linie nachází. Dále je třeba zadat číslo zatěžovacího stavu loadcase_no, ke kterému výsledky náleží. Vzhledem k tomu, že se jedná o numerický výpočet s omezenou přesností, je nutné stanovit toleranci d_tol, která udává maximální vzdálenost mezi linií a uzlem. V tomto příkladu se uvažuje tolerance 1 mm.

Protože nyní máme k dispozici rozhraní pro údaje o modelu (IModelData), může se nejdříve vyhledat linie, a tedy i její počáteční a koncový bod.

' 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

Uzly i linie vyvoláme jednotlivě přímo přes jejich rozhraní (INode nebo ILine). Pro vypsání čísel uzlů ze znakového řetězce (RfLine.NodeList) se použije funkce strToIntArr, kterou popisujeme v jiném příspěvku (viz odkazy). Konvertuje znakový řetězec do číselného pole.

Jestliže jsou nyní dány body linie (počáteční bod) a (koncový bod), lze zadat první parametry rovnice.

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

Vypočítá se, respektive nastaví směrový vektor

, podpůrný vektor (A) a skalární součin směrového vektoru (v2). Dále se definují také proměnné Pres (P_res) pro výsledný bod a s pro faktor z rovnice pro přímku (1).

Výpočet vzdálenosti ve smyčce

V našem příkladu jsme se rozhodli zpracovat výsledky na základě uzlů sítě konečných prvků. Kontrola vzdálenosti probíhá ve smyčce nad polem těchto výsledků. Nejdříve je třeba výsledky vyvolat pomocí rozhraní ICalculation2 a následně IResults. Ve smyčce je nejdříve popsán bod Pres pomocí souřadnic výsledné hodnoty (pro přehlednost). Poté lze provést přímý výpočet rovnice (4). Po výpočtu s je možné zkontrolovat, zda je hodnota menší než nula nebo větší než jedna, protože tyto hodnoty leží mimo přímku, respektive před a za přímkou. Pokud se hodnota nachází v tomto rozmezí, vypočítá se vzdálenost pomocí rovnice (6).

' get results in fe-nodes
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

Pro kontrolu faktoru s a také vzdálenosti d se nastaví určitá tolerance, aby případné drobné nepřesnosti nevedly k vyloučení výsledku.

Výsledky programu

Hodnoty nalezené programem jsou zobrazeny v tabulce se zaokrouhlením na dvě desetinná místa.

σy+ [N/mm²]Faktor 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

Pro srovnání jsou k dispozici hodnoty z průběhu výsledků na příslušné linii, které vidíme na obr. 03.

Je zřejmé, že hodnoty si odpovídají a že byla dosažena 100% shoda, respektive byly nalezeny všechny hodnoty na linii.

Závěr

Na základě vektorového výpočtu byl vytvořen program, který umožňuje najít uzly podél linie. Pomocí tohoto algoritmu lze kromě výsledků vyhledávat i všechny ostatní geometrické prvky. Tento postup je velmi užitečný, protože vizuální výběr není přes rozhraní COM samozřejmě možný. Výběr lze ovšem provést jiným způsobem pomocí funkce. U programů, které běží zcela na pozadí, může takto probíhat automatické vyhodnocení výsledků.


Autor

Ing. Günthel zajišťuje technickou podporu zákazníkům.

Odkazy
Stahování