using System;
using System.Windows.Forms;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using AcRx = Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using AcGe = Autodesk.AutoCAD.Geometry;
using AcEd = Autodesk.AutoCAD.EditorInput;
[assembly: AcRx.CommandClass(typeof(AddWithTimer.MyCommands))]
namespace AddWithTimer
{
public class MyCommands
{
// Интервал между вызовами таймера
const int tm_interval = 1000;
// Таймер
static Timer tm = null;
// Параметры полилинии: цвет и количество вершин
static int c_color = 0;
static int n_vertexies = 0;
// Случайные числа для цвета, координат и количества вершин
static Random r_color = new Random();
static Random r = new Random();
static Control syncCtrl = null;
static MyCommands()
{
syncCtrl = new Control();
syncCtrl.CreateControl();
}
~MyCommands()
{
if (tm != null) {
tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
}
}
private static void TimerEventProc(object obj, EventArgs myEventArgs)
{
tm.Enabled = false; // Приостанавливаем таймер
c_color = r_color.Next(255); // Цвет окружности от 0 до 255
n_vertexies = r.Next(30) + 2; // Количество вершин полилинии от 2 до 32
BackgroundProcess();
tm.Enabled = true; // Отпускаем таймер
}
delegate void FinishedProcessingDelegate();
/// <summary>
/// Функция, которая непосредственно работает с чертежом
/// </summary>
static void FinishedProcessing()
{
AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
using (AcAp.DocumentLock locDoc = doc.LockDocument()) {
AcDb.ObjectId spaceId = doc.Database.CurrentSpaceId;
using (AcDb.BlockTableRecord btr = spaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord) {
using (AcDb.Polyline poly = new AcDb.Polyline()) {
poly.SetDatabaseDefaults();
poly.ColorIndex = c_color;
for (int i = 0; i < n_vertexies; i++) {
poly.AddVertexAt(i, new Point2d(r.NextDouble()*100, r.NextDouble()*100), 0, 0, 0);
}
btr.AppendEntity(poly);
}
}
}
}
/// <summary>
/// Функция, которая выполняется из таймера
/// </summary>
static void BackgroundProcess()
{
if (syncCtrl.InvokeRequired)
syncCtrl.Invoke(
new FinishedProcessingDelegate(FinishedProcessing));
else
FinishedProcessing();
}
[AcRx.CommandMethod("TimerStart")]
public void TimerStart()
{
if (tm != null) {
tm.Enabled = false; tm.Stop(); tm.Dispose();
}
tm = new Timer();
tm.Interval = tm_interval; // Задаем интервал
tm.Tick += new EventHandler(TimerEventProc);
tm.Enabled = true;
tm.Start();
}
[AcRx.CommandMethod("TimerStop")]
public void TimerStop()
{
if (tm != null) {
tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
}
}
}
}