AUTOCAD 2012 на C# Visual Studio.

Автор Тема: AUTOCAD 2012 на C# Visual Studio.  (Прочитано 36570 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #15 : 22-09-2014, 19:55:32 »
Вот самый примитивный и практически без проверок код:
Код - C# [Выбрать]
  1. using System;
  2. using System.Windows.Forms;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using AcRx = Autodesk.AutoCAD.Runtime;
  9. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  10. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  11. using AcGe = Autodesk.AutoCAD.Geometry;
  12. using AcEd = Autodesk.AutoCAD.EditorInput;
  13.  
  14. [assembly: AcRx.CommandClass(typeof(AddWithTimer.MyCommands))]
  15.  
  16. namespace AddWithTimer
  17. {
  18.   public class MyCommands
  19.   {
  20.     const int tm_interval = 1000;
  21.     static Timer tm = null;
  22.     static bool  tm_flag = false;
  23.     // Параметры окружности: радиус и цвет
  24.     static double c_radius = 0;
  25.     static int c_color = 0;
  26.     static Random r_color  = new Random();
  27.     static Random r_radius = new Random();
  28.     static AcGe.Point3d c_center;
  29.  
  30.     private static void TimerEventProc(object obj, EventArgs myEventArgs)
  31.     {
  32.       if (!tm_flag)
  33.       {
  34.         tm.Enabled = false; // Приостанавливаем таймер
  35.         c_color = r_color.Next(255); // Цвет окружности от 0 до 255
  36.         c_radius = r_radius.NextDouble();
  37.         c_radius *= 100; // Радиус окружности в пределах от 0 до 100.
  38.         double x_circle = r_radius.NextDouble();
  39.         double y_circle = r_radius.NextDouble();
  40.         c_center = new AcGe.Point3d(x_circle * 1000, y_circle * 1000, 0);
  41.         tm_flag = true;
  42.         tm.Enabled = true; // Отпускаем таймер
  43.       }
  44.     }
  45.     private static void EventEnteringQuiescentState(object sender, EventArgs e)
  46.     {
  47.       if (tm_flag)
  48.       {
  49.         AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  50.         using (AcAp.DocumentLock locDoc = doc.LockDocument())
  51.         {
  52.           AcDb.ObjectId spaceId = doc.Database.CurrentSpaceId;
  53.           using (AcDb.BlockTableRecord btr = spaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
  54.           {
  55.             using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))
  56.             {
  57.               circ.SetDatabaseDefaults();
  58.               circ.ColorIndex = c_color;
  59.               btr.AppendEntity(circ);
  60.             }
  61.           }
  62.         }
  63.         tm_flag = false;
  64.       }
  65.     }
  66.  
  67.     [AcRx.CommandMethod("TimerStart")]
  68.     public void TimerStart()
  69.     {
  70.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  71.       AcEd.Editor ed = doc.Editor;
  72.       ed.EnteringQuiescentState += EventEnteringQuiescentState;
  73.       if (tm != null)
  74.       {
  75.         tm.Enabled = false;  tm.Stop(); tm.Dispose();
  76.       }
  77.       tm = new Timer();
  78.       tm.Interval = tm_interval; // Задаем интервал
  79.       tm.Tick += new EventHandler(TimerEventProc);
  80.       tm.Enabled = true;
  81.       tm.Start();
  82.     }
  83.  
  84.     [AcRx.CommandMethod("TimerStop")]
  85.     public void TimerStop()
  86.     {
  87.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  88.       AcEd.Editor ed = doc.Editor;
  89.       if (tm != null)
  90.       {
  91.         tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;  
  92.       }
  93.       ed.EnteringQuiescentState -= EventEnteringQuiescentState;
  94.     }
  95.   }
  96. }

