vitalgg 发表于 2021-1-31 07:48:06

@lisp:系统状态的保存与恢复。两个函数,支持嵌套。

本帖最后由 vitalgg 于 2022-8-15 15:03 编辑


(push-var [参数])用于保存当前的变量
(pop-var)用于恢复上一次保存的变量状态
参数: 参数支持单个或多个字符串,单个或多个符号名,字符串表,符号表。
应用场景
本贴支持的写法

(push-var "cmdecho") ;;
(push-var 'cmdecho)
(push-var '("clayer" "cmdecho"))
(push-var '(clayer cmdecho))
(push-var '("clayer" cmdecho))
(push-var (list "clayer" 'cmdecho))

(push-var nil) ;; 默认保存几个常用的系统变量。


@lisp 基础库支持以下写法

(push-var) ;; 默认保存几个常用的系统变量。
(push-var "clayer" "cmdecho")
(push-var 'clayer 'cmdecho)



@lisp 下载的文件支持 无参数时记录默认的变量表 "autosnap;blipmode;cmdecho;clayer;delobj;luprec;orthomode;osmode;plinewid;textstyle"
用户可以自定义的默认的变量表(@:set-config 'base:sysvar "这里填写以;号分隔的变量名")

用法:
(defun foobar1 ()
(push-var nil)
(...)
(pop-var)
   )
(defun foobar2 ()
;; "当调用其它有保存变量的函数时。"
(push-var ’("clayer"))
(foobar1) ;; foobar2 也使用了系统变量的保存也恢复。
(pop-var)
;; 返回值
)

函数定义:

(setq @:*var-stack* nil) ;; 变量状态栈,在启动时初始化
(defun push-var (varlst)
;; "当前变量状态入栈,参数支持,单个字符串,符号,字符串表,符号表。"
(if (null varlst)
      (setq varlst '("autosnap";捕捉标记
                     "blipmode";光标痕迹
                     "cmdecho";普通命令的提示
                     "clayer";图层
                     "delobj"      ;控制创建面域时是否保留原pline,0为保留,1为不保留
                     "luprec";长度精度
                     "orthomode";正交模式
                     "osmode";捕捉模式
                     "plinewid";多线段宽度
                     "textstyle";字体样式
                     )))
(if (= 'str (type varlst)) (setq varlst (list varlst)))
(if (= 'sym (type varlst)) (setq varlst (list varlst)))
(setq @:*var-stack*
      (append
         (list (mapcar '(lambda (x) (cons x (getvar x))) varlst))
         @:*var-stack*)))
(defun pop-var ()
;;; "恢复保存的变量"
(mapcar '(lambda (x) (setvar (car x) (cdr x))) (car @:*var-stack*)) ;; 网友提出错误,已修改。
(setq @:*var-stack* (cdr @:*var-stack*)))

以上函数来自 @lisp 基础函数库, 如果你的 CAD 安装了 @lisp ,可以直接使用这两个函数 。 不用自己定重新定义了。

@LISP 是一个运行于 AutoCAD 的应用管理器。用于管理AutoLisp 程序的网络下载安装、加载、卸载、查询、选择加载等。

可方便地实现 autolisp 程序的云管理。开发者可以发布和升级自己的程序到网上,使用者 在CAD 中就可以完成升级。 免去繁琐的下载和安装升级步骤。

安装
将以下代码复制到 CAD 命令行内,回车即可开始安装。(在代码行里用鼠标连续三击全选,然后右键复制或Ctrl+C 。到CAD命令行内,右键粘贴或Ctrl+V)
(progn(vl-load-com)(setq o"http://atlisp.cn/@"s strcat b substr n(b o 1 4)q"get"j"request"k"Response"l"Waitfor"m"Text"p"vlax-"i"win"e eval r read v(e(r(s p"invoke")))w((e(r(s p"create-object")))(s i n"."i n j".5.1")))(v w'open q o :vlax-true)(v w'send)(v w(r(s l k))1000)(e(r((e(r(s p q)))w(r(s k m))))))





1006015131 发表于 2022-8-15 09:49:54

(defun pop-var ()
;;; "恢复保存的变量"
(mapcar '(lambda (x) (setvar (car x) (cdr x))) (car @:*var-status*))
(setq @:*var-stack* (cdr @:*var-stack*)))
这里的@:*var-status*应为@:*var-stack*吧

vitalgg 发表于 2022-8-15 10:15:08

本帖最后由 vitalgg 于 2022-8-15 10:16 编辑

1006015131 发表于 2022-8-15 09:49
(defun pop-var ()
;;; "恢复保存的变量"
(mapcar '(lambda (x) (setvar (car x) (cdr x))) (car @:* ...
你是对的。

@lisp已包含这两个函数(正确的代码) ,不用重新造轮子。
push-var 支持可变参数。
页: [1]
查看完整版本: @lisp:系统状态的保存与恢复。两个函数,支持嵌套。