Protože modelovat žebro jako plochu s výsledkovým prutem je podstatně složitější než použít prut typu žebro, vytvoříme pro převod prutu typu žebro na plošný model včetně výsledkového prutu následující program v EXCELu-VBA.
Pro převod žebra na plošný model je třeba provést následující kroky:
- Načtení parametrů žebra (průřez, orientace atd.)
- Vytvoření plochy žebra
- vytvořit výsledkový prut
- Smazání prutu typu žebro
V následujícím textu uvádíme pro ukázku výňatky z celého zdrojového kódu. Celý kód si můžete stáhnout v připojeném souboru na konci tohoto článku.
Načtení parametrů žebra
Uživatel má možnost vybrat příslušné žebro k převodu v rozhraní programu. K tomu je třeba pracovat s funkcí EnableSelections. Dokud je funkce EnableSelections nastavena na true, budou se z RFEMu načítat pouze vybrané prvky. Načtení vybraného prutu pak bude vypadat následovně.
' get interface of active model
Set iMod = iApp.GetActiveModel
' get interface of (structural) model data
Dim iModData As RFEM5.IModelData2
Set iModData = iMod.GetModelData
' get selected member
iModData.EnableSelections True
Dim mems() As RFEM5.Member
Dim selMem As RFEM5.Member
mems = iModData.GetMembers
selMem = mems(0)
iModData.EnableSelections False
Pro modelování žebra jsou zapotřebí následující parametry:
- Průřez žebra, čísla ploch a spolupůsobící šířky
- Orientace žebra
- Materiál žebra
V programu RFEM je žebro typem prutu. Při programování přes rozhraní COM to znamená, že data žebra se musí načíst přes dvě různá rozhraní. Zaprvé je to rozhraní pro prut a zadruhé rozhraní pro žebro. Rozhraní na žebro lze vyvolat přes IModelData.GetRib. GetRib čeká na číslo žebra, které je v prutu obsaženo prostřednictvím Member.RibNo.
' get parameters of rib
' #####################
Dim iRb As RFEM5.IRib
Set iRb = iModData.GetRib(selMem.RibNo, AtNo)
Dim selRb As RFEM5.Rib
selRb = iRb.GetData
Dim rbCrsc As RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection
Rozhraní na žebro pak nabízí dva různé prvky: obecné údaje o žebru přes strukturu Rib a údaje o průřezu žebra přes RibCrossSection. Rib obsahuje čísla ploch, polohu žebra a spolupůsobící šířky. RibCrossSection obsahuje označení a rozměry vnitřního průřezu žebra, který používá také RF-CONCRETE Members (ITCU).
Dále je potřeba také orientace, která je dána lokálním osovým systémem prutu. Přístup k osovému systému zajišťuje rozhraní na prut. Funkce IMemer.GetLocalCoordinateSystem vrací strukturu CoordinateSystem.
Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData
GetLocalCoordinateSystem ještě čeká na x-místo na prutu, které zde bylo nastaveno na 0,0, respektive na počátek. Kromě uvedených parametrů je zapotřebí dále materiál prutu, který obdržíme přes průřez prutu.
Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData
Vytvoření plochy žebra
Program se nejdříve vytvoří pouze pro přímá žebra na kladné straně z. Protože žebro může ležet také šikmo v prostoru, měla by se vytvořit plocha na základě orientace prutu. Proměnná cosy pro lokální osový systém prutu obsahuje směrový vektor pro lokální z osu cosy.AxisZ s příslušnými třemi hodnotami x, y a z. Tento vektor je normován tak, že při jeho vynásobení výškou žebra udává vzdálenost a směr spodní hrany žebra. Pro hraniční linie plochy žebra se tedy tento vektor vynásobí výškou žebra a přičte se k počátečnímu a koncovému uzlu. Získají se tak oba koncové uzly dolní hrany plochy žebra. Je třeba si přitom uvědomit, že k výšce žebra náleží také polovina tloušťky plochy spolupůsobící šířky. Pro zjednodušení se použije pouze tloušťka plochy na první straně (-y v lokálním osovém systému) od průřezu žebra (UpperLeftFlangeThickness). Jakmile máme k dispozici uzly, lze vygenerovat hraniční linie a plochu žebra.
' create/calculate nodes
' ######################
Dim nodes() As RFEM5.Node
nodes = selNodes
nodes(0).no = index_n + 1
nodes(1).no = index_n + 2
Dim h_rib As Double
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness / 2)
nodes(0).X = nodes(0).X + h_rib * cosy.AxisZ.X
nodes(0).Y = nodes(0).Y + h_rib * cosy.AxisZ.Y
nodes(0).Z = nodes(0).Z + h_rib * cosy.AxisZ.Z
nodes(1).X = nodes(1).X + h_rib * cosy.AxisZ.X
nodes(1).Y = nodes(1).Y + h_rib * cosy.AxisZ.Y
nodes(1).Z = nodes(1).Z + h_rib * cosy.AxisZ.Z
' create lines
' ############
Dim lines(0 To 2) As RFEM5.RfLine
lines(0).no = index_l + 1
lines(1).no = index_l + 2
lines(2).no = index_l + 3
lines(0).NodeList = str(selNodes(0).no) + "," + str(nodes(0).no)
lines(1).NodeList = str(selNodes(1).no) + "," + str(nodes(1).no)
lines(2).NodeList = str(nodes(0).no) + "," + str(nodes(1).no)
' create surface
' ##############
Dim surf As RFEM5.Surface
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str(selLine.no) + "," + str(lines(0).no) + "," + str(lines(2).no) + "," + str(lines(1).no)
surf.Comment = "rib"
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.MaterialNo
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = index_s + 1
Proměnné index_n, index_l, index_s obsahují vždy poslední index příslušného prvku z programu RFEM. Informace o stanovení indexů najdeme ve zdrojovém kódu, který k tomuto článku připojujeme ke stažení.
Vytvořit výsledkový prut
Výsledkový prut se stejně jako žebro skládá ze dvou prvků: standardní struktury Member a přídavných údajů ResultBeam. Přídavné údaje lze upravovat pouze přes rozhraní na prut, takže je třeba nejdříve vytvořit prut a poté lze data přenést přes rozhraní IMember. Protože poloha prutu je obvykle excentrická, vytvoří se počáteční a koncový uzel přímo ve středu smyku bez excentricity prutu. Excentricita se uloží v RibCrossSection. Počáteční a koncový uzel původního žebra tak lze zkopírovat a použít jako základ. Pomocí směrových vektorů y a z lokálního osového systému prutu lze zkopírované uzly přesunout na správné místo. Pro pozdější posouzení musí mít také výsledkový prut průřez, který se nejprve zkopíruje z původního žebra. Poté se označení průřezu převezme z RibCrossSection. Obsah CrossSection.TextID se smaže, jinak by se použil pro vytvoření průřezu místo znakového řetězce z CrossSection.Description.
' create nodes for result member and calculate eccentricity
Dim resNodes() As RFEM5.Node
resNodes = selNodes
resNodes(0).no = index_n + 3
resNodes(1).no = index_n + 4
resNodes(0).X = selNodes(0).X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes(0).Y = selNodes(0).Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes(0).Z = selNodes(0).Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
resNodes(1).X = selNodes(1).X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes(1).Y = selNodes(1).Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes(1).Z = selNodes(1).Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
' create line
Dim resLine As RFEM5.RfLine
resLine.no = index_l + 4
resLine.NodeCount = 2
resLine.Type = PolylineType
resLine.NodeList = str(resNodes(0).no) & "," & str(resNodes(1).no)
' create cross section
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no = index_c + 1
resCrsc.TextID = ""
' create member
Dim resMem As RFEM5.Member
resMem.LineNo = resLine.no
resMem.no = index_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
resMem.Rotation = selMem.Rotation
' send data to RFEM
' ####################
iModData.PrepareModification
iModData.SetNodes
iModData.SetLines
iModData.SetSurface
iModData.SetNodes resNodes
iModData.SetLine resLine
iModData.SetCrossSection resCrsc
iModData.SetMember resMem
iModData.FinishModification
Po vytvoření prutu (a také uzlů, linií, průřezu a plochy) je třeba stanovit a přenést parametry pro výsledkový prut. Výsledkový prut integruje vnitřní síly jiných prvků (prutů, ploch, těles) a převádí je podle jejich polohy na vnitřní síly prutu. Pro zahrnutí správných prvků má výsledkový prut dvě základní možnosti. Můžeme zadat prvky, které se mají integrovat, a dodatečně omezit oblast integrace pomocí tělesa (válec nebo kvádr). V našem případě se tedy použije číslo nové plochy žebra a případně čísla ploch spolupůsobících šířek. Jako integrační oblast se vybere kvádr, který lze lokálně definovat ve směru +/- y a +/- z. Jako hodnoty se opět použijí údaje z RibCrossSection. Je třeba si uvědomit, že i v případě chybějící spolupůsobící šířky je třeba použít šířku integrace, aby deska nad žebrem mohla být správně integrována. Přídavná šířka tak musí odpovídat polovině tloušťky plochy.
' set result beam parameters
' ##########################
Dim resBeam As RFEM5.ResultBeam
Dim iResBeam As RFEM5.IResultBeam
Set iResBeam = iModData.GetMember(resMem.no, AtNo).GetExtraData
resBeam = iResBeam.GetData
' set integrated elements
If selRb.SurfaceNoSide1 Then
resBeam.IncludeSurfaces = str(selRb.SurfaceNoSide1) & '',
End If
If selRb.SurfaceNoSide2 Then
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(selRb.SurfaceNoSide2) &,
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(surf.no)
' set integration area
resBeam.Integrate = WithinCuboidGeneral
Dim resBeamParam(0 To 3) As Double
' +y, -y, +z, -z
If selRb.WidthSide2 Then
resBeamParam(0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Else
resBeamParam(0) = 0.5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y
End If
If selRb.WidthSide1 Then
resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y
Else
resBeamParam(1) = 0.5 * rbCrsc.WebThickness + rbCrsc.Eccentricity.Y
End If
resBeamParam(2) = rbCrsc.Depth
resBeamParam(3) = rbCrsc.Depth
resBeam.Parameters = resBeamParam
' send new result beam parameters to RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification
Smazání prutu typu žebro
Protože nové žebro bylo nyní vytvořeno z ploch, můžeme již prut, staré žebro, smazat. Libovolný prvek můžeme odstranit pomocí funkce DeleteObjects v rozhraní IModelData. Protože dochází k úpravě prvků, je tu třeba opět použít blok Prepare/Finish modification.
' Remove Rib
' ##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str(selMem.no)
iModData.FinishModification
Závěr a výhled
Žebra jako pruty ve své jednoduchosti nemohou vždy pokrýt všechny aspekty složitějšího modelu. Vytvoření prutu typu žebro je jednoduché, a proto zde představený program kombinuje jednoduché vytvoření žebra jako prutu s detailnějším modelováním a vytvořením žebra z ploch. Kromě již známých prvků, jako například rozhraní na prut (IMember), jsme představili rozhraní IRib, které mimo jiné umožňuje přístup k průřezu žebra. Také jsme si načetli lokální osový systém prutu a pomocí vektorového výpočtu jsme vytvořili plochu žebra.
Výhled
V programu jsou možnosti pro jemnější nastavení. Můžeme tak například ještě zohlednit polohu žebra (nahoře, dole, střed). Další možností by bylo rozšíření na žebra s náběhy nebo dokonce žebra na zakřivených liniích.