Wir portieren auf der Arbeit gerade ein altes AutoCAD VBA-Projekt mit Hilfe von ObjectARX nach VB.net.

ObjectARX ist supermächtig, aber für Neueinsteiger gibt es einige Klippen zu umschiffen. Ich möchte behaupten, dass wir die meisten schon gerammt haben, aber immer noch auf Fahrt sind! ;)

Eine gute Quelle ist übrigens der Blog von Kean Walmsley!

Beim letzten Problem hatte ich eine Funktion geschrieben, die per Transaktion Änderungen in einer DWG-Datei vornimmt. Wenn ich die Funktion direkt per Kommando aufgerufen habe, klappt alles wunderbar! Wenn ich sie allerdings von einem modalen Fenster aus aufgerufen habe, gab es immer eine eLockViolation-Ausnahme:

Eine Ausnahme (erste Chance) des Typs “Autodesk.AutoCAD.Runtime.Exception” ist in AcdbMgd.dll aufgetreten.
Autodesk.AutoCAD.Runtime.Exception: eLockViolation

Zum Glück hat Sebastian eine Lösung im CAD-Forum gefunden:

wenn eine Funktion aus dem Form (eigentlich ohne AutoCAD-Befehl) gestartet wird, dann muss die Funktion dafür das Document vor Zugriff von anderen Befehlen sperren.

Das Sperren passiert mit der LockDocument-Eigenschaft des Dokument-Objektes:

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices

Public Class TestForm
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oActiveDoc As Document = Application.DocumentManager.MdiActiveDocument

        Using oAcadDocLock As DocumentLock = oActiveDoc.LockDocument
            Using oTransaction As Transaction = oActiveDoc.TransactionManager.StartTransaction
                '...
                '...
                '...
                oTransaction.Commit()
            End Using
        End Using
    End Sub
End Class
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput

Public Class TextAutoCadAddIn
    <CommandMethod("test4")> _
    Public Sub Test()
        Application.ShowModelessDialog(New TestForm())
    End Sub
End Class