Тема: LISP. Чтение и запись системных переменных в файл. Обсуждение

Уже несколько раз сталкивался с тем, что необходимо прочитать весь комплекс системных переменных "глюкующего" када и посмотреть, в чем разница. Для этого:

;|=======================================================================================
*    Получение списка всех системных переменных. Для нормального функционирования должны
* быть установлены Express Tools либо по пути поддержки када лежать файл sysvdlg.dat,
* соответствующий версии када.
* Пример вызова:
(_kpblc-get-sysvar-list)
=======================================================================================|;
(defun _kpblc-get-sysvar-list (/ filename result str f)
  (setq filename (findfile "sysvdlg.dat"))
  (if filename
    (progn
      (if (setq f (open filename "r"))
    (progn
      (setq *kpblc-sysvar-list* nil)
      (while (setq str (read-line f))
        (setq result (cons str result))
        ) ;_ end of while
      (close f)
      ) ;_ end of progn
    ) ;_ end of if
      (foreach string result
    (if (vl-string-search "|" string)
      (setq    *kpblc-sysvar-list*
         (cons
           (substr string
               2
               (- (vl-string-search "|" string) 1)
               ) ;_ end of substr
           *kpblc-sysvar-list*
           ) ;_ end of cons
        ) ;_ end of setq
      ) ;_ end of if
    ) ;_ end of foreach
      ) ;_ end of progn
    (alert "Не найден файл sysvdlg.dat")
    ) ;_ end of if
  ) ;_ end of defun
