Dim iApp As RFEM5.ApplicationSet 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.modelIf 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.iModelDataSet iModelData = iModel.GetModelData()
' Knotenlager anlegen.Dim nodsups(0 To 1) As RFEM5.NodalSupportnodsups(0).No = 1nodsups(0).nodeList = "1"nodsups(0).RestraintConstantX = -1nodsups(0).RestraintConstantY = 0#nodsups(0).RestraintConstantZ = -1nodsups(0).SupportConstantX = -1nodsups(0).SupportConstantY = -1nodsups(0).SupportConstantZ = -1
nodsups(1).No = 2nodsups(1).nodeList = "2"nodsups(1).RestraintConstantX = -1nodsups(1).RestraintConstantY = 0#nodsups(1).RestraintConstantZ = -1nodsups(1).SupportConstantX = 0#nodsups(1).SupportConstantY = -1nodsups(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.PrepareModificationiModelData.SetNodalSupports nodsupsiModelData.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.iLoadsSet iLoads = iModel.GetLoads
' Lastfälle anlegen.Dim loadcases(0 To 2) As RFEM5.LoadCase
loadcases(0).Loading.No = 1loadcases(0).SelfWeight = Trueloadcases(0).ToSolve = Trueloadcases(0).SelfWeightFactor.X = 0loadcases(0).SelfWeightFactor.Y = 0loadcases(0).SelfWeightFactor.Z = 1loadcases(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 = 2loadcases(1).SelfWeight = Falseloadcases(1).ToSolve = Trueloadcases(1).ActionCategory = ShowHLowerThan1000
loadcases(2).Loading.No = 3loadcases(2).SelfWeight = Falseloadcases(2).ToSolve = Trueloadcases(2).ActionCategory = ImposedCategoryA
' Lastfälle übergeben.iLoads.PrepareModificationiLoads.SetLoadCases loadcasesiLoads.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 = 1loadcombs(0).ToSolve = Trueloadcombs(0).Definition = "1.35*lc1 + 1.5*lc2 + 1.05*lc3"
' Lastkombinationen übergeben.iLoads.PrepareModificationiLoads.SetLoadCombinations loadcombsiLoads.FinishModification
' Ergebniskombinationen anlegen.Dim rescombs(0 To 0) As RFEM5.ResultCombination
rescombs(0).Loading.No = 1rescombs(0).Definition = "1.35*lc1 + 0.75*lc2 + 1.5*lc3"
' Ergebniskombinationen übergeben.iLoads.PrepareModificationiLoads.SetResultCombinations rescombsiLoads.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.iLoadCaseSet 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.MemberLoadReDim 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 = 1memLoads(0).ObjectList = "1"memLoads(0).Distribution = TrapezoidalTypememLoads(0).Magnitude1 = 6000#memLoads(0).Magnitude2 = 4000#memLoads(0).RelativeDistances = FalsememLoads(0).DistanceA = 0.2memLoads(0).DistanceB = 0.9
' Stablasten übergeben.iLoadCase.PrepareModificationiLoadCase.SetMemberLoads memLoadsiLoadCase.FinishModificationBei 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 NodalLoadnodalLoads(0).No = 1nodalLoads(0).nodeList = "2"nodalLoads(0).Component.Force.X = -15000nodalLoads(0).Component.Force.Y = 0nodalLoads(0).Component.Force.Z = 0nodalLoads(0).Component.Moment.X = 0nodalLoads(0).Component.Moment.Y = 0nodalLoads(0).Component.Moment.Z = 0
' Knotenlasten übergeben.iLoadCase.PrepareModificationiLoadCase.SetNodalLoads nodalLoadsiLoadCase.FinishModification
' Stablasten anlegen.ReDim memLoads(0 To 0)memLoads(0).No = 1memLoads(0).ObjectList = "1"memLoads(0).Distribution = UniformTypememLoads(0).Magnitude1 = 5000#
' Stablasten übergeben.iLoadCase.PrepareModificationiLoadCase.SetMemberLoads memLoadsiLoadCase.FinishModificationAls 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.