Bezieht sich auf | |||
Produkt(e): | MicroStation | ||
Version(en): | 08.11.09.578 | ||
Umgebung: | Windows 7 64 bit | ||
Produktbereich: | Programmierung | ||
Produktunterbereich: | VBA | ||
Ursprünglicher Autor: | Artur Goldsweer, BDN Technical Support | ||
Es besteht häufig die Anforderung, größere Mengen an Daten zu importieren und diese Koordinaten mit beispielsweise Zellen zu markieren.
Solche Daten werden üblicherweise in einer Tabellenform wie z.B. als Excel CSV Datei zur Verfügung gestellt und sind in einer bestimmten Reihenfolge pro Datensatz formatiert.
Es bietet sich für eine solche Aufgabe an VBA als Programmiersprache zu verwenden. Einerseits ist eine solche Aufgabenstellung nicht komplex und man kann leicht Änderungen vornehmen, sollten sich die Datenstrukturen einmal ändern, und schließlich ist VBA Bestandteil der MicroStation Installation schon seit Einführung der V8 Generation.
Jetzt zu einem konkreten Beispiel, bei dem wir Daten in einem folgenden Muster zur Verfügung gestellt bekommen, als Trennsymbol ist das Semikolon (;) festgelegt, wie es auch in der deutschen Excel Version üblich ist für CSV Dateien:
Zellname ; x-Wert; y-Wert; z-Wert; Drehung (in Grad).
D.h. pro Datenzeile steht die Information, welche Zelle an welcher Koordinate platziert werden soll, hinzu kommt noch ein Wert, der angibt, um wieviel Grad die Zelle gedreht werden soll
Konkret könnten die Daten in Excel folgendermaßen aussehen:
pfeil | 10.00 | 20.00 | 30.00 | 90.00 |
pfeil | 1.00 | 2.00 | 3.00 | 45.00 |
punkt | 5.00 | 4.00 | 4.00 | 180.00 |
D.h. die erste Zeile besagt, dass die Zelle "pfeil" an der Position xyz=10,20,30 mit einer Drehung von 90 Grad platziert wird.
Hier einmal dazu ein Ansatz mit VBA, wie man solch eine Aufgabe angehen könnte:
Option Explicit ' Aufruf mit: vba run [import]import <pfad+Dateiname der Koordinatendatei> ' Format der Koordinatendatei: Zellname ; x-Wert; y-Wert; z-Wert; Drehung (in Grad) Sub import() Dim sName As String Dim zeile As String Dim tabelle() As String Dim p As Point3d Dim oCell As CellElement Dim rot As Matrix3d sName = KeyinArguments If Len(sName) = 0 Then MsgBox "Es fehlt der pfad + Name der Datei für Import - Abbruch", vbCritical Exit Sub End If Open sName For Input As #1 Do While Not EOF(1) Line Input #1, zeile tabelle = Split(zeile, ";") If UBound(tabelle) = 4 And tabelle(0) <> "" Then ' es wurden 5 Spalten eingelesen p.X = Val(tabelle(1)) p.Y = Val(tabelle(2)) p.Z = Val(tabelle(3)) rot = Matrix3dFromVectorAndRotationAngle(Point3dFromXYZ(0, 0, 1), Radians(tabelle(4))) Set oCell = CreateCellElement2(tabelle(0), p, Point3dFromXYZ(1, 1, 1), True, rot) ActiveModelReference.AddElement oCell End If Loop End Sub
Diese VBA Routine benötigt eine Textdatei mit den nötigen Daten zum Import. Dieser Dateiname inkl. Pfad muss beim Start der VBA Routine mit angegeben werden.
Um dies möglichst einfach zu machen, kopiert man die .MVBA Projektdatei in ein Verzeichnis, das in der Konfigurationsvariablen MS_VBASEARCHDIRECTORIES mit angegeben wird, damit wird diese VBA Routine automatisch gefunden und man kann diese mit einem solchen Keyin starten:
vba run [import]import <pfad+Dateiname der Koordinatendatei>
Konkretes Beispiel:
vba run [import]import d:\dateien\punkte.csv
Ich hänge hier noch eine fertige .MVBA Datei an zum Herunterladen: communities.bentley.com/.../import.mvba
Und hier eine .CSV Datei mit Beispielsdaten [korrigiert am 19.9.2018]: communities.bentley.com/.../4718.punkte.csv
Damit die zu platzierenden Zellen gefunden werden, wird vorausgesetzt, dass eine Zellbibliothek mit den notwendigen Zellen angehängt ist.
Viel Spaß beim Testen und Anpassen!