CustomEntity на основе AcDbBlockRecord

Автор Тема: CustomEntity на основе AcDbBlockRecord  (Прочитано 8762 раз)

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

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
CustomEntity на основе AcDbBlockRecord
« : 22-06-2017, 15:40:14 »
Добрый день.  Возникла острая необходимость создания CustomEntity на основе данных из стороннего dwg файла с библиотекой блоков.
Задача такая:
   1. в зависимости от выбора пользователя, на текущий dwg файл надо вставить CustomEntity, который "висит" на курсоре с запросом точки вставки и угла поворота.
   2. УГО  CustomEntity должно отрисовываться на основе одного из ранее определенных блоков из библиотеки блоков, находящейся в  стороннем dwg файле.
   3.  CustomEntity представляет собой объект, который помимо собственного УГО, может иметь так называемую, представленную графически, зону обнаружения (ЗО), с которой можно сразу вставлять CustomEntity (соответственно ЗО "висит" вместе с УГО на курсоре до момента определения точки вставки и угла поворота) или которую можно отображать/ скрывать по команде пользователя, т.е. пользователь может щелкнуть по УГО с ЗО и скрыть ЗО, либо по УГО  CustomEntity и отобразить ЗО. При этом УГО у разных объектов может быть одно и тоже, но ЗО  может быть разная (в зависимости от конкретной марки устройства).
 Предполагаемое решение:
 1. УГО и ЗО (для каждой марки) реализовать в виде отдельных блоков в библиотеки блоков (соответствие УГО с нужной  ЗО определяется в СУБД).
 2. По запросу пользователя импортировать нужные AcDbBlockRecord-ы  (УГО и ЗО) в текущий dwg-файл.
 3. На основе данных из AcDbBlockRecord-ов реализовать метод subWorldDraw() для отрисовки своего  CustomEntity, а затем с помощью Jig-а вставить его в текущий dwg файл.
 Вопросы:
   - оптимальное ли это решение (и правильное ли оно) для поставленной задачи?
  - как идентифицировать ЗО в составе CustomEntity для ее скрытия и отображения?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #1 : 22-06-2017, 15:45:52 »
AlexZ
А теперь всё тоже самое, но по-русски без всех этих УГО и ЗО. Кстати, класса AcDbBlockRecord в ObjectARX нет. Есть AcDbBlockTableRecord и есть AcDbBlockReference. Зачем нужен CustomEntity я совсем не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #2 : 22-06-2017, 15:49:37 »
- оптимальное ли это решение (и правильное ли оно) для поставленной задачи?
Я считаю, что не только не оптимальное, но плохо реализуемое.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Re: CustomEntity на основе AcDbBlockTableRecord
« Ответ #3 : 23-06-2017, 11:54:43 »
Спасибо за поправку по поводу классов.  :-[
CustomEntity мне нужен для описания  и реализации специфических данных и методов, присущих определенным типам устройств. При этом некоторые устройства имеют визуальное представление, а некоторые нет. Например - охранный извещатель характеризуется условным графическим отображением + пользователь может захотеть посмотреть его зону обнаружения,  а потом ее скрыть на чертеже.
Визуализацию CustomEntity я хотел выполнить универсально, на основе ранее определенных данных в библиотеке блоков.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #4 : 23-06-2017, 11:59:30 »
Тогда уточнение. Custom Entity на основе AcDbBlockTableRecord сделать нельзя. AcDbBlockTableRecord - не является Entity. На его основе можно сделать Custom Object. А вот AcDbBlockReference - это Entity и на его основе теоретически можно сделать Custom Entity.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #5 : 23-06-2017, 12:11:20 »
Наследование моего Custom Entity будет от AcDbEntity, но рисование планируется на основе примитивов, входящих в  AcDbBlockTableRecord, которые импортируются из библиотеки блоков в текущую БД, т.е. метод subWorldDraw() моего Custom Entity будет вызывать в итерации методы subWorldDraw() примитивов, входящих в  AcDbBlockTableRecord.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #6 : 23-06-2017, 12:26:05 »
т.е. метод subWorldDraw() моего Custom Entity будет вызывать в итерации методы subWorldDraw() примитивов, входящих в  AcDbBlockTableRecord.
1. А если кому-то придёт в голову выполнить _PURGE и описаний твоих блоков не станет?
2. Учти, что из методов Custom Entity нельзя открывать/читать другую AcDbDatabase - Fatal Error обеспечен. Так что AcDbBlockTableRecord должны быть в текущей базе.
3. subWorldDraw - это конечно хорошо. А как дела с привязками, ручками и т.д. и т.п.?
Это на вскидку несколько проблем, с которыми ты столкнешься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #7 : 23-06-2017, 12:58:15 »
Тогда, может быть подскажите, как лучше оптимально реализовать мою задачу, чтобы не писать свою реализацию метода subWorldDraw() для каждого типа устройства, учитывая что стандарты по условным графическим отображениям меняются. А так графику блока изменил и все. Может есть какие- нибудь приемы. Плюс к этому необходимо по запросу часть графики объекта отображать, а часть скрывать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity на основе AcDbBlockRecord
« Ответ #8 : 23-06-2017, 13:22:31 »
Тогда, может быть подскажите, как лучше оптимально реализовать мою задачу
Увы, но тут я не подскажу. Я бы не стал хранить эту информацию в  AcDbBlockTableRecord. Скорее некий внешний xml-файл, описывающий устройство. Возможно будет удобно написать команду, которая бы на основе AcDbBlockTableRecord формировала бы такой xml-файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение