1797x
001408
2. März 2017

COM-Schnittstelle in VBA | 2.2 Erstellen eines Stabes

In Teil 2.1 der Beiträge dieser Serie wurde am Beispiel eines Stabes das Anlegen und Verändern von Elementen gezeigt. Im dritten Teil werden diese Kernelemente wiederverwendet und damit Kontenlager, Lasten, Lastfälle, Lastkombinationen und Ergebniskombinationen angelegt. Das im zweiten Beitrag erstellte Modell wird dabei erweitert. Die Elemente aus Teil 1 und 2.1 werden daher nicht erneut angesprochen.


Dim iApp As RFEM5.Application
Set iApp = GetObject(, "RFEM5.Application")
Danach wird die Fehlerbehandlungsroutine gestartet und die Lizenz gesperrt:
' Fehlerbehandlungsroutine.
On Error GoTo e

' COM-Lizenz und Programmzugriff wird gesperrt.
iApp.LockLicense

Es ist ratsam, die Routine vor dem Sperren der Lizenz zu starten, da sonst bei einem Fehler RFEM gesperrt bleibt und nur über den Taskmanager beendet werden kann. Da das Interface zur Anwendung nun bereit ist, kann das Interface für das Modell geholt werden:

' Interface für erstes Modell holen.
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
Set iModel = iApp.GetModel(0)
Else
Err.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"
End If

Für eine bessere Fehlerbehandlung ist es sinnvoll, vor dem Holen des Modells zu prüfen, ob überhaupt ein Modell vorliegt (hier GetModelCount). Auch bei anderen Interfaces wie für Lastfälle oder Lasten kann damit besser auf Fehler hingewiesen werden.

Knotenlager anlegen

Es soll ein Einfeldträger entstehen und da der Stab entlang der x-Achse verläuft, müssen also an Knoten 1 die x,y,z-Translation und die Rotation um x und um z gesperrt werden. Das Lager an Knoten 2 gleicht dem ersten bis auf die freie Translation in x-Richtung. Vor dem Anlegen der Knotenlager muss noch das Interface für die Modelldaten geholt werden. Bei der Definition des Lagers ist darauf zu achten, dass bei den Freiheitsgraden eine Zahl größer gleich 0 einer Freigabe mit Federkonstante gleichzusetzen ist. Auch hier werden SI-Einheiten verwendet, also N/m bzw. N/rad:

' Interface für Modelldaten holen.
Dim iModelData As RFEM5.iModelData
Set iModelData = iModel.GetModelData()

' Knotenlager anlegen.
Dim nodsups(0 To 1) As RFEM5.NodalSupport
nodsups(0).No = 1
nodsups(0).nodeList = "1"
nodsups(0).RestraintConstantX = -1
nodsups(0).RestraintConstantY = 0#
nodsups(0).RestraintConstantZ = -1
nodsups(0).SupportConstantX = -1
nodsups(0).SupportConstantY = -1
nodsups(0).SupportConstantZ = -1

nodsups(1).No = 2
nodsups(1).nodeList = "2"
nodsups(1).RestraintConstantX = -1
nodsups(1).RestraintConstantY = 0#
nodsups(1).RestraintConstantZ = -1
nodsups(1).SupportConstantX = 0#
nodsups(1).SupportConstantY = -1
nodsups(1).SupportConstantZ = -1

Falls es hier zu Problemen kommt, kann es am falschen Datentyp liegen. Wenn double verlangt wird, kann eine integer-Angabe zu Fehlern führen. Es muss hinter den integer-Wert dann eine Raute ergänzt werden, damit dieser als double-Wert verwendet wird.

Natürlich muss das Knotenlager danach wieder im Bearbeitungsmodus (PrepareModification/ FinishModification) übergeben werden:

' Knotenlager übergeben.
iModelData.PrepareModification
iModelData.SetNodalSupports nodsups
iModelData.FinishModification

Lastfälle anlegen

