1845x
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.

Zkonvertováno na s a začíná na

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 analyzovaná plocha a červená plocha představuje rovinu řezu, která je definována bodem Pres a směrovým vektorem

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

   ' získat linii
    Dim ILin As RFEM5.ILine
    Set ILin = iModelData.GetLine(line_no, AtNo)
    Dim lin As RFEM5.RfLine
    lin = ILin.GetData
   
    
    ' získat uzly z linie
    Dim n(0 To 1) Jako RFEM5.Uzel
    
    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
    
    Nastavíme iNd = nic

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.

S nyní danými body linie

(počáteční bod) a (Koncový bod) lze nastavit první parametry rovnice.

    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

Stane se vektorem směru

(v), vektor podpory (A) a součin měřítka 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).

    ' získat výsledky v uzlech fe-uzlů
    Dim iCalc As ICalculation2
    Set iCalc = iModel.GetCalculation
    
    Dim iRes As RFEM5.IResults
    Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
    
    Dim surfBaStr() As RFEM5.SurfaceBasicNapětí
    surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
    
    ' procházet napětími a vypočítat vzdálenost k linii
    Dim i As Integer
    Pro 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
        ' výpočet součinitele pro liniovou rovnici průniku
        s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
        
        Pokud s <= 1 + d_tol A s >= 0 - d_tol Pak
            ' vypočítat vzdálenost průsečíku a uzlu fe-uzlu
            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
            
            If (d < d_tol) Pak
                ' zde lze zpracovat nalezený výsledkový bod
            End If
        End If
        
    Další 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,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

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 a výhled

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í


;