Выбор объектов со своим приглашением
Известно, что выбор одного объекта (стандартные функции entsel / nentsel / nentselp) позволяют передавать в качестве одного из параметров строковое приглашение типа “Выберите объект”. ssget такой возможностью не обладает. Но разве это значит, что и сделать такого нельзя?
Конечно, сделать можно. Раз можно – значит, сделаем.
Если мы сначала “погасим” любую возможность вывода сообщений самого AutoCAD’a, а потом выполним, например, (princ “\nНу что, не ждали?”), то в командной строке мы увидим эту самую строку.
Воспользуемся этой возможностью. Ну и заодно добавим “бонус” – обработку ошибок. ssget при нажатии на Esc вываливает аварийное завершение? Да и черт с ним, сделаем чтоб не вываливал
(setq sysvar (mapcar
(function
(lambda (x / tmp)
(setq tmp (getvar (car x)))
(setvar (car x) (cdr x))
(cons (car x) tmp)
) ;_ end of lambda
) ;_ end of function
'(("cmdecho" . 0) ("menuecho" . 0) ("nomutt" . 1))
) ;_ end of mapcar
) ;_ end of setq
(princ (strcat "\n" (vl-string-trim " \n\t:" msg) " <Отмена> : "))
(setq res (vl-catch-all-apply fun-ssget))
(foreach item sysvar
(setvar (car item) (cdr item))
) ;_ end of foreach
(if (= (type res) 'pickset)
res
) ;_ end of if
) ;_ end of defun
Как видно, тут все просто до безобразия: сначала полностью гасится вывод в ком.строку, потом выводится сообщение, выполняется ssget, восстанавливаются системные переменные и возвращается соответствующий результат.
Конечно, можно код доработать – например, вместо fun-ssget передавать отдельно критерии выбора, отдельно фильтр примитивов. Но я этого делать не стал – как-то вызов строки
лично мне прочитать и понять проще, чем что-то другое.
Материалы для проектирования, работы и разработки (и не только в AutoCAD)