Тема: AcEdSSGetFilter

Кто-нибудь работал с этой штукой?
В частности, как добивить в набор что-нибудь внутри метода ssgetAddFailed(...)

Re: AcEdSSGetFilter

Можно чуть подробней? Зачем добавлять именно внутри метода ssgetAddFailed(...)?
Как надо добавить - вызвать чтоб юзер что-то ткнул или программно?

Re: AcEdSSGetFilter

Есть 'Custom Entity' который имеет "тело" и "текст". Теперь, если пользователь что-то как-то выбирает, то в набор должны попадать только те объекты, "текст" которых удовлетворяет условию выбора. Например, используется рамка (не секущая) - в набор попадают те объекты "текст" которых находится в рамке.

Re: AcEdSSGetFilter

AcEdSSGetFilter - это реактор на события по селекшену. Если объект не попал полностью в несекущую рамку, то он не попадет в селекшен сет, все события реактора AcEdSSGetFilter - происходят уже по факту. Т.е. придется по endSSGet(...) - как-то САМОМУ вычислять объекты, текст которых таки в рамку попал - после чего добавлять эти объекты в SS.
Выцепить координаты рамки можно в AcEdInputPointMonitor. Потом программно получить селекшен сет пересекающейся рамкой - и выбрать только те объекты из полученного SS, текст которых лежит в рамке (при этом надо не забывать, что рамка вещь плоская и что в нее попадает зависит от View в котором находишься). Короче твоя задумка страшный гемор.
Сделай отдельно CustomEntity тела и текста - которые будут провязаны отношениями AcDbHardOwnershipId (см. хелп owner-ownee relationship). Тогда по событию endSSGet - будешь получать все тексты в рамочке и при необходимости добавлять тела-владельцы текста в SS.

Re: AcEdSSGetFilter

Даже не знаю что и сказать...
Поднятый мною вопрос касается либо бага в ssgetAddFailed(), либо моего непонимания цели этого метода. Суть проблемы в том, что AcEdSelectionSetService::add(...) сообщает, что все, что я добавляю, добавляется, но в действительности в набор не попадает.
Использование endSSGet() - да, наверное, но в этом случае появляется такая проблема, что в процессе выбора пользователь получает автокадные мессаги типа
"0 found"
"0 found"
а потом, вдруг (по окончании выбора)
"121 found"
Обходные пути (AcEdInputPointMonitor) конечно ДА, куда же без них..., а вот по поводу перепроектирования объектов, это, в моем случае, уж слишком круто.

Re: AcEdSSGetFilter

ssgetAddFailed() - это сообщение когда в subselection - ты не выбрал ни одного объекта или уже выбранные в селекшене.
subselection - это примитивное действие в процессе selection.
Чтоб понять.
1) Открой акад.
2) Поставь два кружка.
3) Набей команду select
4) теперь ты можешь много раз выделять объекты.
5) Посмотри что пишется. Если выбрал то пишется сколько, если нет, то 0 found и приходит сообщение ssgetAddFailed().
6) Завершаешь команду select - тебе приходит endSSGet(...) и в конце пишется сколько ты всего навыделял (n found).

Re: AcEdSSGetFilter

5) Посмотри что пишется. Если выбрал то пишется сколько, если нет, то 0 found и приходит сообщение ssgetAddFailed().

Так вот теперь, когда автокад ничего не выбрал, мне и нужно добавить то, что в соответствии с моим замыслом должно попадать.
ssgetAddFailed() приходит до "0 found" - в этом и соль.
А за подробные разъяснения workflow of selecting, спасибо конечно, огромное. :)

Re: AcEdSSGetFilter

Наверное уже я чего-то не понимаю...
Допустим у тебя три твоих объекта (тело + текст).
Ты выделил их рамкой так, что 2(два) объекта попали полностью, а 1(один) только текст, тогда по твоему замыслу в селекшен должны попасть все 3(три) объекта - но акад напишет что 2 добавлено и метод ssgetAddFailed - вообще не вызовется... т.к. никакого Failed не произошло...

Re: AcEdSSGetFilter

Ты выделил их рамкой так, что 2(два) объекта попали полностью, а 1(один) только текст, тогда по твоему замыслу в селекшен должны попасть все 3(три) объекта

Совершенно верно, но только в этом случае (когда два объекта попали полностью) вызывается ssgetAddFilter() а не ssgetAddFailed() и все работает ОК.
Но вот если в рамку попали только 2(два) текста и ни одного объекта полностью, вызывается ssgetAddFailed().
В этом случае, как и в ssgetAddFilter(), я, при помощи AcEdSelectionSetService::add(...) добавляю в селешен те два объекта, тексты которых попали в рамку, и получаю eOk. Но в действительности ничего не добавляется.
Вот такая проблема. На мой взгляд это очень похоже на баг - класс сравнительно новый да и функциональность специфичная.