找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2152|回复: 7

[对话框] (XD::DCL:AddList)批量填充列表

[复制链接]
发表于 2014-10-6 08:52:18 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::DCL:AddList
调用格式: (XD::DCL:AddList key val item)
参数说明: _$klst --- key or key list
_$val --- list or (list list ..)
_$itemL --- 默认值 ( int string or list )
返回值:
函数简介: 批量填充列表
函数来源: 原创
函数作者: Free-Lancer
适用版本: 不限 
最后更新时间: 2014-10-11
备注: key 作为全局变量时将记录上次值

多表填充时,$itemL 必须为 表 (或 nil) 不可为 int string
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Free-Lancer 于 2014-10-11 08:39 编辑

(setq klst  '("k1" "k2" "k3" "k4") ;_key list
      lst1  '("0"  "1" "2" "3" "4")
      lst2  '("0"  "1" "2" "3" "4")
      lst3  '("0"  "1" "2" "3" "4")
      lst4  '("0"  "1" "2" "3" "4")
      itemL '("0"  "1" "2" "3")
)
单个列表控件填充, lst1 用变量形式可以在运行进行更改
(xd::dcl:addlist "k1" 'lst1 "0");项
(xd::dcl:addlist "k1" 'lst1 0) 索引形式,整数
(xd::dcl:addlist "k1" nil 0) 空表,不填充,索引值必须有,但无效
(xd::dcl:addlist "k1" 'lst1 nil) 填表,不设定默认索引
批量列表填充
(xd::dcl:addlist klst '(lst1 lst2 lst3 lst4) itemL)
(xd::dcl:addlist klst '(lst1 lst2 lst3) itemL) 仅填充与 klst 中对应的表
(xd::dcl:addlist klst '(lst1 lst2 lst3) nil)
  1. ;; 填充列表
  2. (defun XD::DCL:AddList (_$klst _$val _$itemL / _addlist)
  3.   (defun _addlist (key val item / n _msettile)
  4.     (defun _msettile (item / ll)
  5.       (cond
  6.         ((and (= (type item) 'INT) ;_整数时
  7.               (<= 0 item (1- (length (vl-symbol-value val))))
  8.          )
  9.          (set_tile key (itoa item))
  10.         )
  11.         ((and (= (type item) 'STR)
  12.               (setq n (vl-position item (vl-symbol-value val)))
  13.          )
  14.          (set_tile key (itoa n))
  15.         )
  16.         ((listp item) ;_ list_box multiple_select  = true;
  17.          (setq ll (mapcar '(lambda (x)
  18.                              (if (= (type x) 'STR)
  19.                                (vl-position x (vl-symbol-value val))
  20.                                x
  21.                              )
  22.                            )
  23.                           item
  24.                   )
  25.          )
  26.          (set_tile key
  27.                    (vl-string-trim
  28.                      " "
  29.                      (vl-string-translate
  30.                        "()"
  31.                        "  "
  32.                        (vl-princ-to-string ll)
  33.                      )
  34.                    )
  35.          )
  36.         )
  37.         (t)
  38.       )
  39.     )
  40.     (if        (eval val) ;_not nil
  41.       (progn
  42.         (start_list key)
  43.         (foreach n (vl-symbol-value val) (add_list n))
  44.         (end_list)
  45.         (if (eval (read key)) ;_如果 key 已有值
  46.           (_msettile (eval (read key)))
  47.           (if item ;_按给定设置默认索引
  48.             (_msettile item)
  49.           )
  50.         )
  51.       )
  52.     )
  53.   )
  54.   (if (listp _$klst)
  55.     (while _$klst ;_适应不等长表
  56.       (_addlist (car _$klst) (car _$val) (car _$itemL))
  57.       (setq _$klst  (cdr _$klst)
  58.             _$val   (cdr _$val)
  59.             _$itemL (cdr _$itemL)
  60.       )
  61.     )
  62.     (_addlist _$klst _$val _$itemL)
  63.   )
  64. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2014-10-7 10:15:19 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-11 08:42 编辑

更新, 适应更复杂的批量填充, 测试代码
  1. (defun c:tt2 (/ strl lyrlst fn id)
  2.   (setq        strl   '("temp:dialog {"
  3.                  "label = \"List text\";"
  4.                  ":row  {"
  5.                  ":list_box { key = \"lyr1\"; height = 16; width = 8;}"
  6.                  ":list_box { key = \"lyr2\"; height = 16; multiple_select  = true; width = 8;}"
  7.                  "}"
  8.                  "ok_cancel;}"
  9.                 )
  10.         lyrlst (fy:table "layer")
  11.         fn     (xd::dcl:make strl)
  12.         id     (xd::dcl:load fn "temp")
  13.   )
  14.   (xd::dcl:listaction
  15.     '("lyr1" "lyr2") ;_key list, 单个列表时用 key string
  16.     '(lyrlst lyrlst) ;_引用的变量名,加 ', 单个列表时 'lyrlst
  17.     '("0" ("1" 2 3)) ;_lyr1 lyr2 为全局变量, 指定初始索引
  18.     nil ;_ 不指定回调函数时记录索引值
  19.   )
  20.   (xd::dcl:accept nil) ;_不取值仅定义 ok cancel
  21.   (if (= (xd::dcl:start id fn) 1)
  22.     (progn
  23.       (and lyr1
  24.            (princ (strcat "\nListBox1 select " (vl-princ-to-string lyr1)))
  25.       )
  26.       (and lyr2
  27.            (princ (strcat "\nListBox2 select " (vl-princ-to-string lyr2)))
  28.       )
  29.     )
  30.   )
  31.   (princ)
  32. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-10 17:26:26 | 显示全部楼层
2014.10.10更新
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-11 08:43:15 | 显示全部楼层
2014.10.11 更新多选时Bug

点评

'("0" ("1" 2 3)) ;_lyr1 lyr2 为全局变量, 指定初始索引 大师,这又怎么理解啊?  详情 回复 发表于 2014-10-11 11:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3199个

财富等级: 富可敌国

发表于 2014-10-11 11:54:29 | 显示全部楼层
本帖最后由 lucas3 于 2014-10-11 12:08 编辑
Free-Lancer 发表于 2014-10-11 08:43
2014.10.11 更新多选时Bug

    '("0" ("1" 2 3)) ;_lyr1 lyr2 为全局变量, 指定初始索引
大师,这又怎么理解啊?

另外这个示例看不出效果,默认的图层(即不选择)按确定后没有提示,能不能将这个示例完善,比如画两个同心圆,大圆用左边的图层,小圆用右边的图层……

点评

初始索引只是一个显示,当不进行选择时,在 xd::dcl:accept 中获取这个值,这样做只是为了前面少进行一些变量设置,这样说来 accept 还需要再改进一下,获取 List 时直接返回项名,现在是返回索引  详情 回复 发表于 2014-10-11 14:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-11 14:39:16 | 显示全部楼层
lucas3 发表于 2014-10-11 11:54
'("0" ("1" 2 3)) ;_lyr1 lyr2 为全局变量, 指定初始索引
大师,这又怎么理解啊?


初始索引只是一个显示,当不进行选择时,在 xd::dcl:accept 中获取这个值,这样做只是为了前面少进行一些变量设置,这样说来 accept 还需要再改进一下,获取 List 时直接返回项名,现在是返回索引
  1. (defun c:tt2 (/ strl lyrlst fn id result)
  2.   (setq        strl   '("temp:dialog {"
  3.                  "label = \"List text\";"
  4.                  ":row  {"
  5.                  ":list_box { key = \"lyr1\"; height = 16; width = 8;}"
  6.                  ":list_box { key = \"lyr2\"; height = 16;  width = 8;}"
  7.                  "}"
  8.                  "ok_cancel;}"
  9.                 )
  10.         lyrlst (mapcar 'car (xd::object:get "layer"))
  11.         fn     (xd::dcl:make strl)
  12.         id     (xd::dcl:load fn "temp")
  13.         result '("lyr1" "lyr2")
  14.   )
  15.   (xd::dcl:listaction
  16.     '("lyr1" "lyr2")
  17.     '(lyrlst lyrlst)
  18.     '("0" "1")
  19.     nil
  20.   )
  21.   (xd::dcl:accept 'result) ;_按确定后取出控件值,
  22.   (if (= (xd::dcl:start id fn) 1)
  23.     (progn
  24.       (if (not lyr1);_再不点击列表时虽然有默认索引但 lyr1 是不会赋值的
  25.         (setq lyr1 (nth (atoi (car result)) lyrlst))
  26.       )
  27.       (if (not lyr2)
  28.         (setq lyr1 (nth (atoi (cadr result)) lyrlst))
  29.       )
  30.       (and (setq p1 (getpoint "\nFirst Circle Center: "))
  31.            (entmakex (list '(0 . "circle")
  32.                            (cons 8 lyr1)
  33.                            (cons 10 p1)
  34.                            '(40 . 100)
  35.                      )
  36.            )
  37.            (setq p2 (getpoint p1 "\nSecond Circle Center: "))
  38.            (entmakex (list '(0 . "circle")
  39.                            (cons 8 lyr2)
  40.                            (cons 10 p2)
  41.                            '(40 . 100)
  42.                      )
  43.            )
  44.       )
  45.     )
  46.   )
  47.   (princ)
  48. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2014-11-5 14:50:19 | 显示全部楼层
  (xd::dcl:listaction
    '("lyr1" "lyr2")
    '(lyrlst lyrlst)
    '("0" "1")
    nil
  )

-->

  (xd::dcl:listaction
    '("lyr1" "lyr2")
    '(lyrlst lyrlst)
    '(0 1)
    nil
  )

点评

"0" 和 0 一样,函数里面用了 vl-princ-to-string  详情 回复 发表于 2014-11-6 09:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-6 09:57:31 | 显示全部楼层
炫翔 发表于 2014-11-5 14:50
(xd::dcl:listaction
    '("lyr1" "lyr2")
    '(lyrlst lyrlst)

"0" 和 0 一样,函数里面用了 vl-princ-to-string



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-25 14:56 , Processed in 0.368057 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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