明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1152|回复: 4

【K:SetGetUpdVar】获取或更新变量(全局+系统)

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

最近接触了DCL,每个参数要一个变量感觉太麻烦了
干脆记录到一个系统变量,之后更新或提取为全局变量,方便跨文件使用DCL
  1. ;获取或更新变量(全局+系统),将所有参数记录到一个系统变量。
  2. ;参数之间使用分号@@分隔,类型必须为字符串。Flag为是T时强制更新为默认值
  3. (defun K:SetGetUpdVar (Flag SysNam VarLst / XX GlbLst SysLst a b)
  4.   ;(K:SetGetUpdVar SysNam (list (list "Key名" "变量名" "默认值")...))
  5.     (progn  ;基础函数
  6.           ;根据分隔符拆分字符串@LeeMac
  7.           (defun K:STR->Lst (STR Del / len Lst pos)
  8.             (setq len (1+ (strlen Del)))
  9.             (while (setq pos (vl-string-search Del STR))
  10.               (setq Lst (cons (substr STR 1 pos) Lst)
  11.                     STR (substr STR (+ pos len))
  12.               )
  13.             )
  14.             (reverse (cons STR Lst))
  15.           )
  16.           ;使用分隔符串联字符串@LeeMac
  17.           (defun K:Lst->STR (Lst Del / STR)
  18.             (setq STR (car Lst))
  19.             (foreach itm (cdr Lst) (setq STR (strcat STR Del itm)))
  20.             STR
  21.           )
  22.     )
  23.     (setq SysNam (strcat "K\" SysNam));系统变量名
  24.     (setq VarLst
  25.         (mapcar
  26.           '(lambda (XX) (list (nth 0 XX) (strcat "Global:" (nth 1 XX)) (nth 2 XX)))
  27.           VarLst
  28.         )
  29.     );全局变量名补全
  30.     (mapcar
  31.       '(lambda (XX)
  32.         (if (and (nth 0 XX)(get_tile (nth 0 XX)))
  33.             (set (read (nth 1 XX)) (get_tile (nth 0 XX)))
  34.         )
  35.       )
  36.       VarLst
  37.     );获取DCL对应Key的值,更新对应的全局变量
  38.   
  39.     (if Flag ;强制更新变量值
  40.         (progn
  41.             (setenv SysNam (K:Lst->STR (mapcar 'caddr VarLst) "@@")) ;更新系统变量为默认值
  42.             (mapcar '(lambda (XX) (set (read (nth 1 XX)) (nth 2 XX))) VarLst);更新全局变量为默认
  43.         )
  44.         (if
  45.             (vl-every
  46.               '(lambda (XX)
  47.                 (and
  48.                   (eval (read (nth 1 XX)))
  49.                   (eq (type (eval (read (nth 1 XX)))) 'STR)
  50.                 )
  51.               )
  52.               VarLst
  53.             );全局变量都存在且都为STR
  54.             (progn
  55.                 (mapcar '(lambda (xx) (setq GlbLst (cons (eval (read (nth 1 XX))) GlbLst ))) VarLst);收集全局变量
  56.                 (setenv SysNam (K:Lst->STR (reverse GlbLst) "@@")) ;更新系统变量
  57.             )
  58.             (if
  59.               (and
  60.                   (getenv SysNam) ;系统变量存在
  61.                   (setq SysLst (K:STR->Lst (getenv SysNam) "@@"));尝试从系统变量中提取全局变量
  62.                   (eq (length SysLst) (length VarLst));数量相等
  63.               )
  64.               (progn
  65.                   (mapcar '(lambda (a b) (set (read (nth 1 a)) b)) VarLst SysLst);更新全局变量
  66.               )
  67.               (progn
  68.                   (setenv SysNam (K:Lst->STR (mapcar 'caddr VarLst) "@@")) ;更新系统变量为默认值
  69.                   (mapcar '(lambda (XX) (set (read (nth 1 XX)) (nth 2 XX))) VarLst);更新全局变量为默认
  70.               )
  71.             )
  72.         )
  73.     )
  74.     (princ)
  75. )



详细用法:
  1. (setq Global:VarLst
  2.     (list
  3.       (list "Key1" "Nam1" "Var1");参数1
  4.       (list "Key2" "Nam2" "Var2");参数2
  5.     )
  6. );参数列表,自行扩写

  7. (K:SetGetUpdVar Nil "ZZMLSys" Global:VarLst);有全局变量时更新系统变量,无全局变量时获取系统变量(若无则设置为默认值)
  8. (K:SetGetUpdVar T "ZZMLSys" Global:VarLst);强制更新为默认


返回结果:
  1. (princ (getenv "K\\ZZMLSys"));系统变量
  2. (princ Global:Nam1);参数1全局变量
  3. (princ Global:Nam2);参数2全局变量
  4. ....






发表于 2023-12-12 16:10:40 | 显示全部楼层
给大佬点赞,太高产了哇
发表于 2023-12-12 23:47:24 | 显示全部楼层
本帖最后由 magicheno 于 2023-12-12 23:54 编辑

感谢大佬分享,感觉还是不太会用,看不懂
发表于 2023-12-13 15:27:37 | 显示全部楼层
太高级了,不会用哦
发表于 2023-12-18 16:59:01 | 显示全部楼层
谢谢大佬分享的源码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 05:33 , Processed in 0.147282 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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