Как погасить сообщения nanoCAD при загрузке lsp?

В чате по nanoCAD возник вопрос (цитирую не дословно):

При загрузке любого лиспа нана автоматом выводит прописанные там команды.
Независимо от..
Учитывая что это ложится в автозагрузку, имха подавлять принудительно вывод ком строки плохая идея.. Можно не успеть вернуть как было

Вызов принят :) Погнали )))

Ну ок, первым делом пишу "типа загрузчик":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;; loader.lsp, болтается внутри path
((lambda (/ fun_browsefiles-in-directory-nested path sysvars)
   ;|
   Поиск всех файлов внутри каталога
   @Param path Полный путь к родительскому каталогу
   @Param mask Маска файла для выбора
   @Returns Список файлов из родительского каталога и всех его подкаталогов, отвечающих маске  
   |;

   (defun fun_browsefiles-in-directory-nested (path mask)
     ;; call sample : (fun_browsefiles-in-directory-nested (getenv "appdata") "*.lsp")
     (apply (function append)
            (cons
              (if (vl-directory-files path mask)
                (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x)))
                        (vl-directory-files path mask)
                )
              )
              (mapcar
                (function
                  (lambda (x)
                    (fun_browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask)
                  )
                )
                (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1)))
              )
            )
     )
   )

   (setq path    "c:\\files"
         sysvars (vl-remove
                   nil
                   (mapcar
                     (function
                       (lambda (x / temp)
                         (if (setq temp (getvar (car x)))
                           (progn
                             (setvar (car x) (cdr x))
                             (cons (car x) temp)
                           )
                         )
                       )
                     )
                     '(("cmdecho" . 0)
                       ("menuecho" . 0)
                       ("nomutt" . 1)
                      )
                   )
                 )
   )
   (foreach file
     (vl-remove-if
       (function
         (lambda (x)
           (= (strcase (vl-filename-base x)) "LOADER")
         )
       )
       (fun_browsefiles-in-directory-nested path "*.lsp")
     )
     (vl-catch-all-error-p
       (vl-catch-all-apply
         (function
           (lambda ()
             (load file (strcat "\nCan't load file " file))
           )
         )
       )
     )
   )
   (foreach item sysvars
     (setvar (car item) (cdr item))
   )
   (princ)
 )
)

И внутрь каталога c:\files помещаю лисп для примера:

1
2
3
4
(defun c:test1 ()
  (alert "Test1")
  (princ)
)

Загружаю loader.lsp и...

1
2
3
Команда: appload
APPLOAD,ЗАГПРИЛ - Загрузка приложения...
loader.lsp загружен. Команды: TEST1

Ну ок. А если слегка поменять определение test1?

1
2
3
4
5
6
7
8
((lambda ()
   (defun c:test1 ()
     (alert "Test1")
     (princ)
   )
   (princ)
 )
)

Снова загрузка loader:

1
2
3
Команда: appload

APPLOAD,ЗАГПРИЛ - Загрузка приложения...

Тээкс, а если убрать работу с системными переменными из загрузчика?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
;; loader.lsp, болтается внутри path
((lambda (/ fun_browsefiles-in-directory-nested path)
   ;|
   Поиск всех файлов внутри каталога
   @Param path Полный путь к родительскому каталогу
   @Param mask Маска файла для выбора
   @Returns Список файлов из родительского каталога и всех его подкаталогов, отвечающих маске  
   |;

   (defun fun_browsefiles-in-directory-nested (path mask)
     ;; call sample : (fun_browsefiles-in-directory-nested (getenv "appdata") "*.lsp")
     (apply (function append)
            (cons
              (if (vl-directory-files path mask)
                (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x)))
                        (vl-directory-files path mask)
                )
              )
              (mapcar
                (function
                  (lambda (x)
                    (fun_browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask)
                  )
                )
                (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1)))
              )
            )
     )
   )

   (setq path "c:\\files")
   (foreach file
     (vl-remove-if
       (function
         (lambda (x)
           (= (strcase (vl-filename-base x)) "LOADER")
         )
       )
       (fun_browsefiles-in-directory-nested path "*.lsp")
     )
     (vl-catch-all-error-p
       (vl-catch-all-apply
         (function
           (lambda ()
             (load file (strcat "\nCan't load file " file))
           )
         )
       )
     )
   )
   (princ)
 )
)

Кха, а результат-то тот же!

1
2
3
Команда: appload

APPLOAD,ЗАГПРИЛ - Загрузка приложения...

Т.е. для наника, если охота "погасить" вывод в ком.строку про загрузку приложения и определения команд, достаточно эти определения тупо обрамлять лямбдами и тихим выходом в конце. Жжесть )))



Комментарии

Есть 2 коммент. к “Как погасить сообщения nanoCAD при загрузке lsp?”
  1. EdwardSt пишет:

    Если файл с функцией test1 из примера выше загрузить с использованием лисповского выражения
    (load "c:\\files\\test1.lsp"), а не команды appload, возвращено будет только значение последнего выражения в файле.
    Если последнее выражение, как в примере, - (princ), которое ничего не возвращает в командную строку, то загрузка произойдет визуально в "тихом" режиме.
    Естественно, предварительно необходимо убедиться в наличии файла, а также быть уверенным, что в нем нет ошибок.
    Т.е., загрузчик может представлять нечто типа

    1
    2
    3
    4
    5
    6
    7
    (defun c:poehali ( / )
      (load "file1")
      (load "file2")
    ; (load "file3") ;временно не грузим
      (princ "Пакет \"Поехали\" загружен!!!")
      (princ)
      )

    Понятно, что реализация может включать загрузку файлов по списку, по результатам сканирования каталога и т.п..
    Важно загружать лисповским выражением (load ...), которое фактически и берет на себя функцию подавления эха в командной строке.

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

    Лисповская load не глушит вывод в ком.строку, насколько мне известно. У меня всего один вопрос - что будет выводиться в ком.строку, если в file1.lsp определено 2 команды, а в file2.lsp - еще три штуки? Ну вот прямо так, через defn c:< ...>
    Я без наездов если что ;)

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


Я не робот.