3392x
001639
20.7.2020

Převod žebra na plošný model s výsledkovým prutem pomocí VBA

Pokud je žebro součástí nelineárního posouzení nebo pokud vykazuje tuhé spojení s navazujícími stěnami, je třeba místo prutu použít pro modelování plochu. Aby bylo nicméně možné žebro stále posuzovat jako prut, potřebujeme výsledkový prut se správnou excentricitou, který vnitřní síly na ploše převádí na vnitřní síly prutu.

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:

  1. Načtení parametrů žebra (průřez, orientace atd.)
  2. Vytvoření plochy žebra
  3. Vytvoření výsledkového prutu
  4. 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ření výsledkového prutu

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 nodes
    iModData.SetLines lines
    iModData.SetSurface surf
    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

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


Autor

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

Odkazy
Stahování