Как расшифровать объект ProxyEntity

Автор Тема: Как расшифровать объект ProxyEntity  (Прочитано 9708 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Всем доброго дня!
Столкнулся с такой проблемой. В чертеже обнаружил объект ProxyEntity.
Как найти все элементы этого объекта?
Спасибо.

Оффлайн brainstorm

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Как расшифровать объект ProxyEntity
« Ответ #1 : 08-02-2023, 21:47:07 »
Прям сегодня натыкался )
https://bushman-andrey.blogspot.com/2014/12/explodeallproxy-removeallproxy.html
Это утилита от Андрея Бушмана, написанная на .NET. Повторяет функционал ARX утилиты от Александра Ривилиса, ну и позволяет перед действиями с ними увидеть их количество.
А зачем их считать?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как расшифровать объект ProxyEntity
« Ответ #2 : 09-02-2023, 16:21:13 »
Борис_С,
Что такое "все элементы этого объекта"???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #3 : 09-02-2023, 17:17:47 »
Все элементы - это те элементы, из которых состоит ProxyEntity. Если я правильно понимаю,  ProxyEntity включает в себя те же элементы, что и автокад, или я не прав?

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #4 : 09-02-2023, 17:25:25 »
Прям сегодня натыкался )
https://bushman-andrey.blogspot.com/2014/12/explodeallproxy-removeallproxy.html
Это утилита от Андрея Бушмана, написанная на .NET. Повторяет функционал ARX утилиты от Александра Ривилиса, ну и позволяет перед действиями с ними увидеть их количество.
А зачем их считать?
Посмотрел утилиту. Там нет исх. кода. Мне нужно этот код вставить в свой код, написанный на с#.
Считать эти элементы мне нужно для того, чтобы получить тексты, входящие в ProxyEntity. А дальше я анализирую эти тексты и ищу в них ссылки на документы.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Как расшифровать объект ProxyEntity
« Ответ #5 : 09-02-2023, 17:57:03 »
Считать эти элементы мне нужно для того, чтобы получить тексты, входящие в ProxyEntity. А дальше я анализирую эти тексты и ищу в них ссылки на документы.
Напрямую из ProxyEntity информацию не считать, т.к. это не предусмотрено API. Нужно либо разбивать на примитивы автокада и анализировать результат после разбивки или как-то анализировать через dxf.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Как расшифровать объект ProxyEntity
« Ответ #6 : 10-02-2023, 08:39:13 »
Старая версия, не факт что работающая. Да вдобавок еще и "подправленная" моими кривыми ручками: https://autolisp.ru/2015/02/02/managed-alternative-explodeallproxy/
Уж простите, чем богаты
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Отмечено как Решение Борис_С 16-02-2023, 12:18:05

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как расшифровать объект ProxyEntity
« Ответ #7 : 11-02-2023, 22:49:16 »
Все элементы - это те элементы, из которых состоит ProxyEntity. Если я правильно понимаю,  ProxyEntity включает в себя те же элементы, что и автокад, или я не прав?
Не прав. Поясняю. ProxyEntity ничего не включает. Он возникает только в случае, когда в AutoCAD не загружен его Enabler (это может быть dbx/arx/dll-файл). В лучшем случае, и только если это предусмотрено создателем ProxyEntity можно расчленить на примитивы AutoCAD, используя метод Explode. Но во-первых, это не обязательно. Во-вторых, даже если метод Explode сработает, это не значит, что полученные примитивы будут в точности соответствовать изображению ProxyEntity (например, не будет некоторых линий или они будут не на том месте).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #8 : 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?
« Последнее редактирование: 14-02-2023, 22:23:04 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как расшифровать объект ProxyEntity
« Ответ #9 : 14-02-2023, 22:27:02 »
Как преобразовать элементы массива Db.DBObjectCollection так, чтобы воспользоваться методами процедуры FindItems?
Не нужно ничего преобразовывать. Нужно с каждым из элементов newDBObjects проделать то же, что ты проделываешь с en.
И не забывай правило форматирования кода на форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #10 : 15-02-2023, 22:32:50 »
Для обычных элементов документа AutoCad я использую
BlockTableRecord blkTblRec = acTrans.GetObject(layout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
Затем прохожу по всем ObjectId acObjId в blkTblRec
Для элемента ProxyEntity нужно использовать тот же BlockTableRecord или другой?
Дальше алгоритм будет такой же, как и для обычных элементов?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как расшифровать объект ProxyEntity
« Ответ #11 : 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.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #12 : 16-02-2023, 10:21:23 »
Я правильно понимаю, что могут быть только DBText или MText ?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как расшифровать объект ProxyEntity
« Ответ #13 : 16-02-2023, 10:25:58 »
Я правильно понимаю, что могут быть только DBText или MText ?
Из текстовых примитивов только они. Но если будешь обрабатывать и другие, то хуже не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Как расшифровать объект ProxyEntity
« Ответ #14 : 16-02-2023, 12:16:59 »
Спасибо. Все получилось. :)
И еще один вопрос. Можно найти ObjectId для элементов, из которых состоит ProxyEntity, для того,
чтобы потом позиционироваться на эти элементы?
« Последнее редактирование: 16-02-2023, 21:52:19 от Борис_С »