AUTOCAD 2012 на C# Visual Studio.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #30 : 24-09-2014, 18:51:59 »
Теперь всё нормально?

да, все указал и вуаля, заработало!)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #32 : 24-09-2014, 19:04:06 »
И даже окружности рисуются с интервалом приблизительно в секунду? И работать не мешает?

По крайне мере AutoCAD еще не умер, ошибок не выдавало, сейчас попробую сделать чертеж.

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #33 : 24-09-2014, 19:20:01 »
И даже окружности рисуются с интервалом приблизительно в секунду? И работать не мешает?

Еще я хотел у Вас узнать, вместо окружности возможно ли вставить блок или допустим полилинию?

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #35 : 24-09-2014, 19:26:16 »
Конечно. Модифицируй метод FinishedProcessing по своему усмотрению.

Спасибо)

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #36 : 29-09-2014, 17:40:36 »
using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))

Хотел спросить, что делать с этой строчкой, за что она отвечает? Пытаюсь поставить вместо круга полилинию, но застопорился за этой строчке.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #37 : 29-09-2014, 18:08:55 »
Цитата: Александр Ривилис от 22-09-2014, 19:53:14

    using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))


Хотел спросить, что делать с этой строчкой, за что она отвечает? Пытаюсь поставить вместо круга полилинию, но застопорился за этой строчке.
Код - C# [Выбрать]
  1.     using (AcDb.Polyline poly = new AcDb.Polyline())
Ну и не забыть добавить вершины к полилинии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #38 : 01-10-2014, 15:43:09 »
Код - C# [Выбрать]
  1. static double x_cor = 0;
  2. static double y_cor = 0;
  3. static Random r_x_cor = new Random();
  4. static Random r_y_cor = new Random();
  5.  
_______________________
Код - C# [Выбрать]
  1.  x_cor = r_x_cor.NextDouble();
  2.  y_cor = r_y_cor.NextDouble();
  3.  c_color = r_color.Next(255);
  4.   Polyline acPoly = new Polyline();
  5.   acPoly.SetDatabaseDefaults();
  6.   acPoly.AddVertexAt(0, new Point2d(x_cor, y_cor), 0, 0, 0);
  7.   acPoly.AddVertexAt(1, new Point2d(x_cor, y_cor), 0, 0, 0);
  8.   acPoly.AddVertexAt(2, new Point2d(x_cor, y_cor), 0, 0, 0);
  9.  

