vectra 发表于 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:
(propertybag-edit '(("Diameter" . 100) ("Flow" . 0.) ("Extendedable" . "Yes")) nil nil)


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


示例2:添加分隔符、变量别名及说明文字
(propertybag-edit
'(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
'(("Diameter" "直径")
    ("Extendedable" "可扩展" "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No")
   )
nil
)


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


示例3:使用列表
(propertybag-edit
    '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
    '(("Diameter" "直径")
      ("Extendedable"
       "可扩展"
       "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No"
       ("Yes" "No")
      )
   )
    nil
)


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

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

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

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


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

(propertybag-edit
    '(("Diameter" . 100) ("Flow" . 0.) ("" . "---") ("Extendedable" . "Yes"))
    '(("Diameter" "直径")
      ("Extendedable"
       "可扩展"
       "Extendedable\n指定某种参数可否可进行扩展,可选Yes/No指定某种参数可否可进行扩展,可选Yes/No"
       ("Yes" "No")
      t
      )
   )
    ‘$edit-propties-sel
)

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

示例5:公式求解

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




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

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

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

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










wzg356 发表于 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) lstLst0)
)

伪书虫86 发表于 2022-3-5 23:53:06

本帖最后由 伪书虫86 于 2022-3-20 00:16 编辑

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


问题已解决,过来填个坑。
value为propertybag-edit的返回值,由于源程序返回值,如果填入的是数,返回的仍是数,会有可能导致写入属性块的时候有异常,故只需将返回值稍作处理即可,代码如下:

[*](setq value (mapcar '(lambda(x) (if (numberp (cdr x)) (cons (car x) (rtos (cdr x) 2)) x)) value))

508000096 发表于 2017-10-14 20:13:32

不知能否编辑块内文字?

434939575 发表于 2017-9-29 12:33:04

谢谢分享,人好钱多.

yoyoho 发表于 2017-9-30 08:47:39

感谢 vectra 分享程序!!!!

Pegasus 发表于 2017-9-30 23:54:21

谢谢分享!

pengfei2010 发表于 2017-10-1 20:28:34

没怎么明白是干啥用的

cnks 发表于 2017-10-14 19:33:52

支持一下,这个东西不错

LIULISHENG 发表于 2018-2-6 16:45:08

学习了

渠辉 发表于 2019-8-19 13:37:52


谢谢分享!

渠辉 发表于 2019-8-19 13:38:05


谢谢分享!
页: [1] 2
查看完整版本: 通用数据编辑器