明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5003|回复: 14

[源码] 通用数据编辑器

  [复制链接]
发表于 2017-9-28 23:49:39 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2017-9-28 23:56 编辑

这个是“为应用程序数据提供一个简单的修改界面”的升级版,原文http://bbs.mjtd.com/thread-113678-1-1.html

特点:1、开源,方便扩展修改,可以在你的软件中自由使用;
2、纯LISP实现,除DCL文件外无其它依赖项。

使用方法:1、下载附件两个文件,放至任意目录。
2、在CAD 工具->选项 ,“支持文件搜索路径”中增加一项,指定为步骤1中的目录。
3、准备工作完成。

下面来看演示:


示例1:
  1. (propertybag-edit '(("Diameter" . 100) ("Flow" . 0.) ("Extendedable" . "Yes")) nil nil)



在值的文本框里填入3,按确定,程序返回修改后的属性列表
传入的值是浮点数,修改的文本内容将自动转化为浮点类型。整数同理,目前不支持复杂数据类型。


示例2:添加分隔符、变量别名及说明文字

  1. (propertybag-edit
  2.   '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
  3.   '(("Diameter" "直径")
  4.     ("Extendedable" "可扩展" "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No")
  5.    )
  6.   nil
  7. )



属性Diameter显示为更易懂的“直径”;
属性标记为空白“”时,提取该属性的值作为分隔符显示在属性列表框中,方便对数据进行分组。
propertybag-edit函数的第二个参数对属性标记进行了解释,显示了更容易阅读的含义,如果添加了解释说明文字,值下方的说明框会列出该属性的详细说明。


示例3:使用列表

  1. (propertybag-edit
  2.     '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
  3.     '(("Diameter" "直径")
  4.       ("Extendedable"
  5.        "可扩展"
  6.        "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No"
  7.        ("Yes" "No")
  8.       )
  9.      )
  10.     nil
  11.   )



在说明文字后面添加一个可选数据表,将会启用列表框,供用户从预设值中选择。如果要限定用户在列表框中选择,可在此列表后增加一个参数t,如:

  1. (propertybag-edit
  2.     '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
  3.     '(("Diameter" "直径")
  4.       ("Extendedable"
  5.        "可扩展"
  6.        "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No"
  7.        ("Yes" "No")
  8.         t
  9.       )
  10.      )
  11.     nil
  12.   )


这将禁用文本编辑控件,用户只能在列表框中选择项目。

示例4:记住上次编辑的行

  1. (setq $edit-propties-sel "2")

  2. (propertybag-edit
  3.     '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
  4.     '(("Diameter" "直径")
  5.       ("Extendedable"
  6.        "可扩展"
  7.        "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No"
  8.        ("Yes" "No")
  9.         t
  10.       )
  11.      )
  12.     ‘$edit-propties-sel
  13.   )

启动对话框时将预选选定第3行,当选择了其它行时,行号将被保存到变量$edit-propties-sel中,做为下次启动对话框时的预选项。

示例5:公式求解

  1. (propertybag-edit
  2.                 $data
  3.                 '(("Diameter"
  4.                    "直径"
  5.                    "管道的公称直径,单位为mm"
  6.                    (32 40 50 65 80 100 125 150 200 250 300 400 500 600)
  7.                   )
  8.                   ("Flow" "流量" "单位为m3/h。")
  9.                   ("Vol"
  10.                    "流速"
  11.                    "管道内流体在指定流量管径条件下的流速 m/s"
  12.                    "(/ {Flow} 3600. (/ (* pi {Diameter} {Diameter}) 4.e6)))"
  13.                   )
  14.                  )
  15.                 '$edit-propties-sel
  16.               )




如果可选数据表为字符串,将自动对字符串表达式进行求解,并将结果显示在该属性值下。任何修改操作都将触发公式更新。

你也可以调用自定义函数来求解,并有花括号“{”、“}”来表示属性的值。

如定义
  1. (defun vol (f d)
  2.   (/ f 3600. (/ (* pi d d) 4.e6))
  3. )

之后,定义表达式为 "(vol {Flow} {Diameter})" 也可以达到同样的效果。










本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +3 金钱 +10 收起 理由
Bao_lai + 1 赞一个!
llsheng_73 + 1 + 10 不需要理由!!!
自贡黄明儒 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 工具|主题: 71, 订阅: 4
  • · table|主题: 9, 订阅: 0
发表于 2020-9-15 19:39:06 | 显示全部楼层
我来改老版http://bbs.mjtd.com/thread-113678-1-1.html的母文件
加入判断输入是否非法,暂仅判断输入'INT 'REAL 'STR
输入非法不修改,按取消不修改
;;; 原作者:vectra
(defun PropertyEdit (Lst0 / Lst update-textbox update-list make-load-dcl)
  (defun update-textbox (index)
    (set_tile "value" (vl-princ-to-string (cdr (nth (atoi index) Lst))))
    );依list_boxd的定位index(索引)值自表lst取值,向edit_box赋值
  (defun update-list (value / newadd_list index old typ0 typ)
        (defun newadd_list (value index / new)
                (setq new (strcat (car old) "\t" value))
            (start_list "name" 1 index) ;_指定修改 index 位置上的数据
            (add_list new)
            (end_list)
        )  
    (setq index (atoi (get_tile "name"))
          old   (nth index Lst)
          typ0 (type (cdr old));'INT 'REAL 'STR.....
          typ (type (read value))
    )
    (cond  
            ((= 'INT typ0 typ)
                    (newadd_list value index)(setq Lst (subst (cons (car old) (atoi value)) old Lst))
            )
            ((and (= 'REAL typ0)(member typ (list 'INT 'REAL)))
              (newadd_list value index)(setq Lst (subst (cons (car old) (atof value)) old Lst))
            )
                ((= 'STR typ0);
                        (newadd_list value index) (setq Lst (subst (cons (car old) value) old Lst))
                )
            (t (alert "数据类型非法!"))   
    )
  );;依value返回值并判断数据类型更新list_boxd及表lst
  (defun make-load-dcl (/ dclfile dlg file)
    (setq dclfile (vl-filename-mktemp nil nil ".dcl")
          file    (open dclfile "w")
          )
    (write-line
      "PropertyEditForm:dialog{label=\"属性编辑\";
      :row{:list_box{key=\"name\";height=25;width=50;tabs=25;}
      :row{:edit_box{key=\"value\";width=30;}}}
      ok_cancel;}"
      file
    )
    (close file)
    (setq dlg (load_dialog dclfile))
    (vl-file-delete dclfile)
    dlg
    );;;写对话框文件
  (setq Lst Lst0)
  (new_dialog "PropertyEditForm" (make-load-dcl))
  (start_list "name")
  (mapcar  'add_list
    (mapcar '(lambda(e) (strcat (car e) "\t" (vl-princ-to-string (cdr e)))) Lst)
    )
  (end_list)
  (action_tile "name"  "(update-textbox $VALUE) (mode_tile \"value\" 2)");点击执行的动作
  (action_tile "value" "(update-list $VALUE)")
  (if (= (start_dialog) 1) lst  Lst0)
  )
发表于 2022-3-5 23:53:06 | 显示全部楼层
本帖最后由 伪书虫86 于 2022-3-20 00:16 编辑

收藏了半年终于明白了用处,但是发现了一个问题,值为0.85之类小于1的小数时,更新的话,会变成.85,小数点前的0会消失,不知道该怎么处理



问题已解决,过来填个坑。
value为propertybag-edit的返回值,由于源程序返回值,如果填入的是数,返回的仍是数,会有可能导致写入属性块的时候有异常,故只需将返回值稍作处理即可,代码如下:
  • (setq value (mapcar '(lambda(x) (if (numberp (cdr x)) (cons (car x) (rtos (cdr x) 2)) x)) value))

发表于 2017-10-14 20:13:32 | 显示全部楼层
不知能否编辑块内文字?
发表于 2017-9-29 12:33:04 | 显示全部楼层
谢谢分享,人好钱多.
发表于 2017-9-30 08:47:39 | 显示全部楼层
感谢 vectra 分享程序!!!!
发表于 2017-10-1 20:28:34 | 显示全部楼层
没怎么明白是干啥用的
发表于 2017-10-14 19:33:52 | 显示全部楼层
支持一下,这个东西不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-22 20:37 , Processed in 0.223720 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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