(изменено: Константин М, 4 апреля 2012г. 15:01:46)

Тема: Можно ли реализовать поведение у своей Entity как у объектов Архитектуры. Различное представление в разных вьюпортах?

Есть два блока. В них отрисовано представление чего-либо в 2D и 3D варианте.

Надо сделать объект (своя энтитя)аналогичный BlockReference, но чтоб он ссылался на два эти блока и умел отрисовывать себя в вьюпорте "сверху (или снизу)" как 2Д, в противном случае 3Д. Так же как ведут объекты в архитектуре.

Проблем с реализацией в целом нет. Есть концептуальная проблема.
1. Для этого придуман viewportDraw, но он не для постоянной графики и поэтому если с vieportDraw моей энтити пытаться переделигировать viewportDraw энтитям из блока, то ничего не выйдет, ибо у них viewportDraw чистенький (Например, AcDbLine не отрисует себя)

Позвать из viewportDraw - worldDraw объектам из блока не получится.

2. Возвращаемся в worldDraw основного объекта... Это блин отрисовка независимой от вьюпортов постоянной графики. Можно там начинать выяснять кто щас активный, worldToScreen и т.п. - только не задейзанен походу метод worldDraw, чтоб рисовать разные представления в разные вьюпорты.

Вопрос к знающим людям  ;) - как реализована оная фича в Архитектуре. Есть ли идеи как можно таску свыше реализовать в Автокаде.

Re: Можно ли реализовать поведение у своей Entity как у объектов Архитектуры. Различное представление в разных вьюпортах?

Надо сделать объект (своя энтитя)аналогичный BlockReference, но чтоб он ссылался на два эти блока и умел отрисовывать себя в вьюпорте "сверху (или снизу)" как 2Д, в противном случае 3Д.

единственное, что сразу приходит на ум, это делать контейнерный объект (внутрь можно напихать кучу стандартных акадовских объектов разных типов), который будет включать в себя сразу все блоки. А в его wordDraw или viewportDraw (это как кому удобней) будет только определяться текущее положение осей и выставление видимости тому или иному элементу этого объекта (блоку).
Вот только есть одна мааааленькая проблема - AcDbBlockReferences не должны быть динамическими или содержать атрибуты. Это общее ограничение на наследование от AcDbBlockReferences и не только для контейнерных объектов.

(изменено: Николай, 13 апреля 2012г. 17:00:29)

Re: Можно ли реализовать поведение у своей Entity как у объектов Архитектуры. Различное представление в разных вьюпортах?

как реализована оная фича в Архитектуре

если еще интересно, полазил я по адн-овскому сайту.
в архитектуре есть классы:
- AecDbMvBlockDef
- AecMvBlockViewDefinition
Вот через них все и делается. в акадовском arx таких классов нет :(

маленькое уточнение. Это классы OMF (Object Modeling Framework). OMF - это типа надстройки над ObjectARX для ADT (про возможность пользоваться в чистом автокаде ничего нет. так что скорей всего пользоваться можно только в архиректуре)

Re: Можно ли реализовать поведение у своей Entity как у объектов Архитектуры. Различное представление в разных вьюпортах?

Николай пишет:

единственное, что сразу приходит на ум, это делать контейнерный объект (внутрь можно напихать кучу стандартных акадовских объектов разных типов), который будет включать в себя сразу все блоки. А в его wordDraw или viewportDraw (это как кому удобней) будет только определяться текущее положение осей и выставление видимости тому или иному элементу этого объекта (блоку).

Проблема ровно в том что, если показывать MyEntity в двух viewport-ах, то при вызове метода worldDraw() представление энтити будет одинаково перерисовано в обоих видах... Т.е. можно там теоретически подсесть на переключение видов и в worldDraw() что-то там рисовать в зависимости от активного вью. Но если мы включим N-вью режим и изменим какой-то параметр у объекта, то worldDraw() будет позван только один раз, а перегенерится во всех вью.

В идеале я бы вообще хотел два монитора. На первый редактирую в виде сверху, на втором мониторе смотрю трехмерную модельку... но текущая архитектура Автокада обламавыет даже с тем, чтоб на разные мониторчики разнести представление одной базы (DWG)... Да просто не получится два разных документа растащить за пределы контейнерного окна... MFC MDI - технология...

Re: Можно ли реализовать поведение у своей Entity как у объектов Архитектуры. Различное представление в разных вьюпортах?

А если сделать свои классы рисования (наследники от AcGiWorldDraw, AcGiWorldGeometry) и использовать их как переходники информации из рисуемых сущностей? Получится, что при вызове viewportDraw нашего класса будет вызываться WorldDraw той же линии, но данные оттуда будут попадать в AcGiViewportDraw.

Т.е. сделать класс myWorldDraw: public AcGiWorldDraw
и класс myWorldGeometry: public AcGiWorldGeometry, используемый myWorldDraw для рисования.

Затем в viewportDraw нашего класса создать экземпляр myWorldDraw (myWorldDrawInst) и передать ему данные из viewportDraw.

Затем для каждой рисуемой сущности вызвать WorldDraw(&myWorldDrawInst)
И в каждом методе рисования myWorldGeometry, вызывать соответствующие методы какбудто мы их вызываем из viewportDraw нашего класса.

Пример:
Adesk::Boolean myWorldGeometry::polyline(const AcGiPolyline &poly) const
{
m_activeVD->geometry().polyline(poly);
}, где m_activeVD берётся из viewportDraw нашего класса.