Еще не успел опробовать данное решение, но что-то мне не нравится.Что именно не нравится?
я только начал изучать ObjectARX.Начинать изучение ObjectARX с создания Custom Entity - это не лучший вариант.
Начинать изучение ObjectARX с создания Custom Entity - это не лучший вариант.Ничего не поделать, обстоятельства. Но имея опыт программирования на C++ / C# и разработки под Компас-3D, Solidworks разобраться можно. Я как раз читаю книгу Полещука, вроде всё ясно. Тут дело в другом - возможно я выбрал не оптимальное решение.
А нельзя ли в AcDbEntity или AcDbObject как-то поиграть с рендером?Нет конечно. AcDbEntity вообще ничего не знает про рендер.
Мне нужно сделать простой интеллектуальный объект и тут AcDbEntity идеально подходит (возможно я ошибаюсь).Я не знаю что представляет из себя этот "интеллектуальный объект", поэтому сложно дать рекомендации по тому от какого класса следует наследовать.
1) Использовать Wipeout (маскировка). Вроде оптимальное решение, но смущает факт необходимости добавления Wipeout в AcDbBlockTableRecord для возможности отображения. Остальные же графические объекты унаследованные от AcDbEntity можно просто отображать с помощью метода worldDraw(mode).Проблема связана с тем, что огромную роль играет порядок отображения объектов. Если объекты за твоим объектом будут отрисованы после твоего объекта, то твой объект их не скроет. И тут в игру вступает AcDbSortentsTable, которая управляет порядком прорисовки объектов на уровне блока.
Но когда я хочу перенести свой объект, то возникает фатальная ошибка. Не могу понять из-за чего.Перенос - это что? Команда _MOVE? Но в примере нет переопределения subTransformBy, который должен вызываться в этом случае. Это же просто минимальный пример.
Да, я про subTransformBy. Я создал свой компонент на основе AcDbEntity и он хорошо переносится. Вся проблема в добавлении AcDbWipeout.Запусти под отладчиком и посмотри что происходит в этом методе. И вообще-то на код нужно глянуть - я по фотографии не лечу. :-)
Но когда я начинаю перемещать объект и вызывается отрисовка, то AcDbObjectId равен нулю, что вызывает ошибку! Что-то не могу понять как переменная моего класса обнуляется...О! Обрати внимание на методы dwgInFields и dwgOutFields в том примере. Наверняка ты забыл:
Кстати, я решил работать не с AcDbBlockTableRecord в своем кастомного компоненте (как было в примере), а сразу AcDbWipeout, передавая его AcDbObjectId в свой компонент и используя метод acdbOpenAcDbEntity в самом компоненте. Так я могу менять и свойства Wipeout'а (размер и положение) и отрисовывать его. Или это не верно?А где он в этом случае находится? Анонимный AcDbBlockTableRecord использовался в примере для того, чтобы он "не путался под ногами", т.е. не был виден в чертеже.
Но вот сижу и думаю как это работает... ИД объекта (AcDbObjectId) постоянно меняется?! Мне казалось что методы dwgInFields и dwgOutFields служат только для сохранения файла на диске. Нужно ли удерживать указатель в dxfInFields и dxfOutFields?Id-объекта не меняется. Меняется только если закрыть dwg-файл и повторно его открыть. dwgInFields и dwgOutFields используются во многих случах, но в данном случае при создании клона примитива, который и перетаскивается, пока оригинальный остаётся на месте. Т.е. сначала срабатывает конструктор твоего класса, создавая новый экземпляр твоего примитива, потом dwgOutFields для оригинального примитива, а затем dwgInFields для новый экземпляра заполняет его значениями.
Нужно ли удалять AcDbBlockTableRecord (в котором находится AcDbWipeout) при удалении кастомного объеста?Во-первых, нет необходимости - _PURGE удалит этот блок, если на него нет никаких ссылок (HardPointerId).
В деструкторе моего кастомного компонента разве нельзя удалить?Нет. Деструктор "закрывает" объект если он уже в базе, а не удаляет его. Удаляет (точнее ставит пометку об удалении) метод erase() твоего объекта.
Если на объект никто не ссылается, то он потом уничтожается?Во всяком случае _PURGE может его удалить.