|
- 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("rocessInBackground")]
- 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");
- }
- }
- }
复制代码 |
|