Копирование существующего чертежа в активный (COM Interop)

Автор Тема: Копирование существующего чертежа в активный (COM Interop)  (Прочитано 849 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Добрый день!
Разрабатываю программу. Основная работа проводится не в Autocad, поэтому подключение к Autocad и некоторые функции организованы через COM (Interop) с поздним связыванием.

Есть ли возможность в этом случае программно вставить информацию из существующего чертежа на диске в активный чертеж, открытый в Autocad? Идеально, если без открытия существующего чертежа, но в случае с Interop это, вероятно, невозможно?

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

  • Administrator
  • *****
  • Сообщений: 11340
  • Карма: 1469
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть ли возможность в этом случае программно вставить информацию из существующего чертежа на диске в активный чертеж, открытый в Autocad? Идеально, если без открытия существующего чертежа, но в случае с Interop это, вероятно, невозможно?
Это возможно, хотя и не слишком просто и достаточно ненадежно. Но чертеж в любом случае открывается. В одном случае в редакторе AutoCAD, в другом случае без создания нового документа. Поищи примеры использования AxDbDocument.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Пока сделал такой "костыль" по-быстрому.

Код - C# [Выбрать]
  1. int autocadSnapMode = cadApp.ActiveDocument.GetVariable("osmode"); // Запомнить привязку
  2. cadApp.ActiveDocument.ObjectSnapMode = false; //Отключить привязку
  3.  
  4. string sourceName = "d:\\1.dwg";
  5. double x = 0; //x точка вставки
  6. double y = 0; //y точка вставки
  7.  
  8. int activeDoc = 0;
  9. for (int i = 0; i < cadApp.Documents.Count; i++)
  10. {
  11.     if (cadApp.Documents.Item(i).Active == true)
  12.     {
  13.         activeDoc = i;
  14.         break;
  15.     }
  16.    
  17. }
  18.  
  19. cadApp.Documents.Add(sourceName);
  20. dynamic sset = cadApp.ActiveDocument.SelectionSets.Add("vols");
  21.  
  22. List<double> dubList = new List<double>();
  23. //здесь добавление 4х точек для "секущего прямоугольника"
  24. double[] dubArr = dubList.ToArray();
  25.  
  26. sset.SelectByPolygon(AcSelect.acSelectionSetCrossingPolygon, dubArr);
  27.  
  28. AcadEntity[] obj = new AcadEntity[sset.Count];
  29. for (int i = 0; i < sset.Count; i++)
  30. {
  31.     obj[i] = sset.Item(i);    
  32. }
  33.  
  34. foreach (AcadEntity item in obj)
  35. {
  36.     item.Move(AcadPoint(0, 0), AcadPoint(x, y));
  37. }
  38.  
  39. cadApp.ActiveDocument.Database.CopyObjects(obj, cadApp.Documents.Item(activeDoc).ModelSpace);
  40. cadApp.ActiveDocument.Close();
  41. cadApp.Documents.Item(activeDoc).Activate();
  42. cadApp.ActiveDocument.SetVariable("osmode", autocadSnapMode);
  43. cadApp.ZoomExtents();
  44. cadApp.ActiveDocument.Regen(AcRegenType.acAllViewports);
  45.  

Код - C# [Выбрать]
  1. private double[] AcadPoint(double x, double y)
  2. {
  3.     double[] point = new double[3];
  4.  
  5.     point[0] = x;
  6.     point[1] = y;
  7.     point[2] = 0;
  8.  
  9.     return point;
  10. }
  11.  

Спасибо. Поищу информацию о AxDbDocument.

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Этот вариант работает, хоть и долго, на мой взгляд. Единственная проблема кроме скорости и мелькания чертежей, размеры копируются в новый чертеж но их не видно даже после регенерации чертежа.

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

  • Administrator
  • *****
  • Сообщений: 11340
  • Карма: 1469
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотри при помощи MGDDBG есть ли эти размеры в чертеже, в который ты их копируешь. Подозреваю, что копировать их нужно вместе с "опорными" объектами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11340
  • Карма: 1469
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо. Поищу информацию о AxDbDocument.
В этом случае ты не сможешь использовать выбор примитивов при помощи методов SelectXXX()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
В том то и дело, что размер в чертеже точно есть. К примеру, исходный чертеж выглядит так:



Я запускаю метод и получаю результирующий чертеж таким же, но без размера. При этом если даже сделать "ctrl+a", то получу следующее:



А если удалю круг, то размер появляется:



Ну и когда вставляется массив объектов в новый чертеж, я проверяю состав массива, и там этот размер есть...
Не могу понять "природу явления".

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

  • Administrator
  • *****
  • Сообщений: 11340
  • Карма: 1469
  • Рыцарь ObjectARX
  • Skype: rivilis
Размеры аннотативные?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Нет, не аннотативный...

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

  • Administrator
  • *****
  • Сообщений: 11340
  • Карма: 1469
  • Рыцарь ObjectARX
  • Skype: rivilis
Перед копированием сделай тот чертеж, в который копируешь, активным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение