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

ADN Club => AutoCAD .NET API => Тема начата: Борис_С от 08-02-2023, 17:27:34

Название: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 08-02-2023, 17:27:34
Всем доброго дня!
Столкнулся с такой проблемой. В чертеже обнаружил объект ProxyEntity.
Как найти все элементы этого объекта?
Спасибо.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: brainstorm от 08-02-2023, 21:47:07
Прям сегодня натыкался )
https://bushman-andrey.blogspot.com/2014/12/explodeallproxy-removeallproxy.html (https://bushman-andrey.blogspot.com/2014/12/explodeallproxy-removeallproxy.html)
Это утилита от Андрея Бушмана, написанная на .NET. Повторяет функционал ARX утилиты от Александра Ривилиса, ну и позволяет перед действиями с ними увидеть их количество.
А зачем их считать?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 09-02-2023, 16:21:13
Борис_С,
Что такое "все элементы этого объекта"???
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 09-02-2023, 17:17:47
Все элементы - это те элементы, из которых состоит ProxyEntity. Если я правильно понимаю,  ProxyEntity включает в себя те же элементы, что и автокад, или я не прав?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 09-02-2023, 17:25:25
Прям сегодня натыкался )
https://bushman-andrey.blogspot.com/2014/12/explodeallproxy-removeallproxy.html
Это утилита от Андрея Бушмана, написанная на .NET. Повторяет функционал ARX утилиты от Александра Ривилиса, ну и позволяет перед действиями с ними увидеть их количество.
А зачем их считать?
Посмотрел утилиту. Там нет исх. кода. Мне нужно этот код вставить в свой код, написанный на с#.
Считать эти элементы мне нужно для того, чтобы получить тексты, входящие в ProxyEntity. А дальше я анализирую эти тексты и ищу в них ссылки на документы.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Привалов Дмитрий от 09-02-2023, 17:57:03
Считать эти элементы мне нужно для того, чтобы получить тексты, входящие в ProxyEntity. А дальше я анализирую эти тексты и ищу в них ссылки на документы.
Напрямую из ProxyEntity информацию не считать, т.к. это не предусмотрено API. Нужно либо разбивать на примитивы автокада и анализировать результат после разбивки или как-то анализировать через dxf.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Алексей Кулик от 10-02-2023, 08:39:13
Старая версия, не факт что работающая. Да вдобавок еще и "подправленная" моими кривыми ручками: https://autolisp.ru/2015/02/02/managed-alternative-explodeallproxy/
Уж простите, чем богаты
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 11-02-2023, 22:49:16
Все элементы - это те элементы, из которых состоит ProxyEntity. Если я правильно понимаю,  ProxyEntity включает в себя те же элементы, что и автокад, или я не прав?
Не прав. Поясняю. ProxyEntity ничего не включает. Он возникает только в случае, когда в AutoCAD не загружен его Enabler (это может быть dbx/arx/dll-файл). В лучшем случае, и только если это предусмотрено создателем ProxyEntity можно расчленить на примитивы AutoCAD, используя метод Explode. Но во-первых, это не обязательно. Во-вторых, даже если метод Explode сработает, это не значит, что полученные примитивы будут в точности соответствовать изображению ProxyEntity (например, не будет некоторых линий или они будут не на том месте).
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 14-02-2023, 16:21:52
У меня есть процедура FindItems для поиска всех элементов Block Table Record

Код - C# [Выбрать]
  1. public static void FindItems(Transaction acTrans, BlockTableRecord blkTblRec, int tabOrder)
  2.         {
  3.             foreach (ObjectId acObjId in blkTblRec)
  4.             {
  5.                 Entity en = acTrans.GetObject(acObjId, OpenMode.ForRead) as Entity;
  6.                 if (en != null)
  7.                 {
  8.                     if (en.GetType() == typeof(DBText))
  9.                     {
  10.                     }
  11.                     else if (en.GetType() == typeof(MText))
  12.                     {
  13.                     }
  14.                     else if (en.GetType() == typeof(Table))
  15.                     {
  16.                     }
  17.                     else if (en.GetType() == typeof(MLeader))
  18.                     {
  19.                     }
  20.                     else if (en.GetType() == typeof(BlockReference))
  21.                     {
  22.                     }
  23.                     else if (en.GetType() == typeof(ProxyEntity))
  24.                     {
  25.                         Db.ProxyEntity proxyEntity = en as Db.ProxyEntity;
  26.                         Db.DBObjectCollection newDBObjects = new Db.DBObjectCollection();
  27.                         try
  28.                         {
  29.                             proxyEntity.Explode(newDBObjects);
  30.                         }
  31.                         catch (System.Exception e)
  32.                         {
  33.                             ShowMessage(e);
  34.                         }
  35.                     }
  36.                 }
  37.             }
  38.         }
  39.  

Это, естественно только скелет этой процедуры. Для элемента типа ProxyEntity она формирует массив элементов из которых состоит элемент типа ProxyEntity: Db.DBObjectCollection newDBObjects. Как преобразовать элементы массива Db.DBObjectCollection так, чтобы воспользоваться методами процедуры FindItems?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 14-02-2023, 22:27:02
Как преобразовать элементы массива Db.DBObjectCollection так, чтобы воспользоваться методами процедуры FindItems?
Не нужно ничего преобразовывать. Нужно с каждым из элементов newDBObjects проделать то же, что ты проделываешь с en.
И не забывай правило форматирования кода на форуме!
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 15-02-2023, 22:32:50
Для обычных элементов документа AutoCad я использую
BlockTableRecord blkTblRec = acTrans.GetObject(layout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
Затем прохожу по всем ObjectId acObjId в blkTblRec
Для элемента ProxyEntity нужно использовать тот же BlockTableRecord или другой?
Дальше алгоритм будет такой же, как и для обычных элементов?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 15-02-2023, 22:56:59
Для элемента ProxyEntity нужно использовать тот же BlockTableRecord или другой?
Нет. Тебе вообще не понадобится acTrans.GetObject(...), так как newDBObjects уже содержит коллекцию Entity.
Код - C# [Выбрать]
  1. foreach (DBObject obj in newDBObjects)
  2. {
  3.   Entity en1 = obj as Entity;
  4.   if (en1 != null)
  5.   {
  6.       if (en1.GetType() == typeof(DBText))
  7.       {
  8.       }
  9.       else if (en1.GetType() == typeof(MText))
  10.       {
  11.       }
  12.   }
  13. }
BlockReference, MLeader, Table и т.д. не могут быть в результате расчленения ProxyEntity.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 16-02-2023, 10:21:23
Я правильно понимаю, что могут быть только DBText или MText ?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 16-02-2023, 10:25:58
Я правильно понимаю, что могут быть только DBText или MText ?
Из текстовых примитивов только они. Но если будешь обрабатывать и другие, то хуже не будет.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 16-02-2023, 12:16:59
Спасибо. Все получилось. :)
И еще один вопрос. Можно найти ObjectId для элементов, из которых состоит ProxyEntity, для того,
чтобы потом позиционироваться на эти элементы?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 18-02-2023, 00:19:36
Можно найти ObjectId для элементов, из которых состоит ProxyEntity, для того,
чтобы потом позиционироваться на эти элементы?
У них нет ObjectId, так как они не добавлены в чертеж - они только в памяти.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 21-02-2023, 16:41:19
Правильно я понимаю, что позиционироваться на эти элементы нельзя?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 21-02-2023, 21:19:59
Правильно я понимаю, что позиционироваться на эти элементы нельзя?
Что такое "позиционироваться"? Получить по ObjectId объект? Тогда ответ нет. Нет у них ObjectId.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 22-02-2023, 15:10:03
Позиционироваться - это выделить нужный элемент и отобразить его на экране в нужном размере.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 22-02-2023, 15:14:17
Позиционироваться - это выделить нужный элемент и отобразить его на экране в нужном размере.
Для этой цели необходимо, чтобы этот элемент был в базе данных, а это не так.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 22-02-2023, 15:26:26
Значит, я все правильно понимаю. Позиционироваться на элемент ProxyEntity нельзя.
Все ясно. Спасибо, Саша.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Привалов Дмитрий от 23-02-2023, 09:50:59
Значит, я все правильно понимаю. Позиционироваться на элемент ProxyEntity нельзя
Позиционироваться на ProxyEntity можно. Пока ты его не разбил на примитивы автокада и не удалил.
А на разбитые примитивы от ProxyEntity  не получится, пока ты их не добавишь в базу данных чертежа.

 На форуме было как позиционироваться на элемент.
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Борис_С от 23-02-2023, 10:50:19
А можно ссылку на это?
Название: Re: Как расшифровать объект ProxyEntity
Отправлено: Александр Ривилис от 23-02-2023, 11:51:22
Позиционироваться на элемент ProxyEntity нельзя.
Нельзя до того момента, как ты не вставишь его в базу.