Mit VBA ein ACS aus einer anderen Zeichnung importieren


 Produkt(e):MicroStation
 Version(en):V8i oder CONNECT
 Umgebung:Windows 8, 10
 Produktbereich:Programmierung
 Produktunterbereich:VBA

Hintergrundinformation

Es ist möglich im ACS Manager Koordinatensysteme aus anderen DGN Dateien zu importieren. Dieser Vorgang kann auch per VBA aufgezeichnet werden, um diesen Vorgang zu automatisieren.
Allerdings ist der aufgezeichnete VBA Code nicht vollständig, denn für die Auswahl eines ACS in einer anderen Datei sind die Angaben der Datei, des Modells und der Name des zu importierenden ACS notwendig.
Und diese Angaben fehlen, wenn der Code aufgezeichnet wird.

VBA bietet jedoch im Objektkatalog Methoden an, mit denen dieser Vorgang auch durchgeführt werden kann, ich möchte hier ein Beispiel zeigen, wie dies mit VBA erreicht werden kann.
Dazu verwende ich folgende Schritte:

- Öffnen der Datei für Programmierung, die das gesuchte ACS enthält. Die aktive Datei bleibt dabei geöffnet, dieser Schritt ist für den Anwender nicht sichtbar.
- Suchen des gewünschten ACS im richtigen Modell
- Wenn gefunden, dann wird dieses ACS in die aktive Datei kopiert.

Hier der VBA Ansatz dazu, wie man dies erreichen könnte. Es wird hier im konkreten Beispiel angenommen, dass beide DGN Dateien im selben Verzeichnis liegen, dies kann natürlich alles beliebig den eigen Wünschen angepasst werden.

Option Explicit

Sub importACS()
Dim sPath As String
Dim oWorkDgn As DesignFile
Dim oMod As ModelReference
Dim oMods As ModelReferences
Dim ee As ElementEnumerator
Dim bFound As Boolean
Dim oACS As AuxiliaryCoordinateSystemElement
Dim oCC As CopyContext
    
    sPath = ActiveDesignFile.Path  ' Pfad zur aktiven Datei
    Set oWorkDgn = OpenDesignFileForProgram(sPath + "/" + "acsfrom.dgn", True)  'Dateiname der DGN, in der das ACS gesucht wird
   
    Set oMod = oWorkDgn.Models("3D Metric Design") ' Modell in dem nach dem ACS gesucht wird
    If Not oMod Is Nothing Then
        Set ee = oMod.ControlElementCache.Scan()
        bFound = False
        Do While ee.MoveNext
            If ee.Current.IsAuxiliaryCoordinateSystemElement Then
                If ee.Current.AsAuxiliaryCoordinateSystemElement.Name = "test1" Then ' Name des gesuchten ACS
                    Set oACS = ee.Current.AsAuxiliaryCoordinateSystemElement
                    bFound = True
                    Exit Do
                End If
            End If
        Loop
        If bFound Then
            ActiveModelReference.CopyElement oACS, oCC
        End If
    End If
    oWorkDgn.Close
End Sub