using System;
using Autodesk.AutoCAD.Runtime;
using System.Windows.Forms;
using Autodesk.AutoCAD.EditorInput;
using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
namespace BackgroundProcess
{
public class Commands : IExtensionApplication
{
static Control syncCtrl;
public void Initialize()
{
// The control created to help with marshaling
// needs to be created on the main thread
syncCtrl = new Control();
syncCtrl.CreateControl();
}
public void Terminate()
{
}
void BackgroundProcess()
{
// This is to represent the background process
System.Threading.Thread.Sleep(5000);
// Now we need to marshall the call to the main thread
// I don't see how this could ever be false in this context,
// but I check it anyway
if (syncCtrl.InvokeRequired)
syncCtrl.Invoke(
new FinishedProcessingDelegate(FinishedProcessing));
else
FinishedProcessing();
}
delegate void FinishedProcessingDelegate();
void FinishedProcessing()
{
// If we want to modify the database, then we need to lock
// the document since we are in session/application context
Document doc = acApp.DocumentManager.MdiActiveDocument;
using (doc.LockDocument())
{
using (Transaction tr =
doc.Database.TransactionManager.StartTransaction())
{
BlockTable bt =
(BlockTable)tr.GetObject(
doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(
bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Line line =
new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0));
ms.AppendEntity(line);
tr.AddNewlyCreatedDBObject(line, true);
tr.Commit();
}
}
// Also write a message to the command line
// Note: using AutoCAD notification bubbles would be
// a nicer solution :)
// TrayItem/TrayItemBubbleWindow
Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("Finished the background process!\n");
}
[CommandMethod("ProcessInBackground")]
public void ProcessBackground()
{
// Let's say we got some data from the drawing and
// now we want to process it in a background thread
System.Threading.Thread thread =
new System.Threading.Thread(
new System.Threading.ThreadStart(BackgroundProcess));
thread.Start();
Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage(
"Started background processing. " +
"You can keep working as usual.\n");
}
}
}