2096x
001379
20. Dezember 2016

COM-Schnittstelle in VBA | 2.1 Erstellen eines Stabes

Im ersten Teil der Serie ging es um das Öffnen und Erstellen eines Modells in RFEM. Im zweiten Teil soll es am Beispiel eines Stabes um das Anlegen und Verändern von Elementen gehen. Die Elemente aus Teil 1 werden daher nicht erneut angesprochen.

Grundlagen

Ein Stab in RFEM besteht aus mehreren Elementen, welche mehr oder weniger voneinander abhängen. Wenn eines dieser Elemente fehlt, kann der Stab nicht erstellt werden. Folgende Hierarchie muss dabei beachtet werden.

Um ein solches Element erzeugen zu können, muss die Schnittstelle für Modelldaten aktiviert werden:

' Schnittstelle für Modelldaten aktivieren.
Dim iModelData As iModelData

Set iModelData = iModel.GetModelData()

Diese Schnittstelle erlaubt schließlich das Übergeben von Daten an RFEM.

Der Bearbeitungsmodus

Sobald Daten in RFEM geändert oder angelegt werden sollen, muss RFEM in einen Bearbeitungsmodus umgeschaltet werden. In diesem Modus kann zum Beispiel keine Berechnung durchgeführt werden und die übergebenen Daten sind auch erst nach dem Beenden verfügbar. Für das Umschalten in die Bearbeitung muss die Methode PrepareModification() verwendet werden und für das Verlassen FinishModification():

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification
' ...
iModelData.FinishModification

Elemente anlegen

Das Ziel ist es, einen Stab mit dem Querschnitt IPE 100, Baustahl S235, von Punkt P0(0,0,0) nach Punkt P1(1,0,0) zu erzeugen. Dafür müssen zuerst die Knoten angelegt werden. Im folgenden Beispiel wird ein Array verwendet, da dies für weitere Programmänderungen die größte Flexibilität darstellt:

' Knoten anlegen.
Dim nodeList(0 To 1) As RFEM5.Node
nodeList(0).RefObjectNo = 0
nodeList(0).No = 1
nodeList(0).X = 0#
nodeList(0).Y = 0#
nodeList(0).Z = 0#

nodeList(1).RefObjectNo = 0
nodeList(1).No = 2
nodeList(1).X = 1#
nodeList(1).Y = 0#
nodeList(1).Z = 0#

iModelData.PrepareModification
iModelData.SetNodes nodeList
iModelData.FinishModification

Wie bereits zuvor angesprochen, wird dann das Array mit den Knotendaten innerhalb der Methoden PrepareModification() und FinishModification() übergeben. Für die Nummerierung ist folgender Fakt wichtig: Wenn ein neues Element übergeben wird und die darin angegebene Nummer bereits vorhanden ist, dann werden vorhandene Elemente nicht überschrieben, sondern das Elemente an das Ende der Liste angefügt. Beim Eintragen einer Null wird das Element automatisch an die nächste freie Stelle gesetzt.

Das Anlegen der Linien erfolgt analog mit dem kleinen Unterschied, dass hier natürlich auf die Knoten verwiesen werden muss. Die Knotenliste wird genau wie in RFEM als Zeichenkette übergeben:

' Linien anlegen.
Dim lineList(0 To 0) As RFEM5.Line
lineList(0).nodeList = "1,2"
lineList(0).Type = LineType.PolylineType

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification
iModelData.SetLines lineList
iModelData.FinishModification

Elemente verändern

Das Anlegen des Querschnitts verlangt zunächst das Anlegen des Materials. In einem neuen RFEM-Modell werden zunächst immer die Materialien aus dem zuletzt angelegten Modell verwendet. Um sicherzugehen, dass das gewünschte Material verwendet wird, müssen zunächst alle vorhandenen Materialien gelöscht oder verändert werden. Das Löschen aller vorhandenen Materialien und das Anlegen eines neuen Materials ist dabei der einfachste Weg. Im Gegensatz zum Anlegen neuer Elemente muss beim Löschen oder Verändern die Schnittstelle der einzelnen Elemente angesprochen werden. Dazu geht man wie folgt vor:

' Anzahl der vorhandenen Materialien holen.
Dim num As Integer
num = iModelData.GetMaterialCount

' Schleife über vorhandene Materialien.
iModelData.PrepareModification
Dim i As Integer
For i = 0 To num - 1
' Schnittstelle zum Material holen.
Dim iMat As RFEM5.IMaterial
Set iMat = iModelData.GetMaterial(i, AtIndex)
' Material löschen.
iMat.Delete
Next i
iModelData.FinishModification

Die Schnittstelle eines Materials wird über entweder über deren Materialnummer geholt (AtNo) oder über den Index in der Liste aller Materialien. Im Gegensatz zur Materialnummer beginnt der Index bei Null und weißt keine Lücken auf.

Stab fertigstellen

Nachdem nun alle Materialen gelöscht sind, kann ein neues Material angelegt werden. Genau wie unter RFEM kann auch hier das Material anhand seines Namens direkt aus der Materialbibliothek angesprochen werden. Dazu wird über die Eigenschaft TextID die entsprechende Zeichenkette eingetragen (Details siehe RF-COM-5.chm im SDK):

' Neues Material aus Bibliothek anlegen.
Dim mats(0 To 0) As RFEM5.Material
mats(0).TextID = "NameID|Baustahl S 235@TypeID|STEEL@NormID|DIN EN 1993-1-1-10"
mats(0).No = 1

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification
iModelData.SetMaterials mats
iModelData.FinishModification
Ebenso wie das Material wird auch der Querschnitt angelegt. Zusätzlich wird noch die Materialnummer angegeben:
' Neuen Querschnitt aus Bibliothek anlegen.
Dim crs(0 To 0) As RFEM5.CrossSection
crs(0).TextID = "IPE 100"
crs(0).MaterialNo = 1
crs(0).No = 1

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification
iModelData.SetCrossSections crs
iModelData.FinishModification
Da nun alle Elemente für den Stab angelegt wurden, kann jetzt der Stab übergeben werden:
' Neuen Stab anlegen.
Dim mems(0 To 0) As RFEM5.Member
mems(0).LineNo = 1
mems(0).StartCrossSectionNo = 1
mems(0).No = 1

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification
iModelData.SetMembers mems
iModelData.FinishModification

Genau wie unter RFEM genügt auch hier die Angabe des Querschnitts am Stabanfang. Das Stabendgelenk muss nicht erstellt werden, sondern wird automatisch als steif angenommen.

Optimierung

Bisher wurde für jede Elementliste einzeln der Bearbeitungsmodus aufgerufen. Um die Geschwindigkeit bei der Verarbeitung zu erhöhen, kann man alle Elemente innerhalb eines Bearbeitungsmodus‘ übergeben. Ausnahmen sind das Löschen der Materialien und das Anlegen des neuen Materials. Hier müssen zwei getrennte Blöcke verwendet werden, da innerhalb eines Blocks Elemente nicht gelöscht und erstellt werden können:

' Elemente im Bearbeitungsmodus löschen.
iModelData.PrepareModification
Dim i As Integer
For i = 0 To num - 1
' Schnittstelle zum Material holen.
Dim iMat As RFEM5.IMaterial
Set iMat = iModelData.GetMaterial(i, AtIndex)
' Material löschen.
iMat.Delete
Next i
iModelData.FinishModification

' Elemente im Bearbeitungsmodus übergeben.
iModelData.PrepareModification

iModelData.SetNodes nodeList
iModelData.SetLines lineList
iModelData.SetMaterials mats
iModelData.SetCrossSections crs
iModelData.SetMembers mems

iModelData.FinishModification

Zusammenfassung und Ausblick

Die dargestellten Vorgehensweisen bilden die Grundlage für alle Strukturelemente, welche über COM angesprochen werden können. Eine Ausnahme bilden die nichtlinearen Stabendgelenke oder Knotenlager, welche zusätzliche Verschachtelungen beinhalten. Aus diesem Grund wird in kommenden Beiträgen auf diese Elemente eingegangen.


Autor

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

Links
Downloads