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

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Macondo от 07-02-2016, 20:00:23

Название: Поиск принадлежности заданной точки вхождению блока
Отправлено: Macondo от 07-02-2016, 20:00:23
Добрый вечер!
Задался целью найти, принадлежит ли указанная точка вхождению блока. Vla-Interset для таких случаев не работает. Попробовал сделать обход по примитивам внутри вхождения, но почему-то отрезки внутри вхождения (над которыми я хотел для проверки сделать Vla-GetParamAtPoint) оказались скорее отрезками определения блока в нулевой координате. То есть,если, например, изменить цвет отрезка, то он изменится у всех вхождений.
Может, я не по тому пути иду? А если по тому, то как пройтись по подпримитивами именно конкретного вхождения блока?

Общая задача такова: заменить
Код - Auto/Visual Lisp [Выбрать]
  1. (setq BOX (* (getvar "PICKBOX") (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE")))))
  2. (vla-ZoomExtents acad_application)
  3. (setvar "OSMODE" 0)
  4. (setq ss nil ss (ssget "_C" (mapcar '- point (list BOX BOX 0.0)) (mapcar '+ point (list BOX BOX 0.0))
  5. (vla-ZoomPrevious acad_application)
на что-то другое, не зависящее от отображения точки в пределах видимого экрана. Как я понимаю, это SSGET "_X", в котором нужно пройтись по всем отрезкам методом Vla-GetParamAtPoint, а по вхождениям блоков... вот тут и проблема (другие типы примитивов не интересуют).
Название: Re: Поиск принадлежности заданной точки вхождению блока
Отправлено: Александр Ривилис от 07-02-2016, 20:13:07
Попробовал сделать обход по примитивам внутри вхождения, но почему-то отрезки внутри вхождения (над которыми я хотел для проверки сделать Vla-GetParamAtPoint) оказались скорее отрезками определения блока в нулевой координате. То есть,если, например, изменить цвет отрезка, то он изменится у всех вхождений.
Так и должно быть.
Может, я не по тому пути иду? А если по тому, то как пройтись по подпримитивами именно конкретного вхождения блока?
Нет "подпримитивов именно конкретного вхождения блока" (если не считать атрибуты блока). Всё остальное следует пересчитывать из системы координат блока в МСК (Мировую Систему Координат). Всё зависит от точки вставки (InsertionPoint), угла поворота (Rotation) и масштабов по осям (XScaleFactor/YScaleFactor/ZScaleFactor).
Вообще-то лично мне не очень понятно, что ты подразумеваешь под "принадлежит ли указанная точка вхождению блока". Это означает, что она принадлежит габаритному контейнеру вставки блока или одному из примитивов вставки блока? И если одному из примитивов, то понимать ли это принадлежность границе или внутренности (например для круга или замкнутой полилинии)?

Название: Re: Поиск принадлежности заданной точки вхождению блока
Отправлено: Александр Ривилис от 07-02-2016, 20:17:57
Кстати, посмотри еще на описание функции (nentselp): http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-5CE182FE-6455-4C62-B953-B1CA441455C1
Вполне возможно, что она тебя удовлетворит, хотя и требует, чтобы точка находилась в видимой области.
Название: Re: Поиск принадлежности заданной точки вхождению блока
Отправлено: Александр Ривилис от 07-02-2016, 20:29:06
И еще одна полезная ссылка, в которой есть две функции для преобразования из МСК в систему координат блока и обратно: https://www.theswamp.org/index.php?topic=26591.msg321020#msg321020
Название: Re: Поиск принадлежности заданной точки вхождению блока
Отправлено: Macondo от 08-02-2016, 04:16:54
Александр Ривилис, спасибо! Вполне достаточно оказалось функции nentselp: очень кстати пришлась. А преобразование координат поможет для более сложных расчётов, когда в исходной точке сразу несколько блоков.