Выбор объектов со своим приглашением

Известно, что выбор одного объекта (стандартные функции entsel / nentsel / nentselp) позволяют передавать в качестве одного из параметров строковое приглашение типа “Выберите объект”. ssget такой возможностью не обладает. Но разве это значит, что и сделать такого нельзя?

Конечно, сделать можно. Раз можно – значит, сделаем.

Если мы сначала “погасим” любую возможность вывода сообщений самого AutoCAD’a, а потом выполним, например, (princ “\nНу что, не ждали?”), то в командной строке мы увидим эту самую строку.

Воспользуемся этой возможностью. Ну и заодно добавим “бонус” – обработку ошибок. ssget при нажатии на Esc вываливает аварийное завершение? Да и черт с ним, сделаем чтоб не вываливал :)

(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 передавать отдельно критерии выбора, отдельно фильтр примитивов. Но я этого делать не стал – как-то вызов строки

(_lispru-silence-select "Выберите окружность" (function (lambda() (ssget "_+.:S:E" '((0 . "CIRCLE"))))))

лично мне прочитать и понять проще, чем что-то другое.

Размещено в Код LISP, Функции LISP · Метки: , ,



Поделитесь своим мнением


Я не робот.