;|=======================================================================================
*    Функция преобразования типа real, int в строку. Для строки возвращается переданный
* параметр. Для остальных - ""
*    Параметры вызова:
*    param    - преобразуемое значение
*    Примеры вызова:
(_kpblc-cstr 1)        ; вернет "1"
(_kpblc-cstr 1.235)    ; вернет "1.235"
(_kpblc-cstr "abc")    ; вернет "abc"
(_kpblc-cstr '("abc"))    ; вернет "" (передан список)
=======================================================================================|;
(defun _kpblc-cstr (param)
  (cond
    ((= (type param) 'str) param)
    ((= (type param) 'int) (itoa param))
    ((= (type param) 'real) (rtos param))
    (t "")
    ) ;_ end of cond
  ) ;_ end of defun
;|=======================================================================================
*    Функция записи состояния системных переменных в файл.
* У пользователя, выполняющего данную функцию, должны быть установлены права на запись.
*    Параметры вызова:
*    file-name    - имя файла, в который будет записываться информация. Имя
*            указывается полностью, с диском, по принципам, принятым в lisp.
*            Каталоги должны быть созданы. Имя файла не критично, в момент
*            вызова функции имеющийся файл стирается.
*    Примеры вызова:
(kpblc-save-sysvar-file "c:\\sysvar.txt")
(kpblc-save-sysvar-file "d:\\acad\\lisp\\sysvars\\status.txt")
=======================================================================================|;
(defun kpblc-save-sysvar-file (file-name / assoc_file)
  (_kpblc-get-sysvar-list)
  (setq assoc_file (open file-name "w"))
  (foreach sysvar_counter *kpblc-sysvar-list*
    (if    (getvar sysvar_counter)
      (write-line
    (strcat
      sysvar_counter
      "|"
      (_kpblc-cstr (getvar sysvar_counter))
      ) ;_ end of strcat
    assoc_file
    ) ;_ end of write-line
      ) ;_ end of if
    ) ;_ end of foreach
  (close assoc_file)
  ) ;_ end of defun
;|=======================================================================================
*    Функция чтения файла со значениями системных переменных.
*    Параметры вызова:
*    file-name    - имя текстового файла, в котором записаны имена системных
*            переменных и через разделитель "|" - их значения.
*    set-sysvar    - устанавливать переменные или нет. t -> сразу устанавливается
*            nil -> только чтение в список *kpblc-sysvar-list-read* точечными
*            парами (выполняется в любом случае)
*    Примеры вызова:
(kpblc-read-sysvar-file "c:\\sysvar.txt" t)
        ;; чтение записанных переменных из файла c:\sysvar.txt с одновременной
        ;; установкой
(kpblc-read-sysvar-file "c:\\sysvar.txt" nil)
        ;; чтение записанных переменных из файла c:\sysvar.txt
*    Дополнительно: заполняется глобальный список *kpblc-sysvar-list-read* вида
(("dispsilh" . 1.0) ("whiparc" . 1.0) ("zoomfactor" . 60.0))
=======================================================================================|;
(defun kpblc-read-sysvar-file (file-name      set_sysvar     /
                   assoc_file     sysvar_name    sysvar_value
                   file_string    try_to_set
                   )
  (if (findfile file-name)
    (progn
      (setq assoc_file             (open file-name "r")
        *kpblc-sysvar-list-read* nil
        ) ;_ end of setq
      (while (setq file_string (read-line assoc_file))
    (setq sysvar_name  (substr
                 file_string
                 1
                 (vl-string-search "|" file_string)
                 ) ;_ end of substr
          sysvar_value (substr
                 file_string
                 (+ (vl-string-search "|" file_string) 2)
                 ) ;_ end of substr
          ) ;_ end of setq
    ;; Изменение sysvar_value на числовое значение. Преобразование выполняется
    ;; как для real-значений, т.к. такие значения нормально воспринимаются
    ;; системными переменными, имеющими только целочисленные значения
    (if (= (_kpblc-cstr (atof sysvar_value)) sysvar_value)
      (setq sysvar_value (atof sysvar_value))
      ) ;_ end of if
    ;; Проверка на возможность установки системной переменной
    (if (not (vl-catch-all-error-p
           (vl-catch-all-apply
             'setvar
             (list sysvar_name sysvar_value)
             ) ;_ end of vl-catch-all-apply
           ) ;_ end of vl-catch-all-error-p
         ) ;_ end of not
      (progn
        (setq *kpblc-sysvar-list-read*
           (cons
             (vl-list* sysvar_name sysvar_value)
             *kpblc-sysvar-list-read*
             ) ;_ end of cons
          ) ;_ end of setq
        (if    set-sysvar
          (setvar sysvar_name sysvar_value)
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of while
      (close assoc_file)
      ) ;_ end of progn
    (alert "Указанный файл не найден!")
    ) ;_ end of if
  ) ;_ end of defun

Критика приветствуется.
Дальнейшие действия ограничиваются только фантазией программиста - получить список текущих значений, применит реверс, сравнивать значения, выводить различающиеся...

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

А зачем? Для тренировки фантазии?
Может быть и полезная функция - сделать "снимок" состояния переменных при "правильной" настройке и восстановление, если что-то испортили. Вот это хорошо сделано в acadinfo.lsp.
Создается файл acadinfo.txt, в котором ВСЕ описано. Но он делается с умом. Фактически это LISP, который достаточно загрузить, чтобы все восстановилось. И анализировать можно. И на кнопку навесить.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

Спасибо, в программировании я без году неделя, так что еще раз - огромное спасибо.
Дополнительно: там, похоже, вообще вся подноготная када болтается (очень похоже на шаблон скрипта). Разъясните ламеру:
Ну, (setvar ...) понятно.
А что такое ;(setvar ...) (setq ...) и ;(setq ...)?
Спасибо.
> den-si: просьба не потирать пост, т.к. это фактически продолжение темы.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> kpblc
Полный бред :)

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

енто про что - "полный бред"?

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

kpblc пишет:

А что такое ;(setvar ...) (setq ...) и ;(setq ...)?

Это закомментированные строки. Ребята из Autodesk считают, что некоторые из переменных не следует восстанавливать (например, те, которые read-only).

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

это понятно, сейчас с кодом разбираюсь, но (setvar) ясно, а вот что делает (setq), пока не очень понял

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> kpblc
setq, естественно, присваивает значения переменным. Это выявленные глобальные. Но, так как не все их нужно восстанавливать, то строчки закомментированы. А если надо, то комментарий можно убрать.
Фактически это сценарий восстановления. Записать его при хороших настройках, спрятать в надежное место и использовать.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> ShaggyDoc
Не только не все нужно восстанавливать, но и не все можно восстанавливать. Например, встроенные (и не встроенные) функции и встроенные глобальные переменные.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> ShaggyDoc
Что оно присваивает переменные, это понятно. Не ясно другое - как перевести такие строки:

(setq :VLR-XREF-REACTOR    :VLR-XREF-Reactor )
(setq PI    3.1416)
(setq T    T )

Последняя строка меня просто выбила из колеи, если честно. Да и предпоследняя не лучше.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> Александр Ривилис
Конечно. Подходить надо с умом.

;(setq _RU-MENU-GET-POPUP-MENUS #<SUBR @01fc7690 _RU-MENU-GET-POPUP-MENUS> )

"восстанавливать" бесполезно.
А вот

(setq ACET:YESNO    4)
(setq ACET:YESNOCANCEL  3)
(setq ACEXTENDBOTH  3)
(setq ACEXTENDNONE  0)

можно восстановить. Хуже не будет. Могла быть ситуация, когда подобную переменную внесли в список локальных или еще как-то переопределили.

;(setq PAUSE    "/")

закомментирована, но вполне может попасть в список глобальных при проверке в VL и ее могут внести в локальные.

(setq T T )

вроде не имеет смысла, но бывает, и часто, что переменную назвают T (точка). И могут переопределить или "обнилить". Вот тогда и понадобится восстановление. Если, конечно, не написать (setq T nil):). Чтоб никто не догадался.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

> kpblc
Очень просто. Делаете (setq PI 4). И сбывается военный маразм - "в военное время синус может достигать 4-х". А у нас PI будет 4. Например, в хитроумной защите программы. И пусть это найдет "кул-хацкер", ломая ARX.

Re: LISP. Чтение и запись системных переменных в файл. Обсуждение

Ясно, что ничего не ясно. "В штате, кажется, Луизиана, число пи равно 4" (с) Задорнов.