Тема: Как выбрать обьекты, находящихся вне видимой области?

Столкнулся со соледующей проблемой
следующий код

acedSSGet("C", m_pnt1, m_pnt2, &eb1, m_ssname);

работает только с обьектами, находящимися на экране, можно ли провести выбор и среди обьектов находящихся вне видимой области?

Re: Как выбрать обьекты, находящихся вне видимой области?

Вопрос в догонку,
Как выбрать обьекты с выключенного слоя?

Re: Как выбрать обьекты, находящихся вне видимой области?

> alex
1) Чтобы сильно не мучатся советую сделать на момент выбора так, чтобы точки m_pnt1 и m_pnt2 находились на экране. Иначе тебе придется пройтись по всей базе чертежа.
2) С выключенного слоя примитивы можно получить используя acedSSGet ("_X",...) с фильтром по слою или проходом по всей базе чертежа...

Re: Как выбрать обьекты, находящихся вне видимой области?

> Александр Ривилис
Иначе тебе придется пройтись по всей базе чертежа
И то не получитя. Потому что selection - это видо-зависимая операция. Т.е. указывается не кирпич 3D в котором надо найти объекты, а окошко 2D - "смотря" через которое надо выбрать "видимые" элементы. Посему что такое обйти всю базу для идентификации попдания объекта в selection set я не представляю...

Re: Как выбрать обьекты, находящихся вне видимой области?

> KonstantinM
Ну не все так уж страшно, Константин. smile
Если очень упрощенно, то можно спроецировать точки m_pnt1 и m_pnt2 из UCS в DCS (получить m1_DCS, m2_DCS), пройтись по всем примитивам базы и для каждой проекции их BoundingBox в плоскость взгляда проверить на попадание внутрь прямоугольника (m1_DCS, m2_DCS). Это для случая, если выбор нужно сделать рамкой, для секрамки все несколько сложнее. Это все IMHO и очень-очень приблизительно, а главное значительно (возможно на порядок) медленне, чем acedSSGet("_С",...), т.к. для примитивов, находящихся на виртуальном экране, AutoCAD использует совсем другие алгоритмы для выбора примитивов.

Re: Как выбрать обьекты, находящихся вне видимой области?

> alex
Итераторы, итераторы и еще раз итераторы...

Re: Как выбрать обьекты, находящихся вне видимой области?

> Александр Ривилис
:) - Ну дак блин е-мое... одни буквы и цифры. Можно свое окошко написать, где самому отображать приметивы, селектить, бегать по базе, заниматься трансформацией систем координат... короче все это от плохой жизни...
вернее даже от плохой модели автокада. (Ругать не строить, но все понимают что все корни уходят в глубокое прошлое откуда растет много проблем )
Например было бы не хило для AcDbBlockTableRecorda - сделать некий класс AcDbBlockTableModel - который был бы нагружен полезной функциональностью типа.
______________________________
Конструктор:
AcDbBlockTableModel::AcDbBlockTableModel(blkId)
Global Model Functions
select(3DSpace) (всякие селекты, по 3D областям)
select(Layer) (селекты по слоям)
....
View Model Functions
setViewCamera( pos, Matrix ) - установка камеры
getObjectsInView(_ARR<AcDbObjectId>&)
select( 2dBox ) - селекты по рамке и контурам...
...
________________________________
Ну почему World и View - вообще разнесены и не связаны в одну модель, почему такая привязка к приметивам на дисплее (виртуальном)? Я уже ранее писал, что если объект поставить Invisible, то он вообще исключается из всяких операций input point processing - а от сюда растет куча бед с update-ами, refresh-ами. Короче то что видно на экране - реально завязали с моделью.
Поясню. Все объекты отрисовывают себя в worldDraw в конечном итоге приметивами. Далее эти приметивы запоминаются в некотором дереве AcGsModel. Далее AcGsModel отображается на экран. Весь input point processing происходит не с реальными объектами а через AcGsNode - достукиваются до реальных объектов (типа получить osnap и все такое). Как результат косяки когда в процессе input point-нга (gripping, dragging еtс) происходит изменение каких-либо объектов - это отображается не сразу. Более того при gripping, dragging - вставляют в AcGsModel приметивы, которые принадлежат объектам не из модели (типа клон таскаемого объекта), при flushGraphics() - для изменившихся объектов убивают их старые AcGsNode - (приметивы) и вставляют новые - т.е. дергают worldDraw() - и в этот момент убивают все AcGsNode - темпоральных объектов. Посему модификация объектов при dragging-е приводит к "глюкам". Кстати уже только саму AcGsModel - отображают на экране.... при этом если что-то не попало в "вид", то вообще исключают из input point processinga...
Хотя спорить не буду - в целом модель как она есть сейчас получилась приемлемой, но со своими проблемами и косяками.
А сделать даже для ObjectARX что-нибудь аля AcDbBlockTableModel как я описал выше - вообще не вижу проблем т.к. это расширение старого а не его изменение... Но не каждому же пользователю это делать самому и итераторами бегать по базе, паралельно трансформируя системы координат и точки...

Re: Как выбрать обьекты, находящихся вне видимой области?

[А про GSMarker-ы я вообще молчу.]
worldDraw( mode )
{
AcDb3dPolyline pln1;
AcDb3dPolyline pln2;
pln1 (делаем пять вершин);
pln2 (делаем четыре вершины);
mode.geometry().setGsMarkerId(0);
pln1.worldDraw(mode);
mode.geometry().setGsMarkerId(1);
pln1.worldDraw(mode);
}
Понятно, что просетить свои маркеры - дохлый номер т.к. в worldDraw - подобъекта они переопределятся в свои....
Посему вопрос - как узнать в какую полилайн ткнули по GSmarker-у где-нибудь в getOsnapInfo или processInputPoint?
Посему маркер должен быть не int, а _ARR<int>
Они попытались это замазать через getGSMarkerPath и getPathByGsMarker - но это все такое фуфло... что делать если объекты не резиденты базы данных, а просто темпорально созданы в worldDraw как в примере выше?

Re: Как выбрать обьекты, находящихся вне видимой области?

Константин. А к чему это все? Вы же понимаете, что "те корни" - не выдернуть (дерево может упасть). Так что приходится пользоваться тем, что уже в нем есть и тихо надеятся, что что-нибудь полезное добавят. Я не имею в виду "баги" - их и так добавят. smile
Ну а если говорить о конкретном вопросе, то ничего лучше, чем найти к какой из полилиний указанная точка будет ближе (с учетом направления взгляда и т.д.) я предложить те могу. Но это не значит, что такого способа нет - просто я его не знаю. :(

Re: Как выбрать обьекты, находящихся вне видимой области?

Я это к тому, что такой способ потенциально возможен, но реализовывать его для коммерческого использования я бы не стал. Т.к. при реализации встретилась бы еще куча проблем.
Просто у меня была такая же фишка один в один как тема топика. Только для открытого неактивной (не текущей) базы.
1) Просто изменил логику программы чтобы операция выполнялась только если база это текущий документ.
2) Перед оной операцией делаю команду _zoom _e, то бишь активный документ отобразить полностью.
Могу предложить как вариант перед select-ом - смотреть попадает ли вид в рамку, если нет, то подстраивать его чтоб рамка попадала...