Grundlagen
Es soll ein Werkzeug erstellt werden, welches an den aktuell im Programm selektierten Knoten nichtlineare Knotenlager anlegt. Dazu sind folgende Kernelemente notwendig:
- aktuell selektierte Knoten holen
- Knotenlager anlegen
- Nichtlinearität anlegen und zuweisen
- Werkzeug im Programm erzeugen
Im Folgenden sollen diese Punkte abgearbeitet werden. Dafür ist das Wissen aus den vorangegangenen Beiträgen erforderlich und wird nicht nochmal behandelt. Im verfügbaren Quellcode werden aber bereits erwähnte Elemente wie zum Beispiel das Holen der Struktur in Kommentaren knapp dokumentiert.
Aktuell selektierte Knoten holen
Das Bearbeiten selektierter Elemente über die COM-Schnittstelle erfolgt über die bereits bekannten Funktionen wie zum Beispiel IModelData.GetNodes für Knoten. Damit aber nur die selektierten Elemente zurückgegeben werden, muss zuvor über IModelData.EnableSelections auf die Bearbeitung der aktuellen Selektion umgeschaltet werden. Wenn EnableSelections auf True gesetzt ist, gibt IModelData.GetNodes nur die selektierten Elemente zurück. Hier das konkrete Beispiel:
' selektierte Knoten holeniModDat.EnableSelections True ' nur mit selektierten Objekten arbeitenDim nodes() As RFEM5.Nodenodes = iModDat.GetNodesiModDat.EnableSelections False ' wieder mit allen Objekten arbeiten
Nachdem die selektierten Knoten geholt wurden, wird EnableSelections wieder auf false gesetzt, da dies zu einer häufigen Fehlerquelle werden kann. Da das Knotenlager für die Definition eine Knotenliste als Zeichenkette benötigt, wird diese gleich im Anschluss erstellt:
' Liste der Knoten anlegenDim nodeList As StringDim i AsLongFor i = 0 ToUBound(nodes, 1) nodeList = nodeList & nodes(i).No & ","Next i
Knotenlager anlegen
Die Nichtlinearität, im konkreten Fall das Diagramm, ist ein separates Element. Es kann einem Knotenlager erst zugewiesen werden, wenn dies bereits im System vorhanden ist. Daher muss zuerst ein Knotenlager nach den bekannten Prinzipien der vorigen Beiträge angelegt werden:
' Knotenlager anlegenDim nodSup As RFEM5.NodalSupportnodSup.No = 100nodSup.IsColumn = FalsenodSup.IsValid = TruenodSup.nodeList = nodeListnodSup.ReferenceSystem = GlobalSystemType
nodSup.RestraintConstantX = 0.01nodSup.RestraintConstantY = 0.01nodSup.RestraintConstantZ = 0.01
nodSup.SupportConstantX = -1nodSup.SupportConstantY = -1nodSup.SupportConstantZ = -1
' Nichtlinearität definierennodSup.SupportNonlinearityZ = WorkingDiagramType
iModDat.PrepareModificationiModDat.SetNodalSupport nodSupiModDat.FinishModification
Wie im Code zu erkennen ist, wird in globaler z-Richtung als Nichtlinearität der Typ WorkingDiagramType angegeben.
Nichtlineares Lager anlegen und zuweisen
Nachdem das Knotenlager auf die Nichtlinearität WorkingDiagramType vorbereitet wurde, muss diese nun erzeugt werden:
' Nichtlinearität erstellenDim nldgrm As RFEM5.NonlinearityDiagram
nldgrm.ForceType = StiffnessDiagramForceType.NoneStiffnessForcenldgrm.PositiveZoneType = DiagramAfterLastStepType.StopDiagramTypenldgrm.Symmetric = True
' Diagramm erstellenReDim nldgrm.PositiveZone(3, 1)nldgrm.PositiveZone(0, 0) = 0#nldgrm.PositiveZone(0, 1) = 0#
nldgrm.PositiveZone(1, 0) = 0.01nldgrm.PositiveZone(1, 1) = 100
nldgrm.PositiveZone(2, 0) = 0.03nldgrm.PositiveZone(2, 1) = 200
nldgrm.PositiveZone(3, 0) = 0.05nldgrm.PositiveZone(3, 1) = 300
Das Diagramm besteht aus einem zweidimensionalen Feld. Die erste Dimension entspricht dem Datensatz und die zweite Dimension den Elementen des Datensatzes. Hier ist das erste Element im Datensatz die Verschiebung in m und das Zweite die Kraft in N. Das obige Beispiel erstellt somit vier Datensätze, bei dem zum Beispiel der dritte Punkt des Diagramms an der Stelle 30 mm und 0,2 kN ist. Diese Nichtlinearität muss nun dem vorhandenen Lager zugewiesen werden. Dazu wird das Interface zum Knotenlager und danach zur Nichtlinearität geholt:
' Nichtlinearität zuweisenDim iNodSup As RFEM5.INodalSupportSet iNodSup = iModDat.GetNodalSupport(100,ItemAt.AtNo)Dim iNldiag As RFEM5.INonlinearityDiagramSet iNldiag = iNodSup.GetNonlinearity(AlongAxisZ)
iModDat.PrepareModificationiNldiag.SetData nldgrmiModDat.FinishModification
Die Nichtlinearität ist hier entlang der Z-Achse und daher muss beim Holen AlongAxisZ gewählt werden. Die Zuweisung erfolgt im bekannten Modification Block.
Werkzeug im Programm erzeugen
Es ist in RFEM möglich, externe Programme einzubinden. Dazu muss die RFEM.ini im Programmpfad abgeändert werden. Im Gegensatz zur Programmierung in C# und VB, wo eine ausführbare Datei erzeugt wird, muss bei VBA Excel für die Ausführung des Werkzeugs verwendet werden. Excel kann über ein Argument beim Start eine zu öffnende Datei zugewiesen werden. Dies würde in der Kommandozeile folgendermaßen aussehen, wobei die Excel-Datei unter C:\temp abgelegt und Excel als 32-Bit-Version installiert ist:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabelle1.xlsm
Damit wird Excel mit der gewünschten Datei geöffnet. Da der Aufruf eines externen Programms von RFEM nur ohne zusätzliche Argumente (wie in diesem Fall der Dateiname hinter EXCEL.EXE) erfolgen kann, muss noch eine Windows-Batch-Datei erzeugt werden. Diese einfache Textdatei mit der Dateiendung ".bat" wird von Windows wie eine ausführbare EXE-Datei behandelt. Zum Erzeugen muss also zum Beispiel mit dem Editor eine TXT-Datei angelegt werden, welche nach der Erstellung die neue Dateiendung ".bat" erhält. Das Anzeigen der Dateiendung muss eventuell erst im Windows-Explorer eingestellt werden. Diese Batchdatei (im Folgenden EXCEL-Werzeug.bat) muss dann den folgenden Eintrag haben:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabelle1.xlsm
Dies entspricht dem Kommando, wie es in der Kommandozeile eingegeben werden würde.
Nach der Erstellung dieser ausführbaren Datei kann diese in die RFEM.ini als externes Werkzeug eingetragen werden. Die RFEM.ini befindet sich im Programmpfad von RFEM (Standard für RFEM 5.07 64-Bit: C:\Program Files\Dlubal\RFEM 5.07). Dort sind folgende Einträge zu ergänzen:
ModuleName2=EXCEL-Werkzeug
ModuleExeName2="c:\temp\EXCEL-Werkzeug.bat"
ModuleDescription2=Nichtlineares Stabendgelenk
Natürlich müssen dann die Batchdatei EXCEL-Werkzeug.bat und das Makro tabelle1.xlsm auch unter C:/temp/ abgelegt werden.
Damit auch das Makro automatisch ausgeführt wird, muss die Subroutine in der von Excel beim Öffnen automatisch ausgeführte Subroutine gestartet werden. Diese Subroutine heißt Workbook_Open und muss im Workbook abgelegt werden.
Jetzt fehlt noch, dass Excel nach dem erfolgreichen Ausführen wieder beendet wird. Falls ein Fehler auftritt oder RFEM nicht geöffnet ist, soll das Makro bearbeitet werden können. Dafür wird noch eine Fallunterscheidung eingebaut. Die komplette Vorlage sieht wie folgt aus:
Private SubWorkbook_Open()
' Fehlerbehandlungsroutine Programmstart RFEMOn Error GoTo e
' Interface zu RFEM wird geholtDim iApp AsRFEM5.ApplicationSet iApp = GetObject(, "RFEM5.Application")
e: ' bei einem Fehler wird "RFEM not open" ausgegebenIf Err.Number <> 0 Then MsgBox "RFEM not open", , Err.Source Exit SubEnd If
' Fehlerbehandlungsroutine ProgrammOn Error GoTo f
' COM-Lizenz und Programmzugriff werden gesperrtiApp.LockLicense
' Interface für aktives Modell holenDim iModel As RFEM5.modelIf iApp.GetModelCount > 0 Then Set iModel = iApp.GetActiveModelElse' Fehler werfen, wenn nicht genügend Modelle vorhanden sindErr.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"End If
' Platz für eigenen Quellcode
f: ' Fehler aus Quellcode abfangenIf Err.Number <> 0 Then MsgBox Err.Description, , Err.Source ' COM-Lizenz wird freigegeben, Programmzugriff wieder möglich iModel.GetApplication.UnlockLicense ' Werkzeug soll Excel offen lassen, wenn ein Fehler auftritt Exit SubEnd If
' COM-Lizenz wird freigegeben, Programmzugriff wieder möglichiModel.GetApplication.UnlockLicense' Werkzeug soll Excel bei erfolgreicher Anwendung schließenApplication.Quit
End Sub
Hier fehlt nun lediglich der Verweis auf die vorhin erstellte Subroutine, welche unter "Platz für eigenen Quellcode" platziert wird. Der komplette Quellcode ist im nachfolgenden Link erhältlich.
Zusammenfassung
Die Erstellung des nichtlinearen Knotenlagers ist eine Ergänzung zu den vorherigen Beiträgen, wohingegen das Anlegen eines externen Moduls Neuland ist. Das Einbinden ist bei der Verwendung ausführbarer Dateien, wie sie mit Hilfe von Visual Studio und VB beziehungsweise C# typischerweise erstellt werden, unproblematischer. Aus diesem Grund wurde hier der komplexere Vorgang mit Excel beschrieben.