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

Известно, что выбор одного объекта (стандартные функции 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, Функции LISP · Метки: , ,



Комментарии

Есть 2 коммент. к “Выбор объектов со своим приглашением”
  1. BearDyugin пишет:

    С комстрокой работает, а вот при включенном динамическом вводе на курсоре весит запрос "выберите объекты"

  2. Кулик Алексей aka kpblc пишет:

    К сожалению, это непобедимо через lisp (только если пробовать заменить еще и значение dynmode, хотя я этого не проворачивал, и именно поэтому предсказать результат не могу). Через NET, если я правильно помню, можно подменить запрос. Но сколько времени займет написание аналога ssget - не представляю :)

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


Я не робот.