自贡黄明儒 发表于 2017-7-27 12:31:25

操作对话框

本帖最后由 自贡黄明儒 于 2022-5-25 15:37 编辑

有网友问我对话框怎么写,其实我也不太懂。我也是后来掌握的慢慢理解加深的。对话框其实就下面4句
(setq dclid (load_dialog fname))①
(new_dialog "SameEnt" dclid)②
(setq return# (start_dialog))③
(unload_dialog dclid)④
我一直认为最后一句④是必要的,highflybird大师说可有可无,想想也是,现在内存很大,卸不卸载有什么关系。
第一句①当然是必要的,不论是lisp、对话框DCL、或者其它什么程序,总是要选调入内存才能运行的。所以对话框只需要掌握②③这两句。

看下面的程序
1 用户增加的语句基本上在②③之间。
2 紧跟②之后,是一个函数(setdata)。给对话框上的控件赋值。
3 (setdata)之后是对话框上控件的操作。一般有action_tile,set_tile,mode_tile
要说明一下的是:A 后面有done_dialog的,会使对话框消失。那么对话框上的数据会消失,所以要写一个函数(getdata)以获取对话框上的数据,如㈡.
B (done_dialog 1)后面这个1,会传递给③句的return#,这相当的奇怪。
C 如果要在屏上交互点取东西,那么对话框必须消失,所以必需要done_dialog,如㈢。这句赋给return#=2,所以对话框能循环出现。
D ③之后是判断,根据return#的值做不同的事。因为"Pick1"和"Pick2"对话框都会消失。
C 对话框中的控件如果是" ok_only;",那么㈡可以不要。默认值return#=1

(setq dclid (load_dialog fname))
(setq return# 3)
(while (> return# 1)
(new_dialog "SameEnt" dclid);②
(setdata);㈠
(action_tile "accept" "(getdata)(done_dialog 1)");㈡
(action_tile "Pick1" "(getdata)(done_dialog 2)");㈢
(action_tile "Pick2" "(done_dialog 3)")
(action_tile "ra1" "(getdata)(doRadio)")
(action_tile "ra2" "(getdata)(doRadio)")
(ACTION_TILE "l3" "(setq val $value)(dol3)")
(setq return# (start_dialog));③
(cond
    ((= return# 1))
    ((= return# 2) (doPick1))
    ((= return# 3) (doPick2))
)
)
(unload_dialog dclid)

简而言之,以上框架中,只需要在②③之间,写好那几个函数(setdata)(getdata)(doPick1)...就可以了。

记住上次对话框的位置http://bbs.xdcad.net/forum.php?m ... =%B6%D4%BB%B0%BF%F2

变量DIASTAT取得的值,估计是:is_defult=true的值

yxp 发表于 2017-7-27 15:46:25

本帖最后由 yxp 于 2017-7-27 16:06 编辑

关于lisp调用对话框,本人自从学习lisp以来发现有以下三种方式:
1.LISP 自带的 DCL,优点:代码少,维护方便,可以用 lisp 生成动态窗口,缺点:控件太少,无法实现复杂操作,比如 表格,标签、菜单等等。
2.其他对话框插件, 比如 OpenDCL,优点:控件多,可迅速上手。缺点:每个CAD版本对应一个 ARX,太累赘,发布一个几十KB的 lisp 代码,得带上几十MB的对话框资源文件。随着CAD版本的增加,情况只会越来越恶化,貌似作者都停止开发了。
3. 用 VS 开发 acitveX 控件,以前明经就有个帖子,论坛崩溃后估计也丢了。百度 C# 开发 AcitveX 也可以找到类似文章,这种方式优于前两种。将对话框做成 DLL,再用 lisp 调用,文件很小,可以和 lisp 一起打包。选择 .net 2.0 即可支持所有CAD版本,32 位 DLL 用 vb6.0 可生成,64 位的就必须上 VS 了 ,vb6.0 不支持 64 位,下面是 VS2015 企业版。

prcstone 发表于 2017-7-28 08:31:19

yxp 发表于 2017-7-27 15:46
关于lisp调用对话框,本人自从学习lisp以来发现有以下三种方式:
1.LISP 自带的 DCL,优点:代码少,维 ...

楼主能详细说说吗?“3. 用 VS 开发 acitveX 控件,以前明经就有个帖子,论坛崩溃后估计也丢了。百度 C# 开发 AcitveX 也可以找到类似文章,这种方式优于前两种。将对话框做成 DLL,再用 lisp 调用,文件很小,可以和 lisp 一起打包。选择 .net 2.0 即可支持所有CAD版本,32 位 DLL 用 vb6.0 可生成,64 位的就必须上 VS 了 ,vb6.0 不支持 64 位,下面是 VS2015 企业版。”

自贡黄明儒 发表于 2017-7-27 12:34:00

本帖最后由 自贡黄明儒 于 2017-7-27 17:38 编辑

同时提供给大家一个工具

lisp爱好者 发表于 2017-7-27 13:49:08

祝贺明经重开,挺黄大师的贴

被承包的东子 发表于 2017-7-27 14:59:17

顶顶顶

fangmin723 发表于 2017-7-28 12:27:55

更新了啊!顶一个!

Sylvanas 发表于 2017-7-28 14:41:40

好工具,黄大师厉害

yfs719 发表于 2017-7-28 16:35:02

重开就发贴,真心赞

ko217 发表于 2017-7-30 21:14:40

黄大师,666666
页: [1] 2
查看完整版本: 操作对话框