明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7552|回复: 30

菜鸟求助

  [复制链接]
发表于 2002-6-23 09:25 | 显示全部楼层 |阅读模式
各位大哥:
      小弟我在为编一个对话框而犯愁.谁能给我一个列子,我将感激不禁.email dhwei1@etang.com.qq:57160160
发表于 2002-6-28 15:16 | 显示全部楼层

这本书...

经过大量整理和扩充,将以《Visual LISP for AutoCAD 2002——技巧与范例》重新出版,已经在出版商手完成审校...
发表于 2002-7-6 15:19 | 显示全部楼层

呵呵,较上劲了。也多谢你的热情。

发表于 2002-6-23 10:44 | 显示全部楼层

re

第十一章 设计对话框
概述
对话框控制语言 (DCL) 以 ASCII 文件形式定义对话框。对话框中各种元素(如按钮和编辑框)又称为控件。控件的尺寸和功能由控件的属性控制。只需提供最基本的位置信息后,就可以自动确定对话框的大小和部件的布局。VLISP 提供了查看对话框的工具,同时还提供了从应用程序中控制对话框的函数。
本章介绍对话框的组成元素。解释 DCL 文件结构和语法,并提供了创建样例对话框的 AutoLISP 和 DCL 代码。本章还提供了一些 DCL 编码技巧,用于解决布局问题。
本章内容包括:
<>对话框部件
<>用 DCL 定义对话框
<>用 Visual LISP 显示对话框
<>调整对话框的布局
<>设计指导
对话框部件
下图显示了一个标准 AutoCAD 对话框,其中部分部件加了标签。在创建和自定义对话框时,这些部件被称为控件。

对话框由其自身的框架和其中的控件组成。可编程对话框 (PDB) 功能模块已经预定义了基本控件类型。
通过将控件编组到行和列中,选择是否在这些成组控件周围添加封闭的框架和边框,可以创建复杂的控件,即组件。控件的行或列称为控件组。组件可以将应用在许多对话框中的控件或控件组定义成组。例如,可以将“确定”、“取消”和“帮助”按钮定义成组件,按钮之间的间距相同。
使用中,组件被视为一个独立的控件。组件包含的控件被称为子组件。DCL 文件按照树型结构组织,其中树型结构顶端的控件 (dialog) 用于定义对话框本身。下图示意了 DCL 文件结构:

在 DCL 中,控件或组件的布局、外观和动作由控件的属性指定。例如,dialog 和多数预定义控件类型都有一个 label 属性,用于指定与控件关联的文字。其中对话框的 label 属性定义对话框顶部的标题,按钮的 label 属性用于指定按钮内的文字等。
DCL 还允许定义新的控件,称为控件原型,控件原型不需要和特定对话框相关联。这一特性使得用户可以非常方便地在多个对话框中使用同一部件。可以在 DCL 文件中引用由其他 DCL 文件定义的控件原型,修改其属性的方法与修改预定义控件属性的方法相同。
设计对话框初期,即开始编码和调试之前,需要考虑设计对话框和应用程序的具体细节。主要表现在控件次序的安排,从而使用户能够更加方便地输入数据。尽管这样做有可能会使得程序结构不如按照惯例编写的连贯,但可以更好地反映出用户工作的方式。
用 DCL 定义对话框
在 ASCII 文本文件中输入 DCL 描述来定义对话框与编写 AutoLISP 代码非常相似。DCL 文件的扩展名为 .dcl。在一个 DCL 文件中可以包含一个或多个对话框的描述,或者只包含供其他 DCL 文件使用的控件原型或组件。DCL 文件由以下三个部分组成,其次序可以任意调整。根据应用程序的不同,可选用其中一个或多个部分:
l 对其他 DCL 文件的引用
包括在引用 DCL 文件中说明的指示。
l 原型控件和组件定义
可以在后续的控件定义(包括对话框定义)中引用。
l 对话框定义
定义控件的属性,或者覆盖在原型控件或组件中定义的属性。
它们将定义控件的属性或覆盖在原型控件和部件中定义的属性。
本节内容包括:
<>base.dcl 和 acad.dcl 文件
<>引用 DCL 文件
<>DCL 语法
base.dcl 和 acad.dcl 文件
AutoCAD 提供的 base.dcl 和 acad.dcl 文件被放置在 AutoCAD 的 Support 目录下。
base.dcl 文件提供了基本的预定义控件和控件类型的 DCL 定义,其中还包含一些常用原型控件的定义。PDB 功能模块不允许重新定义预定义控件。
acad.dcl 文件包含所有 AutoCAD 自身使用的对话框的标准定义。
警告! 任何 base.dcl 中的错误都有可能导致标准 AutoCAD 对话框的显示出现问题,包括用户应用程序或其他应用程序中的自定义对话框。
引用 DCL 文件
创建对话框时,必须针对应用新建一个 DCL 文件。所有 DCL 文件都可以使用定义在 base.dcl 文件中的控件。通过在包含指示中指定其他文件名称,DCL 文件可以使用在另一个 DCL 文件中定义的控件。您可以创建满足自己需要的 DCL 文件层次,如下图所示:

