Выбор объектов со своим приглашением
Известно, что выбор одного объекта (стандартные функции entsel / nentsel / nentselp) позволяют передавать в качестве одного из параметров строковое приглашение типа "Выберите объект". ssget такой возможностью не обладает. Но разве это значит, что и сделать такого нельзя?
Конечно, сделать можно. Раз можно - значит, сделаем.
Если мы сначала "погасим" любую возможность вывода сообщений самого AutoCAD'a, а потом выполним, например, (princ "\nНу что, не ждали?"), то в командной строке мы увидим эту самую строку.
Воспользуемся этой возможностью. Ну и заодно добавим "бонус" - обработку ошибок. ssget при нажатии на Esc вываливает аварийное завершение? Да и черт с ним, сделаем чтоб не вываливал
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (defun _lispru-silence-select (msg fun-ssget / sysvar res) (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 передавать отдельно критерии выбора, отдельно фильтр примитивов. Но я этого делать не стал - как-то вызов строки
1 | (_lispru-silence-select "Выберите окружность" (function (lambda() (ssget "_+.:S:E" '((0 . "CIRCLE")))))) |
лично мне прочитать и понять проще, чем что-то другое.
С комстрокой работает, а вот при включенном динамическом вводе на курсоре весит запрос "выберите объекты"
К сожалению, это непобедимо через lisp (только если пробовать заменить еще и значение dynmode, хотя я этого не проворачивал, и именно поэтому предсказать результат не могу). Через NET, если я правильно помню, можно подменить запрос. Но сколько времени займет написание аналога ssget - не представляю