Importieren von Koordinaten aus einer Textdatei und diese Koordinaten mit einer Linie verbinden


In der Praxis gibt es verschiedenartige Anforderungen für das Einlesen von Koordinaten.
Eine Variante besteht darin, dass die Koordinaten, die in einer Textdatei als XYZ Koordinaten zur Verfügung stehen, automatisch durch eine Linie miteinander verbunden werden.

Ich möchte hier einmal einen Ansatz mit VBA vorschlagen, mit dem genau dies realisiert werden kann.

Der Einfachheit halber ist die Textdatei innerhalb des VBA Quellcodes fest verdrahtet, konkret: c:\daten\Beispieldaten_punkte.txt
Die einzelnen Koordinaten werden zusätzlich durch einen Text gekennzeichnet. Dieser Text ist im Prinzip eine hochlaufende Nummer und ist auf mindestens 3 Stellen festgelegt.
Die Position für diesen Text ist die Koordinate um (2,2) nach rechts oben versetzt.
Die Texthöhe wird so verwendet, wie es zur zeit eingestellt ist.

Die Koordinaten sollten in einer Textdatei vorliegen, jeweils 1 Koordinate pro Zeile im Format X Y Z
Wobei zwischen die Werten ein Leerzeichne sein muss.


All diese Einstellungen lassen sich natürlich abändern oder weiter automatisieren.

Den VBA Code habe ich zusätzlich als MVBA Projektdatei angehängt, hier aber einmal der Vorschlag als Text, wie man so etwas angehen könnte:

Option Explicit

Sub import()
    Dim s As String
    Dim p() As String
    Dim counter As Long
    Dim oLine As LineElement
    Dim pStart As Point3d
    Dim pEnd As Point3d
    Dim porigin As Point3d
    Dim oText As TextElement
    Dim sNummer As String
    
    ActiveSettings.TextStyle.Justification = msdTextJustificationLeftBottom  ' Ausrichtung für Text (links unten)

    Open "c:\daten\Beispieldaten_punkte.txt" For Input As #1
    CommandState.StartDefaultCommand
    ActiveSettings.LineWeight = 0
    CadInputQueue.SendKeyin "place line"
    
    Do While Not (EOF(1))
        Line Input #1, s
        p = Split(s, " ")
        If UBound(p) - LBound(p) = 2 Then  ' nur wenn xyz Koordinate gefunden wurden
            counter = counter + 1   ' Zähler zum Durchnummerieren der Koordinaten
            
            ' Punkt an Koordinate setzen:
            pStart = Point3dFromXYZ(Val(p(0)), Val(p(1)), Val(p(2)))
            pEnd = pStart
            ActiveSettings.LineWeight = 8 ' Strichstärke hochsetzen, damit die Punkte zu sehen sind
            Set oLine = CreateLineElement2(Nothing, pStart, pEnd)
            ActiveModelReference.AddElement oLine  ' Punkt einfügen
            ActiveSettings.LineWeight = 0
            
            sNummer = CStr(counter)
            If Len(sNummer) < 3 Then
                sNummer = String(3 - Len(sNummer), "0") + sNummer
            End If
            
            porigin = Point3dAdd(pStart, Point3dFromXYZ(2, 2, 0))  ' Einfügepunkt für Text
            Set oText = CreateTextElement1(Nothing, sNummer, porigin, Matrix3dIdentity)
            ActiveModelReference.AddElement oText  ' Text einfügen (Punktnummer)
            
            CadInputQueue.SendDataPoint pStart  ' nächsten Punkt für Verbindungslinie setzen
            
        End If
    Loop
        CadInputQueue.SendReset
        CommandState.StartDefaultCommand
    Close #1
End Sub

communities.bentley.com/.../8836.import.mvba