如上图所示,user1.dcl 和 user2.dcl 文件独立于其他文件,但 user3.dcl 使用定义在 user1.dcl 中的控件。其中包含指示的格式如下:
@include filename
其中,filename 是用引号引起的其他 DCL 文件的完整名称。例如,下面样例指示包含一个名为 usercore.dcl 的 DCL 文件:
@include "usercore.dcl"
如果仅指定了文件名,则 PDB 功能首先在当前目录下搜索,然后再在 DCL 文件(包含 include 语句的文件)所在的目录下搜索指定的 DCL 文件。如果指定了完整路径名,则 PDB 功能仅在路径指定的目录下搜索。
注意 不能在自己创建的 DCL 文件中使用 acad.dcl 文件中定义的对话框,也不能指定 @include "acad.dcl"。但是,如果要创建类似的对话框,可以复制其定义并粘贴到自己的 DCL 文件中。
DCL 语法
本节描述用于指定控件、控件属性和属性值的 DCL 语法。
可以通过控件定义创建新的控件。如果控件定义出现在对话框定义之外,则可能是原型控件或组件。通过控件引用,原型控件或组件可以在对话框定义中使用。每个对定义的引用都继承原控件的属性。当引用原型控件时,可以修改继承属性的值或添加新的属性。当引用组件时,不能修改或添加属性。
如果需要使用一个控件的多个实例,并且这些实例具有一些相同的公共属性,最简单的办法就是定义和命名一个仅包含这些公共属性的原型控件。然后,在对原型控件的各个引用中修改属性值或添加新的属性。这样在每次引用控件时,就不必列出所有公共属性。由于属性是可以继承的,所以在更多的时候,用户所需的往往是创建控件的引用,尤其是对预定义控件的引用,而不是定义新的控件。
本节内容包括:
<>控件定义
<>控件引用
<>属性和属性值
<>注释
控件定义
控件定义格式如下:
name : item1 [ : item2 : item3 ... ] {
attribute = value;
...
}
其中,每个 item 都是先前定义的控件。新控件 (name) 继承了所有指定控件 (item1, item2, item3, ...) 的属性。同时,大括号中的属性定义还补充或(如果属性名是继承的)替换继承的定义。当定义具有多个父定义时,按照从左至右的顺序处理属性。也就是说,如果多个项目指定了相同的属性,则使用遇到的第一个属性。
如果新定义不包含子定义,则是一个控件原型。引用此控件原型时,可以修改或添加其属性。如果它是一个带有子定义的组件,则不能修改其属性。
控件或控件原型的 name 只能由字母、数字或下划线 ( _ ) 组成,并且必须以字母开始。
注意 控件名是区分大小写的。例如,bigbutton 与 BigButton 或 BIGBUTTON 是不同的。在实际应用中,需要注意拼写。
以下是按钮控件的(内部)定义:
button : tile {
fixed_height = true;
is_tab_stop = true;
}
base.dcl 文件定义了一个 default_button,如下所示:
default_button : button {
is_default = true;
}
default_button 继承了 button 控件的 fixed_height 和 is_tab_stop 属性。同时增加了一个新属性 is_default,并将该属性设置为 true。
控件引用
控件引用的格式如下:
name;
或者
: name {
attribute = value;
. . .
}
其中 name 是先前定义的控件的名称。控件名是区分大小写的。在第一种引用方式中,所有在 name 中定义的属性均被引用。在第二种引用方式中,大括号中的属性定义可以用来添加新的定义或替换从 name 继承的定义。由于引用的是控件,而不是定义,所以属性的改变仅应用在控件的这一实例上。
注意 第二种引用方式只能用于控件原型,而不能用于组件。
spacer 控件仅用于调整对话框定义的布局。它没有唯一的属性值,所以,只能通过指定名称对其进行引用:
spacer;
在 base.dcl 文件中定义的 ok_cancel 控件是一个组件,对它的引用也只能通过指定名称来完成:
ok_cancel;
另一方面,您还可以重定义一个独立控件的属性。例如,如果要创建一个具有与前一个定义的按钮相同的特性,但文本不同的按钮,可以如下定义:
: retirement_button {
label = "Goodbye";
}
详细信息,请参见自定义退出按钮文本。
属性和属性值
在控件定义或引用的大括号中,可以使用下列格式为控件的某一属性赋值:
attribute = value ;
其中,attribute 是一个有效的关键字,value 是赋给该属性的值。等号 (=) 用于分隔属性和属性值,分号 (;) 标志赋值语句结束。例如,key 属性定义控件的名称,程序要靠该名称来引用控件;label 属性定义在控件中显示的文本。关于 DCL 属性的完整列表,请参见预定义属性摘要。
与控件名一样,属性名和属性值也是区分大小写的。例如,Width 和 width 表示不同的属性,而 True 和 true 表示不同的属性值。
注释
在 DCL 文件中,前面带有双斜杠 (//) 的语句是注释。// 到行尾之间的所有内容都将被忽略。DCL 还接受 C 语言的注释,即 /* 注释文字 */ 格式。前导的 /* 和结束的 */ 可以在不同的行上。
用 Visual LISP 显示对话框
VLISP 提供了预览用 DCL 定义的对话框的工具。要想查看其工作情况,请在 VLISP 文本编辑器中将下列 DCL 代码复制到新文件里:
hello : dialog {
label = "Sample Dialog Box";
: text {
label = "Hello, world";
}
: button {
key = "accept";
label = "OK";
is_default = true;
}
}
这个 DCL 文件定义一个对话框,其标签为“Sample Dialog Box”。对话框中包含一个文本控件和一个“OK”按钮。将文件存为 hello.dcl,并在“另存为”对话框的“文件类型”字段中指定“DCL 源文件”。
注意 在指定文件名时必须包含文件扩展名。VLISP 不能自动为其添加 .dcl 文件扩展名。
注意文本编辑器自动为 DCL 文件进行语法着色。缺省的语法着色方案如下表所示:

选择“工具”&#9658;“界面工具”&#9658;“预览编辑器中的 DCL”在文本编辑器窗口显示对话框定义。因为在一个 .dcl 文件中可能定义了多个对话框,
VLISP 提示您指定要查看的对话框名称:

如果 DCL 文件包含多个对话框的定义,单击下拉箭头并选择要预览的对话框。如果 hello.dcl 中只定义一个对话框,选择“确定”即可查看它:

选择“OK”结束对话框的预览。
按钮是示范对话框属性的一个好方法,您可以在对话框中使用标准的退出按钮组件。通过使用 ok_only 组件,可以创建与上图相同的对话框。请参见对话框退出按钮和错误控件。
本节内容包括:
<>预览错误处理
<>对 DCL 文件的语义核查
预览错误处理
如果 DCL 代码中包含错误,VLISP DCL 预览程序将会显示信息,指示出错的行和关键字以及符号。例如,从 hello.dcl 中删除“button”前的冒号制造一个错误,然后预览此对话框,您将看到下列信息:

按“确定”从屏幕上清除该信息。VLISP 还可显示其他错误信息,如下所示:

对 DCL 文件的语义核查
AutoCAD 提供了对 DCL 文件进行语义核查的功能,共分为四级 (0-3),请参见后面的表。语义核查检查 DCL 文件中的代码是否有错或者不必要。语义核查在加载 DCL 文件时进行。要设置核查的级别,请在 DCL 文件中的任何地方加入下列语句(不能将此语句放置在控件定义里):
dcl_settings : default_dcl_settings { audit_level = 3; }
如果 DCL 文件通过包含指示引用了其他 DCL 文件,则只应在一个文件中定义 dcl_settings。定义的核查级别将用于所有包含文件。下表对每种核查级别进行说明:

为了充分利用语义核查的功能,在开发过程中应将 audit_level 设定为 3。而在调试通过并准备向用户发布之前,需将 dcl_settings 语句清除干净。
调整对话框的布局
回头再看上一节中定义的样例对话框,有一个小问题:

请注意“OK”按钮几乎占据了整个对话框的宽度。要想改善对话框的外观,可以编辑 DCL 文件,向其中的按钮控件添加两个属性。要想禁止按钮填满全部可用空间,添加一个 fixed_width 属性并设置为 true。这将使按钮的边框收缩,比包含在其中的文本稍微宽一点。要想居中显示该按钮,添加 alignment 属性并设置为 centered。列中的控件在缺省情况下是左对正的。DCL 描述如下所示:
hello : dialog {
label = "Sample Dialog Box";
: text {
label = "Hello, world";
}
: button {
key = "accept";
label = "OK";
is_default = true;
fixed_width = true;
alignment = centered;
}
}
对话框的外观如下所示:

下面各小节中介绍的技巧可以避免许多常见的布局问题。如果缺省的布局不适合您所创建的对话框,可以调整在原型或组件上的缺省布局。在必要时也可只调整个别的控件。
本节内容包括:
<>在控件组中分配控件
<>调整控件间距
<>调整右端和底部的空间
<>调整加框行和列周围的空间
<>自定义退出按钮文本
在控件组中分配控件
在调整对话框中控件的布局时,应该按照各个控件的相对大小组织成适当的行和列。下面 DCL 定义了出现在另一个控件上方,并且拥有三个控件的行:
: column {
: row {
: compact_tile {
}
: compact_tile {
}
: compact_tile {
}
}
: large_tile {
}
}
如果 compact_tile 部件具有 fixed_width 属性,同时 large_tile 比其上方的 compact_tiles 行要求的最小空间大得多,则根据缺省的水平对齐原则,此组件将显示为下列形式:

行中第一个 compact_tile 的左边和 large_tile 的左边对齐,并且最后一个 compact_tile 的右边和 large_tile 的右边对齐,介于其间的控件等距排列。其他相邻列的情况与此类似。
可以使用 spacer_0 和 spacer_1 控件控制缺省的分布方式,它们是定义在 base.dcl 中的 spacer 控件的变体。关于这些控件的详细信息,请参见 DCL 控件分类。
调整控件间距
如果相邻两列的控件所占据的空间差距相对较大,则占据空间相对较小的一列中的控件可能会分布得比较疏松。但是如果将不协调的列的 fixed_height 属性设置为 true,则可以改善这一现象。调整后的结果如下图所示:

调整右端和底部的空间
对话框的右端可能会包含一片空白区域。用户可以定义一个文本控件并为它显式地指定一个宽度,该宽度要大于其当前文本所需的宽度。例如,下列代码段定义一个控件,在应用程序为其设置值以前,该控件不显示任何内容(值为 null):
: text {
key = "l_text";
width = 18;
fixed_width = true;
}
width 属性在对话框中预定了 18 字符宽度的空间。应用程序可以用下列语句添加文本:
(set_tile "l_text" "By layer")
因为显示“By layer”不需要 18 个字符的长度,这使得在对话框的右端出现空白区。
用 errtile 控件显示出错信息时,也会出现类似的问题(请参见对话框退出按钮和错误控件)。除非当前显示了错误信息,否则在对话框的底部会出现一片额外的空白。这种情况下,在对话框的顶部使用 spacer 控件,可以帮助调整控件的垂直布局。
调整加框行和列周围的空间
如果加框的行或列的 label 属性为空白 (" ") 或空字符串 (""),则显示控件组周围的框,但不显示任何文本。单空在边框中不显示为空格。但是,从对话框的布局上来看,label 的值为单空或空字符串还是有区别的:
l 如果 label 的属性值为单空,则框内文本占据的纵向空间将被失去,但框上标签其占据的纵向空间将被保留。
l 如果 label 为空字符串,则无论是框内还是框上方,所有纵向空间都将失去。
在下面 DCL 代码中,前两个列的边框的顶边用于确定行高度(通过相同的 Y 值),而第三个列的边框的顶边用于确保其上方或下方没有空白,缺省的边界除外:
: row {
: boxed_column {
label = "Some Text";
}
: boxed_column {
label = " "; // 单个空格:缺省值
}
: boxed_column {
label = ""; // 空字符串
}
}
自定义退出按钮文本
对于某些对话框,您可能想修改一个退出按钮中的文本内容。例如,如果创建一个用于删除数据的对话框,则将“确定”按钮改为“删除”可能会更安全一些。要做到这一点,可以如下使用 retirement_button 控件原型:
destroy_button : retirement_button {
label = "删除(&D)";
key = "destroy";
}
注意 label 属性中与 (&) 符号的用法,它为控件指定一个助记符。这样,按钮标签中的字母 D 被指定为助记符,并且该字母带下划线。
注意 在自定义退出按钮组件时,最好使用从 base.dcl 文件中取出适当的 DCL 代码,而不要引用某本手册中的代码。
定义了自定义的退出按钮之后,需要将其嵌入到符合标准控件组外观和功能的组件中。以下样例显示 ok_cancel_help 组件的当前定义:
ok_cancel_help : column {
: row {
fixed_width = true;
alignment = centered;
ok_button;
: spacer { width = 2; }
cancel_button;
: spacer { width = 2; }
help_button;
}
}
如下创建一个新的组件,用新按钮替换 ok_button:
destroy_cancel_help : column {
: row {
fixed_width = true;
alignment = centered;
destroy_button;
: spacer { width = 2; }
cancel_button;
: spacer { width = 2; }
help_button;
}
}
在标准组件中,“确定”按钮是缺省按钮,但其属性没有添加到 destroy_button 中。然而,如果对话框的操作具有一定的破坏性(或非常耗时),则强烈建议您将“取消”按钮设置为缺省按钮。这样,此按钮既是缺省按钮,同时又是取消按钮:
destroy_cancel_help : column {
: row {
fixed_width = true;
alignment = centered;
destroy_button;
: spacer { width = 2; }
: cancel_button { is_default = true; }
: spacer { width = 2; }
help_button;
}
}
因为有一个属性被修改了,原先的“取消”按钮在此作为一个控件原型。同时在 cancel_button 前面添加了一个冒号。
警告! 如果“取消”按钮和缺省按钮是同一个按钮(is_default 和 is_cancel 都被设置为 true),同时没有将调用函数 done_dialog 的操作指定给其他按钮,则除了此按钮以外,其他按钮都无法退出对话框,对话框只能通过取消被关闭。
设计指导
为了设计出更好的对话框,不仅要考虑其实际用途,而且还需从美观、功效和 Windows 环境的 GUI 标准等方面来考虑。以下各小节将从这些角度出发,提供 GUI、对话框以及预定义控件和控件组的设计指导。关于控件和控件组的更多样例请参见第十三章可编程对话框参考。
本节内容包括:
<>美观和功效
<>前后一致的设计和清晰明了的语言
<>用户控制
<>容错处理
<>提供帮助
<>考虑残疾用户
<>单词字母的大写
<>避免缩略语
<>布局
<>控件的大小和位置
<>禁用控件
<>嵌套对话框
<>隐藏对话框
<>提供缺省值
<>处理键盘输入
<>国际语言的考虑
<>预定义控件和控件组的指导
<>错误处理
美观和功效
漂亮的外观对于一个对话框来说是十分重要的。如果一个对话框看起来非常混乱,不但使用起来非常不方便,而且其功效也不好。因此,控件的排列必须要便于用户的使用。设计时可以考虑将经常使用的控件放置在显眼的位置。尤其是在需要与其他控件配合使用时,更应仔细安排好控件的位置,以便用户可以非常方便地在控件之间切换。
前后一致的设计和清晰明了的语言
应用程序的用户接口应该在内部保持一致,除此之外,还应和与之相关的应用程序保持一致。如果对话框的设计与应用程序、相关应用程序或主机系统中的其他对话框保持良好的一致性,则当用户遇到新型对话框时,仍然能够快速掌握其用法。比较典型的一致性实例就是“确定”和“取消”按钮的放置。在实际的设计中,与各种控件相关的处理都应保持良好的一致性。例如,如何在文本框中输入文字,以及如何在列表框中选择项目等等。要保证一致性最好的方法就是重复使用控件以及控制它们的代码。
标准化可以确保一致性。使用对话框控件的标准定义,不但可以减少工作量,保持设计上的一致性,而且还便于用户的学习和使用。
使用的语言要清晰明了。虽然对话框是一个图形用户接口,但大多数控件中都包含文字提示。例如,对话框的标签、按钮的名称以及提示信息中都应使用直接了当,无二义性的语言。同时,应尽量避免使用用户不易理解的专业行话和技术术语。
用户控制
可以为用户提供一些访问对话框输入的控制。用对话框代替命令行接口的好处在于:用户不必严格遵循提示的顺序。在对话框中,用户可以按照任何顺序输入。有些限制是必需的,例如,当用户选定某一选项时,另一个选项应该相应变灰,即处于禁用状态。但仅限于内置用于保证应用程序正常工作的限制。
例如,下图显示“对象编组”对话框。对话框中包含一个“编组名”字段,用户在其中输入新建编组的名称。如果“未命名”选项被选中,就不能指定“编组名”。

如果要使用多个对话框,这些对话框能够依次层叠弹出,而不要让用户在调用另一个对话框前先关闭当前对话框。应该保证用户总能返回到最初显示的对话框中,这样就不会在准备退出对话框之前,再一次要求用户进行选择。由于当前对话框显示在前一个对话框之上,这样可以提示用户对话框间的关联,即来自何处又将返回到何处。
无论何时用户对当前状态或选项进行了修改,最好能够对修改立即做出响应。如果用户选择了某个选项,最好能够立即显示出相关的描述信息。如果某一选项排斥其他选项,应该在用户选择了该选项之后,立即禁用无效的选项。
例如,在 AutoCAD 的“选择颜色”对话框中,当用户选择了一种颜色编号后,图像控件会立即显示用户选定的颜色。又如“块定义”对话框,在“选择对象”按钮下,始终会显示当前选定对象的数目:

容错处理
让对话框具有一定的容错性可以使用户能够更加自如地操作而不必担心出现不可逆的错误。对于较轻的错误,可以用错误控件在对话框的下端显示一个错误信息。而对于严重的错误,则应该设计一个警告对话框来处理。关于使用 alert 函数显示简单的警告对话框(只有一个“确定”按钮)的详细信息,请参见 AutoLISP 参考中的 alert。
如果用户选择了一种可能具有破坏性或比较耗时的操作,应显示一个警告对话框,由用户选择是继续执行选定的操作还是取消。
例如,在“块定义”对话框中,如果用户试图创建一个与现有块同名的块,则屏幕上会显示一个警告对话框,用户可以在此选择是覆盖现有的块,还是取消操作不做任何修改:

用于警告用户的嵌套对话框应该返回到前一个对话框。只有引起严重的或潜在的致命错误时,才可以终止当前嵌套对话框。
提供帮助
在设计对话框时,应提供相应的帮助功能模块。联机帮助信息的数量取决于应用程序和对话框操作的复杂程度。建议至少应该在应用程序的主对话框中添加一个“帮助”按钮,显示一个描述重要信息的单独对话框。通常,“帮助”按钮可以用 help 函数调用帮助功能模块。
如果应用程序非常复杂,则可以考虑开发一个上下文相关的帮助功能模块,并且具有多个帮助对话框窗口,每个窗口都与特定的对话框相关联。
考虑残疾用户
如果能为身有残疾的用户多考虑一些,则所设计的程序就能方便更多的用户。设计对话框时,需要考虑以下因素:
颜色
大多有视觉障碍的用户都无法正确区分某些颜色之间的差异。如果用颜色编码来表达信息,最好能补充一些其他方式说明相同的信息(通常可以使用文字)。
例如,标准的 AutoCAD 颜色对话框中不仅用一个图像控件来显示选定的颜色,同时还提供了该颜色的名称和编号。
联机帮助
由于印刷手册或参考文档上印刷的字体太小,一些用户在阅读的时候不太方便。此时,在主对话框中设置一个“帮助”按钮用以提供联机帮助是非常有用的。
键盘的使用
对于那些不能用定点设备和使用定点设备有困难的用户,可以为对话框中的控件指定助记符。这样,用户只通过键盘便可以使用对话框。
简洁明了
用简洁明了的语言设计对话框,可以有助于用户的理解和接受,不至于对用户产生误导。不要强迫用户去记忆太多生疏的东西,在词汇的使用上,应尽量使用标准的术语或精确的描述。
单词字母的大写
下面是控制对话框中文字大小写的一些常用规定:
对话框、区域和列的标题
标题字符大小写的规定:将第一个单词和最后一个单词,以及除冠词、介词和连词以外的所有单词的首字母大写。然而,如果该对话框是通过菜单(不是命令行)调用的,则对话框标题的大小写应与菜单保持一致。
控件标签
控件(如按钮)标签字符大小写的规定:句尾不使用句号。文本框和下拉列表标签的末尾使用冒号 (:)。如果标签文字比较长,或者是一个提问的短语,可以遵从通常的大小写文法(首字母大写,其他部分遵从其本身的大小写规则)。
提示和信息
遵从通常的大小写文法。
避免缩略语
缩略语常常会带来二义性,不便于用户理解。如果由于空间的限制而不得不使用缩略语,则尽量在一个组(如加框的列)内使用一致的缩略语。注意尽量保持前后的一致性。尤其应该注意不要一些术语使用全称,而另外一些术语又使用它的缩略语。
布局
设计对话框时,应将其中的部件合理地按行或者按列排列,以便用户从左至右或从上至下地浏览。最好将相关输入字段(如编辑框或列表框)纵向或横向对齐排列,这样便于用户用 TAB
键在各字段间循环切换。
调整布局时,最好能够将对话框中的字段按照输入数据的自然顺序排列,例如,X、Y 和 Z 坐标。并且垂直或水平地排列这些输入框。同时注意不要在这些边框区域的周围或它们之间留下过多的空间。如有必要还可以将控件宽度向右侧边界扩展。
控件的大小和位置
为了保证信息显示得清晰明了,注意不要将对话框定义得过大,超过其本身的实际需要。
注意 由于大多数用户的屏幕分辨率可能只是 640 x 480。如果应用程序是在更高的分辨率下开发的,请不要忘记在低分辨率下对所设计的对话框进行适当的调整。
在缺省情况下,AutoCAD 在图形窗口的中央位置显示所有的对话框。但是,也可以指定对话框显示在其他位置(例如用户上次指定的位置)。AutoLISP 的 new_dialog 和 done_dialog 函数用来放置对话框。
禁用控件
如果某个控件或区域与当前选项设置冲突或无关,则应立即将其“变灰”以禁止用户选用。不过在设计时,应尽量避免过多地使用这一特性,因为对话框中出现很多无效的控件会使用户感到不舒服。
如果某个控件已经显示了数值,则禁用此控件不会影响其中的数值,即当该控件再次被激活后,数值保持不变。如果处于禁用状态的控件的数值发生了变化,会让用户感到费解。
嵌套对话框
AutoCAD 允许嵌套对话框的数目为 8 个。关于如何处理嵌套对话框的详细信息,请参见嵌套对话框。
除警告对话框外,一般在调用嵌套对话框的按钮标签文字中添加省略号 (...),表明将打开嵌套对话框。注意,对话框的嵌套层次最好不要超过三层。如果第四层对话框只是警告对话框,那么四层嵌套比较合理。另外,由于初始情况下对话框显示在屏幕的中央,为了增强对话框的层次感,应使嵌套对话框的尺寸小于主对话框。
隐藏对话框
如果在关闭对话框之前,用户需要在图形屏幕上执行选择操作,则必须临时关闭对话框,以便用户能够看见屏幕并进行选择。选择结束后,必须重新显示对话框。这一过程称为隐藏对话框。
导致隐藏对话框的按钮标签中不应包含省略号,而是在标签文字的后面使用一个空格加一个小于号 (<)。同时还应提示用户在对话框隐藏时应该执行哪些操作。
大多数情况下,可使用 getxxx 函数之一获取输入。这些函数都提供了一个用于指定提示信息的参数。
对话框重新出现时,其中应该包含在选择过程中的反馈信息。新的信息可以在编辑框字段、更新的列表框、指示状态的文本信息中出现,也可以是三者的任意组合。
提供缺省值
在设计对话框时,应尽可能为所有选项提供一个缺省值。合理设置的缺省值有助于用户轻松快捷地完成对话框操作。
建议每次使用对话框时都自动更新缺省值,换句话说,总是将用户前一次修改后的值作为本次对话框启动时的缺省值。尽管用户可能还需对这些缺省值进行修改,但这样比让用户每次都从头做一遍修改减少了很多工作量。
处理键盘输入
创建自定义对话框时,可以指定其如何处理键盘的快捷键。有些快捷键对所有对话框都是通用的。例如,用户可以用 TAB 键在对话框控件之间来回切换,用 SPACEBAR 键打开或关闭开关。在缺省情况下,用 TAB 键可以切换到所有活动的控件。
AutoCAD 提供两个通用的加速键。一个是接受键(通常是 ENTER 键),用于接受用户在对话框中输入的数值;另一个是取消键(ESC 键),用于放弃用户在对话框中输入的数值。AutoCAD
第一次显示一个对话框时,初始键盘焦点会在其中某个控件之上。在用户将焦点移动到其他控件之前,用户键入的信息都将作用于该控件。
要在控件之间移动,用户可以按 TAB 键选择其他控件,也可以输入控件助记符的快捷键。例如,在“绘图辅助工具”对话框中,用户可以输入 L、T 或 R 选择“等轴测捕捉/栅格”的单选按钮之一。在控件之间移动只是改变对话框的焦点,但不做任何选择。用户必须按接受键才能选择当前焦点所在的控件。对于某些类型的控件,双击鼠标按钮与按接受键等效。
国际语言的考虑
很多国家语言中相同含义的词语都比英文长。因此在设计中,如果考虑要在其他国家发行此应用程序,则应该在对话框中为词语多保留一些空间以满足本地化的需要。下表列出一些常用 AutoCAD 术语在各国家语言中的对照情况。

预定义控件和控件组的指导
本节介绍特定类型预定义控件和控件组的相关约定和设计指导。
本节内容包括:
<>按钮
<>控件组
<>编辑框
<>图像按钮和图像控件
<>列表框
<>单选按钮、单选按钮行和单选按钮列
<>滑块
<>文本
<>开关
按钮
与按钮关联的操作应该是可见的,即用户选择之后,操作能够立即生效。同时,按钮标签的文字应该明确,不带二义性。通常可以使用动词作为按钮的标签,描述按钮按下后产生的动作。但如果标签表述的意思足够明确,即使不使用动词作为按钮标签也可以接受。例如,“确定”或“选项”按钮标签。关于调用其他对话框或隐藏当前对话框的按钮的详细信息,请参见嵌套对话框和隐藏对话框。
按列排列的按钮应该保持一致的宽度。另外应该在这些按钮的公共父控件组中设置固定的宽度(fixed_width = true; 或者 children_fixed_width = true;)。
控件组
加边框的控件组(按行或列排列)称为组框或区域,是将协同工作的几个控件组合在一起,独立于其他控件并为其命名,从而可以为用户提供视觉提示。区域可以包含任意多个控件和未加边框的行或列。区域的标签应该能够表明其用途。
如果几个控件具有一定的关联,可以将这些控件放置在同一区域中。下图“块定义”对话框中的“基点”控件组示意了用带有标签和边框的控件组构造区域的技巧:

然而在实际的设计中,注意不要过多地使用区域。利用空白间距同样是对控件分组的一种有效方法。注意不要为列表框控件加上边框,因为这样看上去会显得很累赘。
编辑框
编辑框文字输入部分的长度应该与平均输入条目的长度大致相等。如果不能准确判断用户输入长度,可以将实数字段的宽度设置为 10,而将文字字段的宽度设置为 20。
编辑框的标签应以冒号 (:) 结束。
如果对编辑框中输入的文字有限制,应在编辑框的右侧放置一个文本控件简要说明限制条件。例如,如果需要用户在编辑框中输入文件名,则没有必要对文件名进一步说明。但是,如果用户在编辑框中输入的数字不能超过 100,则在此提示用户是非常必要的。
对于类似点数据的输入,最好提供带有两个或三个编辑框的输入区,这样就无需用户了解输入点坐标的命令行语法。但需要输入高级语法的编辑框可能例外,例如在 AutoCAD 文件搜索对话框中的通配符模式编辑框。

图像按钮和图像控件
如果将图像按钮或图像控件用作图标提醒用户,注意应在所有对话框中保持这些图标用法的一致性。例如,使用惊叹号作为警告标志。
如果使用图像按钮表示选择结果,最好补充一段简单的描述性文字。如果用图像(或图像的一部分)的颜色表示选定,则使用文字加以描述尤为重要。
列表框
由于 DCL 列表框不能水平滚动,所以,应将列表框的宽度设计得足够宽,以便能够容纳列表中最长的项目。如果列表框不是对话框的主控件,最好用一个标签(或文本控件)说明列表框的内容。使用列表框标签的另外一个好处是:用户可以使用给定的助记符直接切换到该列表框控件上。
如果列表中的项目不需要按照特定的逻辑概念排序,则应该按照字母顺序排列这些项目。如果列表的长度是固定的,并且比较短,则可以考虑用单选按钮列代替列表框。
单选按钮、单选按钮行和单选按钮列
单选按钮列无论是从视觉效果上还是易用性上都优于单选按钮行。只是当按钮数目较少(通常为两个到四个),或是按钮标签比较简短时,才使用单选按钮行。

如果选择其他选项会使单选按钮行或列中的选项失效,应禁用整个行或列。在某些情况下,选择其他选项会使部分单选按钮失效。此时,应逐个禁用对应的按钮。
滑块
注意不要使得滑块表示的数值增量与其本身大小比例失调。例如,如果只赋予了滑块四个增量数值,而对话框中的滑块区域却有两寸宽,则用户需要将滑块移动半寸以上才能看出数值的变化。在实际的设计中,应该通过调整滑块的尺寸避免跃动的变化。
如果用户需要知道滑块控制的数值,则对话框应该能够显示滑块的当前数值,并且此数值还能随着滑块的移动而不断地更新。建议使用一个编辑框控件,这样用户可以不使用滑块而在编辑框中直接输入数值。如果使用编辑框,则在滑块移动的过程中,应该不断更新编辑框中的数值,否则可以使用一个文本控件显示滑块的当前数值。下图是一个典型的滑块和编辑框的组合样例:

文本
如果只用标签不足以将控件的用途表述清楚,可以借助文本控件说明个别控件或对话框区域的用途;也可以用文本控件显示状态信息或提示信息,包括错误信息和警告。
文字应该准确,没有二义性。必须能够对用户要用到的选项或输入字段作出准确的描述。例如,“列表框中的选项无效”这样的错误信息并不能为用户提供多少帮助,而“图层不存在”这样的错误信息则能使用户一目了然。
在设计时应注意将文字消息与所描述的控件对齐。
同时应该把说明一组控件或对话框某一区域的文本放置在所描述的控件的上方。
开关
如果开关控制的选项与某些控件的内容有一定关联,应将它们组织在一起。
如果一个开关同时控制其他几个控件,通常将这些控件按照行或者列排列在一起,这样可以突出开关。如果某个开关只控制一个控件,则可以将此开关直接放置在控件的右侧。下面对话框中的开关可启用或禁用另一个控件。

错误处理
对话框可以通过错误控件 errtile(文本控件的一种),或嵌套的警告对话框显示错误和警告信息。下面的准则对这两种方式都适用:
l 错误信息应该是带有标点符号的完整句子,以大写字母开头,以句号结束。
l 错误信息应该说明问题或指出潜在的问题,说明应该简洁明了。
l 如果可能,报告错误之后,应将对话框的焦点移动到触发该错误的控件上。
本节内容包括:
<>错误控件
<>警告对话框
错误控件
错误控件用于显示比较轻微的错误或警告信息,特别是来自键盘或其他设备的输入错误。
不要在用于显示状态信息的文本控件显示错误信息,因为这样不容易引起用户的注意。
如果使用错误控件,应将其放置在对话框的底部。关于使用标准错误控件的描述,请参见对话框退出按钮和错误控件。
警告对话框
通过调用 alert 函数,可以显示包含单个“确定”按钮的标准警告对话框。应为严重或潜在的致命错误设计警告对话框,但不要过多地使用此对话框。由于警告对话框需要用户的输入,因此容易影响用户的工作情绪,尤其在报告比较轻微的错误或需要修正的模糊条目时。
应在执行可能破坏数据或耗时的操作之前,使用警告对话框警告用户。此警告对话框应提供继续执行或取消该操作的选择。如果警告对话框需要为用户提供选择的选项,例如,“继续”或“取消”,则必须根据需要自己建立这些选项。
如果警告对话框为用户提供了选择的选项,则其中的文本应预先予以说明问题所在,然后提示下一步的操作。此时,用于执行操作的按钮标签上应使用一个描述发生结果的动词。在这种设计要求下,如果将“确定”替换为“覆盖”将表达得更为确切,同时还可以有效地避免用户犯经验主义的错误。
除非真的是致命错误,否则应为用户提供返回至前一个步骤的方法,或从触发警告对话框的操作中退出的方法。
通常对话框的缺省按钮是“确定”或是与之等价的按钮。但是当警告对话框所说明的后果比较严重时,最好将“取消”或与之等价的按钮设置为缺省按钮。

第十二章 管理对话框
概述
在 AutoCAD 中,用户可以在自己的应用程序中设计和使用对话框。对话框的外观由对话框控制语言 (DCL) 文件定义,详细信息请参见设计对话框。对话框的功能控制由 AutoLISP 应用程序来实现。本章讲述如何使用 AutoLISP 控制对话框。本章中列举了一些 DCL 文件的样例,所以提前阅读设计对话框部分,将有益于本章的阅读。
本章内容包括:
<>用 AutoLISP 程序控制对话框
<>动作表达式与回调
<>处理控件
<>嵌套对话框
<>隐藏对话框
<>列表框和弹出式列表
<>图像控件和按钮
<>特定应用数据
<>DCL 错误处理
<>对话框函数概要
用 AutoLISP 程序控制对话框
本章先概述从 AutoLISP 程序中显示对话框和响应用户输入的过程。
本节内容包括:
<>概述
<>对话框被打开时的函数限制
概述
本例从一个样例对话框开始:

下列 DCL 定义对话框:
hello : dialog {
label = "Sample Dialog Box";
: text { label = "Hello, world."; }
ok_only;
}
这段 DCL 定义一个对话框,其标签为“Sample Dialog Box”,对话框中包含一个文本控件和一个单独的“OK”按钮。DCL 保存在 hello.dcl 文件中。
显示对话框和响应用户按 OK 的步骤
1 用 load_dialog 函数将 DCL 文件加载到内存中。例如:
(setq dcl_id (load_dialog "hello.dcl"))
load_dialog 函数返回 DCL 标识码。在后续的函数调用中需要用它来标识对话框。
2 调用 new_dialog 函数,将对话框名和 DCL 识别码作为参数传递给该函数,如下所示:
(new_dialog "hello" dcl_id)
3 通过设置控件值、列表和图像来初始化对话框。
上述 DCL 样例使用名为 ok_only 的预定义控件。因此您无需初始化该控件,除非想要覆盖它的缺省值。ok_only 控件有一个名为 done_dialog 的指定动作。如果用户按“OK”按钮,AutoCAD 将 done_dialog 调用传递给您的 AutoLISP 应用程序并关闭对话框。
4 调用 start_dialog 将对话框的控制传递给 AutoCAD 以便演示给用户:
(start_dialog)
5 调用 unload_dialog 在用户响应后从内存中删除对话框。
步骤 3、4 和 5 依赖于 new_dialog 函数返回非 nil 值。出于简化的原因,本样例中未包含错误处理。
您可以使用下列函数调用样例对话框:
(defun C:HELLO( / dcl_id )
(setq dcl_id (load_dialog "hello.dcl"))  ;加载 DCL 文件
(if (not (new_dialog "hello" dcl_id))   ;初始化对话框
(exit)       ;如果不工作就退出
)
(start_dialog)      ;显示对话框
(unload_dialog dcl_id)     ;卸载 DCL 文件
(princ)
)
在新的 VLISP 文本编辑器窗口中输入此代码,然后从 VLISP 菜单中选择“工具” “加载编辑器中的文字”来加载该程序。要想显示该对话框,请在 VLISP 控制台提示下输入 (c:hello)。
注意 start_dialog 调用保持在激活状态,直到用户选择了一个控件(通常是一个按钮),并且该控件关联的动作表达式调用了 done_dialog。控件可以显式地调用 done_dialog。如果控件的 is_cancel 属性设置为 true,则可以通过选择该控件来调用 done_dialog。
警告! 从理论上讲,调用 start_dialog 时对话框即获取了输入控制权,但在 Windows 中,调用 new_dialog 时对话框便获取了输入控制权,这对写程序没有影响。然而,如果交叉调用这些函数(从 AutoCAD 命令提示或 VLISP 窗口),则必须将它们作为一个语句输入。可以用 progn 或其他函数来包含它们。如果不这样做,new_dialog 的交叉调用会冻结屏幕。new_dialog 和 start_dialog 的交叉调用在调试时会很有用处(关于这些函数交叉调用的实例,请参见 DCL 错误处理)。
对话框被打开时的函数限制
当对话框被激活(即调用 start_dialog)时,不能调用要求用户在 AutoCAD 命令行输入或影响对话框外的显示(例如,AutoCAD 图形窗口)的 AutoLISP 函数。这个限制还包括写文字的函数,如 print、princ 和 prin1。
在您不使用任何需要用户输入的选项时,可以调用 ssget。
如果程序在调用 start_dialog 和 done_dialog 之间调用一个受限函数,AutoCAD 将终止所有对话框并显示下列错误信息:
AutoCAD rejected function
可以测试 CMDACTIVE 系统变量来判断对话框是否被激活。如果 CMDACTIVE 系统变量的值大于 7,则对话框是被激活的,该变量的位码值指示了命令、脚本和对话框的活动状态。
注意 如果应用程序需要用户必须在图形屏幕上而不是自身的对话框中输入(例如,指定一个点或选择一个对象),则必须隐藏该对话框。也就是说,必须调用 done_dialog 以使图形屏幕再次可见,然后在用户选择完毕后重新启动对话框。详细信息请参见隐藏对话框。
term_dialog 函数终止所有当前对话框,就好像用户逐个取消一样。这个函数可以用于取消一系列嵌套的对话框。
动作表达式与回调
要想定义在对话框中的某控件被选定时执行的动作,可以通过调用 action_tile 函数将 AutoLISP 表达式与该控件相关联,该表达式就是动作表达式。在动作表达式中,需要经常访问 DCL 文件中的属性。get_tile 和 get_attr 函数提供了这项功能。get_attr 函数可以获取在 DCL 文件中的用户定义属性;get_tile 函数可获得控件的当前运行值(基于用户对该控件的输入)。定义动作表达式必须在调用 new_dialog 之后、调用 start_dialog 之前进行。
关于用户如何选择控件或修改控件内容的信息将回调返回给动作表达式。在多数情况下,对话框中每一个被激活的控件都将产生一个回调。响应回调的动作表达式通常被当作回调函数引用,该函数检查相关控件的合法性,更新对话框中的信息(对应于控件的值)。对话框的更新包括:提示错误信息、禁用其他控件,以及在编辑框或列表框中显示适当的文本。
只有 OK 按钮(或与之等效的控件)可以检查控件的值,以便永久保存用户最终选定的设置。换句话说,应该在 OK 按钮的回调中修改与控件值相关的变量,而不是在单个控件的回调中更新。如果在单个控件的回调中更新永久变量,用户就无法通过选择“取消”按钮来恢复变量的原值。如果 OK 按钮的回调检测到错误,则不会退出对话框,而是显示错误信息并将焦点返回到错误控件处。
当一个对话框中包括几个有类似处理的控件时,可以简单地将这些控件与一个回调函数相关联。在这种情况下,直到用户选择 OK 才提交修改的原则依然适用。
除调用 action_tile 之外,还有两种方法来定义动作。当调用 new_dialog 时,可以为整个对话框定义一个缺省动作,还可以使用控件的 action 属性来定义一个动作。关于定义动作以及执行顺序的详细信息,请参见缺省值与 DCL 动作。
本节内容包括:
<>动作表达式
<>回调原因
动作表达式
动作表达式可存取下表中所列的变量,指示选定的控件,并说明动作执行期间的控件状态。变量名是系统保留的,而且是只读的;它们仅在动作表达式对它们存取时有意义。

如果 edit1 是一个文本框,当用户退出文本框时,将对下列 action_tile 调用中的动作表达式求值:
(action_tile "edit1" "(setq ns $value)")
$value 包含用户输入的字符串,并且表达式将其存入 ns 变量中。
如下所示的例子保存了被选择的控件名,以便程序使用它:
(action_tile "edit1" "(setq newtile $key)")
将 newtile 变量设置为选定控件的关键字名,本例中为“edit1”。在被当作动作并由多个控件共用的函数中,$key 变量非常有用。
当一个控件在多个 action_tile 调用中被命名,只有最后一个调用(在 start_dialog 之前)对它有影响。(就象为同一个变量指定了多个值。)可编程对话框 (PDB) 功能模块只允许每个控件有一个动作。
回调原因
回调原因指出了动作发生的原因,并返回到 $reason 变量中。它为任一种动作都设置了值,但只有当动作与 edit_box、list_box、image_button 或 slider 控件相关时,才需要对它进行检验。下表列出了所有可能的值:

代码 1 在表中给出了详细说明,代码 2、3 和 4 的详细文字说明请见表后。
代码 2 -- 编辑框
用户已经按 TAB 键或选择其他控件退出了编辑框,但尚未作最后选择。如果这是一个编辑框回调的原因,应用程序不应更新其相关变量的值,而应检查编辑框中的值的合法性。
代码 3 -- 滑块
用户通过拖动滑块(或等效操作)改变了滑动条的值,但尚未作最后选择。如果这是滑块回调的原因,应用程序不应更新其相关变量的值,而应更新显示滑块状态的文本。详细信息请参见滑块,代码样例请参见处理滑块。
代码 4 -- 列表框
用户双击列表框。可以在应用程序中定义双击的含义。如果对话框的主要目的是选择一个列表项,则双击应作出选择然后退出对话框(此时,list_box 控件的 is_default 属性应该是 true)。如果列表框不是对话框的主要控件,则双击应被看作是一个选择(代码 1)。
允许用户选择多个项目的列表框 (multiple_select = true) 不支持双击。
代码 5 -- 图像按钮
用户已双击图像按钮。可以在应用程序中定义双击的含义。在多数情况下,用单击来选择按钮就可以了。但在某些情况下,用单击(或键盘操作)亮显按钮,而用 ENTER 键或双击选择按钮会更合适一些。
本节内容包括:
<>缺省值与 DCL 动作
缺省值与 DCL 动作
action_tile 并非唯一可用于指定动作的函数。控件的 DCL 说明可包括 AutoLISP 中的 action 属性,并且 new_dialog 调用可为整个对话框指定一个缺省动作。控件一次只能有一个动作。如果 DCL 和应用程序指定多个动作,它们会按下列优先顺序彼此替换(从最低到最高优先级):
l 由 new_dialog 调用指定的缺省动作(仅用于没有显式地为控件指定动作的情况)。
l 由 DCL 文件中的 action 属性指定的动作。
l 由 action_tile 调用指定的动作(最高优先级)。
处理控件
应用程序在初始化和动作(回调)时拥有一些对当前对话框中控件的控制权。本节将介绍控件处理函数,并演示如何初始化和修改控件的模式和值。
本节内容包括:
<>初始化模式和值
<>在回调时改变模式和值
<>处理单选控件组
<>处理滑块
<>处理编辑框
初始化模式和值
初始化一个控件包括:
l 使之成为对话框的初始化键盘焦点
l 禁用或启用控件
l 如果控件是编辑框或图像,则亮显其内容
这些操作都是由 mode_tile 调用完成的。可以通过 set_tile 设置控件的值。
要想在编辑框中显示一个缺省值(例如姓氏),并将对话框的初始焦点设定到该编辑框,则可以使用下列代码:
(setq name_str "Kenobi")    ;缺省
(set_tile "lastname" name_str)  ;初始化字段
(mode_tile "lastname" 2)   ;2 将焦点设置到控件
一个附加的 mode_tile 调用会使编辑框中的所有内容亮显,这样用户可以直接输入来覆盖缺省值。如下例所示:
(mode_tile "lastname" 3) ; 3 选择框中的内容
在回调时改变模式和值
在回调时,用户可以检查控件的值。如果需要,可以再次调用 set_tile 来修改这个值。在回调过程中,也可以调用 mode_tile 来改变控件的状态。下表列出了 mode_tile 中 mode 参数的值:

当调用 mode_tile 来禁用一个是当前焦点的控件时,必须再次调用 mode_tile 将焦点设置到另一个控件上(多数情况下是用 tab 键切换到的下一个控件)。否则,焦点将仍停留在被禁用的控件上,这是非法的,并会导致错误发生。
“禁用自身”的一个典型例子是:选择“上一个”或“下一个”按钮在一系列对话框间进行“翻页”操作。当用户在倒数第二页上选择了“下一个”按钮后,该按钮应该被禁用。当在第二页上选择了“上一个”按钮后,该按钮同样也应被禁用。在这两种情况下,代码应先禁用按钮,然后将焦点设置到其他控件上。
假定名为“group_on”的控件是一个开关,控制名为“group”的控件组。当开关被关闭时,该控件组中的控件是非活动的,且不能被修改。在这种情况下,可以为开关定义以下动作(注意控制字符 \" 的用法,它允许在action_tile 参数中使用双引号)。
(action_tile "group_on" "(mode_tile \"group\" (- 1 (atoi $value)))")
动作表达式中的减法和 atoi 调用设置 mode_tile 函数的 mode 参数。由于开关关闭时是 0,打开时是 1,所以该减法颠倒了数值,并且由 mode 来控制是否启用该控件组。
可以调用 get_attr 函数来检验除 value 以外的其他属性。例如,可以获得“pressme”按钮的标签。
(get_attr "pressme" "label")
get_attr 函数将指定属性的值返回为一个字符串。
注意 如果使用 get_attr 获得一个 value 属性,则取得了存储在 DCL 文件中的 value 属性(控件的初始值)。get_tile 函数可获取控件当前的运行值。这两个值不一定相同。
处理单选控件组
单选按钮出现在单选控件组中。在每个单选按钮里,“1”代表开,“0”代表关;单选控件组的值是当前选定按钮的 key 属性。可编程对话框 (PDB) 功能模块管理一个控件组中的单选按钮的值,并确保同一时刻只能有一个单选按钮被打开。可以为每个单选按钮指定一个动作。更方便的办法是为整个单选控件组指定一个动作,然后测试单选控件组的值来确定选定的单选按钮。
分析下面的样例:一个单选控件组控制在用户退出对话框后,显示三维对象的哪一个视图。该控件组包括四个单选按钮:
(action_tile "view_sel" "(pick_view $value)")
.
.
.
(defun pick_view (which)
(cond
((= which "front") (setq show_which 0))
((= which "top") (setq show_which 1))
((= which "left") (setq show_which 2))
((= which "right") (setq show_which 3))
)
)
这些实例显示出所有单选按钮都与同一个变量(它拥有多个值)相关联。这些变量也可引发附加动作,例如禁用对话框中的一些选项。如果单选控件组很大,可以将关联的值存储在一个表中。如果使用该表,则应组织表的结构,使它不依赖于控件组中的按钮顺序。PDB 功能模块不会限制顺序,而且顺序会随 DCL 改变而变化。
处理滑块
当处理滑块的动作和回调时,应用程序应检查在回调过程中收到的原因码。并非一定要检查,但这是个好主意,因为可以简化处理过程。
每当到达滑块的增量边界时,都要发生一个回调。例如,如果滑块被定义成最小值是 0,最大值是 10,大小增量都是 1。那么从滑块的一端移动到另一端时,将发生 10 次回调。
下列是一个处理滑块的函数的基本结构。它由一个与滑块控件相关联的动作表达式调用。函数使用的 slider_info 控件以十进制格式显示滑块的当前值;通常这样的控件是一个编辑框,这样,用户既可以选择操纵滑块,也可以选择直接键入选定的值。如果用户在 slider_info 中输入值,则编辑框的回调应如下所示更新滑块的值:
(action_tile
"myslider"
"(slider_action $value $reason)"
)
(action_tile
"slider_info"
"(ebox_action $value $reason)"
)
.
.
.
(defun slider_action(val why)
(if (or (= why 2) (= why 1))  ;检查结果代码
(set_tile "slider_info" val)  ;显示临时结果
)
)
(defun ebox_action(val why)
(if (or (= why 2) (= why 1))  ;检查结果代码
( set_tile "myslider" val)  ;显示临时结果
)
)
处理编辑框
处理编辑框的动作和回调与处理滑块类似。然而,由于编辑框中的字符总是可见的,所以无需处理中间结果。当该控件上的焦点转移时,编辑框只需返回回调代码。下列代码样例检查值,但不重新显示值:
(action_tile "myeditbox" "(edit_action $value $reason)")
.
.
.
(defun edit_action (val why)
(if (or (= why 2) (= why 4))
. 在此执行临时值的范围检查
.
)
)
嵌套对话框
在动作表达式或回调函数中调用 new_dialog 和 start_dialog 可以创建和管理嵌套对话框。例如,包含下列语句的函数将在用户选择了名为“button_1”的按钮后,显示“Hello, world”对话框。
(action_tile "button_1" "(c:hello)")
在再次使用前一个对话框之前,必须先退出嵌套对话框。
AutoCAD 限制嵌套对话框的层数不能超过 8 层。为避免造成混乱,建议嵌套不要超过 4 层。
警告! 如果通过多次调用 new_dialog 显示嵌套对话框,注意要用一个相应的 done_dialog 调用来配合每个 new_dialog 调用(不管是不是从回调中调用)。否则,可能导致应用程序失败。
term_dialog 函数关闭所有当前打开的对话框,就好像用户逐个取消一样。如果需要取消一系列嵌套对话框,则可以使用此函数。
隐藏对话框
当对话框被激活时,用户不能进行交互式选择。如果想让用户在图形屏幕上选择,则必须先隐藏对话框,然后再将其恢复。隐藏对话框与用 done_dialog 来关闭对话框是相同的,但回调函数必须调用 done_dialog 的 status 参数指示该对话框是被隐藏而不是结束或取消。应将 status 参数设置为应用程序定义的值。
当对话框消失时,start_dialog 函数返回应用程序定义的 status。然后,程序必须检查 start_dialog 返回的状态以决定下一步动作。关于 status 的标准值和程序定义值的信息,请参见 AutoLISP 参考中的 done_dialog。
例如,有一个简单的对话框,需要用户在 AutoCAD 图形窗口中拾取一点:

该对话框用下列 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 = "ickMe";
key = "hide";
mnemonic = "H";
}}}}
控制对话框的函数显示窗口,直到用户选择了“OK”或关闭窗口为止。如果用户选择“PickMe”,代码将隐藏对话框并提示用户选择一点。下列 AutoLISP 代码控制该对话框:
(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)    ;提示用户
(getpoint "\npick a point")  ;拾取 pt
)
((= what_next 0)
(prompt "\nuser cancelled dialog")
)
)
)
(unload_dialog dcl_id)
(princ)
)
注意 term_dialog 函数立即关闭对话框,但不返回状态码,因此应用程序不能区分嵌套对话框的隐藏和因为错误而导致的对话框被取消。
本节内容包括:
<>要求输入口令
要求输入口令
下面样例用一个简单的对话框要求用户输入一个口令。
文件 getpass.dcl 定义了一个名为 passdlg 的对话框,该对话框包括两个控件,用于用户输入口令的 edit_box 控件和 ok_cancel 控件。使用 password_char DCL 属性来屏蔽用户输入的文本:
// GETPASS.DCL
//
passdlg : dialog {
label = "assword Protected";
: edit_box {
label = "assword:";
edit_width = 20;
key = "password";
password_char = "?";
}
ok_cancel;
}
文件 getpass.lsp 定义了 GETPASS 函数,该函数用于加载 getpass.dcl 文件并显示 passdlg 对话框。当用户在编辑框中输入文字时,文字会被特定字符(即 DCL 文件中定义的 password_char 字符)替代。为编辑框指定的动作确保了用户输入的字符被赋给 pass 变量:
;; GETPASS.LSP
;;
(defun GETPASS ( / dcl_id pass )
(setq dcl_id (load_dialog "getpass.dcl"))
(if (new_dialog "passdlg" dcl_id)
(progn
(action_tile "password" "(setq pass $value)")
(start_dialog)
(unload_dialog dcl_id)
)
(princ "Error: Unable to load GETPASS.DCL. ")
)
pass
)
GETPASS 函数返回用户输入的字符串。
列表框和弹出式列表
AutoLISP 提供了下列用于处理对话框中列表框和弹出式列表的函数:
l start_list
l add_list
l end_list
可以依次调用这些函数来设置列表框和弹出式列表中显示的内容。
本节内容包括:
<>列表操作
<>处理列表元素
列表操作
对话框的列表操作总是从调用 start_list 函数开始,该函数的语法如下所示:
(start_list key [operation [index]])
key 参数是一个标识对话框控件的字符串。key 参数是区分大小写的。operation 参数是一个整数值,用于指出是在创建新列表、修改列表,还是在向列表中增加项目,下面列出有效的操作参数:

index 参数仅用于改变操作。索引指示要用后续的 add_list 调用修改的列表项,列表中的第一项是索引 0。
如果您不指定 operation,缺省为 3(创建新列表)。如果不指定 index,索引值缺省为 0。
如下执行列表操作:
创建新列表 (3)
在调用 start_list 之后,可以重复调用 add_list 向列表中添加新项目。通过调用 end_list 可以结束列表的处理。
改变列表中的项目 (1)
在调用 start_list 之后,调用 add_list 一次可以替换项目,项目的索引在 start_list 调用中指定(如果多次调用 add_list,它会再次替换相同的项目)。通过调用 end_list 可以结束列表处理。
向列表框中添加项目 (2)
在调用 start_list 之后,调用 add_list 可以向列表末尾添加项目。继续调用 add_list 可以添加更多的项,直到调用 end_list 为止。
不论正在进行何种列表操作,都必须按顺序调用三个函数 start_list、add_list(可能多次)和 end_list。
mapcar 函数适用于将一个“原始的”AutoLISP 表转换到列表框中显示。在下例中,appnames 表中包含用户希望在 selections 列表框中出现的字符串。下列代码段设置并显示该列表:
(start_list "selections")   ;指定列表框的名称
(mapcar ' add_list appnames)   ;指定 AutoLISP 表
(end_list)
因为创建列表 (3) 是缺省设置,因此本例中未加指定。
list_box 控件的值是选定项(单选或多选的选定项目)的索引。如果程序需要知道与索引相关联的实际文字,则必须保存原始列表。同时还必须追踪对列表的修改。
添加列表项类似于创建一个新列表。例如,如果 appnames 中有 12 项,且希望添加另一个“newnames”列表,可以使用下列代码:
(start_list "selections" 2)
(mapcar 'add_list newnames)
(end_list)
改变一个项目只需要调用 add_list 一次,在这种情况下,指定要修改的项目的索引。
(start_list "selections" 1 5)   ;改变列表中的第六个项目
(add_list "SURPRISE!")   ;第一个索引是 0
(end_list)
除非重建列表,否则不能在列表中删除或插入一项。
处理列表元素
由于 list_box 控件的值包含前导空格(特别是在需要获取多个项目时),所以不要用字符串比较来测试其值。在处理列表框之前,先调用 atoi 函数将其转换为一个整数,也可以用 read 自动将读取值转换为一个整数。如果名为“justone”的列表只接受一个选择,下列代码段将检查第三个项目是否被选择:
(setq index ( get_tile "justone"))
(cond
((/= index "")   ;检查该字符串是否为空
(= 2 (atoi index))
     ;处理第三个项目
...
)
)
首先检查字符串是否为空是有必要的,因为 atoi 函数为一个空字符串和字符串“0”都返回 0。
弹出式列表的值没有前导空格,无须做转换。弹出式列表框不允许多选。
如果列表框支持多选,则程序必须进行转换,并搜索列表框中的多个串值。下列 MK_LIST 的定义返回一个列表,其中只包含用户从原始 displist 列表中选定的项目(在本例中,显示表 displist 是作为全局变量管理)。用列表框的当前 $value 调用 MK_LIST 函数:
(defun MK_LIST (readlist / count item retlist)
(setq count 1)
(while (setq item (read readlist))
(setq retlist (cons (nth item displist) retlist))
(while (and (/= " " (substr readlist count 1))
(/= "" (substr readlist count 1)))
(setq count (1+ count))
)
(setq readlist (substr readlist count))
)
(reverse retlist)
)
上述所有样例都在单选情况下工作。
图像控件和按钮
AutoLISP 提供了用于处理图像控件和图像按钮的函数。本节介绍如何使用这些函数。
本节内容包括:
<>创建图像
<>处理图像按钮
创建图像
为图像控件和图像按钮创建图像的调用顺序与处理列表的顺序类似。start_image 函数开始创建图像;end_image 结束创建图像。然而,绘制图像的类型不是由参数而是由单独的函数调用来指定:
vector_image
在当前图像中绘制一个矢量(一根直线)
fill_image
在当前图像中绘制一个填充矩形
slide_image
在图像中绘制一张 AutoCAD 幻灯片
矢量和填充矩形对简单的图像是很有用的,例如,AutoCAD 的“选择颜色”对话框用来显示用户选择的颜色样本。对于复杂的图像,使用幻灯片更为方便。但显示幻灯片占用时间较多。因此使用幻灯片时,则应尽量使它们简单一些。
注意 如果在图像控件中使用内含填充对象的幻灯片(例如宽多段线、实体和三维面),图像将显示为轮廓,除非用由 SHADE 命令创建的图像来制作幻灯片。
vector_image 函数需要指定绝对坐标,而 fill_image 和 slide_image 需要指定一个开始坐标以及相对宽度和高度。为正确作到这一点,必须知道图像控件或图像按钮的准确尺寸。由于这些尺寸通常是在设计对话框时指定的,所以 PDB 功能模块提供了返回特定控件的宽度和高度的函数。这些尺寸函数是 dimx_tile 和 dimy_tile。应在开始创建图像前调用它们。控件的原点 (0,0),通常在其左上角。
图像颜色可使用 AutoCAD 的颜色编号,或使用下表中的合法颜色编号(其值和助记符是由 Autodesk 设备接口 [ADI] 定义的)。

下例中,“cur_color”是一个完全用红色填充的图像控件:
(setq width (dimx_tile "cur_color")
height (dimy_tile "cur_color"))
(start_image "cur_color")
(fill_image 0 0 width height 1) ;1 = AutoCAD 红
(end_image)
图像绘制函数可以连续调用。下面的代码先填充图像,然后在其上绘制一个垂直的带区:
(setq width (dimx_tile "stripe")
height (dimy_tile "stripe"))
(start_image "stripe")
(fill_image 0 0 width height 3)    ;3 = AutoCAD 绿
(setq x (/ width 2))     ;垂直居中矢量
(vector_image x 0 x height 4)    ;4 = AutoCAD 青
(end_image)
用 slide_image 显示的幻灯片可以是单独的幻灯片文件 (.sld),也可以是幻灯片库文件 (.slb) 的一部分。如果幻灯片是一个 .sld 文件,则仅需指定文件名,无须带 .sld 扩展名(例如,“frntview”)。如果幻灯片在一个幻灯片库中,则须先指定库名称,后面跟一个幻灯片名称,幻灯片名称应在括号内。注意指定幻灯片库时也无需指定扩展名,例如,“allviews(frntview)”。slide_image 函数会根据当前 AutoCAD 的库搜索路径查找幻灯片或幻灯片库文件。(请参见 AutoLISP 参考中的 load。)
下例中,幻灯片在一个名为“topview.sld”的文件中:
(setq x (dimx_tile "view")
y (dimy_tile "view"))
(start_image "view")
( slide_image 0 0 x y "topview")
(end_image)
幻灯片中的矢量经常绘制成白色(颜色编号 7),这是图像的缺省背景颜色。如果图像控件在第一次显示幻灯片时呈现空白,请试着将它的 color 属性改为 graphics_background(也可在调用 slide_image 之前先调用 fill_image 来改变图像的背景颜色)。
处理图像按钮
可以像处理普通按钮一样处理图像按钮;也就是说,可以用它来触发一个单独的动作。然而,也可以用 PDB 功能模块定义按钮区域。定义区域后,引发的动作将取决于用户选择图像按钮的哪一部分。这个机制是很容易理解的:一个图像按钮的动作或回调返回用户选择的 (X,Y) 位置。该坐标位于特定图像按钮控件的范围之内(与尺寸函数返回的一样)。应用程序可以通过隐式地定义图像的区域来指定选择位置的含义。DDVPOINT 对话框就很好地使用了这个功能。加载和运行 AutoCAD Support 目录中的 ddvpoint.lsp 文件可以查看该对话框。
在下例中,图像按钮中包含两个由 fill_image 创建的颜色样本。选择哪一个,取决于用户选择的区域。如果水平分割图像按钮(上半部黑暗,下半部明亮),则动作只需测试一个尺寸:
(action_tile "image_sel" "(pick_shade $key $value $y)")
...
(defun pick_shade (key val y)
(setq threshold
(/ ( dimy_tile key) 2))   ;水平分割图像
(if (> y threshold)    ;记住原点在左上角
(setq result "Light")
(setq result "Dark") )
)
特定应用数据
client_data_tile 函数为控件指定特定应用数据。该数据在回调时有效,就象 $data 变量,其值是字符串。客户端数据未在 DCL 中声明,它只在应用程序运行时是有效的。使用客户端数据与使用用户定义属性类似。其主要差别是,用户定义属性是只读的,而客户端数据在运行期间是可修改的。同样,最终用户可以在应用程序的 DCL 文件中检验用户定义属性,而客户端数据则是不可见的。
因为程序必须维护列表框(或弹出式列表)中显示的列表,所以用客户端数据来处理列表信息十分适宜。下例对 MK_LIST 函数进行改进,将表作为函数的一个参数(请参见处理列表元素):
(defun MK_LIST (readlist displist / )
这样,一个全局列表变量不再是必需的。下面的对话框处理程序的主要部分中调用 client_data_tile 将一个短表与控件关联起来,然后通过一个动作表达式将列表传入到 MK_LIST:
(client_data_tile
"colorsyslist"
"Red-Green-Blue Cyan-Magenta-Yellow Hue-Saturation-Value"
)
(action_tile
"colorsyslist"
"(setq usrchoice (mk_list $value $data))"
)
DCL 错误处理
在您第一次加载一个 DCL 文件时,PDB 功能模块对其进行错误检查。如果 AutoCAD 遇到语法错误、属性错误或其他类型的错误(如为一个活动控件指定关键字属性失败),PDB 不加载该文件,AutoCAD 将显示一个或多个对话框提示您纠正错误,或者将错误列表写入 acad.dce 文本文件。如果 AutoCAD 将错误信息写入到 acad.dce 中,将显示如下的提示信息:

您可以查看 acad.dce 的内容来查找错误。AutoCAD 将 acad.dce 文件放在当前的工作目录中。当 AutoCAD 成功读取 DCL 文件时,它将删除 acad.dce 文件。
如果应用程序使用多个 DCL 文件,每次加载新的文件时,acad.dce 文件将被覆盖(如果没有发生错误将被删除)。当测试程序时,
acad.dce 只显示最近读取的 DCL 文件中的错误(如果有的话)。建议使用 VLISP DCL“预览”功能来调试 DCL 文件(请参见用 Visual LISP
显示对话框)。您也可以通过 load_dialog 函数在 AutoCAD 中手动加载和调试每一个文件。下列 load_dialog 函数加载 DCL 文件 hellofile.dcl:
命令: (load_dialog "hellofile")
3
如果对话框成功加载,load_dialog 返回一个正整数,用来标识 DCL 文件。将此值传递给 new_dialog 函数来初始化文件中的单个对话框。
如果 new_dialog 函数运行成功,则返回 T,否则返回 nil。如果 new_dialog 返回 T,可调用 start_dialog 函数显示对话框。
调试了所有 DCL 文件后,就可以加载您的程序并联合测试对话框。如果程序在 start_dialog 和 done_dialog 调用之间调用了一个受限函数,AutoCAD 将终止所有对话框并显示下列错误信息:
AutoCAD rejected function
关于受限制的函数的详细信息,请参见对话框被打开时的函数限制。
本节内容包括:
<>设置影响错误信息的核查级别
设置影响错误信息的核查级别
语义核查的级别影响 AutoCAD 为 DCL 文件显示的提示信息(请参见对 DCL 文件的语义核查)。例如,显示定义在隐藏对话框中的 hidedcl
对话框时,如果选用缺省的核查级别,则不带任何警告。如果将核查级别设置为 3,AutoCAD 将显示一个带有警告信息的提示对话框。将下列内容插入到 hidedcl 起始部分即可作到这一点:
dcl_settings : default_dcl_settings { audit_level = 3; }
尝试用 VLISP DCL“预览”功能查看在 hidedcl 中定义的对话框。您将被提示查看 acad.dce 文件,其中包含下列信息:
=== DCL semantic audit of C:/PROGRA~1/AUTOCA~1/VLISP/$vld$.dcl ===
Hint in "hidedcl". (widget type = text, key = "message")
fixed_height = true is probably redundant.
在低级别(识别能力较低)的语义核查下,AutoCAD 通常不检查多余的属性定义和对话框显示。
从 DCL 中删除 fixed_height = true 语句以纠正 AutoCAD 向您警告的情况。
对话框函数概要
本节概要介绍在一个典型的对话框处理函数中所需的步骤。同时还介绍了在设计和执行您自己的对话框函数时可以引用的样例应用程序。
本节内容包括:
<>函数调用顺序
<>块定义对话框样例
函数调用顺序
下面示范了典型的函数调用顺序:
1 调用 load_dialog 来加载 DCL 文件。
2 调用 new_dialog 来显示特定的对话框。
必须检查 new_dialog 的返回值。在调用 new_dialog 失败时调用 start_dialog 会导致不可预知的结果。
3 通过设置控件值、列表和图像来初始化对话框。当调用 action_tile 设置动作表达式或回调函数时,也进行初始化。此时,可调用的其他函数通常有:设置控件值和状态的 set_tile 和 mode_tile;用于列表框的 start_list、add_list 和 end_list;用于图像的尺寸函数 start_image、 vector_image、fill_image、slide_image 和 end_image。此时,也可调用 client_data_tile
来使对话框及其组件与应用程序的特定数据相关联。
4 调用 start_dialog 将控制权转交给对话框,以便用户进行输入。
5 处理动作(回调)中的用户输入。当有可能调用 get_tile、get_attr、set_tile 和 mode_tile 时,应进行此项处理。
用户按“退出”按钮,触发了调用 done_dialog 的动作,使 start_dialog 返回一个值。此时,调用 unload_dialog 来卸载该 DCL 文件。
这套方案一次只能处理一个对话框和一个 DCL 文件。应用程序中往往有多个对话框。处理这些对话框的最简单和最快捷的方法是:将所有对话框存储在一个 DCL 文件中。这样,调用 load_dialog 就可以一次加载所有的对话框,可用 new_dialog 调用其中任一对话框。然而,如果内存有限,则需创建多个 DCL 文件。在加载另一组对话框之前,先用 unload_dialog 将一组对话框从内存中卸载。
块定义对话框样例
样例应用程序 bmake.lsp 及其相关联的 bmake.dcl 文件示例了许多有用的对话框技术。这些文件均在 AutoCAD 的 Support 目录中。应用程序 bmake 实际上是 entmake 函数的交互式界面。可用它来定义一个新块,并可浏览现存块的名称。由 bmake 列举的一些技术包括:
l 通过定义由 done_dialog 传入 start_dialog 的特殊状态码来隐藏对话框。请参见 C:BMAKE 函数的主循环(其后紧跟 load_dialog 和 action_tile 的调用)。
l 使用开关来启用或禁用另一个控件。请参见 DO_UNNAMED 函数的定义。
l 为列表框构造一个列表。请参见函数 PAT_MATCH 和 SORT。
l 显示标准 AutoCAD 帮助对话框。请参见 DO_HELP 函数。
除示例的对话框技术外,bmake 也是很好的示例。

第十三章 可编程对话框参考
概述
本章介绍对话框控制语言 (DCL) 的所有控件及相关属性,同时还概要介绍可用于处理可编程对话框的 VLISP 函数。
本章内容包括:
<>控件属性
<>预定义属性摘要
<>DCL 属性分类
<>DCL 控件功能摘要
<>DCL 控件分类
<>可编程对话框函数摘要
控件属性
控件的属性用来定义其布局和功能。属性类似于编程语言中的变量:由名称和值两部分组成。
本节内容包括:
<>属性类型
<>受限制的属性
<>用户定义的属性
属性类型
属性值必须是以下数据类型之一:
整数
表示距离的数字(包括整数和实数)值,例如控件的宽度或高度,以 character-width 或 character-height 为单位。
实数
带小数的实数必须包含前导数字。例如,0.1 要写成 0.1,而不能是 .1。
被引号括起来的字符串
被引号括起来的字符串由文字和括起文字的双引号 ("") 组成。属性值区分大小写:即 B1 和 b1 不等。如果需要在字符串中使用双引号,则应在双引号前上一个加反斜杠 (\")。除此之外,被引号括起来的字符串中还可以包含其他控制字符。下表列出了可被 DCL 识别的控制字符:
DCL 字符串中允许使用的控制字符
控制字符 含义
\"  双引号(嵌套的)
\\  反斜杠
\n  换行符
\t  水平制表符
保留字
保留字是由字母和数字字符组成的标识符,首字符是字母。例如,许多属性都使用 true 或 false 作为属性值。保留字区分大小写:即 True 不等于 true。
与保留字和字符串一样,属性名也区分大小写,例如,不能调用 Width 为 width 属性赋值。
在实际使用中,应用程序总是将属性作为字符串检索。如果应用程序使用的是数字值,则这些值必须能够在数字和字符串值之间转换。关于在 AutoLISP 程序中处理控件值的详细信息,请参见处理控件。
有些属性,如 width 和 height 对于所有控件都是通用的。是否指定控件值是可选的。因为大多数属性都有其缺省值,如果用户没有指定这些属性的值,则用其缺省值。而另一些属性只对特定类型的控件才有意义,例如,图像控件的背景色属性 color 只适用于同类控件,如果将其应用到其他类型的控件上,AutoCAD 会报告一个错误信息,并且通常忽略这一属性。
受限制的属性
注意不要在 DCL 文件中使用以下控件属性:
l horizontal_margin(水平边距)
l vertical_margin(垂直边距)
l type(类型)
用户定义的属性
定义控件时,可以使用自己定义的属性。属性名称可以是任何与预定义标准属性不冲突的有效名称。预定义标准属性在上一小节中介绍过,并在预定义属性摘要中概要介绍。属性名称与关键字类似,可以包含字母、数字或下划线,而且首字符必须是字母。
如果用户定义属性名与预定义属性冲突,PDB 功能模块不会将该属性作为一个新的属性处理,并且将分配给该用户定义属性的值分配给标准属性。这种错误在调试过程中比较难以检测到。
分配给用户定义属性的值及其含义都由应用程序定义。用户定义属性的值必须符合在控件属性中介绍的数据类型。
定义属性和定义特定应用程序的客户数据是类似的。这两种方法都可启用 PDB 功能模块管理用户提供的数据。用户定义属性是只读的,也就是说,在对话框活动过程中,这些属性值是静态的。如果需要动态地更改这些值,则必须在运行时使用客户数据。终端用户可以检查自己在应用程序的 DCL 文件中定义的用户定义属性值,但客户数据对用户来说却是不可见的。
AutoCAD 的“绘图辅助工具”对话框中定义了一个自定义属性 errmsg,该属性对每个控件都有唯一的字符串值。公用的错误处理程序在显示警告信息时将用到此属性的值。例如,假设控件将以下值赋给 errmsg:
如果用户输入的值无效,例如一个负数,则 AutoCAD 将显示以下错误信息:
Invalid Grid Y Spacing.
以上“Invalid”这个词以及随后的句号 (.) 都是由错误处理程序提供的。
用户定义的属性还可以用于限制控件的值以及控件激活的子对话框的名称(详细信息请参见嵌套对话框)。
预定义属性摘要
本节列出了 PDB 功能模块定义的属性。下表按照字母顺序概要介绍这些预定义属性。关于各属性的信息,请参见用户定义的属性。
预定义属性
属性名 相关控件 含义(被指定时或为 true 时)
action  所有活动控件 AutoLISP 动作表达式
alignment  所有控件  控件组中的水平或垂直位置
allow_accept  edit_box、image_button、list_box 控件被选定时,激活is_default按钮
aspect_ratio  image、 image_button 图像的宽高比
big_increment  slider 最大移动增量
children_alignment  row、column、radio_row、radio_column、boxed_row、boxed_column、boxed_radio_row、boxed_radio_column 控件组的子控件的对齐方式
children_fixed_height  row、column、radio_row、radio_column、boxed_row、boxed_column、boxed_radio_row、boxed_radio_column 控件组的子控件的高度不在调整布局时增长
children_fixed_width  row、column、radio_row、radio_column、boxed_row、boxed_column、boxed_radio_row、boxed_radio_column 控件组的子控件的宽度不在调整布局时增长
color  image、 image_button 图像的背景(填充)色
edit_limit  edit_box 用户可以输入的最大字符数
edit_width  edit_box、 popup_list 控件的编辑(输入)部分的宽度
fixed_height  所有控件 高度不在调整布局时增长
fixed_width  所有控件 宽度不在调整布局时增长
fixed_width_font  list_box、 popup_list 以固定间距的字体显示文字
height  所有控件 控件的高度
initial_focus  对话框 带有初始焦点的关键字
is_bold  文字 显示为粗体
is_cancel  按钮 当按取消键(通常是 ESC)时被激活的按钮
is_default  按钮 当按接收键(通常是 ENTER)时被激活的按钮
is_enabled  所有活动控件 在初始状况下启用控件
is_tab_stop  所有活动控件 控件的制表位
key  所有活动控件 应用使用的控件名
label  boxed_row、boxed_column、boxed_radio_row、boxed_radio_column、button、dialog、edit_box、list_box、popup_list、radio_button、text、toggle 显示控件标签
layout  slider 滑块是水平放置还是垂直放置
list  list_box、 popup_list 列表中显示的初始值
max_value  slider 滑块的最大值
min_value  slider 滑块的最小值
mnemonic  所有活动控件 控件的助记符
multiple_select  list_box 列表框允许多选
password_char  edit_box 为在编辑框中输入的文本加掩码
small_increment  slider 最小移动增量
tabs  list_box、 popup_list 列表显示的制表位
tab_truncate  list_box、 popup_list 截断长出制表位的文字
value  文字、活动控件(按钮和图像按钮除外) 控件的初始值
width  所有控件 控件的宽度
DCL 属性分类
本节详细介绍 DCL 控件属性。属性按照字母顺序列出。
action
action = "(function)";
指定一个 AutoLISP 表达式,当控件被选定时,该表达式执行一个操作,即所谓的回调。对于某些类型的控件,当把焦点切换到其上时,便可以引起回调。
其可能的值是带引号的字符串,必须是一个有效的 AutoLISP 表达式。一个控件只能具有一个动作。如果应用程序使用 action_tile 函数为控件指定一个操作,则原来的 action 属性将被取代。
注意 不能在 action 属性中调用 AutoLISP 的 command 函数。
alignment
alignment = position;
为控件组中的控件指定水平或垂直位置。
对于列中的子控件,其值可以是左 (left)、右 (right) 或居中 (centered)(缺省值为左)。
对于行中的子控件,其值可以是顶 (top)、底 (bottom) 或居中 (centered)(缺省值为居中)。
不能沿控件组的长轴指定控件的对齐方式。控件组中的第一个控件和最后一个控件总是与行或列的两端对齐。除非用户插入 spacer_0 控件(请参见 spacer_0)进行调节,否则控件组中的其他控件都均匀排列。
allow_accept
allow_accept = true-false;
指定用户按下接受键(通常为 ENTER 键)时,控件是否被激活。如果该属性值为 true,则当用户按接受键时,相当于按下缺省按钮(如果存在)。缺省按钮是 is_default 属性被设置为 true 的 button 控件。allow_accept 属性缺省为 false。
aspect_ratio
aspect_ratio = real;
指定图像的宽高比(宽度/高度)。如果属性值为零 (0.0),则控件按图像大小调整。
属性值可以是一个浮点数(缺省值为:none)。
big_increment
big_increment = integer;
指定滑块移动的最大增量值。big_increment 的缺省值是整个值范围的十分之一。增量值的大小必须在属性 min_value 和 max_value
确定的范围内。
children_alignment
children_alignment = position;
指定控件组中所有控件的缺省对齐方式(与 alignment 属性类似)。如果已显式地指定了 alignment 属性,则不能覆盖该属性。
对于列,其值可以是左 (left)、右 (right) 或居中 (centered)(缺省值为左)。
对于行,其值可以是顶 (top)、底 (bottom) 或居中 (centered)(缺省值为居中)。
children_fixed_height
children_fixed_height = true-false;
指定控件组中所有子控件的缺省高度(与 height 属性类似)。如果已显式地指定了 height 属性,则不能覆盖该属性。
其值可以是 true 或 false(缺省值为 false)。
注意 使用带有 fixed_ 标识的属性时应特别慎重。因为对缺省值不经意的修改可能会对布局产生严重的影响。
children_fixed_width
children_fixed_width = true-false;
指定控件组中所有子控件的缺省宽度(与 width 属性类似)。如果已显式地指定了子控件的 width 属性,则不能覆盖该属性。
其值可以是 true 或 false(缺省为 false)。
注意 使用带有 fixed_ 标识的属性时应特别慎重。因为对缺省值不经意的修改可能会对布局产生严重的影响。
color
color = colorname;
指定图像的背景(填充)颜色。可使用整数值、AutoCAD 为颜色指定保留字(缺省值为 7)或下表中列出的符号名:
颜色符号名
符号名 含义
dialog_line  当前对话框框线的颜色
dialog_foreground  当前对话框的前景颜色(文字)
dialog_background  当前对话框的背景颜色
graphics_background  AutoCAD 图形屏幕的当前背景颜色(通常为 0)
black  AutoCAD 颜色 = 0(黑色)(黑色背景中的亮色)
red  AutoCAD 颜色 = 1(红色)
yellow  AutoCAD 颜色 = 2(黄色)
green  AutoCAD 颜色 = 3(绿色)
cyan  AutoCAD 颜色 = 4(青色)
blue  AutoCAD 颜色 = 5(蓝色)
magenta  AutoCAD 颜色 = 6(品红)
white  AutoCAD 颜色 = 7(白色)
graphics_foreground  (白亮背景中的黑色)
其中符号名 graphics_background 和 graphics_foreground 可以作为 black 和 white 的别名使用。由于颜色的实际显示取决于当前 AutoCAD 的配置情况,所以使用特定的颜色可能会导致显示的混乱。同时应该注意,幻灯片中的矢量在图像中通常只以黑白两种颜色显示。如果第一次显示时图像控件为空,则可以试着将其 color 属性设置为 graphics_background 或 graphics_foreground。
edit_limit
edit_limit = integer;
指定允许用户在编辑框中输入的最大字符数目。其值可以是一个整数值(缺省值为 132)。当输入的字符数达到此限制时,AutoCAD 将拒绝接受用户后来输入的其他字符(BACKSPACE 或 DEL 除外)。最大编辑限制允许输入 256 个字符。
edit_width
edit_width = number;
以字符宽度为单位指定框的编辑或输入区(即 edit_box 控件的实际加框部分)的宽度。其值是一个整数或实数。如果没有指定 edit_width 属性值,或指定为零,并且控件的宽度不固定,则编辑框将扩展至填满全部可用空间。如果 edit_width 非零,则该框在控件占用空间内向右对齐。如果出于调整布局的目的需要调整控件的宽度,可以使用 PDB 功能模块在标签和输入区之间插入 spacer 控件。
fixed_height
fixed_height = true-false;
指定控件的高度是否可以填满整个可用空间。如果属性值为 true,则控件的高度不会填满为布局或对齐操作留出的可用空间。
其值可以是 true 或 false(缺省值为 false)。
fixed_width
fixed_width = true-false;
指定控件的宽度是否可以填满整个可用空间。如果属性值为 true,则控件的宽度不会填满为布局或对齐操作留出的可用空间。
其值可以是 true 或 false(缺省值 false)。
fixed_width_font
fixed_width_font = true-false;
指定列表框或弹出式列表是否以固定字符间距的字体显示文字。此属性可以简化用空格和制表符控制控件按列对齐。
其值可以是 true 或 false(缺省值为 false)。
height
height = number;
指定控件的高度。其值是一个整数或实数值,以字符高度为单位表示控件高度。除非在缺省设置下控件的布局令人不满意,否则不要指定高度值。不过,在使用图像控件和图像按钮时,必须指定其高度。
控件的 height 属性仅指定其最小高度。除非控件的高度已由某个 fixed_ 属性固定,否则在调整布局时仍然可以扩展该尺寸。缺省是根据当前的布局动态地指定高度。
字符高度单位被定义为屏幕字符的最大高度(包括行间距)。
initial_focus
initial_focus = "string";
指定对话框中接受初始键盘焦点的控件的关键字。其值是一个被引号括起来的字符串(没有缺省值)。
is_bold
is_bold = true-false;
指定是否以粗体字符显示文字。其值可以是 true 或 false(缺省值为 false)。如果属性值为 true,文字以粗体字符显示。
is_cancel
is_cancel = true-false;
指定当用户按 ESC 键时按钮是否被选中。其值可以是 true 或 false(缺省值为 false)。
如果按钮的 is_cancel 属性被设置为 true,且动作表达式不能退出对话框(不调用 done_dialog 函数),则对话框会在动作表达式运行之后自动终止,并将 DIASTAT 系统变量设置为 0。
对话框中只能有一个按钮的 is_cancel 属性可以被设置为 true。
is_default
is_default = true-false;
指定是否将一个按钮作为缺省按钮,用户按下接受键时,将选中该按钮(被按下)。其值可以是 true 或 false(缺省值为 false)。如果用户将 edit_box、list_box 或 image_button 的 allow_accept 属性设置为 true,则用户按下接受键(仅适用于列表框和图像按钮)或双击时,也会选中缺省按钮。如果当前焦点正位于其他按钮上,则按下接受键时不选中缺省按钮,而选中焦点所在的按钮。
对话框中只能有一个按钮的 is_default 属性可以被设置为 true。
is_enabled
is_enabled = true-false;
指定控件在打开对话框时是否可用。其值可以是 true 或 false(缺省值为 true)。如果属性值为 false,则控件不可用,显示为灰色。
is_tab_stop
is_tab_stop = true-false;
指定在用户按 TAB 键切换控件时,控件是否接受键盘焦点。其值可以是 true 或 false(缺省值为 true)。如果控件被禁用,那么即使此属性被设置为 true,使用 TAB 键仍不能将焦点移动到此控件。如果此属性被设置为 false,则使用 TAB 键不能将焦点移动到此控件。
key
key = "string";
指定应用程序引用特定控件的名称。其值是被引号括起来的字符串(无缺省值)。在对话框中,每个 key 属性值都必须是唯一的。该字符串区分大小写:如果 key 属性值为 BigTile,则不能用 bigtile 引用它。
由于 key 属性值对用户不可见,因此设计者可以随意指定此属性值(只要保证其唯一性)。同理,在将应用程序翻译成其他语言时,key
属性的值可以不必翻译。
label
label = "string";
指定显示在控件中的文字。其值是被引号括起来的字符串(缺省值为空串:" ")。文字的位置由控件决定。
label 属性可以为控件指定一个助记符。助记符在控件标签上显示为一个带下划线的字符。
如果标签字符串中某字符的前面有一个与符号 (&),则此字符是控件的助记符。对话框中的助记符不必是唯一的:如果对话框中的多个控件有相同助记符,在键盘上按助记符时,焦点将在这些控件之间循环切换。
助记符只是切换焦点所在的位置,但并不选择控件。如果用户为一个包含一组项目的控件指定一个助记符,例如控件组或列表框,则焦点将移动到控件的第一个接受制表位切换的项目上。除了 属性被设置为 false 的控件外,其他所有活动控件都可以使用 TAB 键切换。
注意 还可以使用 mnemonic 属性指定控件的助记符。
layout
layout = position;
指定滑块的方向。值可以是水平 (horizontal) 或垂直 (vertical),缺省值为水平。对于水平滑块,其值从左至右递增。对于垂直滑块,其值从下至上递增。
list
list = "string";
指定 popup_list 或 list_box 控件的初始行(选项)。其值是被引号括起来的字符串(无缺省值)。列表中的各行由换行符 (\n) 分隔,在每一行中还可以使用制表符 (\t)。
max_value
max_value = integer;
指定 slider 控件返回值的上限。缺省值为 10000。此值是一个带符号的 16 位整数,最大不能超过 32767。
min_value
min_value = integer;
指定 slider 控件返回值的下限。缺省值为 0。此值是一个带符号的 16 位整数,最小不能超过 -32768。min_value 的值可以超过 max_value 的值。
mnemonic
mnemonic = "char";
指定控件的键盘助记符。在控件标签中,助记符是一个带下划线的字符。其值是被引号括起来的字符串,其中只包含一个字符(无缺省值)。该字符必须是控件标签中的某个字符。对话框中的助记符不必是唯一的:如果对话框中的多个控件有相同助记符,在键盘上按助记符时,焦点将在这些控件之间循环切换。
从用户的角度来看,助记符是不区分大小写的。例如,如果按钮的助记符为 A,用户输入 a 或 A 都可以使焦点移动到该按钮上。然而,在 DCL 文件中,助记符必须是控件 label 属性的一个字符,并且其大小写应该与 label 字符串中的相应字符保持一致。
助记符只是切换焦点所在的位置,但并不选择控件。如果用户为一个包含一组项目的控件指定一个助记符,例如控件组或列表框,则焦点将移动到控件的第一个接受制表位切换的项目上。除了 is_tab_stop 属性被设置为 false 的控件外,其他所有活动控件都可以使用 TAB
键切换。
注意 还可以使用 label 属性指定助记符。
multiple_select
multiple_select = true-false;
指定是否可以在 list_box 控件中同时进行多项选择(亮显)。其值可以是 true 或 false(缺省值为 false)。如果值为 true,则可以同时选择多项。
password_char
password_char = "char";
指定用于屏蔽用户输入的字符。如果指定了 password_char,并且其值不为空,则当用户输入时,在编辑框中仅显示指定的屏蔽字符,而不显示用户输入的内容。此属性不会影响到应用程序获得用户输入的正确内容,只是改变用户输入字符的显示。
关于在应用程序中使用 password_char 属性的样例,请参见要求输入口令。
small_increment
small_increment = integer;
指定滑块移动的最小增量值。small_increment 的缺省值是整个取值范围的百分之一。增量值的大小必须在属性 min_value 和 max_value 确定的范围内。此属性是可选的。
tabs
tabs = "string";
以字符宽度为单位指定制表位的位置。其值可以是一个包含整数或浮点数的被引号括起来的字符串,由空格分隔(无缺省值)。这些值用于将 popup_list 或 list_box 控件中的文字垂直对齐。
例如,下列代码用于在每 8 个字符处指定一个制表位。
tabs = "8 16 24 32";
tab_truncate
tab_truncate = true-false;
指定当列表框或弹出式列表中文字超出指定的制表位时,是否截断文字。其值可以是 true 或 false(缺省值为 false)。
value
value = "string";
指定控件的初始值。该值是一个被引号括起来的字符串。对于不同类型的控件,其值在含义上有很大的区别。实际使用时,通过用户输入或者调用 set_tile 函数可以改变控件的值。
在对话框布局过程中,不必考虑控件的 value 属性。当布局完成并且对话框显示在屏幕上以后,new_dialog 函数将使用 value 属性初始化对话框中的所有控件。控件的 value 属性不会影响对话框中的控件的大小和间距。
width
width = number;
指定控件宽度。其值是一个整数或实数值,以字符宽度为单位表示控件的宽度。除非对缺省设置下的控件外观不满意,否则不要指定宽度值。不过,在使用图像控件和图像按钮时,必须指定其宽度。
控件的 width 属性仅指定其最小宽度。除非控件的宽度已由某个 fixed_ 属性固定,否则在调整布局时仍然可以扩展该尺寸。缺省是根据当前的布局动态地指定宽度。
字符宽度单位是所有大小写字母字符的平均宽度,也可以定义为屏幕的宽度除以 80。这两种算法的结果都小于 ((A .. Z ) 字符的宽度 + (a .. z ) 字符的宽度 )/52。
DCL 控件功能摘要
本节按照功能分组摘要说明 DCL 控件。
预定义活动控件
预定义活动控件是 AutoCAD PDB 功能模块中的一组内置的或预定义的控件,这些控件可以直接使用,或作为构成复杂控件的基础。base.dcl
文件中给出了这些控件的注释性定义。(请参见 base.dcl 和 acad.dcl 文件。)
用户选择活动控件时(例如按一个按钮),对话框向控制它的应用程序发送通知作为响应。预定义活动控件可以有一个与其关联的动作。动作的结果既可以是用户可见的,也可以是内部作用(例如,状态更新)。动作带有一个原因代码,该代码指出哪个控件触发此动作。触发动作的具体原因取决于触发动作的控件的类型。
button popup_list
edit_box radio_button
image_button slider
list_box toggle
控件组
将一组控件按行或按列排列,即所谓的组件。从布局的角度看,控件组被视为一个单独的控件。可以为行和列添加边框,同时还可以随意添加标签,但不能为不带边框的控件组添加标签。
用户不能选中整个控件组,而只能单独地选中其中包含的控件。除单选按钮行和单选按钮列外,不能为控件组指定动作。可使用以下控件定义控件组:
boxed_column dialog
boxed_radio_column radio_column
boxed_radio_row radio_row
boxed_row row
column
用于修饰和说明的控件
下面列出的控件既不会触发动作,也不能被选中。这些控件可用于显示说明信息、强调说明或填补对话框的布局。
image spacer_0
text spacer_1
spacer
文本组
与其他类型的控件类似,文本控件的周围都有一定的边空。因此,把多段文字合并在一起时,就会出现问题。例如,如果要显示以下信息:
耗时 0800 小时,37 秒。
其中的实际数值(0800 和 37)是由程序提供的。可以使用 text_part 控件创建一串连续的文本信息,也可以用一个行间距不太大的段落,垂直分段显示文本信息。
以下文本组控件是定义在 base.dcl 文件中的原型控件。
concatenation text_part
paragraph
对话框退出按钮和错误控件
base.dcl 文件中定义了一些用于退出对话框的标准按钮子组件。使用这些标准的按钮可以很好地保证应用程序之间的外观一致。
errtile ok_cancel_help
ok_only ok_cancel_help_errtile
ok_cancel ok_cancel_help_info
可以使用原型控件 retirement_button 自定义这些按钮中的文字,详细信息请参见自定义退出按钮文本。
限制使用的控件
自定义的 DCL 文件中不能使用 cluster 或 tile 控件。另外,除非将标准退出按钮定义为子组件(请参见本节的对话框退出按钮和错误控件),否则请不要使用基本退出按钮类型(如 cancel_button、help_button、info_button 和 ok_button)。
DCL 控件分类
本节说明所有预定义的 DCL 控件。在下面控件的说明中,先给出控件的名称,然后是语法,接着列出所有与控件相关的属性。在控件说明之后,再对该控件的全部特定属性进行说明。
boxed_column
: boxed_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

boxed_column(加框的列)周围有一个边框。加框列的布局与对话框的布局有些类似。如果为加框列指定了标签,其标签内嵌显示在边框顶边上。如果没有指定标签,或指定为空白 (" ") 或空 (""),则只显示边框。
label
作为标题出现。空白和空之间的间距可能不尽相同。详细信息请参见调整加框行和列周围的空间。
boxed_radio_column
: boxed_radio_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

boxed_radio_column(加框的单选按钮列)周围有一个边框,处理标签与加框列的标签的处理方式一样。
label
作为标题出现。如果没有指定标签,或指定为空白(缺省)或空 (""),则只显示边框,但空白和空之间的间距可能不尽相同。详细信息请参见调整加框行和列周围的空间。
value
指定当前被选定的单选按钮(其值为“1”)的 key 属性 。
boxed_radio_row
: boxed_radio_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

boxed_radio_row(加框的单选按钮行)周围有一个边框,其标签的处理与加框行的标签的处理方式一样。
label
作为标题出现。如果没有指定标签,或指定空白(缺省)或空 (""),则只显示边框,但空白和空之间的间距可能不尽相同。详细信息请参见调整加框行和列周围的空间。
value
指定当前被选定的单选按钮(其值为“1”)的 key 属性。
boxed_row
: boxed_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

boxed_row(加框的行)周围有一个边框。如果加框行带有标签,其标签内嵌显示在框线中。
label
作为标题出现。如果没有指定标签,或指定空白(缺省)或空 (""),则只显示边框,但空白和空之间的间距可能不尽相同。详细信息请参见调整加框行和列周围的空间。
button
: button {
action alignment fixed_height fixed_width
height is_cancel is_default is_enabled
is_tab_stop key label mnemonic width
}

顾名思义,button(按钮)控件类似于按钮。按钮的 label 属性指定显示在按钮上的文字。按钮适用于产生用户立即可见的动作。例如,退出对话框、进入下一级子对话框等。
对话框必须包含一个“确定”(或与之等效的)按钮,以便用户能够在使用或查看完对话框的信息之后使用。大多数对话框还应包含一个“取消”按钮,以便用户能够退出对话框,不作任何修改。
对话框应该使用标准的退出按钮子组件,详细信息请参见对话框退出按钮和错误控件。这些子组件可以保证能够为本节介绍的属性正确赋值。
注意 如果将缺省按钮和取消按钮指定为同一按钮,则对话框中至少应该包含另一个退出按钮与调用 done_dialog 函数的动作相关联。否则,该对话框只能通过取消来退出。
label
指定按钮中显示的文字。
column
: column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

column(列)中的各个控件按照在 DCL 文件中定义的顺序垂直排列。列中可以包含任意类型的控件(单个的单选按钮除外),甚至还可以包含行或者其他列。
在不带边框的列中,除标准布局属性外,不包含其他附加的布局属性。
concatenation
: concatenation {
}
用于将多个连接的 text_part 控件拼成一行文字。在运行过程中需要向标准消息中插入文字以修改其内容时,使用此控件非常有效。
concatenation 及其周围的边距构成一个整体。
concatenation 控件在 base.dcl 文件中定义。关于使用 concatenation 控件的样例,请参见 paragraph。
dialog
: dialog {
initial_focus label value
}
dialog(对话框)控件用于定义对话框。不能同时指定其 label 和 value 属性,因为 value 属性会覆盖 label 属性。
label
指定显示在对话框标题栏中的标题。
value
指定作为对话框标题显示的字符串。然而,由于在对话框布局过程中不检测此值。所以,如果要使用这种方法指定标题,应保证对话框足够宽,否则标题文字将被截断。
在 dialog 控件中,除在布局过程中处理的次序不太一样之外,label 属性和 value 属性是等价的。如果需要在运行时修改标题,可以使用 set_tile 函数,详细信息请参见 AutoLISP 参考中的 set_tile。
initial_focus
指定接受初始键盘焦点的控件的 key 值。
edit_box
: edit_box {
action alignment allow_accept edit_limit
edit_width fixed_height fixed_width height
is_enabled is_tab_stop key label mnemonic
value width password_char
}

edit_box(编辑框)是允许用户在其中输入或编辑单行文字的字段。可选的 label 属性显示在框的左侧。如果输入的文字超过编辑框的长度,文字可以在编辑框内水平滚动。
在布局中,label 属性值向左对齐,编辑框向右对齐。这样就方便了垂直对齐 edit_box 控件的处理。
label
作为标题出现。如果指定了标签,它将在 edit_box 控件中向左对齐。
value
放置在框中的初始 ASCII 值。该值在框的编辑(输入)区内向左对齐。编辑框的值以空字符表示结束。如果用户输入的字符数目超过 edit_limit 属性的限制,则输入的值将被截断,并自动在其末尾添加空字符。
errtile
errtile;
errtile(错误控件)是显示在对话框底部的一个文本控件。缺省值为空白。程序可以通过设置此控件的值来显示信息。控件 key 属性值为“error”。例如:
(set_tile "error" "You can only select one option")
errtile 控件在 base.dcl 文件中定义。
image
: image {
action alignment aspect_ratio color
fixed_height fixed_width height is_enabled
is_tab_stop key mnemonic value width
}

image(图像)是一个矩形区域,其中显示矢量图形的图片。在 AutoCAD 对话框中,图像控件常用于显示图标、线型、文字字体和颜色块。关于如何生成图像控件的图像的详细信息,请参见创建图像。
必须为图像控件显式地指定 width 和 height 属性,或者指定其中某一属性值再加上 aspect_ratio。
image_button
: image_button {
action alignment allow_accept aspect_ratio
color fixed_height fixed_width height
is_enabled is_tab_stop key mnemonic width
}

image_button(图像按钮)控件是一个显示图形的按钮,它比标签更加生动。
当用户选择图像按钮时,程序可以获取指针选定点的具体坐标位置。如果希望显示缩微的图形,并为不同的选择区域指定不同的含义,则这一特性非常有用。
关于如何生成图像按钮中的图像的详细信息,请参见创建图像。
必须为图像按钮显式地指定 width 和 height 属性,或者指定其中某一属性值再加上 aspect_ratio。
list_box
: list_box {
action alignment allow_accept fixed_height
fixed_width height is_enabled is_tab_stop
key label list mnemonic multiple_select tabs
value width
}

list_box(列表框)包含一个按行排列的文字字符串列表。通常,列表的长度是可变的,但是当一个其他类型的控件(例如,一组单选按钮)占据了对话框中大部分空间时,列表框也可以用于固定长度的列表。用户选中一行时,该行文字被亮显。列表框包含的项目数可以多于列表区域可以容纳的行数,此时在列表框的右侧会出现一个滚动条(仅当列表区域无法同时显示所有列表项时,才会出现滚动条)。通过拖动滚动条游标或单击滚动条箭头,用户可以浏览所有列表项。有些应用程序还允许用户同时选定多个列表项。
关于如何管理列表框和弹出式列表中的内容的详细信息,请参见列表框和弹出式列表。
label
显示在列表框上方的文字。
value
一个被引号括起来的字符串,可以包含 0 ("")或多个整数,整数之间由空格分隔(无缺省值)。每个整数指示最初被选中的列表项,序号从 0 开始依次增大。如果 multiple_select 属性被设置为 false,则 value 属性中只能包含一个整数。
如果此字符串为空 (""),则说明初始没有选中列表框中的任何项目。此时,不必指定 value 的属性值。
ok_only
ok_only;

ok_only 控件是一个单独的“确定”按钮,例如,用于警告对话框中的“确定”按钮。其 key 属性值为“accept”。
ok_only 控件在 base.dcl 文件中定义。
ok_cancel
ok_cancel;

ok_cancel 控件由“确定”和“取消”两个按钮组成,是标准组合控件,常用在修改数据的对话框中。“取消”按钮的 key 属性值为“cancel”。
ok_cancel 控件在 base.dcl 文件中定义。
ok_cancel_help
ok_cancel_help;

此控件由 ok_cancel 控件组和“帮助”按钮组成。“帮助”按钮的 key 属性值为“help”。建议在应用程序的主对话框和复杂的对话框中使用“帮助”按钮。“帮助”按钮通过调用 AutoLISP 的 help 函数,显示标准的“AutoCAD 帮助”对话框。
ok_cancel_help 控件在 base.dcl 文件中定义。
ok_cancel_help_errtile
ok_cancel_help_errtile;

使用 ok_cancel_help_errtile 控件是同时指定退出按钮和错误控件的快捷方法。
ok_cancel_help_errtile 控件定义在 base.dcl 文件中。
ok_cancel_help_info
ok_cancel_help_info;

ok_cancel_help_info 控件除了具有 ok_cancel_help 控件的所有功能之外,还包含一个信息按钮,用于显示附加信息。可以显示应用程序名称、公司徽标、应用程序版本号以及如何获取技术支持等方面的信息。“信息”按钮的 key 属性值为“info”。
ok_cancel_help_info 控件定义在 base.dcl 文件中。
paragraph
: paragraph {
}

paragraph(段落)是垂直排列的 text_part 或 concatenation 的控件组。段落可以静态生成也可以在运行过程中动态生成。在对话框的布局过程中,paragraph 控件及其周围的边距构成一个整体。
paragraph 控件在 base.dcl 文件中定义。
上面的图例由以下 DCL 生成:
: paragraph
{
: concatenation
{
: text_part
{
label = "One";
}
: text_part
{
label = "good turn";
}
}
: text_part {
label = "Deserves another";
}
}
popup_list
: popup_list {
action alignment edit_width fixed_height
fixed_width height is_enabled is_tab_stop
key label list mnemonic tabs value width
}

就功能而言,popup_list(弹出式列表或简单的弹出)与列表框是等价的。在对话框第一次显示时,弹出是折叠的,看上去象一个按钮,其右端有一个箭头指示弹出标志。当用户选择其中的文字或右侧箭头时,会弹出一个列表,其中显示多个选项。弹出式列表的右侧显示一个滚动条,类似于列表框中的滚动条。当弹出式列表被折叠时,显示字段内显示当前选择的项目。弹出式列表不允许多选。
关于如何管理列表框和弹出式列表中的列表的详细信息,请参见列表框和弹出式列表。
label
作为标题出现在弹出式列表的左侧。如果指定标签,它将在 popup_list 控件中向左对齐。
edit_width
以字符宽度为单位指定列表的文本区宽度,不包含左边可选的标签和右边的弹出箭头(或滚动条)的宽度。如果没有指定 edit_width 的值或其值为零,并且控件的宽度不固定,则框将扩展填满所有可用区域。其值是一个整数或实数。如果 edit_width 非零,则框在控件中向右对齐。如果出于调整布局的目的,需要拉伸控件,可使用 PDB 功能模块在控件的 label 和框的编辑区之间添加间距进行调节。
value
被引号括起来的字符串,包含一个整数(缺省值为 0)。该整数指示当前列表框中被选中的列表项(列表没有弹出时显示的项目),序号从 0 开始依次增大。
radio_button
: radio_button {
action alignment fixed_height fixed_width
height is_enabled is_tab_stop key label
mnemonic value width
}

radio_button(单选按钮)是构成单选按钮行和列的一组按钮。与汽车收音机上的按钮类似,用户一次只能选择一个按钮。按下一个按钮后,按钮行或按钮列上的另一个已打开按钮将被关闭。单选按钮的 label 属性是可选的,其文字显示在单选按钮的右侧。如果试图在单选按钮行或列外使用单选按钮,PDB 功能模块将会报告错误。
label
单选按钮右侧显示的文字。
value
被引号括起来的字符串(无缺省值)。如果值为“1”,则 radio_button 处于打开状态,如果值为“0”,则 radio_button 处于关闭状态。除此以外的其他值都等价于“0”。
如果经过选择单选按钮行或列中有多个 radio_button 的值为“1”,那么只有最后一个单选按钮被打开。(这种情况可能会在 DCL
文件的定义中出现。在对话框打开时,PDB 功能模块会管理单选按钮,确保每个控件组中只有一个单选按钮处于打开状态。)
radio_column
: radio_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

radio_column(单选按钮列)中包含单选按钮控件,用户每次只能选择其中一个单选按钮。单选按钮列为用户提供了一组固定的相互排斥的选项。与普通的列不同,可以为单选按钮列指定一个动作。
value
被引号括起来的字符串,其中包含当前选定的单选按钮的 key 属性值(其值为“1”)。
radio_row
: radio_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}

radio_row(单选按钮行)与单选按钮列类似,也包含多个单选按钮控件,用户每次只能选择其中一个单选按钮。可以为单选按钮行指定一个动作。
value
被引号括起来的字符串,其中包含当前选定的单选按钮的 key 属性值(其值为“1”)。
注意 就使用而言,单选按钮行不如单选按钮列方便,这是因为在对单选按钮行操作时,用户移动鼠标的距离较远。仅当指定的选项数目较少(2 到 4 个),或者标签相对较短时才使用单选按钮行。
row
: row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
raw(行)与 column(列)类似,但行中的控件按照在 DCL 文件中定义的顺序水平排列,而不是垂直排列。
在不加边框的行中,除标准布局属性外,不包含其他布局属性。
slider
: slider {
action alignment big_increment fixed_height
fixed_width height key label layout
max_value min_value mnemonic small_increment
value width
}

可以用 slider(滑块)获取数值。用户可以左右(或上下)拖动滑块的游标,以指定一个数值,其含义由应用程序决定。该值以字符串形式返回,其中包含指定范围内的带符号整数(一个 16 位的整数,最大范围在 -32,768 到 32,767 之间)。应用程序可以根据需要设置。
value
被引号括起来的字符串(缺省值为 min_value),包含滑块的当前(整数)值。
text
: text {
alignment fixed_height fixed_width height
is_bold key label value width
}
text(文本)控件是用于显示标题或其他信息的文本字符串。
大多数控件自身都包含一个 label 属性用于显示标题,所以不必经常使用文本控件。但可以在对话框中用一个文本控件来显示用户动作的反馈信息、错误信息或警告信息,在不需要时,可以将此文本控件的内容置空。
关于警告对话框和错误控件的详细信息,请参见对话框退出按钮和错误控件和 DCL 错误处理。
如果显示静态文本信息,则可以直接在 label 属性中赋值,不必指定 width 或 value 属性。如果要在运行时动态地显示文本信息,则可以先为 value 属性指定一个初始值,然后为 width 属性指定一个足够大的值以保证能完全显示出所有需要显示的信息。对话框布局完成后,此控件的大小不会再发生变化,所以如果使用 set_tile 函数为该控件指定一个超过了指定宽度的字符串,则该显示的文字将被截断。
label
要显示的文字。text 控件的布局过程中,label 的宽度选择在 DCL 中指定的 width 属性值和 label 属性所需的宽度中较大的一个。所以,至少要指定其中一个属性值。
value
与 label 属性类似,value 属性指定显示在文本控件中的字符串。但是此属性不影响控件的布局。
text_part
: text_part {
label
}
text_part 控件也是一种文本控件,它是大篇文字的一部分。text_part 的边距可以不显示,所以与其他 text_parts 一起组合为 concatenation 或 paragraph 控件。
text_part 控件定义在 base.dcl 文件中。关于使用 text_part 的样例,请参见 paragraph。
toggle
: toggle {
action alignment fixed_height fixed_width
height is_enabled is_tab_stop label width
}

toggle (开关)控件用于控制布尔值("0" 或 "1")。开关显示为一个小的“开关框”,其右侧显示可选择 label 属性值。当用户选择开关框时,其中出现(或清除)复选标记或一个 X 标记。开关使得用户可以查看或修改选项的开/关状态。开关又被称为复选框。
label
开关右侧显示的文字。
value
被引号括起来的字符串,指定 toggle 控件的初始状态,其中包含一个整数(缺省为 "0")。如果字符串为 "0",表示关闭,开关框为空(没有复选标记)。如果为 "1",表示打开状态,有复选标记(或一个 X)。
spacer
: spacer {
alignment fixed_height fixed_width
height width
}
spacer 是一个空白控件。仅用于调整对话框中相邻控件之间的间距和布局。因为 PDB 功能模块可以自动调整控件之间的间距,所以为了保证与其他对话框之间的一致性,最好在必要时才使用此控件。详细信息请参见调整对话框的布局。
除标准布局属性外,spacer 控件不包含其他布局属性。
spacer_0
spacer_0;
spacer_0 控件,如下图所示,是一种没有宽度的 spacer 控件。它只指示控件组中的一个点,表明在布局过程中,如果该组被拉伸,则在该点处插入间距。如果为组中的某个 spacer_0 控件指定了确定的宽度,则控件组中所有控件将都使用此宽度等分排列。
spacer_0 控件在 base.dcl 文件中定义。

spacer_1
spacer_1;
spacer_1 控件,如下图所示,是宽度和高度都等于 1 的一种 spacer 控件。该控件用作用户可见的最小 spacer 控件。
spacer_1 控件在 base.dcl 文件中定义。

spacer_1 控件的使用
可编程对话框函数摘要
可编程对话框函数执行对话框的打开和关闭、控件和属性处理、列表框和弹出式列表处理、图像控件处理和应用程序特定数据的处理。本节列出了 Visual LISP 中所有可用的 PDB 功能模块,并根据每个模块的任务类型将其分组。关于这些函数的详细信息,请参见 AutoLISP 参考。
本节内容包括:
<>对话框打开和关闭函数
<>控件和属性处理函数
<>列表框和弹出式列表处理函数
<>图像控件处理函数
<>特定应用数据处理函数
对话框打开和关闭函数
对话框打开和关闭函数
函数名 说明
(done_dialog [status]) 终止对话框
(load_dialog dclfile) 加载 DCL 文件
(new_dialog dlgname dcl_id [action [screen-pt]]) 开始并显示新对话框,也可以指定缺省动作
(start_dialog) 显示对话框并开始接受用户输入
(term_dialog) 终止所有当前对话框,就好像用户逐个取消这些对话框
(unload_dialog dcl_id) 卸载 DCL 文件
控件和属性处理函数
控件和属性处理函数
函数名 说明
(action_tile key action-expression) 指定当用户选择对话框中的特定控件时要执行的动作
(get_attr key attribute) 获取对话框属性的 DCL 值
(get_tile key) 获取对话框控件的当前运行时的值
(mode_tile key mode) 设置对话框控件的模式
(set_tile key value) 设置对话框控件的值
列表框和弹出式列表处理函数
列表框和弹出式列表处理函数
函数名 说明
(add_list string) 在当前活动对话框列表中添加或修改一个字符串
(end_list) 结束处理当前活动对话框列表
(start_list key [operation [index]]) 开始处理列表框中或弹出式列表对话框控件中的列表
图像控件处理函数
图像控件处理函数
函数名 说明
(dimx_tile key) 和 (dimy_tile key) 以对话框单位为单位获取控件的尺寸
(end_image) 结束创建当前活动对话框图像
(fill_image x1 y1 wid hgt color) 在当前活动对话框图像控件中绘制一个填充矩形
(slide_image x1 y1 wid hgt sldname) 在当前活动对话框图像控件中显示一个幻灯片
(start_image key) 开始在对话框控件中创建一个图像
(vector_image x1 y1 x2 y2 color) 在当前活动对话框图像中绘制一个矢量
特定应用数据处理函数
特定应用处理函数
函数名 说明
(client_data_tile key clientdata) 将应用程序管理的数据与对话框控件相关联
发表于 2002-6-23 10:47 | 显示全部楼层

re

(cond
( (and ai_dcl (listp ai_dcl))) ; it's already loaded.

( (not (findfile "ai_utils.lsp")) ; find it
(ai_abort "DDMODIFY"
(strcat "Can't locate file AI_UTILS.LSP."
"\n Check support directory.")))

( (eq "failed" (load "ai_utils" "failed")) ; load it
(ai_abort "DDMODIFY" "Can't load file AI_UTILS.LSP"))
)

(defun B_SPROCKET_HILITE;重点显示选中图象项
(
B_sprocket_tile
/
)
(if (/= B_sprocket_last_slide B_sprocket_tile)
(progn
(mode_tile B_sprocket_tile 4)
(if (/= B_sprocket_last_slide nil)
(mode_tile B_sprocket_last_slide 4)
);end-if
);end-progn
);end-if
(setq B_sprocket_last_slide B_sprocket_tile)
);end-B_SPROCKET_HILITE

(defun B_SPROCKET_SLIDE_STAR;启动幻灯片
(
B_sprocket_slide
B_sprocket_slide_slb
B_sprocket_slide_dcl
/
)
(start_image B_sprocket_slide_dcl);开始建立图象
(fill_image 0 0 (dimx_tile B_sprocket_slide_dcl) (dimy_tile B_sprocket_slide_dcl) -2
);以AUTOCAD图形背景色填充
(slide_image 0 0 (dimx_tile B_sprocket_slide_dcl) (dimy_tile B_sprocket_slide_dcl) (strcat B_sprocket_slide_slb "(" B_sprocket_slide ")")
);end-silde_image从幻灯片库中调入幻灯片
(end_image);结束当前激活图象的建立
);end-B_SPROCKET_SLIDE_STAR

(defun B_SPROCKET_CHAIN_SET;设置链轮DCL数据表
(
/
)
(start_list "B_SPROCKET_CHAIN_S_DCL")
(mapcar 'add_list B_sprocket_chain_dat_list)
(end_list)
);end-B_SPROCKET_CHAIN_SET

(defun B_SPROCKET_NOTEETH_LIST_BEGIN;建立链轮齿数数据表
(
/
)
(setq B_sprocket_noteeth_list
'(7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33
34 35 36 37 38 39 40 41 42 43 44 45 46
47 48 49 50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69 70 71 72
)
)
);end-B_SPROCKET_NOTEETH_LIST_BEGIN

(defun B_SPROCKET_NOTEETH_LIST_SET;设置链轮齿数DCL数据表
(
/
)
(start_list "B_SPROCKET_NOTEETH_S_DCL")
(mapcar 'add_list (mapcar 'rtos B_sprocket_noteeth_list))
(end_list)
);end-B_SPROCKET_NOTEETH_LIST_SET

(defun B_SPROCKET_SLIDE_CHANGE;改变视图选择
(
/
)
(if (= B_sprocket_view 10401)
(progn
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_FLANK" "B_SPROCKET" "B_SPROCKET_VIEW_DCL")
(set_tile "B_SPROCKET_VIEW_S_DCL" "1")
(setq B_sprocket_view 10402)
(mode_tile "B_SPROCKET_ANGLE_DCL" 0)
(mode_tile "B_SPROCKET_ANGLE_S_DCL" 0)
);end-progn
(progn
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_FACE" "B_SPROCKET" "B_SPROCKET_VIEW_DCL")
(set_tile "B_SPROCKET_VIEW_S_DCL" "0")
(setq B_sprocket_view 10401)
(mode_tile "B_SPROCKET_ANGLE_DCL" 1)
(mode_tile "B_SPROCKET_ANGLE_S_DCL" 1)
);end-progn
);end-if
);end-B_SPROCKET_SLIDE_CHANGE


;;读入输入的链轮所用链的型号,和链的型号(国标)比较,如国标中有则设为使用链号,否则显示错误的输入。
;;把链的节距(p)、滚子直径(d1)、、内节内宽(b1)、链条通道高度(h1)、排居(pt)、单排抗拉载荷(kn)读出。

(defun B_SPROCKET_CHAIN_INPUT
(
/
B_sprocket_chain_count
)
(setq B_sprocket_chain_size (get_tile "B_SPROCKET_CHAIN_DCL"))
(setq B_sprocket_chain_count 0)
(if (null B_NO_LIST) (load "B_NO_LIST"))
(setq B_sprocket_chain_count (B_NO_LIST B_sprocket_chain_size B_sprocket_chain_dat_list))
(if (/= B_sprocket_chain_count (length B_sprocket_chain_dat_list))
(progn
(set_tile "error" "")
(set_tile "B_SPROCKET_CHAIN_DCL" B_sprocket_chain_size)
(set_tile "B_SPROCKET_CHAIN_S_DCL" (itoa B_sprocket_chain_count))
(if (null B_DATE_LIST_NO) (load "B_DATE_LIST_NO"))
(setq B_sprocket_chain_size_line (B_DATE_LIST_NO B_sprocket_chain_date_file B_sprocket_chain_count))
(setq B_sprocket_chain_data_n B_sprocket_chain_count)
);end-progn
(progn
(set_tile "error" "输入的数据无效或无此链的数据")
(mode_tile "B_SPROCKET_CHAIN_DCL" 2)
);end-progn
);end-if
(setq B_sprocket_chain_p (atof (nth 1 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_d1 (atof (nth 2 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_b1 (atof (nth 3 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_h1 (atof (nth 4 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_pt (atof (nth 5 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_kn (atof (nth 6 B_sprocket_chain_size_line)))
);end-B_SPROCKET_CHAIN_INPUT


;;读入选择的链轮所用链的型号。
;;把链的节距(p)、滚子直径(d1)、、内节内宽(b1)、链条通道高度(h1)、排居(pt)、单排抗拉载荷(kn)读出。

(defun B_SPROCKET_CHAIN_SELECTION
(
/
)
(setq B_sprocket_chain_data_n (atoi (get_tile "B_SPROCKET_CHAIN_S_DCL")))
(if (null B_DATE_LIST_NO) (load "B_DATE_LIST_NO"))
(setq B_sprocket_chain_size_line (B_DATE_LIST_NO B_sprocket_chain_date_file B_sprocket_chain_data_n))
(setq B_sprocket_chain_size (car B_sprocket_chain_size_line))
(set_tile "B_SPROCKET_CHAIN_DCL" B_sprocket_chain_size)
(setq B_sprocket_chain_p (atof (nth 1 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_d1 (atof (nth 2 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_b1 (atof (nth 3 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_h1 (atof (nth 4 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_pt (atof (nth 5 B_sprocket_chain_size_line)))
(setq B_sprocket_chain_kn (atof (nth 6 B_sprocket_chain_size_line)))
);end-B_SPROCKET_CHAIN_SELECTION


;;读入输入的链轮齿数,和链的可用齿数比较,如有则设为使用齿数,否则显示错误的输入。

(defun B_SPROCKET_NOTEETH_INPUT
(
/
B_sprocket_noteeth_count
)
(setq B_sprocket_noteeth (atoi (get_tile "B_SPROCKET_NOTEETH_DCL")))
(setq B_sprocket_noteeth_count 0)
(if (null B_NO_LIST) (load "B_NO_LIST"))
(setq B_sprocket_noteeth_count (B_NO_LIST B_sprocket_noteeth B_sprocket_noteeth_list))
(if (/= B_sprocket_noteeth_count (length B_sprocket_noteeth_list))
(progn
(set_tile "error" "")
(set_tile "B_SPROCKET_NOTEETH_DCL" (itoa B_sprocket_noteeth))
(set_tile "B_SPROCKET_NOTEETH_S_DCL" (itoa B_sprocket_noteeth_count))
);end-progn
(progn
(set_tile "error" "输入的数据无效或无此齿数的数据")
(mode_tile "B_SPROCKET_NOTEETH_DCL" 2)
);end-progn
);end-if
);end-B_SPROCKET_NOTEETH_INPUT


;;读入选择的链轮齿数。

(defun B_SPROCKET_NOTEETH_SELECTION
(
/
B_sprocket_noteeth_count
)
(setq B_sprocket_noteeth_count (atoi (get_tile "B_SPROCKET_NOTEETH_S_DCL")))
(setq B_sprocket_noteeth (nth B_sprocket_noteeth_count B_sprocket_noteeth_list))
(set_tile "B_SPROCKET_NOTEETH_DCL" (rtos B_sprocket_noteeth))
);end-B_SPROCKET_NOTEETH_SELECTION


;;读入选择的链轮插入点坐标。

(defun B_SPROCKET_CENTER_INPUT
(
/
)
(setq B_sprocket_center_x (atof (get_tile "B_SPROCKET_CENTER_X_DCL")))
(setq B_sprocket_center_y (atof (get_tile "B_SPROCKET_CENTER_Y_DCL")))
(setq B_sprocket_center_z (atof (get_tile "B_SPROCKET_CENTER_Z_DCL")))
(setq B_sprocket_center (list B_sprocket_center_x B_sprocket_center_y B_sprocket_center_z))
);end-B_SPROCKET_CENTER_INPUT


;;读入选择的链轮插入角度值。

(defun B_SPROCKET_ANGLE_INPUT
(
/
)
(setq B_sprocket_angle (* 0.017453292 (atof (get_tile "B_SPROCKET_ANGLE_DCL"))))
);end-B_SPROCKET_ANGLE_INPUT


;;读入已选择或缺省的链轮视图。

(defun B_SPROCKET_DCL_DEFAULT_VIEW
(
/
)
(if (= B_sprocket_view 10401)
(progn
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_FACE" "B_SPROCKET" "B_SPROCKET_VIEW_DCL")
(set_tile "B_SPROCKET_VIEW_S_DCL" "0")
(mode_tile "B_SPROCKET_ANGLE_DCL" 1)
(mode_tile "B_SPROCKET_ANGLE_S_DCL" 1)
);end-progn
(progn
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_FLANK" "B_SPROCKET" "B_SPROCKET_VIEW_DCL")
(set_tile "B_SPROCKET_VIEW_S_DCL" "1")
(mode_tile "B_SPROCKET_ANGLE_DCL" 0)
(mode_tile "B_SPROCKET_ANGLE_S_DCL" 0)
);end-progn
);end-if
);end-B_SPROCKET_DCL_DEFAULT_VIEW


;;读入已选择或缺省的链轮所用链型号。

(defun B_SPROCKET_DCL_DEFAULT_CHAIN
(
/
)
(set_tile "B_SPROCKET_CHAIN_DCL" B_sprocket_chain_size)
(if (null B_NO_LIST) (load "B_NO_LIST"))
(set_tile "B_SPROCKET_CHAIN_S_DCL" (itoa (B_NO_LIST B_sprocket_chain_size B_sprocket_chain_dat_list)))
);end-B_SPROCKET_DCL_DEFAULT_CHAIN


;;读入已选择或缺省的链轮齿数。

(defun B_SPROCKET_DCL_DEFAULT_NOTEETH
(
/
)
(princ)
(set_tile "B_SPROCKET_NOTEETH_DCL" (itoa B_sprocket_noteeth))
(if (null B_NO_LIST) (load "B_NO_LIST"))
(set_tile "B_SPROCKET_NOTEETH_S_DCL" (itoa (B_NO_LIST B_sprocket_noteeth B_sprocket_noteeth_list)))
);end-B_SPROCKET_DCL_DEFAULT_NOTEETH

(defun B_SPROCKET_MAKE_LAYER
(
/
B_sprocket_layer
B_lay_exist
)
(cond
((= B_sprocket_shaft_view 10411)
(setq B_sprocket_layer (strcat "L_SPROCKET-" B_sprocket_chain_size "_" (itoa (fix B_sprocket_noteeth)) "_" (itoa (fix B_sprocket_width)) "-DRIVER"))
);end-10411
((= B_sprocket_shaft_view 10412)
(setq B_sprocket_layer (strcat "L_SPROCKET-" B_sprocket_chain_size "_" (itoa (fix B_sprocket_noteeth)) "_" (itoa (fix B_sprocket_width)) "-BEARTWO"))
);end-10412
((= B_sprocket_shaft_view 10413)
(setq B_sprocket_layer (strcat "L_SPROCKET-" B_sprocket_chain_size "_" (itoa (fix B_sprocket_noteeth)) "_" (itoa (fix B_sprocket_width)) "-BEARONE"))
);end-10413
);end-cond
(setq B_lay_exist (tblsearch "layer" B_sprocket_layer))
(if (/= B_lay_exist nil)
(setvar "CLAYER" B_sprocket_layer)
(command "layer" "M" B_sprocket_layer "C" "190" "" "")
);end-if
(princ)
);end-B_SPROCKET_MAKE_LAYER


(defun B_SPROCKET_SET_BEGIN
(
/
)
(setq B_sprocket_view 10401)
(setq B_sprocket_shaft_view 10411)
(setq B_sprocket_what_shaft_driver 10450)
(setq B_sprocket_what_shaft_beartwo 10460)
(setq B_sprocket_what_shaft_bearone 10470)
(setq B_sprocket_center '(0.0 0.0 0.0))
(setq B_sprocket_center_x 0.0)
(setq B_sprocket_center_y 0.0)
(setq B_sprocket_center_z 0.0)
(setq B_sprocket_chain_size "08B")
(if (null B_NO_LIST) (load "B_NO_LIST"))
(setq B_sprocket_chain_data_n (B_NO_LIST B_sprocket_chain_size B_sprocket_chain_dat_list))
(setq B_sprocket_chain_p 12.7)
(setq B_sprocket_chain_d1 8.51)
(setq B_sprocket_chain_b1 7.75)
(setq B_sprocket_chain_h1 12.07)
(setq B_sprocket_chain_pt 13.92)
(setq B_sprocket_chain_kn 17.8)
(setq B_sprocket_noteeth 11)
(setq B_sprocket_angle 0.0)
(setq B_sprocket_width 0.0)
(setq B_sprocket_outdia 0.0)
(setq B_sprocket_shaft_bearing_two_dy 0.0)
(setq B_sprocket_shaft_bearing_two_dw 0.0)
(setq B_sprocket_shaft_bearing_two_dl 0.0)
(setq B_sprocket_shaft_bearing_one_dy 0.0)
(setq B_sprocket_shaft_bearing_one_dw 0.0)
(setq B_sprocket_shaft_bearing_one_dl 0.0)
(setq B_sprocket_shaft_driver_d 0.0)
(B_SPROCKET_COUNT)
);end-B_SPROCKET_SET_BEGIN


(defun B_SPROCKET_SHAFT_DCL_DEFAULT_VIEW
(
/
)
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_SHAFT_DRIVER" "B_SPROCKET_SHAFT" "B_SPROCKET_SHAFT_DRIVER_DCL")
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_SHAFT_BEARING_TWO" "B_SPROCKET_SHAFT" "B_SPROCKET_SHAFT_BEARING_TWO_DCL")
(B_SPROCKET_SLIDE_STAR "B_SPROCKET_SHAFT_BEARING_ONE" "B_SPROCKET_SHAFT" "B_SPROCKET_SHAFT_BEARING_ONE_DCL")
(cond
((= B_sprocket_shaft_view 10411)
(B_SPROCKET_HILITE B_SPROCKET_SHAFT_DRIVER_DCL)
);end-10411
((= B_sprocket_shaft_view 10412)
(B_SPROCKET_HILITE B_SPROCKET_SHAFT_BEARING_TWO_DCL)
);end-10412
((= B_sprocket_shaft_view 10413)
(B_SPROCKET_HILITE B_SPROCKET_SHAFT_BEARING_ONE_DCL)
);end-10413
);end-cond
);end-B_SPROCKET_SHAFT_DCL_DEFAULT_VIEW

(defun B_SPROCKET_DCL_DEFAULT
(
/
)
(B_SPROCKET_CHAIN_SET)
(B_SPROCKET_NOTEETH_LIST_SET)
(if B_sprocket_view
(B_SPROCKET_DCL_DEFAULT_VIEW)
);end-if
(if B_sprocket_shaft_view
(B_SPROCKET_SHAFT_DCL_DEFAULT_VIEW)
);end-if
(if B_sprocket_center
(progn
(set_tile "B_SPROCKET_CENTER_X_DCL" (rtos B_sprocket_center_x))
(set_tile "B_SPROCKET_CENTER_Y_DCL" (rtos B_sprocket_center_y))
(set_tile "B_SPROCKET_CENTER_Z_DCL" (rtos B_sprocket_center_z))
);end-cond
);end-if
(if B_sprocket_angle
(set_tile "B_SPROCKET_ANGLE_DCL" (rtos (* 57.29577951 B_sprocket_angle)))
);end-if
(if B_sprocket_chain_size
(B_SPROCKET_DCL_DEFAULT_CHAIN)
);end-if
(if B_sprocket_noteeth
(B_SPROCKET_DCL_DEFAULT_NOTEETH)
);end-if
(if B_sprocket_width
(set_tile "B_SPROCKET_WIDTH_DCL" (rtos B_sprocket_width))
);end-if
(if B_sprocket_outdia
(set_tile "B_SPROCKET_OUTDIA_DCL" (rtos B_sprocket_outdia))
);end-if
);end-B_SPROCKET_DCL_DEFAULT

(defun B_SPROCKET_SHAFT_DRIVER_DCL_DEFAULT
(
/
)
(if B_sprocket_shaft_driver_d
(set_tile "B_SPROCKET_SHAFT_DRIVER_D_DCL" (rtos B_sprocket_shaft_driver_d))
);end-if
);end-B_SPROCKET_SHAFT_DRIVER_DCL_DEFAULT

(defun B_SPROCKET_SHAFT_BEARING_TWO_DCL_DEFAULT
(
/
)
(if B_sprocket_shaft_bearing_two_dy
(set_tile "B_SPROCKET_SHAFT_BEARING_TWO_DY_DCL" (rtos B_sprocket_shaft_bearing_two_dy))
);end-if
(if B_sprocket_shaft_bearing_two_dw
(set_tile "B_SPROCKET_SHAFT_BEARING_TWO_DW_DCL" (rtos B_sprocket_shaft_bearing_two_dw))
);end-if
(if B_sprocket_shaft_bearing_two_dl
(set_tile "B_SPROCKET_SHAFT_BEARING_TWO_DL_DCL" (rtos B_sprocket_shaft_bearing_two_dl))
);end-if
);end-B_SPROCKET_SHAFT_BEARING_TWO_DCL_DEFAULT

(defun B_SPROCKET_SHAFT_BEARING_ONE_DCL_DEFAULT
(
/
)
(if B_sprocket_shaft_bearing_two_dy
(set_tile "B_SPROCKET_SHAFT_BEARING_ONE_DY_DCL" (rtos B_sprocket_shaft_bearing_one_dy))
);end-if
(if B_sprocket_shaft_bearing_two_dw
(set_tile "B_SPROCKET_SHAFT_BEARING_ONE_DW_DCL" (rtos B_sprocket_shaft_bearing_one_dw))
);end-if
(if B_sprocket_shaft_bearing_two_dl
(set_tile "B_SPROCKET_SHAFT_BEARING_ONE_DL_DCL" (rtos B_sprocket_shaft_bearing_one_dl))
);end-if
);end-B_SPROCKET_SHAFT_BEARING_ONE_DCL_DEFAULT

(defun B_SPROCKET_ACCEPT
(
/
)
(cond
((and (= B_sprocket_what_shaft_driver 10450) (= B_sprocket_what_shaft_beartwo 10460) (= B_sprocket_what_shaft_bearone 10470))
(mode_tile "B_SPROCKET_SHAFT_DRIVER_DCL" 2)
(set_tile "error" "请输入轴心数据")
);end-0
((<= B_sprocket_width 0)
(mode_tile "B_SPROCKET_WIDTH_DCL" 2)
(set_tile "error" "请输入链轮宽度")
);end-1
((<= B_sprocket_outdia 0)
(mode_tile "B_SPROCKET_OUTDIA_DCL" 2)
(set_tile "error" "请输入齿侧直径")
);end-1
(T
(done_dialog 1)
);end-1
);end-cond
(PRINC)
);end-B_SPROCKET_ACCEPT


(defun B_SPROCKET_COUNT
(
/
)
(B_SPROCKET_GROOVE_COUNT)
(B_SPROCKET_FIGURE_COUNT)
(B_SPROCKET_NUMBERAITON_COUNT)
(PRINC)
);end-B_SPROCKET_COUNT

(defun B_SPROCKET_GROOVE_COUNT
(
/
B_sprocket_groove_p0
B_sprocket_groove_hc
)
;;计算三圆弧一直线齿槽形状参数
(setq B_sprocket_groove_r1 (+ (* B_sprocket_chain_d1 0.5025) 0.05));OK
(setq B_sprocket_groove_a2 (- 55.0 (/ 60.0 B_sprocket_noteeth)));OK
(setq B_sprocket_groove_m (* (* (SIN (/ B_sprocket_groove_a2 57.29578)) 0.8) B_sprocket_chain_d1));OK
(setq B_sprocket_groove_t (* (* (COS (/ B_sprocket_groove_a2 57.29578)) 0.8) B_sprocket_chain_d1));OK
(setq B_sprocket_groove_r2 (+ (* B_sprocket_chain_d1 1.3025) 0.05));OK
(setq B_sprocket_groove_beita (- 18.0 (/ 56.0 B_sprocket_noteeth)));OK
(setq B_sprocket_groove_w (* (* (COS (/ 3.1415926 B_sprocket_noteeth)) 1.3) B_sprocket_chain_d1));OK
(setq B_sprocket_groove_v (* (* (SIN (/ 3.1415926 B_sprocket_noteeth)) 1.3) B_sprocket_chain_d1));OK
(setq B_sprocket_groove_gama (- 17.0 (/ 64.0 B_sprocket_noteeth)));OK
(setq B_sprocket_groove_r3 (- (* (- (+ (* (COS (/ B_sprocket_groove_gama 57.29578)) 1.3) (* (COS (/ B_sprocket_groove_beita 57.29578)) 0.8)) 1.3025) B_sprocket_chain_d1) 0.05));OK
(setq B_sprocket_groove_bc (* (- (* (SIN (/ B_sprocket_groove_gama 57.29578)) 1.3) (* (SIN (/ B_sprocket_groove_beita 57.29578)) 0.8)) B_sprocket_chain_d1));OK
(setq B_sprocket_groove_p0 (+ (* (- (* B_sprocket_groove_r1 2.0) B_sprocket_chain_d1) (SIN (/ 3.1415926 B_sprocket_noteeth))) B_sprocket_chain_p));OK
(setq B_sprocket_groove_hc (* (- (* B_sprocket_chain_d1 1.3) (/ B_sprocket_groove_p0 2.0)) (- (* B_sprocket_chain_d1 1.3) (/ B_sprocket_groove_p0 2.0))));OK
(setq B_sprocket_groove_h (sqrt (- (* B_sprocket_groove_r3 B_sprocket_groove_r3) B_sprocket_groove_hc)));OK
(setq B_sprocket_groove_remax (* 0.008 (* B_sprocket_chain_d1 (+ 180.0 (* B_sprocket_noteeth B_sprocket_noteeth)))));OK
(setq B_sprocket_groove_remin (* (* B_sprocket_chain_d1 0.12) (+ B_sprocket_noteeth 2.0)));OK
(setq B_sprocket_groove_rimax (+ (* B_sprocket_chain_d1 0.505) (* (expt B_sprocket_chain_d1 0.3333333333) 0.069)))
(setq B_sprocket_groove_rimin (* B_sprocket_chain_d1 0.505));OK
(setq B_sprocket_groove_ramax (- 120.0 (/ 90.0 B_sprocket_noteeth)));OK
(setq B_sprocket_groove_ramin (- 140.0 (/ 90.0 B_sprocket_noteeth)));OK
(PRINC)
);end-B_SPROCKET_GROOVE_COUNT

(defun B_SPROCKET_FIGURE_COUNT
(
/
)
(setq B_sprocket_figure_bf1 (* B_sprocket_chain_b1 0.94))
(setq B_sprocket_figure_ba (* B_sprocket_chain_P 0.12))
(setq B_sprocket_figure_rx B_sprocket_chain_P)
(setq B_sprocket_figure_h (* B_sprocket_chain_P 0.5))
(setq B_sprocket_figure_ra (* B_sprocket_chain_P 0.04))
(PRINC)
);end-B_SPROCKET_FIGURE_COUNT

(defun B_SPROCKET_NUMBERAITON_COUNT
(
/
)
(setq B_sprocket_numberation_p B_sprocket_chain_P)
(setq B_sprocket_numberation_d (/ B_sprocket_numberation_p (sin (/ 3.1415926 B_sprocket_noteeth))))
(setq B_sprocket_numberation_da (* B_sprocket_chain_P (+ 0.54 (/ (cos (/ 3.1415926 B_sprocket_noteeth)) (sin (/ 3.1415926 B_sprocket_noteeth))))))
(setq B_sprocket_numberation_damax (- (+ B_sprocket_numberation_d (* B_sprocket_numberation_p 1.25)) B_sprocket_chain_d1))
(setq B_sprocket_numberation_damin (- (+ B_sprocket_numberation_d (* B_sprocket_numberation_p (- 1.0 (/ 1.6 B_sprocket_noteeth)))) B_sprocket_chain_d1))
(setq B_sprocket_numberation_df (- B_sprocket_numberation_d B_sprocket_chain_d1))
(setq B_sprocket_numberation_ha (* B_sprocket_chain_P 0.27))
(setq B_sprocket_numberation_hamax (- (* B_sprocket_chain_P (+ 0.625 (/ 0.8 B_sprocket_noteeth))) (* B_sprocket_chain_d1 0.5)))
(setq B_sprocket_numberation_hamin (* (- B_sprocket_chain_P B_sprocket_chain_d1) 0.5))
(setq B_sprocket_numberation_dg (- (- (* B_sprocket_chain_P (/ (cos (/ 3.1415926 B_sprocket_noteeth)) (sin (/ 3.1415926 B_sprocket_noteeth)))) 0.76) (* B_sprocket_chain_h1 1.04)))
(if (= (/ B_sprocket_noteeth 2.0) (/ B_sprocket_noteeth 2))
(setq B_sprocket_numberation_mr (+ B_sprocket_numberation_d B_sprocket_chain_d1))
(setq B_sprocket_numberation_mr (+ (* B_sprocket_numberation_d (cos (/ 1.5707963 B_sprocket_noteeth))) B_sprocket_chain_d1))
);end-if
(PRINC)
);end-B_SPROCKET_NUMBERAITON_COUNT


(defun B_SPROCKET_GROOVE_INPUT
(
/
)
(if (not (new_dialog "B_SPROCKET_GROOVE" B_sprocket_id))
(exit)
);end-if
;;将三圆弧一直线齿槽形状参数值赋给DCL变量
(set_tile "B_SPROCKET_GROOVE_R1_DCL" (rtos B_sprocket_groove_r1))
(set_tile "B_SPROCKET_GROOVE_A2_DCL" (rtos B_sprocket_groove_a2))
(set_tile "B_SPROCKET_GROOVE_M_DCL" (rtos B_sprocket_groove_m))
(set_tile "B_SPROCKET_GROOVE_T_DCL" (rtos B_sprocket_groove_t))
(set_tile "B_SPROCKET_GROOVE_R2_DCL" (rtos B_sprocket_groove_r2))
(set_tile "B_SPROCKET_GROOVE_BEITA_DCL" (rtos B_sprocket_groove_beita))
(set_tile "B_SPROCKET_GROOVE_W_DCL" (rtos B_sprocket_groove_w))
(set_tile "B_SPROCKET_GROOVE_V_DCL" (rtos B_sprocket_groove_v))
(set_tile "B_SPROCKET_GROOVE_GAMA_DCL" (rtos B_sprocket_groove_gama))
(set_tile "B_SPROCKET_GROOVE_R3_DCL" (rtos B_sprocket_groove_r3))
(set_tile "B_SPROCKET_GROOVE_BC_DCL" (rtos B_sprocket_groove_bc))
(set_tile "B_SPROCKET_GROOVE_H_DCL" (rtos B_sprocket_groove_h))
(set_tile "B_SPROCKET_GROOVE_REMAX_DCL" (rtos B_sprocket_groove_remax))
(set_tile "B_SPROCKET_GROOVE_REMIN_DCL" (rtos B_sprocket_groove_remin))
(set_tile "B_SPROCKET_GROOVE_RIMAX_DCL" (rtos B_sprocket_groove_rimax))
(set_tile "B_SPROCKET_GROOVE_RIMIN_DCL" (rtos B_sprocket_groove_rimin))
(set_tile "B_SPROCKET_GROOVE_RAMAX_DCL" (rtos B_sprocket_groove_ramax))
(set_tile "B_SPROCKET_GROOVE_RAMIN_DCL" (rtos B_sprocket_groove_ramin))
(action_tile "accept" "(done_dialog 10421)")
(setq B_sprocket_what_groove (start_dialog))
(PRINC)
);end-B_SPROCKET_GROOVE_INPUT

(defun B_SPROCKET_FIGURE_INPUT
(
/
)
(if (not (new_dialog "B_SPROCKET_FIGURE" B_sprocket_id))
(exit)
);end-if
(set_tile "B_SPROCKET_FIGURE_BF1_DCL" (rtos B_sprocket_figure_bf1))
(set_tile "B_SPROCKET_FIGURE_BA_DCL" (rtos B_sprocket_figure_ba))
(set_tile "B_SPROCKET_FIGURE_RX_DCL" (rtos B_sprocket_figure_rx))
(set_tile "B_SPROCKET_FIGURE_H_DCL" (rtos B_sprocket_figure_h))
(set_tile "B_SPROCKET_FIGURE_RA_DCL" (rtos B_sprocket_figure_ra))
(action_tile "accept" "(done_dialog 10431)")
(setq B_sprocket_what_figure (start_dialog))
(PRINC)
);end-B_SPROCKET_FIGURE_INPUT

(defun B_SPROCKET_NUMBERAITON
(
/
)
(if (not (new_dialog "B_SPROCKET_NUMBERAITON" B_sprocket_id))
(exit)
);end-if
(set_tile "B_SPROCKET_NUMBERAITON_P_DCL" (rtos B_sprocket_numberation_p))
(set_tile "B_SPROCKET_NUMBERAITON_D_DCL" (rtos B_sprocket_numberation_d))
(set_tile "B_SPROCKET_NUMBERAITON_DA_DCL" (rtos B_sprocket_numberation_da))
(set_tile "B_SPROCKET_NUMBERAITON_DAMAX_DCL" (rtos B_sprocket_numberation_damax))
(set_tile "B_SPROCKET_NUMBERAITON_DAMIN_DCL" (rtos B_sprocket_numberation_damin))
(set_tile "B_SPROCKET_NUMBERAITON_DF_DCL" (rtos B_sprocket_numberation_df))
(set_tile "B_SPROCKET_NUMBERAITON_HA_DCL" (rtos B_sprocket_numberation_ha))
(set_tile "B_SPROCKET_NUMBERAITON_HAMAX_DCL" (rtos B_sprocket_numberation_hamax))
(set_tile "B_SPROCKET_NUMBERAITON_HAMIN_DCL" (rtos B_sprocket_numberation_hamin))
(set_tile "B_SPROCKET_NUMBERAITON_DG_DCL" (rtos B_sprocket_numberation_dg))
(set_tile "B_SPROCKET_NUMBERAITON_MR_DCL" (rtos B_sprocket_numberation_mr))
(action_tile "accept" "(done_dialog 10441)")
(setq B_sprocket_what_numberaition (start_dialog))
(PRINC)
);end-B_SPROCKET_NUMBERAITON

(defun B_SPROCKET_SHAFT_DRIVER
(
/
)
(set_tile "error" "")
(if (not (new_dialog "B_SPROCKET_SHAFT_DRIVER" B_sprocket_id))
(exit)
);end-if
(B_SPROCKET_SHAFT_DRIVER_DCL_DEFAULT)
(action_tile "B_SPROCKET_SHAFT_DRIVER_D_DCL" "(setq B_sprocket_shaft_driver_d (atof (get_tile $key)))")
(action_tile "accept" "(done_dialog 10451)")
(setq B_sprocket_what_shaft_beartwo 10460)
; (setq B_sprocket_shaft_bearing_two_dy 0.0)
; (setq B_sprocket_shaft_bearing_two_dw 0.0)
; (setq B_sprocket_shaft_bearing_two_dl 0.0)
(setq B_sprocket_what_shaft_bearone 10470)
; (setq B_sprocket_shaft_bearing_one_dy 0.0)
; (setq B_sprocket_shaft_bearing_one_dw 0.0)
; (setq B_sprocket_shaft_bearing_one_dl 0.0)
(setq B_sprocket_what_shaft_driver (start_dialog))
(PRINC)
);end-B_SPROCKET_SHAFT_DRIVER

(defun B_SPROCKET_SHAFT_BEARING_TWO
(
/
)
(set_tile "error" "")
(if (not (new_dialog "B_SPROCKET_SHAFT_BEARING_TWO" B_sprocket_id))
(exit)
);end-if
(B_SPROCKET_SHAFT_BEARING_TWO_DCL_DEFAULT)
(action_tile "B_SPROCKET_SHAFT_BEARING_TWO_DY_DCL" "(setq B_sprocket_shaft_bearing_two_dy (atof (get_tile $key)))")
(action_tile "B_SPROCKET_SHAFT_BEARING_TWO_DW_DCL" "(setq B_sprocket_shaft_bearing_two_dw (atof (get_tile $key)))")
(action_tile "B_SPROCKET_SHAFT_BEARING_TWO_DL_DCL" "(setq B_sprocket_shaft_bearing_two_dl (atof (get_tile $key)))")
(action_tile "accept" "(done_dialog 10461)")
(setq B_sprocket_what_shaft_bearone 10470)
; (setq B_sprocket_shaft_bearing_one_dy 0.0)
; (setq B_sprocket_shaft_bearing_one_dw 0.0)
; (setq B_sprocket_shaft_bearing_one_dl 0.0)
(setq B_sprocket_what_shaft_driver 10450)
; (setq B_sprocket_shaft_driver_d 0.0)
(setq B_sprocket_what_shaft_beartwo (start_dialog))
(PRINC)
);end-B_SPROCKET_SHAFT_BEARING_TWO

(defun B_SPROCKET_SHAFT_BEARING_ONE
(
/
)
(set_tile "error" "")
(if (not (new_dialog "B_SPROCKET_SHAFT_BEARING_ONE" B_sprocket_id))
(exit)
);end-if
(B_SPROCKET_SHAFT_BEARING_ONE_DCL_DEFAULT)
(action_tile "B_SPROCKET_SHAFT_BEARING_ONE_DY_DCL" "(setq B_sprocket_shaft_bearing_one_dy (atof (get_tile $key)))")
(action_tile "B_SPROCKET_SHAFT_BEARING_ONE_DW_DCL" "(setq B_sprocket_shaft_bearing_one_dw (atof (get_tile $key)))")
(action_tile "B_SPROCKET_SHAFT_BEARING_ONE_DL_DCL" "(setq B_sprocket_shaft_bearing_one_dl (atof (get_tile $key)))")
(action_tile "accept" "(done_dialog 10471)")
(setq B_sprocket_what_shaft_beartwo 10460)
; (setq B_sprocket_shaft_bearing_two_dy 0.0)
; (setq B_sprocket_shaft_bearing_two_dw 0.0)
; (setq B_sprocket_shaft_bearing_two_dl 0.0)
(setq B_sprocket_what_shaft_driver 10450)
; (setq B_sprocket_shaft_driver_d 0.0)
(setq B_sprocket_what_shaft_bearone (start_dialog))
(PRINC)
);end-B_SPROCKET_SHAFT_BEARING_ONE










(defun B_SPROCKET_DRAW_FACE_CENTER
(
/
B_current_lt
)
(setq B_current_lt (getvar "CELTYPE"))
(setq lay_line (tblsearch "LTYPE" "CENTER"))
(if (= lay_line nil)
(command "-layer" "l" "center" "" "l" "" "" ""
);end-command
);end-if
(if (/= B_current_lt "CENTER")
(setvar "CELTYPE" "CENTER")
(setvar "CELTYPE" B_current_lt)
);end-if
(setq B_sprocket_numberation_d (atof (rtos B_sprocket_numberation_d 2 2)))
(setvar "OSMODE" 0)
(command "line" (list (+ (car B_sprocket_center) (+ (* B_sprocket_numberation_da 0.5) 3.0)) (cadr B_sprocket_center) 0)
(list (- (car B_sprocket_center) (+ (* B_sprocket_numberation_da 0.5) 3.0)) (cadr B_sprocket_center) 0) ""
);end-command
(command "line" (list (car B_sprocket_center) (+ (cadr B_sprocket_center) (+ (* B_sprocket_numberation_da 0.5) 3.0)) 0)
(list (car B_sprocket_center) (- (cadr B_sprocket_center) (+ (* B_sprocket_numberation_da 0.5) 3.0)) 0) ""
);end-command
(command "CIRCLE" B_sprocket_center "D" B_sprocket_numberation_d
);end-command
(setvar "OSMODE" 51)
(setvar "CELTYPE" B_current_lt)
);end-B_SPROCKET_DRAW_FACE_CENTER

(defun B_SPROCKET_DRAW_FLANK_CENTER
(
/
B_current_lt
B_sprocket_point01
B_sprocket_point02
)
(setq B_current_lt (getvar "CELTYPE"))
(setq lay_line (tblsearch "LTYPE" "CENTER"))
(if (= lay_line nil)
(command "-layer" "l" "center" "" "l" "" "" ""
);end-command
);end-if
(if (/= B_current_lt "CENTER")
(setvar "CELTYPE" "CENTER")
(setvar "CELTYPE" B_current_lt)
);end-if
(setq B_sprocket_numberation_d (atof (rtos B_sprocket_numberation_d 2 2)))
(setq B_sprocket_point01 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_d 2.0)))
(setq B_sprocket_point02 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_d -2.0)))
(setvar "OSMODE" 0)
(command "line" (polar B_sprocket_center B_sprocket_angle -3.0) (polar B_sprocket_center B_sprocket_angle (+ B_sprocket_width 3.0)) ""
);end-command
(command "line" (polar B_sprocket_point01 B_sprocket_angle -3.0) (polar B_sprocket_point01 B_sprocket_angle (+ B_sprocket_figure_bf1 3.0)) ""
);end-command
(command "line" (polar B_sprocket_point02 B_sprocket_angle -3.0) (polar B_sprocket_point02 B_sprocket_angle (+ B_sprocket_figure_bf1 3.0)) ""
);end-command
(setvar "OSMODE" 51)
(setvar "CELTYPE" B_current_lt)
);end-B_SPROCKET_DRAW_FLANK_CENTER


(defun B_SPROCKET_DRAW_FACE_CHAIN
(
/
)
(setq B_sprocket_numberation_da (atof (rtos B_sprocket_numberation_da 2 0)))
(setq B_sprocket_numberation_df (atof (rtos B_sprocket_numberation_df 2 2)))
(setvar "OSMODE" 0)
(command "CIRCLE" B_sprocket_center "D" B_sprocket_numberation_da
);end-command
(command "CIRCLE" B_sprocket_center "D" B_sprocket_numberation_df
);end-command
(command "CIRCLE" B_sprocket_center "D" B_sprocket_outdia
);end-command
(setvar "OSMODE" 51)
(princ)
);end-B_SPROCKET_DRAW_FACE_CHAIN


(defun B_SPROCKET_DRAW_FLANK_CHAIN
(
/
B_sprocket_point00
B_sprocket_point01
B_sprocket_point02
B_sprocket_point03
B_sprocket_point04
B_sprocket_point05
B_sprocket_point06
B_sprocket_point07
B_sprocket_point08
B_sprocket_point09
)
(setq B_sprocket_figure_ba (atof (rtos B_sprocket_figure_ba 2 1)))
(setq B_sprocket_figure_rx (atof (rtos B_sprocket_figure_rx 2 0)))
(setq B_sprocket_figure_bf1 (atof (rtos B_sprocket_figure_bf1 2 2)))
(setq B_sprocket_numberation_da (atof (rtos B_sprocket_numberation_da 2 0)))
(setq B_sprocket_numberation_df (atof (rtos B_sprocket_numberation_df 2 2)))
(setq B_sprocket_draw_h (sqrt (- (* B_sprocket_figure_ba B_sprocket_figure_rx 2.0) (* B_sprocket_figure_ba B_sprocket_figure_ba))))
(setq B_sprocket_point00 (polar B_sprocket_center B_sprocket_angle B_sprocket_width))
(setq B_sprocket_point01 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (- (/ B_sprocket_numberation_da 2.0) B_sprocket_draw_h)))
(setq B_sprocket_point02 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (+ (/ B_sprocket_numberation_da -2.0) B_sprocket_draw_h)))
(setq B_sprocket_point03 (polar B_sprocket_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_outdia 2.0)))
(setq B_sprocket_point04 (polar B_sprocket_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_outdia -2.0)))
(setq B_sprocket_point05 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_df 2.0)))
(setq B_sprocket_point06 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_df -2.0)))
(setq B_sprocket_point07 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_da 2.0)))
(setq B_sprocket_point08 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_numberation_da -2.0)))
(setvar "OSMODE" 0)
(command "line" B_sprocket_point01 B_sprocket_point02 ""
);end-command
(command "line" B_sprocket_point05 (polar B_sprocket_point05 B_sprocket_angle B_sprocket_figure_bf1) ""
);end-command
(command "line" B_sprocket_point06 (polar B_sprocket_point06 B_sprocket_angle B_sprocket_figure_bf1) ""
);end-command
(command "line" (polar B_sprocket_point01 B_sprocket_angle B_sprocket_figure_bf1) (polar B_sprocket_point02 B_sprocket_angle B_sprocket_figure_bf1) ""
);end-command
(command "line" (polar B_sprocket_point07 B_sprocket_angle B_sprocket_figure_ba) (polar B_sprocket_point07 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_figure_ba)) ""
);end-command
(command "line" (polar B_sprocket_point08 B_sprocket_angle B_sprocket_figure_ba) (polar B_sprocket_point08 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_figure_ba)) ""
);end-command
(command "arc" (polar B_sprocket_point07 B_sprocket_angle B_sprocket_figure_ba) "e" B_sprocket_point01 "r" B_sprocket_figure_rx
);end-command
(command "arc" B_sprocket_point02 "e" (polar B_sprocket_point08 B_sprocket_angle B_sprocket_figure_ba) "r" B_sprocket_figure_rx
);end-command
(command "arc" (polar B_sprocket_point01 B_sprocket_angle B_sprocket_figure_bf1) "e" (polar B_sprocket_point07 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_figure_ba)) "r" B_sprocket_figure_rx
);end-command
(command "arc" (polar B_sprocket_point08 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_figure_ba)) "e" (polar B_sprocket_point02 B_sprocket_angle B_sprocket_figure_bf1) "r" B_sprocket_figure_rx
);end-command
(command "line" B_sprocket_point03 B_sprocket_point04 ""
);end-command
(command "line" B_sprocket_point03 (polar B_sprocket_point03 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_width)) ""
);end-command
(command "line" B_sprocket_point04 (polar B_sprocket_point04 B_sprocket_angle (- B_sprocket_figure_bf1 B_sprocket_width)) ""
);end-command
(setvar "OSMODE" 51)
(princ)
);end-B_SPROCKET_DRAW_FLANK_CHAIN

(defun B_SPROCKET_DRAW_FACE_SHAFT
(
/
)
(COND
((= B_sprocket_shaft_view 10411)
(B_SPROCKET_DRAW_FACE_SHAFT_DRIVER)
);end-10411
((= B_sprocket_shaft_view 10412)
(B_SPROCKET_DRAW_FACE_SHAFT_BEARTWO)
);end-10412
((= B_sprocket_shaft_view 10413)
(B_SPROCKET_DRAW_FACE_SHAFT_BEARONE)
);end-10413
);end-cond
);end-B_SPROCKET_DRAW_FACE_SHAFT

(defun B_SPROCKET_DRAW_FLANK_SHAFT
(
/
)
(COND
((= B_sprocket_shaft_view 10411)
(B_SPROCKET_DRAW_FLANK_SHAFT_DRIVER)
);end-10411
((= B_sprocket_shaft_view 10412)
(B_SPROCKET_DRAW_FLANK_SHAFT_BEARTWO)
);end-10412
((= B_sprocket_shaft_view 10413)
(B_SPROCKET_DRAW_FLANK_SHAFT_BEARONE)
);end-10413
);end-cond
);end-B_SPROCKET_DRAW_FLANK_SHAFT

(defun B_SPROCKET_DRAW_FACE_SHAFT_DRIVER
(
/
B_sprocket_shaft_jian_list
B_sprocket_shaft_jian_count
B_sprocket_shaft_jian_date
B_sprocket_shaft_jian_b
B_sprocket_shaft_jian_t1
B_sprocket_shaft_jian_py
B_sprocket_shaft_point00
B_sprocket_shaft_point01
B_sprocket_shaft_point02
B_sprocket_shaft_point03
B_sprocket_shaft_point04
)
(if (null B_DATE_LIST_TWO) (load "B_DATE_LIST_TWO"))
(if (null B_NO_CENTER_LIST) (load "B_NO_CENTER_LIST"))
(if (null B_DATE_LIST_NO) (load "B_DATE_LIST_NO"))
(setq B_sprocket_shaft_jian_list (B_DATE_LIST_TWO "B_JIAN.DAT"))
(setq B_sprocket_shaft_jian_count (B_NO_CENTER_LIST B_sprocket_shaft_driver_d B_sprocket_shaft_jian_list))
(setq B_sprocket_shaft_jian_date (B_DATE_LIST_NO "B_JIAN.DAT" B_sprocket_shaft_jian_count))
(setq B_sprocket_shaft_jian_b (atof (nth 2 B_sprocket_shaft_jian_date)))
(setq B_sprocket_shaft_jian_t1 (atof (nth 5 B_sprocket_shaft_jian_date)))
(setq B_sprocket_shaft_point00 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (+ (/ B_sprocket_shaft_driver_d 2.0) B_sprocket_shaft_jian_t1)))
(setq B_sprocket_shaft_jian_py (sqrt (- (* B_sprocket_shaft_driver_d B_sprocket_shaft_driver_d) (* B_sprocket_shaft_jian_b B_sprocket_shaft_jian_b))))
(setq B_sprocket_shaft_point01 (list (+ B_sprocket_center_x (/ B_sprocket_shaft_jian_b -2.0)) (+ B_sprocket_center_y (/ B_sprocket_shaft_jian_py 2.0))))
(setq B_sprocket_shaft_point02 (list (+ B_sprocket_center_x (/ B_sprocket_shaft_jian_b 2.0)) (+ B_sprocket_center_y (/ B_sprocket_shaft_jian_py 2.0))))
(setq B_sprocket_shaft_point03 (polar B_sprocket_shaft_point00 B_sprocket_angle (/ B_sprocket_shaft_jian_b -2.0)))
(setq B_sprocket_shaft_point04 (polar B_sprocket_shaft_point00 B_sprocket_angle (/ B_sprocket_shaft_jian_b 2.0)))
(setvar "OSMODE" 0)
(command "line" B_sprocket_shaft_point01 B_sprocket_shaft_point03 B_sprocket_shaft_point04 B_sprocket_shaft_point02 ""
);end-command
(command "arc" "c" B_sprocket_center B_sprocket_shaft_point01 B_sprocket_shaft_point02
);end-command
(setvar "OSMODE" 51)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_DRAW_FLANK_SHAFT_DRIVER
(
/
B_sprocket_shaft_jian_list
B_sprocket_shaft_jian_count
B_sprocket_shaft_jian_date
B_sprocket_shaft_jian_b
B_sprocket_shaft_jian_t1
B_sprocket_shaft_jian_py
B_sprocket_shaft_point01
B_sprocket_shaft_point02
B_sprocket_shaft_point03
B_current_lt
)
(if (null B_DATE_LIST_TWO) (load "B_DATE_LIST_TWO"))
(if (null B_NO_CENTER_LIST) (load "B_NO_CENTER_LIST"))
(if (null B_DATE_LIST_NO) (load "B_DATE_LIST_NO"))
(setq B_sprocket_shaft_jian_list (B_DATE_LIST_TWO "B_JIAN.DAT"))
(setq B_sprocket_shaft_jian_count (B_NO_CENTER_LIST B_sprocket_shaft_driver_d B_sprocket_shaft_jian_list))
(setq B_sprocket_shaft_jian_date (B_DATE_LIST_NO "B_JIAN.DAT" B_sprocket_shaft_jian_count))
(setq B_sprocket_shaft_jian_b (atof (nth 2 B_sprocket_shaft_jian_date)))
(setq B_sprocket_shaft_jian_t1 (atof (nth 5 B_sprocket_shaft_jian_date)))
(setq B_sprocket_shaft_point01 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (+ (/ B_sprocket_shaft_driver_d 2.0) B_sprocket_shaft_jian_t1)))
(setq B_sprocket_shaft_jian_py (sqrt (- (* B_sprocket_shaft_driver_d B_sprocket_shaft_driver_d) (* B_sprocket_shaft_jian_b B_sprocket_shaft_jian_b))))
(setq B_sprocket_shaft_point02 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_driver_d -2.0)))
(setq B_sprocket_shaft_point03 (polar B_sprocket_center (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_jian_py 2.0)))
(setq B_current_lt (getvar "CELTYPE"))
(setq lay_line (tblsearch "LTYPE" "HIDDEN"))
(if (= lay_line nil)
(command "-layer" "l" "hidden" "" "l" "" "" ""
);end-command
);end-if
(if (/= B_current_lt "HIDDEN")
(setvar "CELTYPE" "HIDDEN")
(setvar "CELTYPE" B_current_lt)
);end-if
(setvar "OSMODE" 0)
(command "line" B_sprocket_shaft_point01 (polar B_sprocket_shaft_point01 B_sprocket_angle B_sprocket_width) ""
);end-command
(command "line" B_sprocket_shaft_point02 (polar B_sprocket_shaft_point02 B_sprocket_angle B_sprocket_width) ""
);end-command
(command "line" B_sprocket_shaft_point03 (polar B_sprocket_shaft_point03 B_sprocket_angle B_sprocket_width) ""
);end-command
(setvar "OSMODE" 51)
(setvar "CELTYPE" B_current_lt)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_DRAW_FACE_SHAFT_BEARTWO
(
/
)
(setvar "OSMODE" 0)
(command "CIRCLE" B_sprocket_center "D" B_sprocket_shaft_bearing_two_dy
);end-command
(command "CIRCLE" B_sprocket_center "D" B_sprocket_shaft_bearing_two_dl
);end-command
(setvar "OSMODE" 51)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_DRAW_FLANK_SHAFT_BEARTWO
(
/
B_sprocket_shaft_point00
B_sprocket_shaft_point01
B_sprocket_shaft_point02
B_sprocket_shaft_point03
B_sprocket_shaft_point04
B_sprocket_shaft_point05
B_sprocket_shaft_point06
)
(setq B_sprocket_shaft_point00 (polar B_sprocket_center B_sprocket_angle B_sprocket_shaft_bearing_two_dw))
(setq B_sprocket_shaft_point01 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_two_dy 2.0)))
(setq B_sprocket_shaft_point02 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_two_dy -2.0)))
(setq B_sprocket_shaft_point03 (polar B_sprocket_shaft_point01 B_sprocket_angle (- B_sprocket_width (* B_sprocket_shaft_bearing_two_dw 2.0))))
(setq B_sprocket_shaft_point04 (polar B_sprocket_shaft_point02 B_sprocket_angle (- B_sprocket_width (* B_sprocket_shaft_bearing_two_dw 2.0))))
(setq B_sprocket_shaft_point05 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_two_dl 2.0)))
(setq B_sprocket_shaft_point06 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_two_dl -2.0)))
(setq B_current_lt (getvar "CELTYPE"))
(setq lay_line (tblsearch "LTYPE" "HIDDEN"))
(if (= lay_line nil)
(command "-layer" "l" "hidden" "" "l" "" "" ""
);end-command
);end-if
(if (/= B_current_lt "HIDDEN")
(setvar "CELTYPE" "HIDDEN")
(setvar "CELTYPE" B_current_lt)
);end-if
(setvar "OSMODE" 0)
(command "line" B_sprocket_shaft_point01 (polar B_sprocket_shaft_point01 (+ B_sprocket_angle pi) B_sprocket_shaft_bearing_two_dw) ""
);end-command
(command "line" B_sprocket_shaft_point02 (polar B_sprocket_shaft_point02 (+ B_sprocket_angle pi) B_sprocket_shaft_bearing_two_dw) ""
);end-command
(command "line" B_sprocket_shaft_point02 B_sprocket_shaft_point01 ""
);end-command
(command "line" B_sprocket_shaft_point03 (polar B_sprocket_shaft_point03 B_sprocket_angle B_sprocket_shaft_bearing_two_dw) ""
);end-command
(command "line" B_sprocket_shaft_point04 (polar B_sprocket_shaft_point04 B_sprocket_angle B_sprocket_shaft_bearing_two_dw) ""
);end-command
(command "line" B_sprocket_shaft_point03 B_sprocket_shaft_point04 ""
);end-command
(command "line" B_sprocket_shaft_point05 (polar B_sprocket_shaft_point05 B_sprocket_angle (- B_sprocket_width (* B_sprocket_shaft_bearing_two_dw 2.0))) ""
);end-command
(command "line" B_sprocket_shaft_point06 (polar B_sprocket_shaft_point06 B_sprocket_angle (- B_sprocket_width (* B_sprocket_shaft_bearing_two_dw 2.0))) ""
);end-command
(setvar "OSMODE" 51)
(setvar "CELTYPE" B_current_lt)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_DRAW_FACE_SHAFT_BEARONE
(
/
)
(setvar "OSMODE" 0)
(command "CIRCLE" B_sprocket_center "D" B_sprocket_shaft_bearing_one_dy
);end-command
(command "CIRCLE" B_sprocket_center "D" B_sprocket_shaft_bearing_one_dl
);end-command
(setvar "OSMODE" 51)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_DRAW_FLANK_SHAFT_BEARONE
(
/
B_sprocket_shaft_point00
B_sprocket_shaft_point01
B_sprocket_shaft_point02
B_sprocket_shaft_point03
B_sprocket_shaft_point04
)
(setq B_sprocket_shaft_point00 (polar B_sprocket_center B_sprocket_angle B_sprocket_shaft_bearing_one_dw))
(setq B_sprocket_shaft_point01 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_one_dy 2.0)))
(setq B_sprocket_shaft_point02 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_one_dy -2.0)))
(setq B_sprocket_shaft_point03 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_one_dl 2.0)))
(setq B_sprocket_shaft_point04 (polar B_sprocket_shaft_point00 (+ B_sprocket_angle 1.570796) (/ B_sprocket_shaft_bearing_one_dl -2.0)))
(setq B_current_lt (getvar "CELTYPE"))
(setq lay_line (tblsearch "LTYPE" "HIDDEN"))
(if (= lay_line nil)
(command "-layer" "l" "hidden" "" "l" "" "" ""
);end-command
);end-if
(if (/= B_current_lt "HIDDEN")
(setvar "CELTYPE" "HIDDEN")
(setvar "CELTYPE" B_current_lt)
);end-if
(setvar "OSMODE" 0)
(command "line" B_sprocket_shaft_point01 (polar B_sprocket_shaft_point01 (+ B_sprocket_angle pi) B_sprocket_shaft_bearing_one_dw) ""
);end-command
(command "line" B_sprocket_shaft_point02 (polar B_sprocket_shaft_point02 (+ B_sprocket_angle pi) B_sprocket_shaft_bearing_one_dw) ""
);end-command
(command "line" B_sprocket_shaft_point02 B_sprocket_shaft_point01 ""
);end-command
(command "line" B_sprocket_shaft_point03 (polar B_sprocket_shaft_point03 B_sprocket_angle (- B_sprocket_width B_sprocket_shaft_bearing_one_dw)) ""
);end-command
(command "line" B_sprocket_shaft_point04 (polar B_sprocket_shaft_point04 B_sprocket_angle (- B_sprocket_width B_sprocket_shaft_bearing_one_dw)) ""
);end-command
(setvar "OSMODE" 51)
(setvar "CELTYPE" B_current_lt)
(princ)
);end-B_SPROCKET_DRAW_FACE_SHAFT_DRIVER

(defun B_SPROCKET_ACTION_TILE
(
/
)
(setq B_sprocket_what 7)
(B_SPROCKET_SET_BEGIN)
(while (> B_sprocket_what 2)
(if (not (new_dialog "B_SPROCKET" B_sprocket_id))
(exit)
);end-if
(B_SPROCKET_DCL_DEFAULT)
(action_tile "B_SPROCKET_VIEW_DCL" "(B_SPROCKET_SLIDE_CHANGE) (B_SPROCKET_HILITE B_SPROCKET_VIEW_DCL)")
(action_tile "B_SPROCKET_VIEW_S_DCL" "(B_SPROCKET_SLIDE_CHANGE) (B_SPROCKET_HILITE B_SPROCKET_VIEW_DCL)")
(action_tile "B_SPROCKET_CHAIN_DCL" "(B_SPROCKET_CHAIN_INPUT) (B_SPROCKET_COUNT)")
(action_tile "B_SPROCKET_CHAIN_S_DCL" "(B_SPROCKET_CHAIN_SELECTION) (B_SPROCKET_COUNT)")
(action_tile "B_SPROCKET_NOTEETH_DCL" "(B_SPROCKET_NOTEETH_INPUT) (B_SPROCKET_COUNT)")
(action_tile "B_SPROCKET_NOTEETH_S_DCL" "(B_SPROCKET_NOTEETH_SELECTION) (B_SPROCKET_COUNT)")
(action_tile "B_SPROCKET_WIDTH_DCL" "(setq B_sprocket_width (atof (get_tile $key)))")
(action_tile "B_SPROCKET_OUTDIA_DCL" "(setq B_sprocket_outdia (atof (get_tile $key)))")
(action_tile "B_SPROCKET_GROOVE_DCL" "(B_SPROCKET_GROOVE_INPUT)")
(action_tile "B_SPROCKET_FIGURE_DCL" "(B_SPROCKET_FIGURE_INPUT)")
(action_tile "B_SPROCKET_NUMBERAITON_DCL" "(B_SPROCKET_NUMBERAITON)")
(action_tile "B_SPROCKET_SHAFT_DRIVER_DCL" "(B_SPROCKET_HILITE B_SPROCKET_SHAFT_DRIVER_DCL) (setq B_sprocket_shaft_view 10411) (B_SPROCKET_SHAFT_DRIVER)")
(action_tile "B_SPROCKET_SHAFT_BEARING_TWO_DCL" "(B_SPROCKET_HILITE B_SPROCKET_SHAFT_BEARING_TWO_DCL) (setq B_sprocket_shaft_view 10412) (B_SPROCKET_SHAFT_BEARING_TWO)")
(action_tile "B_SPROCKET_SHAFT_BEARING_ONE_DCL" "(B_SPROCKET_HILITE B_SPROCKET_SHAFT_BEARING_ONE_DCL) (setq B_sprocket_shaft_view 10413) (B_SPROCKET_SHAFT_BEARING_ONE)")
(action_tile "B_SPROCKET_CENTER_DCL" "(done_dialog 4)")
(action_tile "B_SPROCKET_CENTER_X_DCL" "(B_SPROCKET_CENTER_INPUT)")
(action_tile "B_SPROCKET_CENTER_Y_DCL" "(B_SPROCKET_CENTER_INPUT)")
(action_tile "B_SPROCKET_CENTER_Z_DCL" "(B_SPROCKET_CENTER_INPUT)")
(action_tile "B_SPROCKET_ANGLE_S_DCL" "(done_dialog 3)")
(action_tile "B_SPROCKET_ANGLE_DCL" "(B_SPROCKET_ANGLE_INPUT)")
(action_tile "cancel" "(done_dialog 0)")
(action_tile "accept" "(B_SPROCKET_ACCEPT)")
(setq B_sprocket_what (start_dialog))
(cond
((= B_sprocket_what 4)
(initget 1)
(setq B_sprocket_center (getpoint "\n插入点: ")
B_sprocket_center_x (car B_sprocket_center)
B_sprocket_center_y (cadr B_sprocket_center)
B_sprocket_center_z (caddr B_sprocket_center)
)
);end-4
((= B_sprocket_what 3)
(setq B_sprocket_angle (getorient "请输入插入角度: "))
);end-3
);end-cond
);end-while
);end-B_SPROCKET_ACTION_TILE

(defun B_SPROCKET
(
/
B_sprocket_old_cmd;保存系统变量CMDECHO用
B_sprocket_filletrad;保存系统变量FILLETRAD用
B_current_layer;保存当前层变量
B_sprocket_id;数据文件标号
B_sprocket_chain_date_file;数据文件名变量
B_sprocket_center;插入点变量
B_sprocket_center_x;插入点X坐标变量
B_sprocket_center_y;插入点Y坐标变量
B_sprocket_center_z;插入点Z坐标变量
B_sprocket_angle;角度变量
B_sprocket_chain_dat_list;返回链型号数据表
B_sprocket_chain_size_line;返回选中链型号的参数表
B_sprocket_chain_size;返回选中链型号
B_sprocket_chain_data_n;返回选中链型号-表中
B_sprocket_chain_p;返回选中链节距
B_sprocket_chain_d1;返回选中链滚子直径
B_sprocket_chain_b1;返回选中链内节内宽
B_sprocket_chain_h1;返回选中链条通道高度
B_sprocket_chain_pt;返回选中链排距
B_sprocket_chain_kn;返回选中链抗拉载荷
B_sprocket_noteeth;链轮齿数变量
B_sprocket_noteeth_list;链轮齿数表变量
B_sprocket_width;链轮宽度变量
B_sprocket_outdia;链轮齿侧凸弦直径变量
B_sprocket_numberation_p;返回选中链节距
B_sprocket_numberation_d;返回链轮分度圆直径
B_sprocket_numberation_da;返回链轮齿顶圆直径
B_sprocket_numberation_damax;返回链轮齿顶圆直径最大值
B_sprocket_numberation_damin;返回链轮齿顶圆直径最小值
B_sprocket_numberation_df;返回链轮齿根圆直径
B_sprocket_numberation_ha;返回链轮分度圆齿弦高
B_sprocket_numberation_hamax;返回链轮分度圆齿弦高最大值
B_sprocket_numberation_hamin;返回链轮分度圆齿弦高最小值
B_sprocket_numberation_dg;返回链轮齿侧凸缘直径
B_sprocket_numberation_mr;返回链轮量柱测量距
B_sprocket_groove_r1;返回链轮齿沟圆弧半径
B_sprocket_groove_a2;返回链轮齿沟半角
B_sprocket_groove_m;返回链轮工作段圆弧中心坐标-X
B_sprocket_groove_t;返回链轮工作段圆弧中心坐标-Y
B_sprocket_groove_r2;返回链轮工作段圆弧半径
B_sprocket_groove_beita;返回链轮工作段圆弧中心角
B_sprocket_groove_w;返回链轮齿顶圆弧中心坐标-X
B_sprocket_groove_v;返回链轮齿顶圆弧中心坐标-Y
B_sprocket_groove_gama;返回链轮齿形半角
B_sprocket_groove_r3;返回链轮齿顶圆弧半径
B_sprocket_groove_bc;返回链轮工作段直线部分长度
B_sprocket_groove_h;返回链轮e点至齿沟圆弧中心料攥的距离
B_sprocket_figure_bf1;返回链轮齿宽
B_sprocket_figure_ba;返回链轮齿侧倒角
B_sprocket_figure_rx;返回链轮齿侧半径
B_sprocket_figure_h
B_sprocket_figure_ra
B_sprocket_what;窗口循环变量
B_sprocket_last_slide;中间变量
B_sprocket_tile;中间变量
B_sprocket_view;视图选择变量,主视图:10401,侧视图:10402
B_sprocket_shaft_view;心轴式样选择变量 ,驱动:10411,双轴承:10412,单轴承:10413
B_sprocket_what_groove;齿槽形状判断变量,已设:10421,未设:10420
B_sprocket_what_figure;轴向齿廓判断变量,已设:10431,未设:10430
B_sprocket_what_numberaition;计算参数判断变量,已设:10441,未设:10440
B_sprocket_what_shaft_driver;轴心判断变量1 ,已设:10451,未设:10450
B_sprocket_what_shaft_beartwo;轴心判断变量2 ,已设:10461,未设:10460
B_sprocket_shaft_bearing_two_dy;双轴承轴心轴承外径变量
B_sprocket_shaft_bearing_two_dw;双轴承轴心轴承宽度变量
B_sprocket_shaft_bearing_two_dl;双轴承轴心轴承通径变量
B_sprocket_what_shaft_bearone;轴心判断变量3 ,已设:10461,未设:10470
B_sprocket_shaft_bearing_one_dy;单轴承轴心轴承外径变量
B_sprocket_shaft_bearing_one_dw;单轴承轴心轴承宽度变量
B_sprocket_shaft_bearing_one_dl;单轴承轴心轴承通径变量
)
(setq B_sprocket_old_cmd (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq B_sprocket_id (load_dialog "B_SPROCKET"));装入B_DRAWING.DCL
(setq B_sprocket_chain_date_file "B_SPROCKET_CHAIN.DAT")
(if (null B_DATE_LIST_ONE) (load "B_DATE_LIST_ONE"))
(setq B_sprocket_chain_dat_list (B_DATE_LIST_ONE B_sprocket_chain_date_file));装入链轮链型号表
(B_SPROCKET_NOTEETH_LIST_BEGIN);装入链轮齿数表
(B_SPROCKET_ACTION_TILE)
(if (= B_sprocket_what 1)
(progn
(setq B_current_layer (getvar "CLAYER"));保存当前图层
(setq B_sprocket_filletrad (getvar "FILLETRAD"))
(B_SPROCKET_MAKE_LAYER);创建链轮图层
(cond
((= B_sprocket_view 10401);画主视图
(B_SPROCKET_DRAW_FACE_CHAIN)
(B_SPROCKET_DRAW_FACE_CENTER)
  (B_SPROCKET_DRAW_FACE_SHAFT)
(princ)
);cond-10401
((= B_sprocket_view 10402);画侧视图
(B_SPROCKET_DRAW_FLANK_CHAIN)
  (B_SPROCKET_DRAW_FLANK_CENTER)
  (B_SPROCKET_DRAW_FLANK_SHAFT)
(princ)
);cond-10402
);end-cond
(setvar "FILLETRAD" B_sprocket_filletrad)
(setvar "CLAYER" B_current_layer);返回当前图层
);end-progn
);end-if
(unload_dialog B_sprocket_id)
(setvar "CMDECHO" B_sprocket_old_cmd)
(princ)
);end-B_SPROCKET
发表于 2002-6-23 10:56 | 显示全部楼层

请参考《Visual LISP foe AutoCAD2000程序设计——从学会到用好》第四章。

发表于 2002-6-27 20:34 | 显示全部楼层

谢谢!其它的章节在哪里找得到呢?-lisp莱鸟

help me!
发表于 2002-6-27 21:01 | 显示全部楼层

在书店里找,可以找到完整的内容(可能现在迟了点,已经卖完了)

发表于 2002-6-29 13:04 | 显示全部楼层

《Visual LISP for AutoCAD 2002——技巧与范例》出版商是谁

《Visual LISP for AutoCAD 2002——技巧与范例》出版商是谁,可有更详细资料,我要回香港时预订。
还有别的书吗?一次订购比较方便!(我哥在深圳找不到《Visual LISP for Auto CAD2000程序设计___从学会到用好》)
本来香港有一家有卖:
文星图书有限公司(香港九龙旺角西洋菜街74-84号旺角城市中心11楼1105室)
电话: 852-27891736,27891012  传真: 852 23917719
可是已没有现货。
发表于 2002-6-29 13:12 | 显示全部楼层

看看陈老师能不能来个内部电子版本,呵呵

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 10:56 , Processed in 0.269787 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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