Нужно с использованием AutoLISP или Visual LISP (A...

Created on: August 12, 2026

Answered using GPT-5.6 Thinking by Chat01

Question

Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU))
выполнить команду "выбрать подобные", но не во всём чертеже, а указать область рамкой.
/не использовать в коде function STRINGP, CONSP, WHEN/,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP.

Thought

Searched 1 website

Worked for 2m 22s

Answer

Для этой задачи лучше не воспроизводить SELECTSIMILAR вручную, а вызвать штатную команду AutoCAD и затем пересечь полученный набор с объектами, попавшими в заданную прямоугольную область. Так сохраняются все текущие настройки «Выбрать подобные», включая SELECTSIMILARMODE. Сама SELECTSIMILAR ищет подобные объекты по всему текущему чертежу. (Autodesk Help)

lisp
(defun SSAREA-Intersect (ss1 ss2 / ssR i ent) ;; Пересечение двух наборов выбора (setq ssR (ssadd) i 0 ) (if (and ss1 ss2) (while (< i (sslength ss1)) (setq ent (ssname ss1 i)) (if (ssmemb ent ss2) (ssadd ent ssR) ) (setq i (1+ i)) ) ) ssR ) (defun c:SSAREA (/ ssSample p1 p2 ssArea ssSimilar ssFirst ssResult) ;; 1. Выбираем один или несколько объектов-образцов (prompt "\nВыберите объект(ы)-образец для команды \"Выбрать подобные\": ") (setq ssSample (ssget)) (if ssSample (progn ;; 2. Задаем прямоугольную область (setq p1 (getpoint "\nУкажите первый угол рамки: ")) (if p1 (progn (setq p2 (getcorner p1 "\nУкажите противоположный угол рамки: ") ) (if p2 (progn ;; Объекты внутри рамки и пересекающие ее (setq ssArea (ssget "_C" p1 p2)) (if ssArea (progn ;; 3. Запускаем штатную SELECTSIMILAR. ;; Передаем ей выбранные объекты-образцы. (command "_.SELECTSIMILAR" ssSample "") ;; 4. Получаем набор, который SELECTSIMILAR ;; оставила выбранным. (setq ssFirst (ssgetfirst)) (if ssFirst (setq ssSimilar (cadr ssFirst)) ) ;; Запасной вариант получения результата (if (not ssSimilar) (setq ssSimilar (ssget "_P")) ) ;; 5. Оставляем только подобные объекты, ;; находящиеся в указанной рамке. (setq ssResult (SSAREA-Intersect ssArea ssSimilar) ) ;; 6. Делаем результат текущим выбором (sssetfirst nil nil) (if (> (sslength ssResult) 0) (progn (sssetfirst nil ssResult) (prompt (strcat "\nВыбрано подобных объектов в рамке: " (itoa (sslength ssResult)) ) ) ) (prompt "\nВ указанной области подобных объектов не найдено." ) ) ) (prompt "\nВ указанной рамке нет объектов.") ) ) ) ) ) ) (prompt "\nОбъекты-образцы не выбраны.") ) (princ) )

После загрузки LSP команда называется:

text
SSAREA

Алгоритм получается такой: сначала выбираете один или несколько объектов-образцов, затем двумя точками задаёте рамку. Программа выполняет настоящую SELECTSIMILAR, а затем оставляет выбранными только те найденные объекты, которые находятся внутри рамки или пересекают её.

В строке

lisp
(setq ssArea (ssget "_C" p1 p2))

"_C" означает Crossing: выбираются объекты как полностью находящиеся внутри прямоугольника, так и пересекающие его границу. Это штатный режим ssget. (Autodesk Help)

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

lisp
(setq ssArea (ssget "_W" p1 p2))

где "_W" — Window. (Autodesk Help)

Плюс этого решения в том, что оно автоматически учитывает текущие настройки SELECTSIMILAR: тип объекта, цвет, слой, тип линии, масштаб типа линии, вес линии, стиль печати, стиль объекта и имя блока/ссылки — в зависимости от значения SELECTSIMILARMODE. Например, стандартное значение 130 означает слой + имя ссылочного объекта, при этом тип объекта учитывается всегда. (Autodesk Help)

В приведённом коде не используются STRINGP, CONSP и WHEN. Передача selection set непосредственно штатной команде AutoCAD также поддерживается механизмом command: аргументом команды может быть имя набора выбора. (Autodesk Help)

Share this Q&A