明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1922|回复: 16

[源码] 通用的对话框DCL赋值与取值函数

[复制链接]
发表于 2022-3-11 15:50:28 | 显示全部楼层 |阅读模式
本帖最后由 言戲無軍 于 2022-3-13 10:35 编辑

dcl对话框界面可以用飞诗dcl编辑器生成,dcl对话框的赋值与取值对新手来说入门比较难,论坛上有很多通用的函数,一直没有满意的,故写下此2函数。
抛转引玉一起交流,水平有限轻拍。附带了dcl完整测试程序文件。新增dcl创建函数 dcl_create
  • dcl_setTile 赋值
  • dcl_getTile 取值
  • dcl_create

  1. ;;说明:对dcl对话框进行批量赋值及初始化
  2. ;;参数:lst: 控件keys 和 值组成的表
  3. ;;返回:
  4. (defun dcl_setTile(lst / a)
  5.   (mapcar
  6.     '(lambda(x)
  7.        (cond
  8.          ((= (type (cadr x)) 'list)  
  9.            (start_list (car x) );;(caadr x)
  10.            (mapcar 'add_list   (val2str(cadadr x)))
  11.            (end_list)
  12.            (setq a (caadr x))
  13.            (if (= (type a)  'LIST)
  14.              (set_tile (car x)
  15.                (vl-string-right-trim " " (apply 'strcat (mapcar '(lambda(y)(strcat y " "))(val2str a))))               
  16.              )                          
  17.              (set_tile (car x) (val2str(caadr x)))
  18.            )           
  19.          )
  20.          (t (set_tile (car x) (val2str (cadr x))) )
  21.        )
  22.      )
  23.     lst  
  24.   )   
  25. )
  26. ;;说明:获取对话框控件值 需要注意的是没有进行数据合法性检查,自行增加
  27. ;;参数:lst: 控件keys和值组成的表 即变量保存列表*vars&vals*
  28. ;;返回:获取的控件变量
  29. ;;说明:
  30. (defun dcl_getTile(lst / lst0  key v)
  31.   ;(setq lst0 lst)
  32.   (mapcar
  33.     '(lambda(x)
  34.        (setq key (car x))
  35.        (setq v (get_tile key))
  36.        (cond
  37.          ((= (type (cadr x)) 'list)
  38.            (setq a (caadr x))
  39.            (if (/= (type a)  'LIST)
  40.              (setq v (atoi v))
  41.              (setq v (read (strcat "(" v ")")))            
  42.            )
  43.            (list key (list v (cadadr x)))                     
  44.          )
  45.          (t  (list key (str2val v (cadr x)))  )  ;;(str2val "123.5" 10.1)
  46.        )
  47.      )
  48.     lst
  49.   )
  50. )

传入的lst要求是2维表
  1. (setq *vars&vals* ;;;全局变量用于初始化及保存dcl中所有的值 (setq *vars&vals* nil)
  2.     '(
  3.        ("op1" 1);radio1选则1选中 0不选 1选中
  4.        ("op2" 0);radio1选则2未选中 0不选 1选中
  5.        ("edit1" 123.5);;editbox实数
  6.        ("edit2" "asbda");;editbox字符串
  7.        ("tog1" 0);;toggle复选框 0不选 1选中。
  8.        ("pop1"  (2 (0.2 0.5 1.0 2.0 5.0))   )  ;;popuplist下拉框列表 0 代表默认为列表中第一个值1代表第二个...
  9.        ;(0.2 0.5 1.0 2.0 5.0)代表下拉列表框中显示的值
  10.        ("list1"  ((1) ("物品1" "物品2" "物品3" "物品4"))   )  ;;listbox下拉框列表  1 代表默认为列表中第二个值2代表第三个...
  11.        ;;("物品1" "物品2" "物品3" "物品4")list1中显示的值 ;如果列表支持多选 1换为 表 (1) (1 2 3)等
  12.     )
  13.   )


  1. (defun dcl_Create ( / dcl des dcl_id)
  2. (setq dcl (vl-filename-mktemp nil nil ".dcl"))
  3.   (setq des (open dcl "w"))
  4.   (write-line (apply 'strcat  dclLst )des)
  5.   (close des)
  6.   (setq dcl_id (load_dialog dcl))
  7.   (vl-file-delete dcl)
  8.   (setq dlg (car (vl-remove-if-not '(lambda (x) (wcmatch x "*dialog*")) dcllst)))
  9.   (setq dlg (car (LM:str->lst dlg ":" )))
  10.   
  11.   (if (null (new_dialog dlg dcl_id))
  12.     (exit)                                 
  13.   )
  14.   dcl_id
  15.   
  16. )



顺便附上对话框dcl文件转lisp文件程序,也就是程序中用到的dcllist 就不用单独打包dcl文件了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
xj6019 + 1 很给力!
bssurvey + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-12 20:07:14 | 显示全部楼层
本帖最后由 hhh454 于 2022-3-12 20:18 编辑

;; String to List  -  Lee Mac
;; Separates a string using a given delimiter
;; str - [str] String to process
;; del - [str] Delimiter by which to separate the string
;; Returns: [lst] List of strings

(defun LM:str->lst ( str del / len lst pos )
    (setq len (1+ (strlen del)))
    (while (setq pos (vl-string-search del str))
        (setq lst (cons (substr str 1 pos) lst)
              str (substr str (+ pos len))
        )
    )
    (reverse (cons str lst))
)

发表于 2022-3-12 20:34:11 | 显示全部楼层
(defun LM:str->lst (str del / n lst n1)
  (setq n (1+ (strlen del)))
  (while (setq n1 (vl-string-search del str))
    (setq lst (cons (substr str 1 n1) lst)
          str (substr str (+ n1 n))
    )
  )
  (vl-remove "" (reverse (cons str lst)))
)
 楼主| 发表于 2022-4-5 13:21:04 | 显示全部楼层
kozmosovia 发表于 2022-4-2 16:30
https://www.zhihu.com/column/vldcl

膜拜了 vl dcl太专业了 只是自由度差了点,入门有点难
发表于 2022-3-11 15:57:41 | 显示全部楼层
函数不全,缺val2str
 楼主| 发表于 2022-3-11 16:03:44 | 显示全部楼层
在附件中,下载即可。
发表于 2022-3-12 10:23:34 | 显示全部楼层
LM:str->lst
缺少这个函数
发表于 2022-3-12 21:48:37 | 显示全部楼层
这个思路比较好,借鉴了,多谢分享
发表于 2022-3-12 23:32:57 | 显示全部楼层
非常实用,dcl的设置流程得到了大大简化,多谢楼主。
发表于 2022-3-15 09:23:03 | 显示全部楼层
非常感谢楼主的分享
发表于 2022-3-28 22:27:20 | 显示全部楼层
这个思路很不错,多谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 11:35 , Processed in 0.177739 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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