Imports AAAS = Autodesk.AutoCAD.ApplicationServices
Imports AADS = Autodesk.AutoCAD.DatabaseServices
Imports AAEI = Autodesk.AutoCAD.EditorInput
Public Class Plugin
Public Sub Execute()
Dim doc As AAAS.Document = AAAS.Application.DocumentManager.MdiActiveDocument
Dim db As AADS.Database = doc.Database
Dim ed As AAEI.Editor = doc.Editor
Using topTransaction As AADS.Transaction = db.TransactionManager.StartTransaction
Dim btr As AADS.BlockTableRecord = topTransaction.GetObject(db.CurrentSpaceId, AADS.OpenMode.ForWrite)
Dim pickoptions As AAEI.PromptPointOptions = New AAEI.PromptPointOptions(String.Format("Specify point", Environment.NewLine))
pickoptions.AllowNone = True
pickoptions.Keywords.Add("Undo")
Dim pickResult As AAEI.PromptPointResult
Do
pickResult = ed.GetPoint(pickoptions)
Select Case pickResult.Status
Case Autodesk.AutoCAD.EditorInput.PromptStatus.Keyword
Select Case pickResult.StringResult
Case "Undo"
topTransaction.TransactionManager.TopTransaction.Abort()
End Select
Case Autodesk.AutoCAD.EditorInput.PromptStatus.OK
Using innerTransaction As AADS.Transaction = db.TransactionManager.StartTransaction
Dim NewCircle As New AADS.Circle(pickResult.Value, Autodesk.AutoCAD.Geometry.Vector3d.ZAxis, 1)
NewCircle.SetDatabaseDefaults()
btr.AppendEntity(NewCircle)
innerTransaction.AddNewlyCreatedDBObject(NewCircle, True)
innerTransaction.TransactionManager.QueueForGraphicsFlush()
innerTransaction.Commit()
End Using
Case Else
End Select
Loop While pickResult.Status = Autodesk.AutoCAD.EditorInput.PromptStatus.OK OrElse pickResult.Status = Autodesk.AutoCAD.EditorInput.PromptStatus.Keyword
topTransaction.Commit()
End Using
End Sub
End Class
Imports AAAS = Autodesk.AutoCAD.ApplicationServices
Imports AADS = Autodesk.AutoCAD.DatabaseServices
Imports AAEI = Autodesk.AutoCAD.EditorInput
Imports AAR = Autodesk.AutoCAD.Runtime
Public Class Plugin
<AAR.CommandMethod("xxx", AAR.CommandFlags.Modal)> _
Public Shared Sub UndoStuff()
Try
'Using plugin As New Plugin
Dim plugin As New Plugin
plugin.Execute()
'End Using
Catch ex As Exception
AAAS.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(String.Format("{0}{1}", Environment.NewLine, ex.Message))
End Try
End Sub
Public Sub Execute()
Dim doc As AAAS.Document = AAAS.Application.DocumentManager.MdiActiveDocument
Dim db As AADS.Database = doc.Database
Dim ed As AAEI.Editor = doc.Editor
Using topTransaction As AADS.Transaction = db.TransactionManager.StartTransaction
Dim btr As AADS.BlockTableRecord = topTransaction.GetObject(db.CurrentSpaceId, AADS.OpenMode.ForWrite)
Dim pickoptions As AAEI.PromptPointOptions = New AAEI.PromptPointOptions(String.Format("Specify point", Environment.NewLine))
pickoptions.AllowNone = True
Dim pickResult As AAEI.PromptPointResult
Dim UndoAdded As Boolean = False
Do
If UndoAdded = False AndAlso topTransaction.TransactionManager.NumberOfActiveTransactions > 1 Then
pickoptions.Keywords.Add("Undo")
UndoAdded = True
End If
pickResult = ed.GetPoint(pickoptions)
Select Case pickResult.Status
Case Autodesk.AutoCAD.EditorInput.PromptStatus.Keyword
Select Case pickResult.StringResult
Case "Undo"
topTransaction.TransactionManager.TopTransaction.Abort()
End Select
Case Autodesk.AutoCAD.EditorInput.PromptStatus.OK
Dim innerTransaction As AADS.Transaction = db.TransactionManager.StartTransaction
Dim NewCircle As New AADS.Circle(pickResult.Value, Autodesk.AutoCAD.Geometry.Vector3d.ZAxis, 1)
NewCircle.SetDatabaseDefaults()
btr.AppendEntity(NewCircle)
innerTransaction.AddNewlyCreatedDBObject(NewCircle, True)
innerTransaction.TransactionManager.QueueForGraphicsFlush()
'innerTransaction.Commit()
'End Using
Case Else
End Select
Loop While pickResult.Status = Autodesk.AutoCAD.EditorInput.PromptStatus.OK OrElse pickResult.Status = Autodesk.AutoCAD.EditorInput.PromptStatus.Keyword
'commit inner transactions, keeping in mind that the very first transaction is the top / outer transaction
For counter As Integer = topTransaction.TransactionManager.NumberOfActiveTransactions - 1 To 1 Step -1
topTransaction.TransactionManager.TopTransaction.Commit()
topTransaction.TransactionManager.TopTransaction.Dispose()
Next
topTransaction.Commit()
End Using
End Sub
End Class
@Will
After reading the thread, it looks like this is uses the undomarks to determine certain points that the undo command will revert back to and not points that are accessible inside the routine without using the 'ed.SendStringToExecute' which i'm trying to avoid.... is this right?
Thanks, Mark