ADN Open CIS
Сообщество программистов Autodesk в СНГ

25/07/2017

vl-cmdf, command, command-s и возвращаемые значения

Насколько я помню, в 2015 версии прошло такое очень интересное обновление.

Забудем про порядок выполнения command / command-s / vl-cmdf - сейчас разговор не об этом

Раньше command (и command-s тоже) возвращало nil независимо от того, была команда выполнена или отменена. vl-cmdf отличалась тем, что в случае успешного выполнения возвращала t, а если команда была прервана пользователем - nil.

Базируясь на этом, можно было спокойно анализировать - что сделал пользователь при выполнении лиспа, и строить дальнейшее поведение своей программы. Но в 2015 версии "лафа" кончилась: vl-cmdf возвращает t независимо ни от чего. То есть информативность функции потеряна (вопрос обсуждался на форуме).

Захотелось мне все же сделать свой вызов команды. Чтобы если ошибка выполнения или пользователь ее прервал - возвращала nil. Если все хорошо - t. Да заодно и сделать выполнение "тихим". Вот что получилось:

Код - Auto/Visual LISP: [Выделить]
  1.  
  2. (defun _kpblc-cmd-silence (cmd / err sysvar res lastent)
  3.                           ;|
  4. *    Выполнение команды в "скрытом" режиме
  5. *    Параметры вызова:
  6.   cmd   исполняемая команда - строка или список
  7. *    Возвращает t в случае успеха выполнения команды или nil в случае ошибки.
  8. *    Примеры использования:
  9. (_kpblc-cmd-silence "_.regenall")
  10. (_kpblc-cmd-silence (list "_.wssave" (getvar "wscurrent") "_y"))
  11. (_kpblc-cmd-silence (list "_.circle" pause pause))
  12. |;
  13.   (if (not (member (type cmd) (list 'str 'list)))
  14.     (princ (strcat "\nНевозможно выполнить команду " (vl-princ-to-string cmd) " : неопознанный тип"))
  15.     (if (vl-catch-all-error-p
  16.           (setq err (vl-catch-all-apply
  17.                       (function
  18.                         (lambda ()
  19.                           (setq sysvar  (vl-remove nil
  20.                                                    (mapcar (function (lambda (x / tmp)
  21.                                                                        (if (setq tmp (getvar (car x)))
  22.                                                                          (progn (setvar (car x) (cdr x)) (cons (car x) tmp))
  23.                                                                          ) ;_ end of if
  24.                                                                        ) ;_ end of lambda
  25.                                                                      ) ;_ end of function
  26.                                                            '(("sysmon" . 0) ("cmdecho" . 0) ("nomutt" . 1) ("menuecho" . 0))
  27.                                                            ) ;_ end of mapcar
  28.                                                    ) ;_ end of vl-remove
  29.                                 lastent (entlast)
  30.                                 ) ;_ end of setq
  31.                           (if lastent
  32.                             (setq lastent (entget lastent '("*")))
  33.                             ) ;_ end of if
  34.                           (cond ((= (type cmd) 'str) (vl-cmdf cmd))
  35.                                 ((= (type cmd) 'list)
  36.                                  (apply (function and) (list (vl-cmdf (car cmd)) (apply (function vl-cmdf) (cdr cmd))))
  37.                                  )
  38.                                 ) ;_ end of cond
  39.                           (setq res (cond ((and (not lastent) (entlast)) t)
  40.                                           ((not (entlast)) nil)
  41.                                           (t (not (equal (entget (entlast) '("*")) lastent)))
  42.                                           ) ;_ end of cond
  43.                                 ) ;_ end of setq
  44.                           ) ;_ end of lambda
  45.                         ) ;_ end of function
  46.                       ) ;_ end of vl-catch-all-apply
  47.                 ) ;_ end of setq
  48.           ) ;_ end of vl-catch-all-error-p
  49.       (progn (setq res nil)
  50.              (princ
  51.                (cond ((= (type cmd) 'str) (strcat "\nОшибка выполнения команды " cmd))
  52.                      ((= (type cmd) 'list)
  53.                       (strcat "\nОшибка выполнения последовательности команд "
  54.                               (strcat (car cmd)
  55.                                       (apply (function strcat)
  56.                                              (mapcar (function (lambda (x) (strcat " " (vl-princ-to-string x)))) (cdr cmd))
  57.                                              ) ;_ end of apply
  58.                                       ) ;_ end of strcat
  59.                               ) ;_ end of strcat
  60.                       )
  61.                      (t "\nОшибка выполнения команды: неопознанный тип команды")
  62.                      ) ;_ end of cond
  63.                ) ;_ end of princ
  64.              ) ;_ end of progn
  65.       ) ;_ end of if
  66.     ) ;_ end of if
  67.   (foreach item sysvar (setvar (car item) (cdr item)))
  68.   res
  69.   ) ;_ end of defun

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 25.07.2017