Снова пришлось обратится. Для полилинии необходимо для каждой точки задавать переменную типа Random или можно использовать одну (наверное звучит глупо).
Пытался сделать как у Вас, на примере круга, но мне кажется что напрасно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #39 : 01-10-2014, 20:26:48 »
Если число вершин тоже случайное число, то приблизительно так:
Код - 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.  
  17. namespace AddWithTimer
  18. {
  19.   public class MyCommands
  20.   {
  21.     // Интервал между вызовами таймера
  22.     const int tm_interval = 1000;
  23.     // Таймер
  24.     static Timer tm = null;
  25.     // Параметры полилинии: цвет и количество вершин
  26.     static int c_color = 0;
  27.     static int n_vertexies = 0;
  28.     // Случайные числа для цвета, координат и количества вершин
  29.     static Random r_color  = new Random();
  30.     static Random r = new Random();
  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.         tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
  43.       }
  44.     }
  45.  
  46.     private static void TimerEventProc(object obj, EventArgs myEventArgs)
  47.     {
  48.       tm.Enabled = false; // Приостанавливаем таймер
  49.       c_color = r_color.Next(255); // Цвет окружности от 0 до 255
  50.       n_vertexies = r.Next(30) + 2; // Количество вершин полилинии от 2 до 32
  51.       BackgroundProcess();
  52.       tm.Enabled = true; // Отпускаем таймер
  53.     }
  54.  
  55.     delegate void FinishedProcessingDelegate();
  56.  
  57.     /// <summary>
  58.     /// Функция, которая непосредственно работает с чертежом
  59.     /// </summary>
  60.     static void FinishedProcessing()
  61.     {
  62.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  63.       using (AcAp.DocumentLock locDoc = doc.LockDocument()) {
  64.         AcDb.ObjectId spaceId = doc.Database.CurrentSpaceId;
  65.         using (AcDb.BlockTableRecord btr = spaceId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord) {
  66.           using (AcDb.Polyline poly = new AcDb.Polyline()) {
  67.             poly.SetDatabaseDefaults();
  68.             poly.ColorIndex = c_color;
  69.             for (int i = 0; i < n_vertexies; i++) {
  70.               poly.AddVertexAt(i, new Point2d(r.NextDouble()*100, r.NextDouble()*100), 0, 0, 0);
  71.             }
  72.             btr.AppendEntity(poly);
  73.           }
  74.         }
  75.       }
  76.     }
  77.     /// <summary>
  78.     /// Функция, которая выполняется из таймера
  79.     /// </summary>
  80.     static void BackgroundProcess()
  81.     {
  82.       if (syncCtrl.InvokeRequired)
  83.         syncCtrl.Invoke(
  84.           new FinishedProcessingDelegate(FinishedProcessing));
  85.       else
  86.         FinishedProcessing();
  87.     }
  88.  
  89.     [AcRx.CommandMethod("TimerStart")]
  90.     public void TimerStart()
  91.     {
  92.       if (tm != null) {
  93.         tm.Enabled = false; tm.Stop(); tm.Dispose();
  94.       }
  95.       tm = new Timer();
  96.       tm.Interval = tm_interval; // Задаем интервал
  97.       tm.Tick += new EventHandler(TimerEventProc);
  98.       tm.Enabled = true;
  99.       tm.Start();
  100.     }
  101.  
  102.     [AcRx.CommandMethod("TimerStop")]
  103.     public void TimerStop()
  104.     {
  105.       if (tm != null) {
  106.         tm.Enabled = false; tm.Stop(); tm.Dispose(); tm = null;
  107.       }
  108.     }
  109.   }
  110. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #40 : 01-10-2014, 22:37:23 »
Если число вершин тоже случайное число, то приблизительно так:

Интересно. Меня еще один момент интересует, примитивы он рисует, вот только когда, например, рисуешь что то другое, они не появляются, когда заканчиваешь они все появляются.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #41 : 02-10-2014, 00:16:27 »
Меня еще один момент интересует, примитивы он рисует, вот только когда, например, рисуешь что то другое, они не появляются, когда заканчиваешь они все появляются.
А иначе и быть не может. Я писал уже о том, что к AutoCAD можно обращаться только из главной задачи (Thread). Так как пока ты рисуешь что-то другое, главная задача занята. Когда она освобождается - рисуется то, что ты задал рисовать в таймере.

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #42 : 02-10-2014, 02:40:38 »
А иначе и быть не может. Я писал уже о том, что к AutoCAD можно обращаться только из главной задачи (Thread). Так как пока ты рисуешь что-то другое, главная задача занята. Когда она освобождается - рисуется то, что ты задал рисовать в таймере.


Так получается этого сделать невозможно или просто AutoCAD посыпется?
Извините, просто окончательно должен быть уверен.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #43 : 02-10-2014, 03:35:44 »
Так получается этого сделать невозможно или просто AutoCAD посыпется?
А в чем разница? Считай что это сделать невозможно, потому что AutoCAD "посыпется". Можно только так, как я показал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 1
Re: AUTOCAD 2012 на C# Visual Studio.
« Ответ #44 : 06-10-2014, 02:29:04 »
А в чем разница? Считай что это сделать невозможно, потому что AutoCAD "посыпется". Можно только так, как я показал.

Хорошо, я понял.
Еще вопрос по поводу полилинии, как проще сделать из двумерной трехмерную, в примере что Вы мне написали?