付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计的接口类型13.1在一般情况下,一个 CAD 系统将包括:硬件系统与系统。在硬件系统方面,由于不需要再去设计硬件,所以只要根据 CAD 系统的技术要求,就可以确定 CAD 硬件系统应提供的操作能力以及所需的输入、输出设备。而系统的设计就要根据不同的使用要求来进行 CAD 系统的整体规划与功能设定。按 CAD 系统是否具有人机接口的功能可以分为“交互式”和“自动式”两大类。“交互式”系统就是指具有人机接口功能的系统。它的作业过程要在人的直接参与下,以人机的交互作业方式来进行工作。这种作业方式将以人为中心,所以很适用于那些需要先经过人回答过问题后,才能处理的工作。因此,所谓的“交互式”事实上就
2、是“操作亲和力”。换句话说,既然需要有人去输入,那么设计一个让操作者可以轻松输入的接口,就是程序设计员的。“自动式”系统就是指不具有人机或很少有人机接口功能的系统。它在作业过程中无需人的参与或只要很少的人工参与。计算机将根据设计师所编写的程序来自动地完成各个设计步骤。这种作业方式将以计算机为中心,适用于目标明确的流程或设计条件固定的标准工件。例如,自动画出一个标准的螺丝。13.2简单的传统型人机接口范例传统型的人机接口就表现在询问操作者上,这也是初学者最常用的方式。其所用的 get类函数在 5.1 节中已经学到很多。下面,就使用一个简单的 AutoLISP来示范这样的接口。本范例程序名称:XY
3、SQUARE.LSP(本书范例光盘)程序文本如下:(1)(defun C:XYSQUARE (/ x y cp ptm pt1 pt2 pt3 pt4)(2)(setq pt1 (getpon 矩形的左下角点: )196defun 函数是 LISP 程序的开头固定语法。在此语法中,函数名称的格式必须为C:,其中所有的字均须大写;同时,名称中的 C:一定要固定。至于的指令名称部分可以自行规定,但此名称不得与 AutoCAD 现有指令、内建或外部指令名称重复。而 setq 则是专门用来定义变量的函数。这两条程序的意思就是说:将此程序指令的名称定为:XYSQUARE;同时,希望操作者输入一左下角点,
4、此点的坐标数据将由 getpo函数撷取到之后,再将其到 pt1 变量中。(3)(setq x (getdist n 矩形的长: )(4)(setq y (getdist n 矩形的宽: )接下来,希望操作者输入矩形的长宽数值;所以,在此须使用 getdist 函数;而得到的数值,就分别到 x 与 y 变量中。这也就是传统式的人机接口。(5)(setq pt2 (polar pt1 (/ pi 2) y) (6)(setq pt3 (polar pt2 0 x)(7)(setq pt4 (polar pt1 0 x)现在,就需要来计算各点坐标了。要使用一个很方便的坐标获取方式,即使用 polar
5、 函数。由于 pt2(第二点)的坐标值是相对于 pt1 点坐标值的 90o 方向,所以为/2(须以弧度量表示)。其中,pi 即为 。同理,pt3 与pt4 均以相同方式算出角度方向,再配以适当的距离值即到正确的点坐标。如图 13-1 所示。197图 13-1 本范例相关的设计条件图在此程序中,看见了 pi/2 的表示方式是:(/ pi 2)。(8)(d PLINE pt1 pt2 pt3 pt4 C)矩形的四个点坐标既然已算出,那么就要使用d 函数来执行。d 函数后所跟的,就是您下的那个 AutoCAD 指令时的实际操作流程。所以,您可以在本例中看到,当下了 PLINE 指令后,该指令就要求操
6、作者回答点坐标。这时程序就会自动将 pt1,pt2,pt3 与 pt4 等变量所的点坐标值回答出来;最后,再输入了一个“C”(表示 Close 选择项),来让线再画回起点,即完成此矩形的绘制。(9)(setq cp (list (+ (car pt1) (/ x 2) (+ (cadr pt1) (/ y 2)画出矩形后,由于要以矩形中心作为移动的起始点,所以,须先算出中心坐标198同,pt4 坐标点是以 pt1 点坐标为基准,向右 0 ,距离为 X 处的位置意即:pt2 坐标点是以 pt1 点坐标为基准,向上 90 ( /2),距离为 Y 处的位置位置值,并将在 cp 变量中。如此,X,Y
7、距离值除以 2 之后,再分别加上由 pt1 中所获取的 X,Y 坐标值,即可组成中心点的坐标值。最后,再使用那个 list 函数来将分离的数值组坐标值(即串行)。(10)(setq ptm (getpon 新的矩形中心点位置: );点取欲移动四边形至那点的所在位置(11)(d MOVE L cp ptm)d 函数来执行MOVE 指令,并给予适当的数据来自动作答复;用(12);开头defun 函数的对称括号加载并执行此程序后的操作,如图 13-2 所示。矩形的左下角点:(请点取矩形左下角点)矩形的长:矩形的宽:(请键入矩形长数值或以点取两点来定数值)(请键入矩形宽数值或以点取两点来定数值)在上,
8、“ 求顺” 的人总比“ 求逆” 的人多得多。前者,顺的时候,理所当然,不顺的时候,就是打击;后者,由于心态上就已先求逆,所以顺的时候,意外欢欣,不顺的时候,心里已有准备,打击的承受度较大。虽然持有这两种不同的人生观并无对错问题,但是也可发现:以逆向思考来面对人生,有时也会有不错的效果!199图 13-2 本范例的人机接口分析:本范例的优点当程序执行后,操作非常方便,用户不需要手动重复地去调用绘图指令 LINE,即可自动画出符合指定条件的图形。1.2.3.4.本范例的缺点输入提示文句一条一条出来,无法回头去修正想再变更其值的设计条件。无法直接全览并检查所输入的条件。当遇到设计条件很多的状况时,输
9、入太多的提示文句会让操作者感到很烦。在设计条件很多的情况下,无法一次显示设计条件的默认值(因为如果可以,就可以省略那些可采用预设输入的部分而节省输入时间)。5. 对不会程序设计的人来说,程序完成后,画出的图形结构就固定了,当要改变图形的外形以适合自己时,除非找人写程序,否则就无法可想。其中,第 1,2,3,4 条缺点是可以在程序设计本身范畴内处理的,请参考 13.3.1 或13.3.2 节。而第 5 条缺点,则需要用“参数设计法”的功能来处理,请参考 13.4 节。13.3交谈式的人机接口范例200传统式的人机接口坦白说,提示文句式的人机接口是传统过时的。现在只用于设计条件简单,要操作者输入少
10、的状况。在正式的程序设计里,以对 VLISP 来说,需要配合 DCL 语言来设计输入窗口设计正是其优势。窗口来设计人机接口互动的方式才是主流。输入窗口,而对 VBA 来说,可速成的13.3.1配合VLISP 所使用的DCL 语言设计框的交谈式控制语言(Dialogue Control Language,DCL),是一个文字文件(ASCII 文件)。一个 DCL 文件的扩展名是.dcl。单一的.dcl 文件可以包含一个或是多个对话框的描述,或是它仅包含由其他.dcl 文件所使用的典型标题以及副组合。换句话说,DCL文件将用来设计窗口与窗口内容,要让这个 DCL“活”起来,却仍需要相匹配的 LSP
11、文件来处理。所以,在 Visual LISP 里要用到文件。窗口,就要有一个.dcl 文件与一个对应的.lsp可以使用 DCL 来做什么使用 DCL 语言,您将可以:框是以一包含DCL 语法的文字文件来定义的。该文件中的 DCL设计框语法描述将会定义框该以什么样的方式出现以及它将会包含些什么,如:按钮、列表、文字等。在应用程序中支持框 在某些范围内,框的一部分可定义它的行为是如何表现的。例如:被提示可去按哪些按钮,显示出一列表,以方便操作者做一选择等。当您在设计一个框时,您同时也需要考虑到操作者在输入资料时,将会变化的顺序。如此,则会加强这个设计结构,而比起一般的设计要来得较不具“线性”,但可
12、反映出操作者的工作方式。所以,它在经过一些练习后,也可变成较具性的操作方式。假如在您开始规划和修正之前,同时也将框和应用程序做好细节的计划,则可节省许多时间和省去不少麻烦。应该准备什么来编写 DCL要能顺利学习 DCL,您必须有以下的准备:您必须要懂得一些 AutoLISP 程序设计的观念,这也是为什么本章先要您学201AutoLISP 的原因。为什么呢?因为框的设计与 AutoLISP 是关的;您可以说:AutoCAD 使用 AutoLISP 程序来DCL。换句话说:DCL 专门是安排窗口配置的,而搭配的 AutoLISP 程序将让它活动起来。您应该会使用类似记事本、WordPad 或 Wo
13、rd 这类的字处理来编写DCL 程序。准备好之后,您就可以开始以下的实作章节了。踏出 DCL 的第一步您就要踏出第一步了,事实上很简单。首先,您要开始做的就是使用 VLISP 集成环境来编写文件扩展名为.DCL 的文件。在编写之前,您心中对要设计的框配置一定要先有一个梗概。最好的方法就是用笔在一张白纸上先画一画;虽然画出来的配置将来可能因为种种原因导致与这张手绘图不太一样,但也至少不会太。因此,当您要设计自己用的框时,请不要忽略了这一重要步骤。如图 13-3 所示是完成后的画面。如果您问我与手绘稿差多少?老实说,差很多的!不过,设计经验积累愈多,就会愈准。要配置这样的框界面,它的控制程序都放在
14、一文件名称为 SLE.DCL 的文件中。这个程序是属于的,但身为本书读者的您可以修改来使用。下一节就是这个程序的原文。此程序的文件依附录安装后应该被放在:/AutoCAD设计院/NO.7/sles 目录中。您可调出来搭配以下的说明来研究。以下,我要对您述说的说明将掺杂在原文适当之处,像看戏一样,一出一出地上演。“ 有所求才去做” 是人一生中为了生存最无奈的事,有很多的烦恼、计较与不满足都因此而起。事实证明,将这种“ 为自己” 的心态降得愈低,在精神层面就会过得乐富足。所以,有很多的都会鼓励人们要多做无求且默默付出的善事,有机会的时候,大家应该多参与这类付出无求的公益活动。医生:“ 腿怎会跌成这
15、样”:“ 25 年前” 医生:“ 我是问你现在,你告诉我 25 年前干嘛?”:“ 25 年前,我在一家农场帮活,有一天晚上,农场主人202漂亮的女儿三次来敲门,问我需要什么我都告诉她,我什么都不需要”医生:“ 那跟你的腿关系?”:“我今天在房顶上干活时,突然明白了意思,就从屋顶上跌下来了”单击此按钮 图 13-3 本范例的完成图例LE.DCL 的原文S1. dcl_settings : default_dcl_settings audit_level = 0; 203这条程序是在 DCL 文件中第一条首先必须定义的。它将定义检查层次。2. sle : dialog 窗口的起始定义是由这里开始的
16、,窗口的名称是 sle,以方便以后的调用开启或关闭。这个语法是固定的,没什么道理。由“ ” 符号开始到下面这个 sle 窗口结束的一个对称的“ ” 符号,就是 sle 窗口配置的全部内容。3. label = /*MSG1*/尺寸标示变量控制;这是声名 sle 窗口的标题。它的语法也是固定的。在双引号内的就是窗口标题的名称,如图 13-4 所示。图 13-4 窗口标题的语法4. : boxed_column 204因为在窗口内的项目希望用线将它们框起来,所以,在此使用框线的语法。由“ ” 符号开始到下面这个框线结束的一个对称的“ ” 符号,就是此大框线的全部内容。5. label = /*MS
17、G2*/尺寸标示变量控制(开关类);这是声名此大框线的标题,与上面窗口标题的表示方法一样。不过,那个/*MSG2*/ 是批注,按顺序编下来,由 1 开始编,如图 13-5 所示。吃早餐时,他的妻子走到他后面,给他后脑一巴掌。气冲冲地说道:“ 我在你裤袋里找到一张纸条,上面写着二个字,你最好解释一下!” “ 喔!Darling,冷静点儿听我说。那是我上到马场去的那匹马的名字。” 那人冷静地答道。想不到他的妻子听完后立刻毫不犹豫地给他后脑勺再一巴掌,并更生气地说道:“ 刚刚那匹马打找你来了”小框线标题 大框线toggle(开关项) toggle(开关项) toggle(开关项) 205小框线大框线
18、标题图 13-5 框线标题的效果图例6.:row : boxed_column label = (1);: toggle label = /*MSG3*/是否要显示两种 key = dimalt;: toggle ?;label = /*MSG4*/外侧文字是否要水平标示?; key = dimtoh;: toggle label = /*MSG5*/用户是否要自行放置文字?; key = dimupt;: toggle label = /*MSG6*/是否要分离箭头图块?; key = dimsah;: toggle label = /*MSG7*/是否不画第一条尺寸线?; key = di
19、mse1;: toggle label = /*MSG8*/是否不画第二条尺寸线?; key = dimse2;这一段是此大框线内再加一小框线,然后,是小框线内的项目标题与配置。由于206希望这 6 个项目能横列排在一起,因此,使用列的语法来设计。然后,又考虑到这些项目的特性是开关。因此,就挑选方格开关 toggle 来定义这些项目的特性。随同方格开关定义的是lable 与关键值 key。是用来设定框线内这一列项目的名称,它的用法您应该已不陌生。key 则用来定义这些尺寸标示变量的名称,很重要的。因为将来要靠这些 key 来检查操作者做了哪些改变。此外,每一“ ” 符号都有一对称的“ ” 符号
20、匹配,请不要拆散这些对“ 佳偶” ;若您少了一个或多了一个这样的符号,计算机将替您乱配一气。所以,程序写完以后,请务必检查对称符号。7. : boxed_column label = (2);: toggle label = /*MSG9*/拖动时是否要随时更新尺寸?; key = dimsho;: toggle label = /*MSG10*/是否不画第一条延伸线?; key = dimsd1;: toggle label = /*MSG11*/是否不画第二条延伸线?; key = dimsd2;: toggle label = /*MSG12*/是否不画外侧标示线?; key = dim
21、soxd;207: toggle label = /*MSG13*/是否将文字置于延伸线内侧?; key = dimtix;: toggle label = /*MSG14*/强制尺寸线置于延伸线内侧吗?; key = dimtofl;: boxed_column label = (3);: toggle label = /*MSG15*/是否为关联性尺寸?; key = dimaso;: toggle label = /*MSG16*/文字在尺寸线内是水平吗?; key = dimtih;: toggle label = /*MSG17*/是否文字置于尺寸线上?; key = dimtad;
22、208上述道理与上一说明相同。总共在此框线内配置了 3 列共 15 个项目。8. 与上面大框线起始时“ ” 符号的对称符号。表示这部分的框线内容到此为止。9. spacer_1;为了让窗口看起来不会太拥挤,在此加上一的空格控件。图 13-6 空格控件的效果图例10. : boxed_column 这是第二个框线起始。11. label = /*MSG18*/尺寸标示变量控制(数值类);同理,给这个框线定义标题,如图 13-7 所示。209图 13-7 编辑框线的效果图例12. :row : boxed_column label = (a);: edit_box label = /*MSG19*
23、/箭头尺寸; key = dimasz;edit_width = 4;: edit_box label = /*MSG20*/斜纹尺寸; key = dimtsz;edit_width = 4;: edit_box label = /*MSG21*/文字尺寸; key = dimtxt;edit_width = 4;: edit_box label = /*MSG22*/中心记号尺寸; key = dimcen;210edit_width = 4;: edit_box label = /*MSG23*/尺寸线原点偏移量; key = dimexo;edit_width = 4;: edit_b
24、ox label = /*MSG24*/延伸线出头延伸量; key = dimexe;edit_width = 4;这一段也是此大框线内小框线的项目标题与配置。由于也希望这些小框线项目能横列排在一起,因此,仍使用行(row)的语法来设计。然后,再考虑到这些项目的特性是输入数值。所以,就挑选编辑框 edit_box 来定义这些项目的特性。随同编辑框定义的是lable、关键值key 与编辑宽度 edit_width,仍是用来设定框线内这一列项目的名称。key 则是用来定义这些尺寸标示变量的名称;而 edit_width 则用来设定编辑框的宽度,设定为 4 是经尝试后修正的结果。仍提醒您了检查对称符
25、号。13. : boxed_column label = (b);: edit_box label = /*MSG25*/延伸线两边出头量; key = dimdle;edit_width = 4;211: edit_box label = /*MSG26*/双 key = dimaltf; edit_width = 4;: edit_box 标示换算值;label = /*MSG27*/连续标示线间距; key = dimdli;edit_width = 4;: edit_box label = /*MSG28*/标示线到文字间隙; key = dimgap;edit_width = 4;:
26、 edit_box label = /*MSG29*/线性key = dimlfac; edit_width = 4;比例系数;: edit_box label = /*MSG30*/舍入值; key = dimrnd;edit_width = 4;: boxed_column label = (c);: edit_box label = /*MSG31*/整体标示比例系数;212key = dimscale;edit_width = 4;: edit_box label = /*MSG32*/公差字高比例系数; key = dimtfac;edit_width = 4;: edit_box
27、label = /*MSG33*/负公差值; key = dimtm;edit_width = 4;: edit_box label = /*MSG34*/正公差值; key = dimtp;edit_width = 4;: edit_box label = /*MSG35*/线上文字垂直高度; key = dimtvp;edit_width = 4;: edit_box label = /*MSG36*/小数字数; key = dimdec;edit_width = 4;上述道理与上一说明相同。总共在此大框线内配置了 3 列共 18 个项目。21314. 这是与上面大框线起始时“ ” 符号的
28、对称符号。表示这部分的大框线到此为止。15. : row ok_button; cancel_button;: button label = /*MSG37*/上下限或公差标示.; key = lort;mnemonic = /*MSG38*/L; fixed_width = true;接下来,则是定义按钮的部分。依照,在此部分至少应该有【OK】按钮与【Cancel】按钮可供操作者选择或是放弃所做的设定。所以,ok_button 与 cancel_button 应当是没有问题的固定语法。由于这些按钮都是横行排列,因此,一开始就使用 row 语法,如图 13-8所示。(即会将此 3 按钮等距分布
29、之意) 图 13-8 row 语法的效果图例现在,问题可能是在下面的这个自定义按钮部分。这部分在一开始并没有想到要设计,214后来根据使用 AutoCAD 的多年经验知道:尺寸变量中的公差开关(DIMTOL)与上下公差开关 (DIMLIM) 两者是互为开关的。也就是说,如果 DIMTOL 为 ON,则 DIMLIM 就会自动 OFF,反之亦然。所以,就为了这两个变量特别制作这个按钮,让操作者点取后,还会出现一个窗口来选择设定它。在 button 下面的 label 与 key 属性应该不用再解释了。键值 mnemonic 是表示这个按钮的键盘按键值。依此例,操作者可以经过按下【L】或【l】键后
30、出现黑色圆点,再按下【Space】空格键就可选取并执行此按钮的功能,而不一定要经过鼠标或数字化仪上的鼠标的按键来点取。fixed_width = true 是表示在配置区变大时,此按钮的宽度还是固定的。16. 这是与上面窗口起始时“ ” 符号的对称符号。表示这部分的窗口到此为止。17. lort : dialog label = /*MSG39*/一般标示,公差标示或上下限标示;:boxed_column label = /*MSG40*/一般标示,公差标示与上下限选择项;此处是 lort 窗口。不过,这个窗口应该是一个副窗口。它是通过操作者点取【上下限或公差标示】按钮时,应该出现的一个窗口,
31、如图 13-9 所示。215图 13-9 同心按钮的效果图例18. :radio_column : radio_button label = /*MSG41*/回复一般标示; key = none;value = 1;: radio_button label = /*MSG42*/公差标示; key = dimtol;: radio_button label = /*MSG43*/上下限标示; key = dimlim;这一段是此框线内项目的标题与配置。由于,也希望这三个项目能直行排在一起;216(同心按钮)因此,仍使用了同心行的语法来设计。为什么要使用同心行的方式来设计呢?因为考虑到这些项目
32、是三选一的开关。所以,认为使用同心按钮来定义这些项目的特性是最适当不过的了。跟随同心按钮定义的是:您已熟悉的lable 与关键值 key。此外,您还看到一 value 属性。这个属性设定为 1 是表示这个按钮预设为开启的状态,所以,您看到的这个按钮其中心部分将已经是黑色的了;除非操作者点取其他两个按钮。19. 这是上面 boxed_column 的对称符号。20. spacer_1;ok_cancel; errtile;这是设定 OK 与 Cancel 按钮的另一种固定语法。21. 这是与上面窗口起始时 符号的对称符号。表示这部分的副窗口到此为止。以上的程序是已经编写并测试好的,如果您是初次编
33、写这样的程序,那么您一定希望知道调试的过程。根据经验,要测出.dcl 文件的错误之处,您可以在 AutoCAD 指令提示下按下述方式进行判断。1)在 VLISP 集成环境中选择【工具(T)】【界面工具(I)】【预览编辑器中的DCL(E)】命令,如图 13-10 所示。217图 13-10 预览DCL2)选择框的名称(因为一个 DCL 文件中可能有数个框,如图 13-11 所示)。图 13-11 选择框名称3)如果 DCL 语法有错,则会提示出错行号,如图 13-12 所示。图 13-12 出错时的画面可以依此进行判断。这个程序简单易懂吧!现在,如果您回头再去看前面几章,保证您有然大悟的感觉。好
34、,让再继续“向前行”吧!218DIMDIA.LSP 的原文与现在要谈的 VLISP 程序比起来,一个 DCL 文件真像布袋戏里的傀儡。因为真正让 DCL 文件“活”起来的是 VLISP 程序。现在,就让来看看这个操作 DCL 程序的原文内容。此文件依附录安装后应该被放在:/AutoCAD 设计院/NO.7/sles 目录中。其文件名为 DIMDIA.LSP。以下就是这个程序的原文。我要对您述说的说明将掺杂在原文适当之处。1. ;= 以下是加载时的错误检查 =(defun ai_abort (app msg) (defun *error* (s)(if old_error (setq *erro
35、r* old_error) (princ)(if msg(alert (strcat Application error: app nn msg n)(exit); 这是要查看 AI_UTILS 是否已加载。如果没有,那么就尝试找到它并; 将之加载。如果找不到或找到但无法加载,那么就立刻放弃加载这个; 文件并且保留 (autoload) 的残留功能。(cond(and ai_dcl (listp ai_dcl) ; 它已经被加载了(not (findfile ai_utils.lsp) ; 搜寻之(ai_abort sle219(strcat Cant locate file AI_UTILS
36、.LSP.n Check support directory.)(eq failed (load ai_utils failed); 加载之(ai_abort s)le Cant load file AI_UTILS.LSP)(if (not (ai_acadapp) ; 定义一个在 AI_UTILS.LSP 文件中的(ai_abort s)le nil) ; Nil 来抑制 ai_abort 的警; 告窗口。220AI_UTILS.LSP 文件是 AutoCAD 本身提供的一个智能型公用程序文件。在此文件中将有许多好用的公用程序指令。例如,自动加载您自行设计的 LISP 程序或错误讯息程序集
37、等,以提供程序设计编写者一些工具程序。当写好这个程序以后,将来还要将这个DIMDIA.LSP 的 LISP 程序在一进入 AutoCAD 2000 时就被自动加载。而且,还要它自动去判断是不是这个 DIMDIA.LSP 文件已经加载过了,如果已加载,就直接执行,以节省每一 LISP 程序第二次调用过程的执行时间,同时又节省内存空间。这样的功能在以前的版本中,我是自己写一个 LISP 程序来解决的。而现在,AI_UTILS.LSP 中的程序已提供了。因此,像上述的程序语法,您可以将其视为固定的。每一次当您编写一个新的 LISP 程序时,都可以“ 依样画葫芦” 。2. ;= 正式程序将由此开始 =
38、(setq lin_(-1 -1);设定窗口的遇设初始位置()(defun c:dimdia (/ done onoroff vallist tol lim next_d next_d1)激活本程序的指令就是 dimdia。在括号中的变量名称是表示这些变量属于局部变量,也就是当此程序执行完后,这些变量将被。3. (setq tol 0)(setq lim 0);以下开始加载 sle.dcl 文件(setq lin_dcl (load_dialog sle.dcl)221(if ( lin_dcl 0) (exit)load_dialog 是加载.dcl 文件的函数语法。如果所欲加载的 .dcl
39、 文件有问题或找不到,则上述 if 语法做出将判别,中断此程序的执行并跳出。4. ;= 控制主窗口的子程序将由此开始 =(defun main_dia () (setq next_d 5) (setq next_d1 nil); 以下将显示主窗口;(while ( 1 next_d)(if (not (new_dialog sle lin_dcl lin_) (exit)因为会有两个窗口在,所以使用 while 函数语法来控制这两个窗口在一条件下。if 函数语法用来判别 sle 窗口(在 sle.dcl 文件中的)是否可以加载,如果可以,就加载;反之,则中断此程序的执行并跳出。5. ;以下则将
40、 sle 窗口中第一部分的 AutoCAD 变量(开关变量)名称;放到以串行形态存在的 onoroff 变量中,以供稍后使用。;(setq onoroff (dimalt dimtoh dimupt dimsah dimse1 dimse2 dimsho dimsd1 dimsd2 dimsoxd dimtix dimtofl dimaso dimtih dimtad)这些变量名称的顺序必须与在 .dcl 文件中的顺序相同。2226. ;以下则将 sle 窗口中第二部分的 AutoCAD 变量(数值变量)名称;放到以串行型态存在的 vallist 变量中,以供稍待取用。;(setq valli
41、st (dimasz dimtsz dimtxt dimcen dimexo dimexe dimdle dimaltf dimdli dimgap dimlfac dimrnd dimscale dimtfac dimtm dimtp dimtvp dimdec)这些变量名称的顺序必须与在 .dcl 文件中的顺序相同。7. ;以下是要将目前 AutoCAD 的预设变量值放到 s;le 窗口中(mapcar set_on_off onoroff)(mapcar set_value vallist)希望 sle 窗口在一开始的中,开关变量与数值变量的预设目标值就表现在窗口内。所以,就设计了这个
42、mapcar 函数。由于并没有适当的函数语法可以做这种转换,就必须自行设计 set_on_off 与 set_value 这两个子程序来做这个撷取并显示预设设定的动作。这两个副程序将在下面说明。8. ;接下来,;要考虑如果操作者点取了窗口中的按钮时要如何处理?(action_tile accept (ok)(setq done 1)(done_dialog)(action_tile cancel (done_dialog)(setq done 1)223(action_tile lort (show_lort)action_tile 是专门处理操作者的单击动作的。accept 那一行是表示当操
43、作者按下【Enter】键时就相当于单击了【OK】按钮(反之亦然),并于执行 OK 子程序的同时,又结束窗口的操作。OK 子程序将在下面说明,它用来执行操作者所做的设定改变。“ cancel” 那一行程序是表示放弃操作者所作的设定改变并结束窗口的执行。lort 那一行则表示当操作者单击【上下限或公差标示】按钮时,显示 show_lort 的副窗口。show_lort 子程序将在下面提及。9. (cond(= next_d1 3) (show_lort)(if (/= 3 next_d1)(setq next_d (start_dialog)(T (setq next_d (start_dialo
44、g)上面这一段程序是设定一执行条件来执行 show_lort 子程序。next_d 与 next_d1 变量都是为条件控制而设计的,以方便判别。10. )while 循环的终点对称括号。11. )main_dia 子程序的终点对称括号。22412. ;= ok 子程序将由此开始 =;如果操作者单击了【OK】按钮或【Enter】键,将执行此程序以;所做的设定改变;操作者(defun ok ();以下将由窗口中将值撷取出以更新对应的 AutoCAD 尺寸标示变量;(mapcar get_on_off onoroff)(mapcar get_value vallist)get_on_off 与 ge
45、t_value 这两个子程序是用来执行更新动作的。它们将在下面说明。13. (setq lin_(done_dialog 1)若系统返回 1 将激活此 ok 子程序。“” 将包含窗口的位置。下一个调用将会使lin_用此位置。14. )ok 子程序的终点对称括号。15. ;= set_on_off 子程序将由此开始 =(defun set_on_off (varname)(setq d(getvar varname) (set_tile varname (itoa d )225这个子程序会将 AutoCAD 的尺寸标示开关变量默认值传送至窗口中的对应位置上。其中,set_tile 是关键函数。1
46、6. ;= set_value 子程序将由此开始 =(defun set_value (varname) (setq dreal (getvar varname) (set_tile varname (rtos dreal)这个子程序将 AutoCAD 的尺寸标示数值变量默认值传送至窗口中的对应位置上。同样,set_tile 是关键函数。17. ;= get_on_off 子程序将由此开始 =(defun get_on_off (varname)(setvar varname (atoi (get_tile varname)这个子程序会依操作者在窗口中所改变过的AutoCAD 尺寸标示开关状态
47、设定它。其中,get_tile 是关键函数。18. ;= get_value 子程序将由此开始 =(defun get_value (varname)(setvar varname (distof (get_tile varname)这个子程序会根据操作者在窗口中所改变过的 AutoCAD 尺寸标示数值状态设定。同样,get_tile 是关键函数。22619. ;= show_lort 子程序将由此开始 =(defun show_lort()(if (not (new_dialog lort lin_dcl) (exit)这也是要测试在 sle.dcl 文件中的 lort 窗口定义是否可加载。
48、如果可以,就加载激活;反之,则中断此程序的执行并跳出。20. (action_tile none (setq tol 0)(setq lim 0) (action_tile dimtol (setq tol 1) (action_tile dimlim (setq lim 1) (action_tile accept (ok1)(done_dialog)(action_tile cancel (done_dialog)与上述相同,仍将使用 action_tile 来处理在此副窗口中操作者的单击动作。由于在此副窗口中使用了同心按钮架构,所以当操作者单击了三个同心按钮中的一个时,就会激活上述的一个
49、动作。“ none” ,“ dimtol” 或“ dimlim” 都是在 sle.dcl 文件中,lort窗口定义内的各 radio_button 所定义的 key 值。所以,两方面都必须一致,不能打错字。在它们之后的是:设定 tol 或lim 变量值为 1 (开)或 0(关),以方便稍后 ok1 的执行设定。“ accept” 那一行是表示当操作者按下了键盘上的【Enter】键时,就相当于单击了【OK】钮(反之亦然),并执行 OK1 子程序,同时也结束此副窗口的操作。OK1 子程序将在下面说明,它是用来执行操作者所作的设定改变。“ cancel” 那一行是表示放弃操作者所做的设定改变并结束此
50、副窗口的执行。22721. (setq next_d1 (start_dialog) (if (= 3 next_d1) (done_dialog 2)上面这一段程序是制造一个条件来执行返回主窗口的程序。22. )这是 show_lort 子程序的终点对称括号。23. ;= ok1 子程序将由此开始 =(defun ok1 () (setvar dimtol tol)(setvar dimlim lim)这段子程序将用来设定操作者在 lort 副窗口中所作的改变。24. ;= dimmod_main 子程序将由此开始 =(defun (setq(whiledimmod_main() done
51、0)(/= done 1)(main_dia);= 子程序区至此结束 =这段子程序是用来在一条件下调用上面的 main_dia 子程序的。可能您会认为只有一个副窗口似乎不需使用此子程序。不过,这个程序是用来为将来有多个复合窗口时所考虑228设计的架构,可以未雨绸缪。25. ;设定错误函数(setq old_cmd (getvar cmdecho) ;目前的 cmdecho 系统变量设定old_error*error* ;*error* ai_error)(setvar cmdecho 0) (cond目前的错误函数; 新的错误函数(not (setq dcl_id (ai_dcl s (T(d
52、immod_main)le);.DCL 文件是否已加载?(setq *error* old_error) (setvar cmdecho old_cmd)(princ)(unload_dialog lin_dcl) ;由内存中DCL;=26. )这是 sle 程序的终点对称括号。229更进阶的范例承 13.2 节范例,若要将之设计成更进阶的式人机接口,那就最好用“图”的方式来引导操作者操作!其技巧在于使用了 .sld 的幻灯片文件。请按下面步骤来设计。如图13-13 所示。DCL 范例程序名称:SQUARE.DCL(本书范例光盘)图 13-13 SQUARE.DCL 的程序本文与效果LSP 范
53、例程序名称:SQUARE.LSP(本书范例光盘)配合文件名称:SQUARE.SLD(本书范例光盘)程序文本如下:(1)(defun c:square (/ Image_ID sldname width heigh)(2)(setvar cmdecho 0) ;设定 cmdecho 系统变量以避免执行指令的显示(3)(setq Image_ID (load_dialog square.dcl) ;撷取 DCL 的 ID 码 (4)(if ( Image_ID 0) ;如果 DCL 的影像 ID 码不存在就跳出 (5)(exit)(6)(7)(new_dialog square Image_ID)
54、; 激活 DCL 文件(8);开始幻灯片文件的程序段(9)(setq sldname (strcat square.SLD) ;撷取幻灯片文件的名称230(10)(11)(setq width(dimx_tile image)(12)height (dimy_tile image) ;撷取幻灯片尺寸 (13)(start_image image) ;初始幻灯片 (14)(fill_image 0 0 WIDTH HEIGHT 0) ;填满幻灯片(15)(slide_image0 0 WIDTH HEIGHT SLDNAME) ;填满方框(16)(end_image)(17);结束幻灯片文件的程
55、序段(18)(set_tile da 100) ;设定显示于输入窗口里的 a 默认值为 100(19)(set_tile db 50);设定显示于输入窗口里的 b 默认值为 50(20)(action_tile accept (get_xy)(done_dialog)(21)(action_tile cancel (done_dialog);define button-presion(22)(start_dialog) (23)(unload_dialog Image_ID) (24);end dialog (25)(draw);call draw function (26)(princ)(2
56、7)(28)(defun draw (/ pt1 pt2 pt3 pt4 Po s Pt1stlen poDataA po data plineobj cp ptm)(29)() ;加载 activeX 支持(30)(setq *acadObject* (vlax-get-acad-object)(31)(setq *acad* (vla-get-Active*acadObject*)*)(32)(setq *mSpace* (vla-get-MSpace *acad(33);以上三条程序是用来设定一些整体变量(34)(setq pt1 (getpon 矩形的左下角点:)(35)(setq p
57、t2 (polar pt1 (/ pi 2) db)(36)(setq pt3 (polar pt2 0 da)231(37)(setq pt4 (polar pt1 0 da)(38);以上三条程序是用来计算出这三个点的方位(39)(setq Po s (mapcar float (append pt1 pt2 pt3 pt4) (40)(setq Pt1stlen (length Po s)(41)(setq Po DataA(vlax-make-safearrayvlax-vbDouble(cons 0 (1- pt1stlen)(45) ) (46)(47)(vlax-safearra
58、y-fill Po DataA Po s)(48)(setq Po Data (vlax-make-variant(49)(50)(51)(52)Po DataA(logior vlax-vbarray vlax-vbDouble)(53);以上程序用来为即将画出的聚合线改变 4 点为变式(54)(setq plineobj (vla-Addpolyline *mspace* Po Data)(55)(vla-plosed plineobj T)(56);以上程序用来画出聚合线(57)(setq cp (list (+ (car pt1) (/ da 2) (+ (cadr pt1) (/ d
59、b 2) (58)(setq ptm (getpon 新的矩形中心点位置:)(59)(vla-move plineobj (vlax-3d-pocp) (vlax-3d-poptm);move square t (60)(princ)(61)(62)(defun get_xy ()(63)(setq da (atoi (get_tile da) (64)db (atoi (get_tile db) (65)(66)ition232(67);以上程序用来将聚合线移到指定的新位置上分析:从图 13-13 可看出,这样的接口不但清楚地以图标方式来告诉操作者输入值的,都可以更改 a 与 b 的值,同时
60、常用的 a 与 b 的值意义,同时只要在单击【确定】也会预设地显示在输入框中。这在输入项目多的时候,对操作者来说就会很方便实用。在此范例最后的点与新位置的输入部分,仍然使用传统的问答方式。这部分当然也可以将之并入图 13-13 里,不过,这是要留到习题里做的。13.3.2VBA 的做法对接口来讲,VBA 就不用那么麻烦了。在 AutoLISP/VLISP 里的原始写法,是利用一个 LISP 程序再搭配一个 DCL 语言所写的程序来写,那就简单了,只要一个.DVB 程序就搞定了。的。但是,如果要换成 VBA 来将 DIMDIA.LSP 与 SLE.DCL 改用 VBA 的写法范例程序文件名称:D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡镇统战教育培训制度
- 人事管理绩效考核制度
- 代客理财风控制度
- 企业财务绩效考核制度
- 估计绩效考核制度
- 保健室绩效考核制度
- 信息系统科技审计制度
- 健全班组绩效考核制度
- 公关专员绩效考核制度
- 公司外部审计管理制度
- 2026年超声波检测二级试题库(UT)(含答案)(一)
- 2026广东中山市神湾镇招聘雇员17人考试参考题库及答案解析
- 2025年初级电焊工理论考试题及及答案
- 单位内部报账管理制度
- 2026黑龙江牡丹江市绥芬河海融城投房地产开发有限公司招聘建经合约职员2人考试参考题库及答案解析
- 2026年安徽国际商务职业学院单招职业适应性测试题库带答案详解ab卷
- 探本溯源:高三化学复习备考中回归教材的深度剖析与实践策略
- 2026年装饰建材购销合同(1篇)
- 2025年淮南职业技术学院单招职业技能考试模拟测试卷附答案解析
- 高速公路收费业务培训
- 2026年春期人教版二年级下册数学全册教案(核心素养教案)
评论
0/150
提交评论