I am working on an application that uses map to query data, then saves the data to a file, and repeat. It works flawlessly when I use a commandmethod with commandflags.session, But, when I try to run the same code from a form button, I get "drawing is busy". The command from the form button ignores the commandmethod and the commandflags. I am guessing that "sendstringtoexecute" would work, but I would prefer to not do it that way.
What am I missing? Is there another way to lock the session?
Here is what I am trying to do.
drawing1 is open and the user presses the button
data is queried and saved as 1.dwg
close and discard drawing1
open a new doc drawing2
data is queried and saved as 2.dwg
close and discard drawing2
open a new doc drawing3
Solved! Go to Solution.
Solved! by Alexander.Rivilis. See the answer in context.
You can try using DocumentCollection.ExecuteInApplicationContext method.
That's even better - thank you. Starting at an empty drawing1, the user presses the button, and the queries start in drawing2. When it's finished, the user is back at an empty drawing1.
Good idea - sorry. It took a bit of digging and I was in a rush. Thanks again Alexander and tony t (again and again...).
<CommandMethod("q19")> _ Sub q_19() Dim acdocmgr As acapp.DocumentCollection = acapp.Application.DocumentManager 'assume drawing1 is active - it does not matter acdocmgr.ExecuteInApplicationContext(AddressOf testsub, Nothing) End Sub Private Sub testsub(ByVal data As Object) 'in this example data is not used Dim cmddiavalue As Integer = CInt(acapp.Application.GetSystemVariable("CMDDIA")
) acapp.Application.SetSystemVariable("CMDDIA", 0) Dim acdocmgr As acapp.DocumentCollection = acapp.Application.DocumentManager Dim acdoc As acapp.Document = acdocmgr.MdiActiveDocument Dim templatepath As String = "map2diso.dwt" acdoc = acdocmgr.Add(templatepath) acdocmgr.MdiActiveDocument = acdoc 'drawing2 is now active Using acdoclock As acapp.DocumentLock = acdoc.LockDocument Dim currentobjs As New ObjectIdCollection() 'query and save End Using acdoc.CloseAndDiscard() acdoc = acdocmgr.Add(templatepath) acdocmgr.MdiActiveDocument = acdoc 'drawing3 Using acdoclock As acapp.DocumentLock = acdoc.LockDocument Dim currentobjs As New ObjectIdCollection() 'query and save End Using acdoc.CloseAndDiscard() acapp.Application.SetSystemVariable("CMDDIA", cmddiavalue) Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt( ) 'return to drawing1 or whatever doc was before End Sub