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

ADN Club => AutoCAD .NET API => Тема начата: alexeyOMG от 13-09-2016, 15:21:17

Название: Получение объектов, входящих внутрь полилинии
Отправлено: alexeyOMG от 13-09-2016, 15:21:17
Всем привет!

У меня вопрос. Как можно получить все объекты, входящие внутрь полилинии (границы этих объектов с полилинией не должны пересекаться)?

В следующем куске кода

Код - C# [Выбрать]
  1. var ed = doc.Editor;
  2. var polyline = ...;
  3. // Вот здесь я получаю коллекцию узлов полининии
  4. AutocadApplicationGeometry.Point3dCollection ptOneColl = PolyToPoint3dCollection(polyline);
  5. AutocadApplicatioEditorInput.PromptSelectionResult psrSelectWindows = ed.SelectWindowPolygon(ptOneColl);
  6. var objectIds= psrSelectWindows.Value.GetObjectIds();
  7.  

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

Я думал, что можно временно создавать дубликат текущей полилинии, которая будет располагаться прям поверх исходной. Но у новой полининии на дуге поставить кучу узлов на их протяжении (чтобы в итоге из узлов этой полилинии можно было сделать полигон, но не бояться за то, что углы где-то срежутся). Только я не знаю, как это сделать.
Но мб есть и более человеческий и простой вариант :)
Поэтому и вопрос: как мне можно реализовать получение объектов, входящих внутрь замкнутой полилинии, которая состоит не только их прямых отрезков, но и из дуг?
Название: Re: Получение объектов, входящих внутрь полилинии
Отправлено: Александр Ривилис от 13-09-2016, 15:25:17
Но мб есть и более человеческий и простой вариант
Нету. Правильный вариант - это сначала отобрать все объекты, которые теоретически могут попасть внутрь контура (например, по BoundingBox), а потом уже проверять попадают ли они в действительности (тут всё будет значительно сложнее и зависит от типа примитивов, которые нас могут интересовать).
Название: Re: Получение объектов, входящих внутрь полилинии
Отправлено: Александр Ривилис от 13-09-2016, 15:28:19
Я думал, что можно временно создавать дубликат текущей полилинии, которая будет располагаться прям поверх исходной. Но у новой полининии на дуге поставить кучу узлов на их протяжении (чтобы в итоге из узлов этой полилинии можно было сделать полигон, но не бояться за то, что углы где-то срежутся). Только я не знаю, как это сделать.
Здесь в коде есть алгоритм аппроксимации любой кривой (не только полилинии): http://adn-cis.org/poluchenie-tochek-peresecheniya-krivoj-i-ploskosti.html
Название: Re: Получение объектов, входящих внутрь полилинии
Отправлено: Александр Ривилис от 13-09-2016, 15:48:11
Еще хочу напомнить, что точки, которые передаются для SelectWindowPolygon должны быть в ПСК и все (!!!) видны на экране.
Название: Re: Получение объектов, входящих внутрь полилинии
Отправлено: alexeyOMG от 13-09-2016, 15:56:17
Еще хочу напомнить, что точки, которые передаются для SelectWindowPolygon должны быть в ПСК и все (!!!) видны на экране.

Да, спасибо. Я знаю. Я перед расчетом делаю зум по размерам полилинии так, чтобы она вся отображалась.

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

А как тогда реализовать проверку "а потом уже проверять попадают ли они в действительности" ?
Как проверить вхождение границ объекта внутрь полилинии?
Даже если взять просто координаты обычной точки, то как проверить, что мы кликнули внутри полилинии?
Название: Re: Получение объектов, входящих внутрь полилинии
Отправлено: Александр Ривилис от 13-09-2016, 15:59:55
Даже если взять просто координаты обычной точки, то как проверить, что мы кликнули внутри полилинии?
Ну это то совсем просто. Даже статья есть на эту тему: http://adn-cis.org/kak-sredstvami-opredelit-raspolozhenie-tochki-otnositelno-kontura.html
Для BoundingBox можно проверить попадание внутрь полилинии всех четырёх граничных точек.