Für das Anlegen von Lasten muss, genau wie unter RFEM, zuerst ein Lastfall definiert werden. Dieser Aufbau führt dazu, dass beim Programmieren zuerst die Lastfälle angelegt und übergeben werden und danach erst die Lasten mit Hilfe der Interfaces der Lastfälle übertragen werden können. Zuerst zum Anlegen der Lastfälle:

' Interface für Lasten holen.
Dim iLoads As RFEM5.iLoads
Set iLoads = iModel.GetLoads

' Lastfälle anlegen.
Dim loadcases(0 To 2) As RFEM5.LoadCase

loadcases(0).Loading.No = 1
loadcases(0).SelfWeight = True
loadcases(0).ToSolve = True
loadcases(0).SelfWeightFactor.X = 0
loadcases(0).SelfWeightFactor.Y = 0
loadcases(0).SelfWeightFactor.Z = 1
loadcases(0).ActionCategory = Permanent

Es sollen drei Lastfälle erzeugt werden: Eigengewicht, Schnee und Nutzlast. Die Bezeichner innerhalb der COM-Programmierung sind alle englisch. Für den Eigengewichtslastfall wird daher Permanent für ActionCategory verwendet. Über die Eigenschaft SelfWeightFactor können die Richtung und der Wert des Eigengewichts eingestellt werden. Diese gelten aber nur, wenn die Eigenschaft SelfWeight auf True steht. Ansonsten muss noch ToSolve auf True gesezt werden, damit der Lastfall auch mit berechnet und eine Nummer für den Lastfall vergeben wird (.Loading.No). Die anderen beiden Lastfälle sind in ihrer Definition noch ein wenig einfacher, da dort kein Eigengewicht verwendet wird:

loadcases(1).Loading.No = 2
loadcases(1).SelfWeight = False
loadcases(1).ToSolve = True
loadcases(1).ActionCategory = ShowHLowerThan1000

loadcases(2).Loading.No = 3
loadcases(2).SelfWeight = False
loadcases(2).ToSolve = True
loadcases(2).ActionCategory = ImposedCategoryA

' Lastfälle übergeben.
iLoads.PrepareModification
iLoads.SetLoadCases loadcases
iLoads.FinishModification

Für Schnee unterhalb einer Höhe von 1.000 m über NN wird die Kategorie ShowHLowerThan1000 und für die Nutzlast Kategorie A ImposedCategoryA verwendet. Danach können die Lastfälle an RFEM übergeben werden. Es wird aber nicht die Schnittstelle IModelData dafür verwendet, sondern die Schnittstelle ILoads, da es sich hier nicht mehr um Modelldaten, sondern um Lastdaten handelt.

Lastkombinationen und Ergebniskombinationen anlegen

Beim Anlegen der beiden Varianten ergeben sich hier nur wenige Unterschiede. Dies liegt vor allem daran, dass die Berechnungstheorie und andere Einstellungen erst nach dem Anlegen der Lastkombination über das zugehörige Interface durchgeführt werden können. Die Definition wird wie in RFEM vorgenommen und es können sowohl die englischen Bezeichner LC (Load Case) als auch LF (Lastfall) verwendet werden. Auch die unterschiedlichen Dezimaltrenner und die Groß- und Kleinschreibung sind nicht von Bedeutung und werden akzeptiert:

' Lastkombinationen anlegen.
Dim loadcombs(0 To 0) As RFEM5.LoadCombination

loadcombs(0).Loading.No = 1
loadcombs(0).ToSolve = True
loadcombs(0).Definition = "1.35*lc1 + 1.5*lc2 + 1.05*lc3"

' Lastkombinationen übergeben.
iLoads.PrepareModification
iLoads.SetLoadCombinations loadcombs
iLoads.FinishModification

' Ergebniskombinationen anlegen.
Dim rescombs(0 To 0) As RFEM5.ResultCombination

rescombs(0).Loading.No = 1
rescombs(0).Definition = "1.35*lc1 + 0.75*lc2 + 1.5*lc3"

' Ergebniskombinationen übergeben.
iLoads.PrepareModification
iLoads.SetResultCombinations rescombs
iLoads.FinishModification

