@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))))))
(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:16 编辑
1006015131 发表于 2022-8-15 09:49
(defun pop-var ()
;;; "恢复保存的变量"
(mapcar '(lambda (x) (setvar (car x) (cdr x))) (car @:* ...
你是对的。
@lisp已包含这两个函数(正确的代码) ,不用重新造轮子。
push-var 支持可变参数。
页:
[1]