Начни с него. Дальше возможно понадобятся еще ухищрения, т.к. в процессе работы пользователь может переключится на другой документ или закрыть этот. Кроме того, что-то я сомневаюсь, что пользователь будет в восторге если в процессе его работы вдруг что-то будет появляться на экране. Попробуй сам с этим кодом что-то порисовать в AutoCAD'е или подредактировать существующее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #16 : 22-09-2014, 20:53:14 »
А в этом коде можно обойтись без событий редактора - только событиями таймера. Хотя я бы рекомендовал быть с этим кодом осторожнее:
Код - C# [Выбрать]
  1. using System;
  2. using System.Windows.Forms;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using AcRx = Autodesk.AutoCAD.Runtime;
  9. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  10. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  11. using AcGe = Autodesk.AutoCAD.Geometry;
  12. using AcEd = Autodesk.AutoCAD.EditorInput;
  13.  
  14. [assembly: AcRx.CommandClass(typeof(AddWithTimer.MyCommands))]
  15.  
  16. namespace AddWithTimer
  17. {
  18.   public class MyCommands
  19.   {
  20.     // Интервал между вызовами таймера
  21.     const int tm_interval = 1000;
  22.     // Таймер
  23.     static Timer tm = null;
  24.     // Параметры окружности: радиус и цвет
  25.     static double c_radius = 0;
  26.     static int c_color = 0;
  27.     // Случайные числа для цвета и радиуса
  28.     static Random r_color = new Random();
  29.     static Random r_radius = new Random();
  30.     static AcGe.Point3d c_center;
  31.  
  32.     static Control syncCtrl = null;
  33.  
  34.     static MyCommands()
  35.     {
  36.       syncCtrl = new Control();
  37.       syncCtrl.CreateControl();
  38.     }
  39.     ~MyCommands()
  40.     {
  41.       if (tm != null)
  42.       {
  43.         tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
  44.       }
  45.     }
  46.  
  47.     private static void TimerEventProc(object obj, EventArgs myEventArgs)
  48.     {
  49.         tm.Enabled = false; // Приостанавливаем таймер
  50.         c_color = r_color.Next(255); // Цвет окружности от 0 до 255
  51.         c_radius = r_radius.NextDouble();
  52.         c_radius *= 100; // Радиус окружности в пределах от 0 до 100.
  53.         double x_circle = r_radius.NextDouble();
  54.         double y_circle = r_radius.NextDouble();
  55.         c_center = new AcGe.Point3d(x_circle * 1000, y_circle * 1000, 0);
  56.         BackgroundProcess();
  57.         tm.Enabled = true; // Отпускаем таймер
  58.     }
  59.  
  60.     delegate void FinishedProcessingDelegate();
  61.  
  62.     /// <summary>
  63.     /// Функция, которая непосредственно работает с чертежом
  64.     /// </summary>
  65.     static void FinishedProcessing()
  66.     {
  67.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  68.       using (AcAp.DocumentLock locDoc = doc.LockDocument())
  69.       {
  70.         AcDb.ObjectId spaceId = doc.Database.CurrentSpaceId;
  71.         using (AcDb.BlockTableRecord btr = spaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
  72.         {
  73.           using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))
  74.           {
  75.             circ.SetDatabaseDefaults();
  76.             circ.ColorIndex = c_color;
  77.             btr.AppendEntity(circ);
  78.           }
  79.         }
  80.       }
  81.     }
  82.     /// <summary>
  83.     /// Функция, которая выполняется из таймера
  84.     /// </summary>
  85.     static void BackgroundProcess()
  86.     {
  87.       if (syncCtrl.InvokeRequired)
  88.         syncCtrl.Invoke(
  89.           new FinishedProcessingDelegate(FinishedProcessing));
  90.       else
  91.         FinishedProcessing();
  92.     }
  93.  
  94.     [AcRx.CommandMethod("TimerStart")]
  95.     public void TimerStart()
  96.     {
  97.       if (tm != null)
  98.       {
  99.         tm.Enabled = false; tm.Stop(); tm.Dispose();
  100.       }
  101.       tm = new Timer();
  102.       tm.Interval = tm_interval; // Задаем интервал
  103.       tm.Tick += new EventHandler(TimerEventProc);
  104.       tm.Enabled = true;
  105.       tm.Start();
  106.     }
  107.  
  108.     [AcRx.CommandMethod("TimerStop")]
  109.     public void TimerStop()
  110.     {
  111.       if (tm != null)
  112.       {
  113.         tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
  114.       }
  115.     }
  116.   }
  117. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #17 : 23-09-2014, 01:19:44 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #18 : 24-09-2014, 02:42:39 »
А вот и статья на эту тему: Использование потоков (Thread) для фоновой обработки

Огромное Вам спасибо, сейчас начну с ним работать.

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #19 : 24-09-2014, 14:54:39 »
А вот и статья на эту тему: Использование потоков (Thread) для фоновой обработки

