Обнаружил странности в работе vla-SelectAtPoint. Задача такая: найти все объекты с заданными свойствами (а именно линии, полилинии и вхождения блоков, имеющие расширенные данные), проходящие через указанную точку.
Сначала я думал, что получится вот такая конструкция:
Вот, что получилось:
(if (= (type (setq pt (vl-catch-all-apply (function (lambda () (trans (getpoint "\nУкажите точку: ") 1 0)))))) 'list)
(progn
;Создание набора (если есть, то создаём заново):
(setq ssets (vla-get-selectionsets actdoc))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list ssets "Set")))
(setq newSet (vla-add ssets "Set"))
(progn
(vla-delete (vla-item ssets "Set"))
(setq newSet (vla-add ssets "Set"))
);progn
);if
;Помещение в набор всех линий и вхождений блоков с расширенными данными:
(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 9)))
(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 9)))
(vlax-safearray-fill filter_code '(-4 -4 0 -3 -4 -4 0 -3 -4 -4)); DXF-группы для фильтра
(vlax-safearray-fill filter_value '("<OR" "<AND" "*LINE" "'(\"MyApp\")" "AND>" "<AND" "INSERT" "'(\"MyApp\")" "AND>" "OR>"))
(vla-SelectAtPoint newSet (vlax-3d-point pt) filter_code filter_value)
); progn
(princ)
)
Однако с -3 постоянно возникает ошибка (наверное, неправильно задаю список в строке).
Если убрать расширенные данные в фильтре, то всё равно возникает ошибка параметров метода (при этом vla-Select ошибку не выдаёт).
Более того, если всё полностью упростить и оставить в фильтре только INSERT, то (vla-get-count newSet) выдаст один элемент при указании точки на блоке:
(if (= (type (setq pt (vl-catch-all-apply (function (lambda () (trans (getpoint "\nУкажите точку: ") 1 0)))))) 'list)
(progn
;Создание набора (если есть, то создаём заново):
(setq ssets (vla-get-selectionsets actdoc))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list ssets "Set")))
(setq newSet (vla-add ssets "Set"))
(progn
(vla-delete (vla-item ssets "Set"))
(setq newSet (vla-add ssets "Set"))
);progn
);if
;Помещение в набор всех линий и вхождений блоков с расширенными данными:
(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 0)))
(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 0)))
(vlax-safearray-fill filter_code '(0)); DXF-группы для фильтра
(vlax-safearray-fill filter_value '("INSERT"))
(vla-SelectAtPoint newSet (vlax-3d-point pt) filter_code filter_value)
(vla-get-count newSet)
); progn
(princ)
)
Но стоит только начертить отрезок от этой точки, как тот же самый код в итоге покажет 0 элементов в наборе!
Если кто-то сталкивался с этими особенностями и проблемами, прошу просветить