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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Macondo от 30-05-2016, 17:22:18

Название: Поиск объектов в многоугольной области неактивного чертежа
Отправлено: Macondo от 30-05-2016, 17:22:18
Добрый день!
Можно ли найти объекты (например, сформировав набор с фильтрами) внутри зоны (многоугольник секущий или нет) на открытом неактивном чертеже?
Пробовал делать так:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq current_actdoc (vla-Item (vla-get-Documents (vlax-get-acad-object)) "123.dwg"))
  2. (setq current_modspace (vla-get-modelspace current_actdoc))
  3.  
  4. (setq obj (vla-get-ActiveSelectionSet current_actdoc))
  5. (setq ss (vla-SelectByPolygon obj acSelectionSetWindowPolygon
  6.     (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 14))
  7.       (append (list 0 0 0) (list 0 3000 0) (list 3000 3000 0) (list 3000 0 0) (list 0 0 0)))
  8.     (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger '(0 . 0)) '(0))
  9.     (vlax-safearray-fill (vlax-make-safearray vlax-vbVariant '(0 . 0)) '("INSERT"))))
Предварительно в неактивном чертеже 123.dwg была нарисована рамка со сторонами 3000 от нулевой точки, в которую были помещены вхождения блоков.
Переменная ss имеет значение nil.

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

Может, есть какие-то протоптанные пути для этой задачи?
Название: Re: Поиск объектов в многоугольной области неактивного чертежа
Отправлено: Александр Ривилис от 30-05-2016, 20:38:09
Переменная ss имеет значение nil.
Думаю, что именно так оно и должно быть. В конечном итоге все эти ActiveX-овские функции (vla-SelectXXX) сводятся к (ssget) (или acedSSGet в ObjectARX), а они работают только с активным чертежом.
Название: Re: Поиск объектов в многоугольной области неактивного чертежа
Отправлено: Александр Ривилис от 30-05-2016, 20:43:51
Вторым вариантом я думал перебрать все объекты неактивного чертежа и сопоставить точку вставки вхождения блока с точками контура, но не знаю математического алгоритма принадлежности точки сложному контуру.
А вот это правильный алгоритм. Особенно если у тебя контур не имеет дуг.
Например:
http://geol-dh.narod.ru/spds/func-is-in-contour.html
http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=36191&MID=205575#message205575
http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=36191&MID=205580#message205580
Кстати и работать должно значительно быстрее. Ведь здесь чистая математика.
Название: Re: Поиск объектов в многоугольной области неактивного чертежа
Отправлено: Macondo от 02-06-2016, 02:45:32
Спасибо за ссылки! Особенно понравился самый маленький математический алгоритм. Работает  :)