Сообщество программистов Autodesk в СНГ
ADN Club => ObjectARX => Тема начата: AlexZhur от 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 для ее скрытия и отображения?
-
AlexZ
А теперь всё тоже самое, но по-русски без всех этих УГО и ЗО. Кстати, класса AcDbBlockRecord в ObjectARX нет. Есть AcDbBlockTableRecord и есть AcDbBlockReference. Зачем нужен CustomEntity я совсем не понял.
-
- оптимальное ли это решение (и правильное ли оно) для поставленной задачи?
Я считаю, что не только не оптимальное, но плохо реализуемое.
-
Спасибо за поправку по поводу классов. :-[
CustomEntity мне нужен для описания и реализации специфических данных и методов, присущих определенным типам устройств. При этом некоторые устройства имеют визуальное представление, а некоторые нет. Например - охранный извещатель характеризуется условным графическим отображением + пользователь может захотеть посмотреть его зону обнаружения, а потом ее скрыть на чертеже.
Визуализацию CustomEntity я хотел выполнить универсально, на основе ранее определенных данных в библиотеке блоков.
-
Тогда уточнение. Custom Entity на основе AcDbBlockTableRecord сделать нельзя. AcDbBlockTableRecord - не является Entity. На его основе можно сделать Custom Object. А вот AcDbBlockReference - это Entity и на его основе теоретически можно сделать Custom Entity.
-
Наследование моего Custom Entity будет от AcDbEntity, но рисование планируется на основе примитивов, входящих в AcDbBlockTableRecord, которые импортируются из библиотеки блоков в текущую БД, т.е. метод subWorldDraw() моего Custom Entity будет вызывать в итерации методы subWorldDraw() примитивов, входящих в AcDbBlockTableRecord.
-
т.е. метод subWorldDraw() моего Custom Entity будет вызывать в итерации методы subWorldDraw() примитивов, входящих в AcDbBlockTableRecord.
1. А если кому-то придёт в голову выполнить _PURGE и описаний твоих блоков не станет?
2. Учти, что из методов Custom Entity нельзя открывать/читать другую AcDbDatabase - Fatal Error обеспечен. Так что AcDbBlockTableRecord должны быть в текущей базе.
3. subWorldDraw - это конечно хорошо. А как дела с привязками, ручками и т.д. и т.п.?
Это на вскидку несколько проблем, с которыми ты столкнешься.
-
Тогда, может быть подскажите, как лучше оптимально реализовать мою задачу, чтобы не писать свою реализацию метода subWorldDraw() для каждого типа устройства, учитывая что стандарты по условным графическим отображениям меняются. А так графику блока изменил и все. Может есть какие- нибудь приемы. Плюс к этому необходимо по запросу часть графики объекта отображать, а часть скрывать.
-
Тогда, может быть подскажите, как лучше оптимально реализовать мою задачу
Увы, но тут я не подскажу. Я бы не стал хранить эту информацию в AcDbBlockTableRecord. Скорее некий внешний xml-файл, описывающий устройство. Возможно будет удобно написать команду, которая бы на основе AcDbBlockTableRecord формировала бы такой xml-файл.