Тема: 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
Критика приветствуется.
Дальнейшие действия ограничиваются только фантазией программиста - получить список текущих значений, применит реверс, сравнивать значения, выводить различающиеся...