Vyfiltrování příslušných prutů
Cílem je převést k posouzení v modulu RF-STEEL EC3 pouze pruty určitého průřezu. Pro náš příklad se mají vyfiltrovat všechny pruty s průřezem „IPE 300“. Nejdříve vyvoláme všechny průřezy z hlavního programu:
' Vytvořit znakový řetězec požadovaného průřezu
crsc_desc ="IPE 300"
' Vyvolat všechny průřezy z programu RFEM
Dim crscs()As RFEM5.CrossSection
crscs = iModelData.GetCrossSections
' Smyčka přes všechny průřezy
Dim crsc_noAs Long
crsc_no = -1
Dim iAs Long
Krátký dotaz - rychlá odpověď: i = 0Komu UBound(crscs, 1)
' Pokud označení průřezu souhlasí, uložit číslo průřezu
If InStr(LCase(crscs(i).Description), LCase(crsc_desc)) > 0Then
crsc_no = crscs(i).No
Exit For
End If
Další i
' Ukončit program, pokud požadovaný průřez nebyl nalezen
If crsc_no = -1Then
Err.Raise 513,"Get cross-section number","No cross-section with "" " & crsc_desc &" "" within its description found!"
End If
Při porovnávání označení průřezu by se mělo postupovat pokud možno obecně. Nejdříve se převede označení průřezu a také hledaný znakový řetězec pomocí „LCase“ na malá písmena a následně se vyhledává znakový řetězec v označení průřezu. Jestliže se nenajde odpovídající průřez, zůstává číslo průřezu -1, následuje dotaz a přerušení programu.
Po tomto kroku známe číslo průřezu a lze hledat pruty s daným číslem průřezu. Převzít se přitom mají pouze pruty, které mají příslušný průřez na počátku i na konci.
' Vytvořit znakový řetězec pro seznam prutů a nastavit na nulu
Dim mems_strAs String
mems_str = vbanullstr
' Vyvolat všechny pruty z programu RFEM
Dim mems()As RFEM5.Member
mems = iModelData.GetMembers
' Smyčka přes všechny pruty
Krátký dotaz - rychlá odpověď: i = 0Komu UBound(mems, 1)
' Pokud má prut průřez s daným číslem na počátku i na konci,
' převezme se jeho číslo do znakového řetězce
If mems(i).EndCrossSectionNo = crsc_noThen
If mems(i).EndCrossSectionNo = mems(i).StartCrossSectionNoThen
mems_str = mems_str & mems(i).No & ","
End If
End If
Další i
' Ukončit program, pokud nebyl nalezen žádný prut
If mems_str = vbanullstrThen
Err.Raise 514,"Get members","No member with cross-section "" " & crsc_desc &" "" found!"
End If
Vyvolat rozhraní přídavného modulu
Modul se připojí stejně jako hlavní program RFEM nebo RSTAB. Jediný rozdíl spočívá v tom, že se zde nerozlišuje mezi otevřením již otevřené instance a otevřením nové instance, protože je tu vždy již jedna otevřená instance:
' Vyvolat rozhraní pro modul
Dim iStec3As STEEL_EC3.Module
Set iStec3 = iModel.GetModule("STEEL_EC3")
Dalším krokem je smazání všech stávajících případů v modulu:
' Vyvolat počet stávajících případů v modulu
Dim countAs Long
count = iStec3.moGetCaseCount
' Pokud případy existují, vždy smazat první v tabulce
If count > 0Then
Krátký dotaz - rychlá odpověď: i = 0Komu count - 1
iStec3.moDeleteCase i, AT_INDEX
Další i
End If
Následně lze založit požadovaný případ a pomocí již vytvořeného znakového řetězce zadat pruty pro posouzení:
' Vytvořit případ v modulu "Optimalizace"
Dim iStec3CaseAs STEEL_EC3.ICase
Set iStec3Case = iStec3.moSetCase(1,"Optimization")
' Zadat pruty pro posouzení
iStec3Case.moSetMemberList mems_str
Nakonec se ještě zadají požadované kombinace zatěžovacích stavů:
' Zadat kombinace zatížení
Dim iStec3_uls_loads(0Komu 2)As STEEL_EC3.ULS_LOAD
iStec3_uls_loads(0).DesignSituation = DS_FUNDAMENTAL
iStec3_uls_loads(0).No = 1
iStec3_uls_loads(0).Type = ILOAD_GROUP
iStec3_uls_loads(1).DesignSituation = DS_FUNDAMENTAL
iStec3_uls_loads(1).No = 2
iStec3_uls_loads(1).Type = ILOAD_GROUP
iStec3_uls_loads(2).DesignSituation = DS_FUNDAMENTAL
iStec3_uls_loads(2).No = 3
iStec3_uls_loads(2).Type = ILOAD_GROUP
iStec3Case.moSetULSLoads iStec3_uls_loads
Shrnutí a výhled
Uvedené postupy platí pro všechny moduly, které lze připojit přes COM rozhraní. Zdrojový kód a soubor Excel umožňují ještě lépe proniknout do dané problematiky. V následujícím článku bychom chtěli jít ještě více do hloubky a ukázat si, jak lze provázat prvky v modulu a v hlavním programu.