Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 18-06-2014, 21:33:13

Название: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 21:33:13
Использую в работе .NET функцию Document.Editor.SelectCrossingPolygon выбора набора примитивов, которые пересекаются с набором точек. Набор точек беру из 2d-полилинии. Формирую набор Point3dCollection (координата Z=0 у всех точек). Примитивы, которые должны пересекаться тоже плоские–2D. Набор примитивов возвращается все нормально.

Но те примитивы которые находятся за пределами видимой области видового экрана монитора,
почему-то не попадают в набор. Ранее, когда использовал ActiveX такая же ситуация.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 21:38:21
И именно так и должно быть. Так сложилось исторически еще во времена AutoCAD для DOS. Вариантов только два:
1) перед вызовом Editor.SelectCrossingPolygon делать видимым всё, что нужно на экране.
2) не пользоваться Editor.SelectCrossingPolygon и делать всё тоже самое другими методами.

P.S.: Это касается всех методов Editor.SelectXXX (кроме Editor.SelectAll)
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 21:45:35
Да мне так и приходится делать "зумировать все" и только тогда.
Единственное, что пользователю вот эти "зумы" не очень нравятся.
Видимо так было задумано еще в DOS что экономить вычислительные ресурсы.
Но сейчас уже не те времена. Может сообщить разработчикам
что бы доработали функции семейства SelectionXXX.
Можно даже добавить специальный аргумент,
который бы управлял режимами работы функций.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Андрей Бушман от 18-06-2014, 21:56:17
Может сообщить разработчикам
что бы доработали функции семейства SelectionXXX
эх, наивность, "молодо-зелено"... :) С тем же успехом можно писать письма "на деревню дедушке".
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:07:17
Тогда буду писать алгоритм с использованием функции IntersectWith

При большом количестве перебора примитивов это будет работать медленно.

В этом случае мне нужно будет индексировать размещение объектов на плоскости.
Тогда в набор будет попадать небольшое количество объектов, которые рядом с этой полилинией,
сократится размер цикла для проверки пересечения и будет работать быстрее.

Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:14:28
"на деревню дедушке".

А почему так считаешь? Я напротив думаю, что Autodesk как и
любой производитель ПО заинтересован в улучшении своих продуктов
и примет во внимания наши пожелания.
 
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Дима_ от 18-06-2014, 22:17:15
Этой "особенности" 100 лет в обед...
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Андрей Бушман от 18-06-2014, 22:18:23
А почему так считаешь?
Имею некоторую практику общения по данной части.
Я напротив думаю, что Autodesk как и
любой производитель ПО заинтересован в улучшении своих продуктов
и примет во внимания наши пожелания.
Думать-то ты можешь, только практика не всегда сходится с теорией. Есть ещё и такая вещь как "планы манагеров". С качеством ПО это, как правило, не имеет ничего общего.

