Тема: SubEntity и GS marker

Здравствуйте!
1. Опираясь на пример SubEntity, добавил в метод worldDraw отрисовку таблицы. Перед отрисовкой установил gs marker, отрисовывал через mode->geometry().draw(mptable);.
   При отладке выделяется примитив стоящий в методе worldDraw перед моей таблицей.
2. Добавил в пример реализацию собственного примитива, рисующего окружность, помеченную gs маркером 11. далее добавил отрисовку своего примитива в метод worldDraw примера, указав gs marker 5.
   При отладке выделяется окружность моего подпримитива, но фигурирует только маркер 11.
3. В метод worldDraw собственного примитива добавил отрисовку таблицы - при отладке результат как в пункте 1.

Вопрос:
1. Как выделить таблицу?
2. Как работают gs маркеры и почему они могут перекрываться(если указать при отрисовки окружности в п.2 gs маркер из примера, то выделится несколько примитивов)?
3. На сколько мощный механизм GS маркеры и какова перспектива их использования: можно ли их использовать кроме как для выделения подпримитивов?

(изменено: Александр Ривилис, 11 июня 2010г. 23:40:13)

Re: SubEntity и GS marker

Все IMHO, т.к. такого не делал.
1. Таблица - это сложный примитив, состоящий из кучи линий и текстов. Соответственно целиком по одному GS выделить его не получится.
2. Без кода непонятно.
3. Они предназначены именно для выделения подпримитивов.

Re: SubEntity и GS marker

Спасибо за ответ!
   1. Поскольку таблица - сложный примитив, я решил поэкспериментировать и создал собственный примитив, реализовав метод worldDraw следующим образом:

   ...
   mode->subEntityTraits().setSelectionMarker(11);
   mode->geometry().circle(AcGePoint3d(0,0,0),15, AcGeVector3d::kZAxis);
   
   mode->subEntityTraits().setSelectionMarker(12);
   mode->geometry().circle(AcGePoint3d(3,3,0),15, AcGeVector3d::kZAxis);
   ...

   Теоретически, созданный мной примитив является сложным, т.к. состоит из двух окружностей. Но при выделении, в сравнении с таблицей, все отлично, за исключением используемых маркеров.
   Ниже привожу дополнение к методу worldDraw примера:

   ...
   mode->subEntityTraits().setSelectionMarker(5);
   mode->geometry().draw(MyObj);
   ...

   2. По поводу маркеров... В примере SubEntity используются следующие маркеры:

   ...
   #define CRANK 1
   #define LINK 2
   #define PINS 3
   #define PISTON 4
   ...
   
   Если изменить метод worldDraw собственного примитива на

   ...
   mode->subEntityTraits().setSelectionMarker(1);
   mode->geometry().circle(AcGePoint3d(0,0,0),15, AcGeVector3d::kZAxis);
   
   mode->subEntityTraits().setSelectionMarker(2);
   mode->geometry().circle(AcGePoint3d(3,3,0),15, AcGeVector3d::kZAxis);
   ...

   то при выделении первой окружности вместе с ней выделится CRANK, а при выделении второй - LINK.

   2,5. В метод getSubentPathsAtGsMarker примера для идентификации используемого маркера добавил следующий код:

   ...
   acutPrintf(L"\ngetSubentPathsAtGsMarker: %i",gsMark);
   ...

   В результате, при использовании уникальных маркеров, при выделении окружностей в командной строке появляется:

   getSubentPathsAtGsMarker: 11
   getSubentPathsAtGsMarker: 12

   Соответственно для первой и второй окружности моего подпримитива. Все справедливо... Но почему нигде не указывается маркер 5, используемый для отрисовки моего сложного примитива?

   3. В примере SubEntity реализован метод subentPtr, служащий для создания точной копии выделенного подпримитива на каком-то из этапов выделения. Можно ли использовать этот метод для управления подпримитивов? и На каком этапе выделения этот метод используется?

(изменено: Александр Ривилис, 12 июня 2010г. 21:10:00)

Re: SubEntity и GS marker

Видимо ты не понял то, о чем я написал. Таблица - сложный примитив, т.е. при ее отрисовке (в ее собственном методе worldDraw()) IMHO используется (и неоднократно) mode->subEntityTraits().setSelectionMarker(); и таким образом сбивается твоя нумерация. Тот пример, который ты привел в п. 1 неудачный, т.к. здесь ты сам контролируешь задание маркеров, а когда вызываешь mode->geometry().draw(mptable); не можешь проконтролировать задание маркеров, которые используются в AcDbTable::worldDraw()

Re: SubEntity и GS marker

Спасибо за ответ!
Возможно Вы и правы, Александр. Но, исходя из понятия, что таблица - это сложный примитив, состоящий из совокупности простых примитивов (типа линий и текста), помеченных gs маркером либо индивидуально, либо группами, получаем, что, в рамках указанного выше определения, таблица ни чем не отличается от сложного пользовательского примитива.
Основываясь на данном факте, выделение таблицы должно происходить, как и выделение в пользовательском объекте, порционально, т.е., если при использовании пользовательского объекта выделяется одна из окружностей, то при использовании таблицы должны выделяться линии либо группы примитивов (в зависимости от использования маркеров).
Из-за отсутствия хоть каких-либо проявлений селекции, при использовании таблицы, ставится под вопрос использование GS маркеров при реализации AcDbTable. Подтверждением служит поведение пользовательского объекта при отсутствии в его реализации GS маркеров - ничего не выделяется, как и при использовании таблицы.
Т.о. можно предположить, что AcDbTable либо не использует GS маркеры, либо использование этих маркеров вместе с другими маркерами не удовлетворяет общим условиям использования GS маркеров (типа наличия всех подпримитивов на одном слое). Из чего можно сделать вывод, что использование таблиц, как подпримитивов, нецелесообразно, в виду  отсутствия  полной функциональности.