Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alexeynico от 29-06-2020, 13:30:04

Название: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Alexeynico от 29-06-2020, 13:30:04
Добрый день!
Разрабатываю программу. Основная работа проводится не в Autocad, поэтому подключение к Autocad и некоторые функции организованы через COM (Interop) с поздним связыванием.

Есть ли возможность в этом случае программно вставить информацию из существующего чертежа на диске в активный чертеж, открытый в Autocad? Идеально, если без открытия существующего чертежа, но в случае с Interop это, вероятно, невозможно?
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Александр Ривилис от 29-06-2020, 14:14:23
Есть ли возможность в этом случае программно вставить информацию из существующего чертежа на диске в активный чертеж, открытый в Autocad? Идеально, если без открытия существующего чертежа, но в случае с Interop это, вероятно, невозможно?
Это возможно, хотя и не слишком просто и достаточно ненадежно. Но чертеж в любом случае открывается. В одном случае в редакторе AutoCAD, в другом случае без создания нового документа. Поищи примеры использования AxDbDocument.
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Alexeynico от 29-06-2020, 14:35:20
Пока сделал такой "костыль" по-быстрому.

Код - 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.
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Alexeynico от 29-06-2020, 14:36:59
Этот вариант работает, хоть и долго, на мой взгляд. Единственная проблема кроме скорости и мелькания чертежей, размеры копируются в новый чертеж но их не видно даже после регенерации чертежа.
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Александр Ривилис от 29-06-2020, 15:22:04
Посмотри при помощи MGDDBG есть ли эти размеры в чертеже, в который ты их копируешь. Подозреваю, что копировать их нужно вместе с "опорными" объектами.
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Александр Ривилис от 29-06-2020, 15:24:44
Спасибо. Поищу информацию о AxDbDocument.
В этом случае ты не сможешь использовать выбор примитивов при помощи методов SelectXXX()
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Alexeynico от 29-06-2020, 15:33:55
В том то и дело, что размер в чертеже точно есть. К примеру, исходный чертеж выглядит так:

(https://i.postimg.cc/zV8Nj1r0/2020-06-29-15-28-02.png) (https://postimg.cc/zV8Nj1r0)

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

(https://i.postimg.cc/vxHsGWXC/2020-06-29-15-31-20.png) (https://postimg.cc/vxHsGWXC)

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

(https://i.postimg.cc/nXqwwXGm/2020-06-29-15-32-45.png) (https://postimg.cc/nXqwwXGm)

Ну и когда вставляется массив объектов в новый чертеж, я проверяю состав массива, и там этот размер есть...
Не могу понять "природу явления".
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Александр Ривилис от 29-06-2020, 17:39:56
Размеры аннотативные?
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Alexeynico от 29-06-2020, 18:03:10
Нет, не аннотативный...
Название: Re: Копирование существующего чертежа в активный (COM Interop)
Отправлено: Александр Ривилис от 29-06-2020, 18:05:43
Перед копированием сделай тот чертеж, в который копируешь, активным.