Mit VBA Koordinaten einlesen und Zellen gedreht platzieren


 
 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:

pfeil10.0020.0030.0090.00
pfeil1.002.003.0045.00
punkt5.004.004.00180.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!