明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2113|回复: 8

[求助]大侠给个实现这样功能对话框的例子吧

[复制链接]
发表于 2004-3-25 17:29:00 | 显示全部楼层 |阅读模式
我输入命令后先进入一个对话框A,上面有几个选项例如(画圆,画直线),当我选择画直线后,卸载前面对话框A,进入另外一个对话框B,输入参数,确定后画直线,如果我选择画圆后,卸载前面对话框A,进入另外一个对话框C,输入参数,确定后画圆。
发表于 2004-3-25 18:23:00 | 显示全部楼层
如果你是为学习,建议你看书,这个应该是比较简单。。。


如果是为使用,就得把详细过程说清楚,因为这个东西实现不难,可要写很多东西,如果写的不完全合你的意思,就需要大规模改动,
 楼主| 发表于 2004-3-25 19:27:00 | 显示全部楼层
具体过程是:我写了一个画了法兰的程序,我是根据每个管法兰标准都写了一个,例如有SO;WN;PL;BL这四种,我都定义好了命令,输入wn命令就会出现WN法兰的对话框,填参数,确定后画WN法兰,输入pl命令就会出现PL法兰的对话框,填参数,按确定后画PL法兰。 现在因为法兰种类很多,命令也就很多了,所以我就想做一个画法兰的对话框,DCL如下: Flange:dialog{
label="选择法兰类型";
:boxed_column{
label="法兰类型";
:radio_button{
label="带颈平焊钢制管法兰(SO)";
key="SO";
}
:radio_button{
label="带颈对焊钢制管法兰(WN)";
key="WN";
} :radio_button{
label="带颈平焊钢制管法兰(PL)";
key="PL";
}
:radio_button{
label="带颈平焊钢制管法兰盖(BL)";
key="BL";
}
}
ok_cancel;
} lisp程序: (defun c:fl( / dcl_id)
(setq dcl_id(load_dialog "tmp.dcl"))
(new_dialog "Flange" dcl_id)
(set_tile "SO" "1")
(action_tile "cancel" "(done_dialog) (princ) (setq soerr \"*取消*\")(exit)")
(action_tile "accept" "(draw)")
(start_dialog)
(unload_dialog)
) (defun draw()
(if (= (get_tile "SO") "1")
(progn(
(term_dialog)
;(unload_dialog)
(load "so") ;SO法兰的lisp程序so.lsp在support目录中 (command "fg" ) ;因为与solid命令冲突,画SO的法兰命令为fg
) (if (= (get_tile "WN") "1")
(progn(
(term_dialog)
;(unload_dialog)
(load "wn")
(command "wn" ) ;WN 法兰的lisp程序wn.lsp在support目录中
)
)
)
) 我的思想是,因为对话框不能使用command函数,所以我就想先中止Flange对话框,所以我使用(term_dialog)想把它中止后,再用command命令调入画SO法兰的fg命令,但是他提示位置函数fg,实际上在autocad里面输入fg命令是可以出现画SO法兰的对话框的
发表于 2004-3-25 20:07:00 | 显示全部楼层
1、你在帮助文件里搜索“隐藏对话框”,将有你要求的暂时退出对话框的功能,例子中是使用(getpint...),你将其改装成你的程序就可以了。


2、退出对话框用done_dialog,因为你无论用哪个命令,都需要退出对话框,所以这个过程就不要在if判断里面了,先退出对话框,再根据选择不同调用不同的命令(例子你会发现的)


3、如果这些命令是你自己定义的,属外部定义命令,不能用(command ...)的,你直接(c:fg)调用就可以了
 楼主| 发表于 2004-3-25 21:15:00 | 显示全部楼层
隐藏对话框后能使用command吗?因为SO法兰是通过command来画的。 (defun draw()
(if (= (get_tile "SO") "1")
(progn(
(done_dialog)
(unload_dialog)
(load "flange/so")
(c:fg)
)
)
)
) 出错*** ERROR: too few arguments (defun draw()
(if (= (get_tile "SO") "1")
(progn(
(done_dialog)
(term_dialog)
(load "flange/so")
(c:fg)
)
)
)
) 程序就死在这里了,上面的Flange对话框也没有消失,SO的对话框也没有出现 (defun draw()
(if (= (get_tile "SO") "1")
(progn(
(done_dialog)
(load "flange/so")
(c:fg)
)
)
)
) 同上
 楼主| 发表于 2004-3-25 21:17:00 | 显示全部楼层
哦,上面的(done_dialog)
我都写在if之前了
发表于 2004-3-25 21:35:00 | 显示全部楼层
1、你progn后面的括号干吗用的? 2、仔细看帮助文件了吗?看看你的和帮助文件的有什么不同?有那么多unload_dialog或者term_dialog吗?(如下面的程序,同帮助文件一模一样,仅仅是把(getpint...)改成了(command ...)。 3、再看看unload_dialog函数,是那样用的吗,注意看看例子中的用法就可以了 4、建议,你自己看看,这么小个程序就有这么多问题,有几个是难题呢?在继续学习、写程序之前,一定要把会的搞熟了,尽量不要让问题出在自己知道的地方,即使偶尔出现了,应该自己能找出这些错误来。 ;lsp文件 (defun c:hidedcl (/ dcl_id what_next cnt)
(setq dcl_id (load_dialog "hidedcl.dcl")) ;加载对话框
(setq what_next 2)
(setq cnt 1)
(while (>= what_next 2) ;开始显示循环
(if (null (new_dialog "hidedcl" dcl_id)) ;初始化对话框
(exit) ;如果返回 nil 则退出
); endif ; 设置按钮被按下后执行的动作。每个按钮都调用 done_dialog
; 关闭对话框
; 每个按钮都将一个特定的状态代码与 done_dialog 相关联, ; 并且该状态代码由 start_dialog 返回。
(action_tile "accept" "(done_dialog 1)") ;设置 OK 的动作
(action_tile "hide" "(done_dialog 4)") ;设置 PickMe的动作
(setq what_next (start_dialog)) ;显示对话框
;
(cond
((= what_next 4) ;提示用户
(command "_.line" '(0 0) '(100 100) "") ;拾取 pt
)
((= what_next 0)
(prompt "\nuser cancelled dialog")
)
)
)
(unload_dialog dcl_id) (princ) ) ;hidedcl.dcl文件 hidedcl : dialog
{ label="Hide Example";
: column
{ : text
{ key="message";
label="Click PickMe to pick a point";
fixed_width=true;
fixed_height=true;
alignment=centered;
}
:row
{ ok_only;
:retirement_button
{ label = "PickMe";
key = "hide";
mnemonic = "H"; }}}}
发表于 2004-3-31 08:40:00 | 显示全部楼层
sunix你找本dcl的书,抄抄里面关于对话框隐藏的驱动不就结了?


不说内容,你写的实在难看(直言勿怪)
发表于 2004-4-3 14:36:00 | 显示全部楼层
7楼程序好眼熟啊!


昨天刚看过的,其实就是这样!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 00:41 , Processed in 0.185164 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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