3377x
001639
20. Juli 2020

Transformation einer Rippe in ein Flächenmodell mit Ergebnisstab mittels VBA

Wenn eine Rippe Teil einer nichtlinearen Bemessung ist oder biegesteif an folgende Wände übergeht, sollte statt eines Stabes eine Fläche für die Modellierung verwendet werden. Damit die Rippe dennoch als Stab bemessen werden kann, wird ein Ergebnisstab mit der richtigen Exzentrizität benötigt, welcher die Flächenschnittgrößen in Stabschnittgrößen transformiert.

Da die Modellierung einer solchen flächenbasierten Rippe mit Ergebnisstab deutlich komplizierter ist als das Anlegen eines Stabes vom Typ Rippe, soll das folgende Programm in EXCEL-VBA die Umwandlung einer stabbasierten Rippe in ein Flächenmodell samt Ergebnisstab übernehmen.

Für die Transformation einer Rippe in ein Flächenmodell sind folgende Schritte notwendig:

  1. Rippenparameter auslesen (Querschnitt, Orientierung et cetera)
  2. Rippenfläche anlegen
  3. Ergebnisstab anlegen
  4. Rippenstab löschen

Im Folgenden werden exemplarisch Ausschnitte aus dem gesamten Quellcode verwendet. Der vollständige Code kann als Datei heruntergeladen werden.

Rippenparameter auslesen

Der Nutzer soll die Möglichkeit haben, die zu transformierende Rippe per Selektion in der Programmoberfläche auszuwählen. Dazu muss mit der Funktion EnableSelections gearbeitet werden. Solange EnableSelections mit true aktiviert wurde, werden nur selektierte Elemente aus RFEM gelesen. Das Auslesen des selektierten Stabes sieht dann wie folgt aus.

'   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

Für die Modellierung der Rippe werden folgende Parameter benötigt:

  • Rippenquerschnitt, Flächennummern und mitwirkende Breiten
  • Rippenorientierung
  • Material der Rippe

In RFEM ist eine Rippe ein Stabtyp. Für die Programmierung über die COM-Schnittstelle bedeutet das, dass die Daten einer Rippe über zwei verschiedene Schnittstellen geholt werden müssen. Es gibt zum einen die Schnittstelle für den Stab und zum anderen die Schnittstelle für die Rippe. Das Interface zu einer Rippe kann über IModelData.GetRib geholt werden. GetRib erwartet die Rippennummer, welche im Stab über Member.RibNo enthalten ist.

'   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

Das Interface zur Rippe bietet dann zwei verschiedene Elemente an: die allgemeinen Rippendaten über die Struktur Rib und die Daten zum Rippenquerschnitt über RibCrossSection. Rib beinhaltet die Flächennummern, die Lage der Rippe und die mitwirkenden Breiten. RibCrossSection beinhaltet die Bezeichnung und die Abmessungen des internen Rippenquerschnitts, welcher auch von RF-BETON Stäbe verwendet wird (ITCU).

Zusätzlich wird noch die Orientierung benötigt, welche über das lokale Achsensystem des Stabes verfügbar ist. Zugang zum Achsensystem bekommt man über die Schnittstelle zum Stab. Die Funktion IMemer.GetLocalCoordinateSystem gibt die Struktur CoordinateSystem zurück.

Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData

GetLocalCoordinateSystem erwartet noch die x-Stelle des Stabes, welche hier auf 0.0 beziehungsweise den Anfang gesetzt wurde. Neben den genannten Parametern wird noch das Material des Stabes benötigt, welches man über den Querschnitt des Stabes erhält.

Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData

Rippenfläche anlegen

Das Programm wird zunächst nur für gerade Rippen auf der positiven z-Seite angelegt. Da die Rippe auch schräg im Raum liegen kann, sollte die Fläche mit Hilfe der Staborientierung angelegt werden. Die Variable cosy für das lokale Stabachsensystem beinhaltet den Richtungsvektor für die lokale z-Achse cosy.AxisZ mit seinen drei Werten x,y, und z. Dieser Vektor ist normiert, sodass er multipliziert mit der Höhe der Rippe die Entfernung und Richtung der Unterkante der Rippe angibt. Für die Begrenzungslinien der Rippenfläche wird also dieser Vektor mit der Rippenhöhe multipliziert und jeweils zum Anfangs- und Endknoten addiert. Damit ergeben sich die beiden Endknoten der Unterkantenlinie der Rippenfläche. Zu beachten ist noch, dass zur Rippenhöhe auch die halbe Flächendicke der mitwirkenden Breite gehört. Zur Vereinfachung wird nur die Flächendicke der ersten Seite (-y im lokalen Achsensystem) aus dem Rippenquerschnitt verwendet (UpperLeftFlangeThickness). Nachdem die Knoten zur Verfügung stehen, können die Begrenzungslinien und die Rippenfläche generiert werden.

'   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

Die Variablen index_n, index_l, index_s beinhalten jeweils den letzten Index des jeweiligen Elements aus RFEM. Die Ermittlung der Indizes kann dem herunterladbarem Quellcode entnommen werden.

Ergebnisstab anlegen

Der Ergebnisstab besteht wie auch die Rippe aus zwei Elementen: der Standardstruktur Member und den Zusatzdaten ResultBeam. Die Zusatzdaten sind nur über das Interface zum Stab modifizierbar, sodass der Stab zunächst angelegt werden muss und danach über das Interface IMember die Daten übergeben werden können. Da der Stab meist exzentrisch liegen muss, werden Anfangs- und Enknoten direkt im Schubmittelpunkt ohne Stabexzentrizität angelegt. Die Exzentrizität ist in RibCrossSection hinterlegt. So können Anfangs- und Endknoten der originalen Rippe kopiert und damit als Grundlage verwendet werden. Mit Hilfe der Richtungsvektoren y und z aus dem lokalen Stabachsensystem können die kopierten Knoten an die richtige Stelle verschoben werden. Der Ergebnisstab benötigt für eine spätere Bemessung auch einen Querschnitt, welcher zunächst von der originalen Rippe kopiert wird. Danach wird die Querschnittsbezeichnung aus RibCrossSection übernommen und CrossSection.TextID geleert, da sonst diese für die Querschnittserstellung verwendet wird statt der Zeichenkette aus 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

Nachdem der Stab (ebenso Knoten, Linien, Querschnitt und Fläche) angelegt wurde, müssen nun die Parameter für den Ergebnisstab ermittelt und übergeben werden. Ein Ergebnisstab integriert Schnittgrößen anderer Elemente (Stäbe, Flächen, Volumen) auf und transformiert diese entprechend seiner Lage in Stabschnittgrößen. Um die richtigen Elemente einzubeziehen, hat ein Ergebnisstab zwei grundlegende Optionen. Es können die zu integrierenden Elemente angegeben und zusätzlich der Intergrationsbereich über ein Volumen (Zylinder oder Quader) eingegrenzt werden. Im vorliegenden Fall werden also die Nummer der neuen Rippenfläche und die Nummern der Flächen der mitwirkenden Breiten, soweit vorhanden, verwendet. Als Integrationsbereich wird der Quader gewählt, welcher (lokal betrachtet) in +/-y- und +/-z- Richtung definiert werden kann. Als Werte werden wieder die Angaben aus RibCrossSection verwendet. Zu beachten ist, dass im Falle einer fehlenden mitwirkenden Breite trotzdem eine Integrationsbreite verwendet werden muss, damit die Decke über der Rippe richtig integriert wird. Die zusätzliche Breite muss also die halbe Flächendicke sein.

'   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

Rippenstab löschen

Da die neue Rippe aus Flächen nun erstellt wurde, kann der Stab, die alte Rippe, nun gelöscht werden. Das Löschen jeglicher Elemente kann mit Hilfe der Funktion DeleteObjects des Interfaces IModelData erfolgen. Auch hier muss, da Elemente modifiziert werden, ein Prepare-/Finishmodification-Block verwendet werden.

'   Remove Rib
'   ##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str(selMem.no)
iModData.FinishModification

Zusammenfassung

Rippen als Stäbe können in Ihrer Einfachheit nicht immer alle Belange eines komplexeren Modells abdecken. Das Anlegen einer Stabrippe ist einfach und daher verbindet das hier vorgestellte Programm das einfache Anlegen einer Rippe als Stab mit der detaillierteren Modellierung und Abbildung einer Rippe aus Flächen. Es wurden neben bereits bekannten Elementen, wie beispielsweise der Schnittstellen zum Stab (IMember), die Schnittstelle IRib vorgestellt, welche unter anderem Zugriff auf den Rippenquerschnitt bietet. Auch wurde das lokale Achsensystem eines Stabes ausgelesen und mit Hilfe der Vektorrechnung die Fläche der Rippe erstellt.

Ausblick

Es gibt im Programm Möglichkeiten zur Verfeinerung. So könnte noch die Betrachtung der Rippenlage (oben, unten, Mitte) eingebaut werden. Ein weiterer Punkt wäre die Erweiterung auf gevoutete Rippen oder sogar Rippen an gekrümmten Linien.


Autor

Herr Günthel kümmert sich im Kundensupport um die Anliegen unserer Anwender.

Links
Downloads