Никто тебе не запрещает, если хочешь - пиши им. Посмотришь результат.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 22:20:01
1. Алгоритм переделывать не будут. Уверен на 100%. Объясню почему. Алгоритм использует экранное представление примитивов и соответственно ограничен размерами экрана (или чуть больше). Такой алгоритм существенно (возможно на несколько порядков) быстрее, чем сканирование всего пространства Модели/Листа. По поводу изменения алгоритма уже обращались - ответ читай выше.
2. Можно конечно придумать массу разных алгоритмов, ускоряющих работу, но перебрать все примитивы пространства Модели/Листа всё равно придется. :( Например можно проверять пересечение BoundingBox. Кстати, IntersectWith работает далеко не со всеми примитивами. Для некоторых типов примитивов (например, BlockReference) он находит точки пересечения не с примитивами блока, а с его BoundingBox
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 22:21:48
Я напротив думаю, что Autodesk как и
любой производитель ПО заинтересован в улучшении своих продуктов
и примет во внимания наши пожелания.
Да, но не в данном случае. Эта особенность была документирована изначально и на изменение работы алгоритма они не пойдут.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:30:22
Но в моей задаче использование IntersectWith возможно, т.к. скорее блоками пока
мне не придется пользоваться.
А если и придется работать с блоками, то нужно будет "залезать" внутрь базы блока.
Правда внутри базы блока тоже есть проблема ведь координаты примитивов
хранятся, вроде как, относительно точки вставки блока.
Нужно будет клонировать примитивы блока (причем один раз для описателя блока)
со сдвигом относительно базовой точки каждого экземпляра блока.

Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:34:01
Эта особенность была документирована изначально

Да у меня были догадки, что разработчики эту задачу решили в области вывода
контекста устройства графической карты - это действительно быстрое решение.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 22:35:24
Правда внутри базы блока тоже есть проблема ведь координаты примитивов
хранятся, вроде как, относительно точки вставки блока.
Нужно будет клонировать примитивы блока (причем один раз для описателя блока)
со сдвигом относительно базовой точки каждого экземпляра блока.
Можно использовать метод Explode - в большинстве случаев он должен помочь.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:39:14
Можно использовать метод Explode

Да-да! Точняк! Про Explode совсем забыл вроде он тоже хорош! Подойдет!
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 22:39:43
Да у меня были догадки, что разработчики эту задачу решили в области вывода
контекста устройства графической карты - это действительно быстрое решение.
Не совсем так. Это не уровень карты. Есть промежуточный уровень, когда все примитивы AutoCAD (в пределах области видимости) проецируются на плоскость изображения и мы имеем плоские (но векторные, а не растровые) образы, связанные с оригинальными примитивами. А вот найти пересечение на плоскости ограниченной размерами экрана конечно же на порядок проще.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Александр Ривилис от 18-06-2014, 22:41:49
Можно использовать метод Explode
Да-да! Точняк! Про Explode совсем забыл вроде он тоже хорош! Подойдет!
Достаточно недавно обсуждали: http://adn-cis.org/forum/index.php?topic=662.msg2328#msg2328
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 22:48:42
Тогда ясно просто область выборки ограничивается экраном.
Думаю что если область выборки буду ограничивать некоторым "коридором"
полилинии, то тоже выборка будет не большой и пересечения найдутся быстрее,
чем перебирать весь набор примитивов.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: bargool от 19-06-2014, 09:43:21
Для целей поиска пересечений прекрасно подойдёт R-Tree (или другие подобные структуры данных). Искать Spatial Index (http://en.wikipedia.org/wiki/Spatial_database#Spatial_index)
Вот была большая тема (http://forum.dwg.ru/showthread.php?p=1157666&#post1157666), где обсуждали подобную задачу.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Дима_ от 19-06-2014, 10:10:38
bargool - индексация требуется если идет многократная проверка (каждой к каждому) например, или если чертеж однозначно "постоянный", при одноразовой проверке - смысла не имеет. Я бы отфильровал сначала по пересечением габаритов, а выбранные уже по факту.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 19-06-2014, 10:26:17
А у меня как раз тот случай, когда есть, к примеру, 150 отрезков, которые должны найти пересечение
с 40 000 многоугольниками и отрезками. И проверять пересечение 150 раз с 40 000 объектами - это очень долго будет.
По этому я распределяю объекты по квадратным зонам.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Дима_ от 19-06-2014, 10:31:21
По этому я распределяю объекты по квадратным зонам.
Инексируй по прямоугольным зонам. Потом фильтр по ним и непосредственно пересечение.
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Алексей (IdeaSoft) от 19-06-2014, 10:37:44
А чем лучше прямоугольники вместо квадратов, то?
Название: Re: Проблема в использовании функции SelectCrossingPolygon
Отправлено: Дима_ от 19-06-2014, 10:43:57
Тебе не надо разбивать на "сетку" - не будет эффективно (надо подбирать размер ячейки и пр.) - индексацию надо делать непосредственно по габаритам объектов - http://ru.wikipedia.org/wiki/R-tree (http://ru.wikipedia.org/wiki/R-tree), если не осилишь - просто погугли готовый алгоритм.