Предупреждение   1   не удалось разрешить указанную ссылкой сборку "acmgd", поскольку она зависит от "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", отсутствующей в текущей целевой платформе ".NETFramework,Version=v4.0,Profile=Client". Удалите ссылки на сборки не в целевой платформе или рассмотрите возможность переориентации проекта.   WindowsFormsApplication1

Я так понимаю ошибка связана с NETFramework, появилась она сейчас, до этого ее не было.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #20 : 24-09-2014, 16:47:23 »
А ты случайно не exe-файл собираешься делать? Я так подумал глядя на название WindowsFormsApplication1. AutoCAD .NET API можно использовать только из dll-сборок, загруженных внутрь AutoCAD командой _NETLOAD или аналогичными способами.

P.S.: Заодно уточни версию Visual Studio, которую ты используешь и разрядность Windows и AutoCAD (32- или 64-разрядные).
« Последнее редактирование: 24-09-2014, 17:16:24 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #21 : 24-09-2014, 18:05:54 »
А ты случайно не exe-файл собираешься делать? Я так подумал глядя на название WindowsFormsApplication1. AutoCAD .NET API можно использовать только из dll-сборок, загруженных внутрь AutoCAD командой _NETLOAD или аналогичными способами.

P.S.: Заодно уточни версию Visual Studio, которую ты используешь и разрядность Windows и AutoCAD (32- или 64-разрядные).
« Последнее редактирование: 24-09-2014, 17:16:24 от Александр Ривилис »

нет, я просто пробовал после ClassLibrary, Visual Studio 2010 года, Windows 7 x64

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #22 : 24-09-2014, 18:08:11 »
нет, я просто пробовал после ClassLibrary, Visual Studio 2010 года, Windows 7 x64
Не получится. AutoCAD 2012 требует .NET 4.0 (или выше), а VS 2010 позволяет создавать приложения не выше .NET 3.5
Таким образом для AutoCAD 2012 тебе нужен VS 2012 или 2013.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #23 : 24-09-2014, 18:28:51 »
Не получится. AutoCAD 2012 требует .NET 4.0 (или выше), а VS 2010 позволяет создавать приложения не выше .NET 3.5
Таким образом для AutoCAD 2012 тебе нужен VS 2012 или 2013.

При создании проекта можно выбрать версию NET. c 2.0 - 4 или это не имеет значения?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #24 : 24-09-2014, 18:32:02 »
Стоп. В этот я раз я попытался сбить тебя с толку.  ;)
VS 2010 годится для создания приложения для AutoCAD 2012 - она поддерживает .NET 4.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #25 : 24-09-2014, 18:34:45 »
Стоп. В этот я раз я попытался сбить тебя с толку. 
VS 2010 годится для создания приложения для AutoCAD 2012 - она поддерживает .NET 4.0

Тогда что нужно сделать, что бы убрать эти ошибки:

1) Не удалось найти имя типа или пространства имен "Timer" (пропущена директива using или ссылка на сборку?)   C:\Users\Джон\Desktop\двеработы\ClassLibrary2\ClassLibrary2\Class1.cs   21   16   ClassLibrary2

2) Ошибка   3   Имя типа или пространства имен "Windows" отсутствует в пространстве имен "System" (пропущена ссылка на сборку?)   C:\Users\Джон\Desktop\двеработы\ClassLibrary2\ClassLibrary2\Class1.cs   2   14   ClassLibrary2


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #26 : 24-09-2014, 18:44:54 »
Тогда что нужно сделать, что бы убрать эти ошибки:
Например, подключить к проекту соответствующую сборку, в которой определены эти контролы (System.Windows.Forms).

Оффлайн bakaIIHXАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #27 : 24-09-2014, 18:49:31 »
Например, подключить к проекту соответствующую сборку, в которой определены эти контролы (System.Windows.Forms).

Плохо быть по пояс деревянным, спасибо Вам.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #28 : 24-09-2014, 18:50:29 »
Андрей Бушман, абсолютно правильно.
bakaIIHX, на всякий случай прикладываю полностью проект. Тебе нужно будет только изменить путь к файлам сборок если у тебя путь к AutoCAD не такой как у меня: "C:\Program Files\Autodesk\AutoCAD 2012 - English"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #29 : 24-09-2014, 18:50:51 »
Плохо быть по пояс деревянным, спасибо Вам.
Теперь всё нормально?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение