首页 理论教育AutoLISP中调用设计对话框的方法

AutoLISP中调用设计对话框的方法

【摘要】:DCL代码:图15-35 hello例子以下是使用AutoLISP调用hello对话框的程序代码:通过这个例子看一下显示对话框和响应用户按OK键的步骤:用load_dialog函数加载DCL文件;用new_dialog函数初始化对话框;判断new_dialog函数是否调用成功,若成功,可以进行下一步,否则,退出;用start_dialog函数将对话框的控制传递给AutoCAD以便演示给用户;调用unload_dialog函数,在用户响应后从内存中删除对话框。action变量是一个字符串,它包含了用来表示隐含动作的一个AutoLISP表达式。

在上面一章中看到了许多的对话框控件,以及如何自己设计一个对话框。那么如何在AutoLISP程序中使用这些对话框呢?

接下来看一个例子,通过这个例子引出对话框驱动程序编写的介绍。

设计一个简单的对话框,如图15-35所示。

DCL代码:

978-7-111-45924-8-Chapter15-146.jpg

978-7-111-45924-8-Chapter15-147.jpg

图15-35 hello例子

以下是使用AutoLISP调用hello对话框的程序代码:

978-7-111-45924-8-Chapter15-148.jpg

通过这个例子看一下显示对话框和响应用户按OK键的步骤:

(1)用load_dialog函数加载DCL文件;

(2)用new_dialog函数初始化对话框;

(3)判断new_dialog函数是否调用成功,若成功,可以进行下一步,否则,退出;

(4)用start_dialog函数将对话框的控制传递给AutoCAD以便演示给用户;

(5)调用unload_dialog函数,在用户响应后从内存中删除对话框。

以下是对话框打开和关闭函数介绍。

1.load_dialog函数

格式:

978-7-111-45924-8-Chapter15-149.jpg

本函数将一个DCL文件加载到内存,一个应用程序通过多次调用本函数而装入多个文件,本函数按照AutoCAD库搜索路径来搜索指定的DCL文件。

dclfile变量指定要装入的DCL文件的一个字符串,若未指定扩展名,则假定它的扩展名是.DCL。若本函数调用成功,则返回一个正整数值假(设存入变量在index_value中);否则,返回一个负整数,这个index_value在随后调用new_dialog和unload_dialog时可用作被装入的DCL文件的句柄使用。

举例:

978-7-111-45924-8-Chapter15-150.jpg

在上例中,首先调用:

978-7-111-45924-8-Chapter15-151.jpg

将返回值赋给index_value变量。再进行判断,如果index_value大于0,说明调用对话框成功,因此可以进行下一步操作,即运行progn块里面的内容;否则显示“不能打开对话框”的错误。

2.unload_dialog

格式:

978-7-111-45924-8-Chapter15-152.jpg

unload_dialog函数卸载与文件句柄index_value(在用load_dialog函数调用对话框时所获得)相联系的那个DCL文件。本函数总是返回nil。

本函数与load_dialog函数互为反函数.

请参考load_dialog函数和new_dialog函数。

3.new_dialog

格式:

978-7-111-45924-8-Chapter15-153.jpg(www.chuimin.cn)

本函数开始一个新的对话框,并显示该对话框,还能指定一个隐含动作。

dlgname变量是指定对话框的一个字符串,而index_value变量用来识别一个对话框(它是在调用load_dialog函数时获得的,相当于一个对话框的句柄)。

如果指定了screen_pt变量,就必须指定action变量。action变量是一个字符串,它包含了用来表示隐含动作的一个AutoLISP表达式。如果并不想定义一个隐含动作,可以在action变量的位置上传递一个空字符串("")。screen_pt变量是一个2D点表,它是用来指定对话框显示在屏幕上的位置的X、Y坐标。这个点通常指定的是对话框的左上角,但它还与平台有关,其值通常用系统单位表示。如果将screen_pt变量的值设置为(-1,-1),当对话框被打开时它通常会显示在隐含位置上(即AutoCAD的图形屏幕的中心位置上)。

