Zoom gleichzeitig auf 2 Fenster anwenden mit VBA Eventhandler


 Produkt(e):MicroStation
 Version(en):08.11.09.829
 Umgebung:Windows 2000,Windows 8
 Produktbereich:N/A
 Produktunterbereich:N\A

 

Hintergrundinformation

VBA unterstützt verschiedene Eventhandler. Ich möchte hier ein Beispiel für  IViewUpdateEvents aufzeigen, der zwei Ereignisse abfangen kann, und zwar das Ereignis direkt vor bzw. direkt nach dem Neuzeichnen einer Ansicht.

Um dies an einem VBA Beispiel zu zeigen, soll die Funktionalität darin bestehen, das Regenerieren einer Ansicht festzustellen, und darauf zu reagieren, konkret hier im Beispiel so, dass dieselbe Zoomtiefe und Zoomzentrum auf eine weitere Ansicht angewendet wird.
Konkret also, wenn ich in einer Ansicht zoome, wird automatisch ein anderes Fenster ebenso gezoomt

Erforderliche Schritte

 Um diese Funktionalität zu erreichen, benötige ich I'm VBA neben einem Funktionsmodul noch ein Klassenmodul, das den Namen clsEventHandlers haben muss, weil der Name in der Subroutine festgelegt ist. Man kann auch andere Namen wählen, nur muss dies I'm Module entsprechend angepasst werden.

Hier zunächst das VBA Beispiel:

Zunächst das Funktionsmodul:

Public oVw1 As View
Public oVw2 As View
Public bDo As Boolean

Private oEventHandlers As clsEventHandlers

Sub viewtest()
    Dim oMsg As CadInputMessage
    CommandState.StartDefaultCommand
    RemoveHandlers
    bDo = True
    ShowPrompt "Bitte erste Ansicht wählen"
    Set oMsg = CadInputQueue.GetInput(msdCadInputTypeDataPoint, msdCadInputTypeReset)
    If oMsg.InputType = msdCadInputTypeReset Then
        ShowPrompt ""
        Exit Sub
    End If
    Set oVw1 = oMsg.View
    ShowPrompt "Bitte zweite Ansicht wählen"
    Set oMsg = CadInputQueue.GetInput(msdCadInputTypeDataPoint, msdCadInputTypeReset)
    If oMsg.InputType = msdCadInputTypeReset Then
        ShowPrompt ""
        Exit Sub
    End If
    Set oVw2 = oMsg.View
    ShowPrompt ""
    Set oEventHandlers = New clsEventHandlers
    AddViewUpdateEventsHandler oEventHandlers
End Sub


Sub RemoveHandlers()
    If Not oEventHandlers Is Nothing Then
        RemoveViewUpdateEventsHandler oEventHandlers
    End If
    Set oEventHandlers = Nothing
End Sub

Und hier das Klassenmodul:

Implements IViewUpdateEvents

'
'  Methods for the IViewUpdateEvents
'
Private Sub IViewUpdateEvents_AfterRedraw(TheViews() As View, TheModels() As ModelReference, ByVal DrawMode As MsdDrawingMode)
    If UBound(TheModels) < 0 Then
          If bDo Then
            If TheViews(0).Index = oVw1.Index Then
                oVw2.Extents = oVw1.Extents
                oVw2.Center = oVw1.Center
                oVw2.Redraw
            End If
            If TheViews(0).Index = oVw2.Index Then
                oVw1.Extents = oVw2.Extents
                oVw1.Center = oVw2.Center
                oVw1.Redraw
            End If
           End If
    
    End If
End Sub

Private Sub IViewUpdateEvents_BeforeRedraw(TheViews() As View, TheModels() As ModelReference, ByVal DrawMode As MsdDrawingMode)
bDo = Not bDo
End Sub

Wenn nun die Subroutine "viewtest" gestartet wird, muss zunächst einmal festgelegt warden, welche beiden Ansichten miteinander synchronisiert warden sollen.
Dies geschieht durch 2 Klicks in 2 verschiedenen Ansichten.
Nach einem Zoom in einem der Fenster wird der Mechanismus aktiviert, d.h. ab dem 2. Zoom wird ein Zoom in einem der beiden Fenster auf das andere Fenster angewendet.

Die hier vorgestellte VBA Routine stellt nur einen Ansatz dar und soll als Beispiel dienen, um die Möglichkeiten von Eventhandlern aufzuzeigen und kann als Grundlage für eigene Beispiele dienen.

Viel Spaß beim testen und anpassen.

Um die Erstellung des Klassenmoduls zu vereinfachen, hier das Beispielprojekt zum Download:

communities.bentley.com/.../6888.views.zip

 Ursprünglicher Autor:Artur Goldsweer