Lasten anlegen

Wie bereits erwähnt, werden die Lasten nun über die Interfaces der Lastfälle übergeben. Im Beispiel werden in Lastfall 1 keine zusätzlichen Lasten angelegt, in Lastfall 2 wird eine trapezförmige Streckenlast aufgebracht und in Lastfall 3 werden eine konstante Streckenlast und eine Knotenlast aufgebracht. Hier die Vorgehensweise für Lastfall 2:

' Lasten anlegen.
' Lastfall 2.
Dim iLoadCase As RFEM5.iLoadCase

Set iLoadCase = iLoads.GetLoadCase(2, AtNo)
Da die Lastfallnummer bekannt ist, kann diese beim Holen des Interfaces mit AtNo verwendet werden:
' Stablasten anlegen.
Dim memLoads() As RFEM5.MemberLoad
ReDim memLoads(0 To 0)

In diesem Fall wird, da memLoads für Lastfall 3 wiederverwendet werden soll, das Array nicht beim Initialisieren dimensioniert, sondern erst danach. Das hat den Vorteil, dass bei einer erneuten Verwendung von ReDim der Inhalt wieder auf die Standardwerte gesetzt wird. Unter ObjectList werden, per Komma getrennt oder Bindestrich verbunden, die Stäbe für die Belastung gewählt. Bei einer Trapezlast müssen neben den beiden Lastwerten für den Anfang (Magnitude1) und das Ende (Magnitude2) der Last auch die Distanzen für Anfang (DistanceA) und Ende (DistanceB) angegeben werden. Die Eigenschaft RelativeDistances entscheidet darüber, ob absolute (False) Angaben in m oder ob relative (True) Angaben von 0-1 verwendet werden:

memLoads(0).No = 1
memLoads(0).ObjectList = "1"
memLoads(0).Distribution = TrapezoidalType
memLoads(0).Magnitude1 = 6000#
memLoads(0).Magnitude2 = 4000#
memLoads(0).RelativeDistances = False
memLoads(0).DistanceA = 0.2
memLoads(0).DistanceB = 0.9

' Stablasten übergeben.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Bei der Übergabe muss wieder auf die richtige Schnittstelle geachtet werden, hier die Schnittstelle ILoadCase. Die Lasten für Lastfall 3 sind analog wie folgt definiert:
' Knotenlasten anlegen.
Dim nodalLoads(0 To 0) As NodalLoad
nodalLoads(0).No = 1
nodalLoads(0).nodeList = "2"
nodalLoads(0).Component.Force.X = -15000
nodalLoads(0).Component.Force.Y = 0
nodalLoads(0).Component.Force.Z = 0
nodalLoads(0).Component.Moment.X = 0
nodalLoads(0).Component.Moment.Y = 0
nodalLoads(0).Component.Moment.Z = 0

' Knotenlasten übergeben.
iLoadCase.PrepareModification
iLoadCase.SetNodalLoads nodalLoads
iLoadCase.FinishModification

' Stablasten anlegen.
ReDim memLoads(0 To 0)
memLoads(0).No = 1
memLoads(0).ObjectList = "1"
memLoads(0).Distribution = UniformType
memLoads(0).Magnitude1 = 5000#

' Stablasten übergeben.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Als Abschluss des Programms wird nun noch die Fehlerbehandlungsroutine abgeschlossen und danach die Lizenz entsperrt:
e: If Err.Number <> 0 Then MsgBox Err.Description, , Err.Source

' COM-Lizenz wird freigegeben, Programmzugriff wieder möglich.
iModel.GetApplication.UnlockLicense

Zusammenfassung und Ausblick

Die im Beitrag gezeigten Vorgehensweisen bauen auf den Grundlagen aus den beiden vorigen Beiträgen auf. Wie dort bereits erwähnt, ähnelt sich die Struktur bei allen Elementen. Die auch dort angesprochene Ausnahme der nichtlinearen Stabendgelenke oder Knotenlager wird Gegenstand des nächsten Beitrages sein.


Autor

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

Links
Downloads