当用户选中了一个激活的控件,而该控件既没有通过调用action_tile函数显式地分配给它的一个动作或回调函数,也没有在DCL文件中为它定义动作,那么,由new_dialog函数指定的隐含动作就会被求值。

如果new_dialog调用成功,它返回T;否则,它返回nil。

在应用程序中,在调用Startdialog函数之前,必须先调用newdialog。所有对话框的初始化工作,如:设置控件值、生成图像、生成列表框的表以及将各个动作与特定的控件联系起来(用action_tile函数完成)等,都必须发生在调用new_dialog函数之后,同时也必须发生在用start_dialog函数之前。

在应用程序中应该总是检查由new_dialog函数返回的状态。当new_dialog函数调用失败时,调用startdialog函数将有可能导致无法预料的后果。

4.termdialog

格式:

978-7-111-45924-8-Chapter15-154.jpg

一旦用户选中了对话框中任何一个Cancel按钮,本函数就立即终止现行所有对话框。

当任何一个DCL文件被打开时,若一个应用程序被终止,AutoCAD将自动调用本函数。此函数主要用于中断嵌套对话框。此函数总是返回nil。

5.start_dialog

格式:

978-7-111-45924-8-Chapter15-155.jpg

本函数显示一个对话框,并开始接受用户的输入。

在调用本函数之前,必须调用newdialog函数,首先将对话框进行初始化。对话框一直保持激活状态,直到一个动作表达式或回调函数调用done_dialog的函数。通常,done_dialog函数与关键字为"accept”的那个控件相联系(典型情况下是OK按钮),也可以与关键字为“Cancel”的那个控件相联系(典型情况下是Cancel按钮)。

调用start_dialog函数不带变量。它返回一个传递给done_dialog函数的状态代码。如果用户按下了OK按钮,start_dialog函数返回隐含值1,如果用户按下了Cancel按钮,start_dialog函数返回值0,而如果所有对话框都被term_dialog函数终止,那么start_dialog函数就返回-1。但是,如果done_dialog函数传递了一个大于1的整型状态代码,start_dialog函数就会将这个值返回,它的含义由应用程序决定。

6.done_dialog

格式:

978-7-111-45924-8-Chapter15-156.jpg

必须从一个动作表达式或一个回调函数中调用done_dialog函数(参见actiontile函数的介绍)。

如果指定了任选变元status,它必须是一个正整数,这个正整数将由start_dialog函数返回,而代替拾取OK按钮返回1或拾取Cancel按钮返回0。任何大于1的Status值的具体含义,取决于你所编制的应用程序。

done_dialog函数返回一个2D点表,该点表示当退出对话框时该对话框的位置坐标(X,Y)。该返回点取自对话框上的哪一个点作为参考点是由平台决定的,参考点的坐标单位同样也是由平台决定的。通常情况下,参考点是对话框的左上角。可以将这个点传给随后调用的newdialog函数,在重新打开对话框时,将对话框定位在用户指定的位置上。

如果为关键字"accept"或"cancel"(通常是OK和Cancel按钮)提供了一个回调函数,那么,该回调函数必须显式地调用done_dialog函数,如果不这样做,用户就会被困在这个对话框中。如果不为这些按钮提供一个显式地回调函数,而使用标准的退出按钮,AutoCAD将自动处理它们。此外,为"accept"按钮提供的一个显式的回调函数必须使其在调用done_dialog时将变元status指定为1(或由应用程序定义的其他值);否则,start_dialog函数会返回隐含值0,而0意味着用户取消了该对话框。

我们来看一个实例。

一个对话框通常均具有OK和Cancel按钮。用户选中这两个按钮的话,均需调用done_dialog对话框确定(OK)和取消(Cancel)按钮的回调函数,通常可以用两种方法之一进行编制,下面给出代码实例:

第一种形式:

978-7-111-45924-8-Chapter15-157.jpg

第二种形式:

978-7-111-45924-8-Chapter15-158.jpg

978-7-111-45924-8-Chapter15-159.jpg

上述代码中的set_variables函数的功能是在退出对话框之前﹐将需要保存的局部变量值存储在全局变量中。