明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 948|回复: 3

【K:SetGetData】获取或更新全局变量

[复制链接]
发表于 2024-5-11 23:43:52 | 显示全部楼层 |阅读模式
本帖最后由 kucha007 于 2024-5-12 15:45 编辑

用于简单的变量跨文件,期待其他人的解决方案~

  1. ;获取或更新变量(系统+全局+黑板),不存在时更新为默认值(系统变量记录的全局变量值使用@@分隔)
  2. (defun K:SetGetData (RecDATA SysNam VarLst  / K:STR->Lst K:Lst->STR XX SysLst a b)
  3.     (progn  ;基础函数
  4.           ;根据分隔符拆分字符串@LeeMac
  5.           (defun K:STR->Lst (STR Del / len Lst pos)
  6.             (setq len (1+ (strlen Del)))
  7.             (while (setq pos (vl-string-search Del STR))
  8.               (setq Lst (cons (substr STR 1 pos) Lst)
  9.                     STR (substr STR (+ pos len))
  10.               )
  11.             )
  12.             (reverse (cons STR Lst))
  13.           )
  14.           ;使用分隔符串联字符串@LeeMac
  15.           (defun K:Lst->STR (Lst Del / STR)
  16.             (setq STR (car Lst))
  17.             (foreach itm (cdr Lst) (setq STR (strcat STR Del itm)))
  18.             STR
  19.           )
  20.     )
  21.     (if
  22.         (vl-every
  23.           '(lambda (XX)
  24.               (and
  25.                 (eval (read (car XX)));全局变量存在
  26.                 (vl-bb-ref (read (car XX)));黑板空间存在同名变量
  27.                 (eq (type (eval (read (car XX)))) 'STR);全局变量的值都为STR
  28.                 (eq (type (vl-bb-ref (read (car XX)))) 'STR);全局变量的值都为STR
  29.               )
  30.           )
  31.           VarLst
  32.         );变量存在且类型都为STR
  33.         (if RecDATA
  34.             (progn
  35.                 (setq SysLst (mapcar '(lambda (XX) (eval (read (car XX)))) VarLst));取全局
  36.                 (setenv SysNam (K:Lst->STR SysLst "@@")) ;更新系统
  37.                 (mapcar '(lambda (a b) (vl-bb-set (read (car a)) b)) VarLst SysLst) ;更新黑板
  38.             );用全局更新黑板+系统
  39.             (progn
  40.                 (setq SysLst (mapcar '(lambda (XX) (vl-bb-ref (read (car XX)))) VarLst));取黑板
  41.                 (setenv SysNam (K:Lst->STR SysLst "@@")) ;更新系统
  42.                 (mapcar '(lambda (a b) (set (read (car a)) b)) VarLst SysLst) ;更新全局
  43.             );用黑板更新全局+系统
  44.         )
  45.         (if
  46.             (and
  47.                 (getenv SysNam) ;系统变量存在
  48.                 (setq SysLst (K:STR->Lst (getenv SysNam) "@@"));尝试从系统变量中提取全局变量的值
  49.                 (eq (length SysLst) (length VarLst));值的数量相等
  50.             )
  51.             (mapcar '(lambda (a b)
  52.                         (set (read (car a)) b);更新全局变量
  53.                         (vl-bb-set (read (car a)) b);更新黑板空间的变量值
  54.                     )
  55.                     VarLst
  56.                     SysLst
  57.             )
  58.             (progn
  59.                 (setenv SysNam (K:Lst->STR (mapcar 'cadr VarLst) "@@")) ;更新系统变量为默认值
  60.                 (mapcar '(lambda (XX) (set (read (car XX)) (cadr XX))) VarLst);更新全局变量为默认
  61.                 (mapcar '(lambda (XX) (vl-bb-set (read (car XX)) (eval (read (car XX))))) VarLst);更新黑板空间变量为默认
  62.             )
  63.         )
  64.     )(princ)
  65. )



用法:
  1. (setq *MkVarLst*
  2.   (list
  3.     (list "Global:RvLay" "1");1默认层,2当前层
  4.     (list "Global:RvMde" "1");1修改,2批注,3检查
  5.   )
  6. );参数列表,自行扩写
  7. (K:SetGetData Nil "K\\RRSysNam" *MkVarLst*);用黑板更新系统和全局(缺省取默认)
  8. ;你的程序.........
  9. (K:SetGetData T "K\\RRSysNam" *MkVarLst*);用全局更新系统和黑板




评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

发表于 2024-5-12 07:54:17 | 显示全部楼层
感谢长老的分享!
发表于 2024-5-12 09:05:58 | 显示全部楼层
如果同时打开的各文档,可以用
A文档输入(vl-bb-set 'shili "nihao")
B文档输入(vl-bb-ref 'shili)可以得到"nihao"
 楼主| 发表于 2024-5-12 11:27:50 | 显示全部楼层
tigcat 发表于 2024-5-12 09:05
如果同时打开的各文档,可以用
A文档输入(vl-bb-set 'shili "nihao")
B文档输入(vl-bb-ref 'shili)可以得 ...

学到了!更新了一下函数!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-26 19:20 , Processed in 0.205603 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表