public class Commands : IExtensionApplication {
int N = 100000; // буду создавать сто тысяч отрезков
static FrmProc MyFrm;
public void Initialize() {
MyFrm = new FrmProc();
MyFrm.CreateControl();
}
public void Terminate() {
}
void BackgroundProcess() {
for (int i=0; i<N; i++) {
if (MyFrm.Ext) break;
MyFrm.label1.Text = "Создано " + i.ToString() + " отрезков";
MyFrm.ProgBar.Value = i;
MyFrm.Invalidate();
if (MyFrm.InvokeRequired)
MyFrm.Invoke(new FinishedProcessingDelegate(FinishedProcessing));
else
FinishedProcessing();
}
MyFrm.Ext = false; // сброс флага досрочного выхода
MyFrm.Hide(); // Скрываем форму процесса
}
delegate void FinishedProcessingDelegate();
void FinishedProcessing() {
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();
}
}
}
[CommandMethod("TEST")]
public void ProcessBackground() {
System.Threading.Thread thread = new Thread(new ThreadStart(BackgroundProcess));
MyFrm.ProgBar.Maximum = N;
MyFrm.ProgBar.Value = 0;
MyFrm.Show(); // Показываю диалог демонстрации процесса
thread.Start();
}
}
}