通用数据编辑器
本帖最后由 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})" 也可以达到同样的效果。
我来改老版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-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))
不知能否编辑块内文字? 谢谢分享,人好钱多. 感谢 vectra 分享程序!!!! 谢谢分享! 没怎么明白是干啥用的 支持一下,这个东西不错 学习了
谢谢分享!
谢谢分享!
页:
[1]
2