文档详情

第七章AutoCAD软件的二次开发

工****
实名认证
店铺
PPT
501KB
约55页
文档ID:587882722
第七章AutoCAD软件的二次开发_第1页
1/55

第七章第七章   AutoCAD软件的二次开发软件的二次开发•Visual LISP简介•AutoLISP程序设计语言改变改变AutoCAD工作方式的方法:工作方式的方法:Ø定制定制Ø编程编程üAutoLISP/Visual LISPüAutoCAD VBA(Visual Basic for Application)üADS(AutoCAD Development System)üObjectARX(AutoCAD Runtime eXtension) 7. 1 VisualLISP简介简介1. 1. LISP(ListLISP(List Processing Language) Processing Language)::::人工智能领域中广泛采用的一种程序设计语言,由于其处理的对象是符号表达式,因此也称为符号式语言              应用领域:应用领域:应用领域:应用领域:人工智能、机器人、专家系统、博弈、定理证明等         版本:版本:版本:版本:MacLISP、InterLISP、ZetaLISP、 CommonLISP2. 2. AutoLISPAutoLISP::::嵌套于AutoCAD内部,将LISP语言与AutoCAD有机结合的编程语言,用于定制和扩展AutoCAD的功能,是AutoCAD二次开发的工具之一。

使用AutoLISP可以直接调用几乎所有的AutoCAD命令;AutoLISP既具备高级语言的基本结构和功能,又具有一般高级语言所没有的强大的图形处理功能用途:用途:用途:用途:l利用AutoLISP 进行AutoCAD二次开发,实现直接增加和修改AutoCAD命令;l扩大AutoCAD的图形编辑功能;l建立图形库和数据库并对当前图形进行直接访问和修改;l开发CAD软件包一、一、一、一、AutoLISPAutoLISP简介简介简介简介 7. 1 AutoLISP简介简介3. 3. AutoLISPAutoLISP的典型应用的典型应用的典型应用的典型应用l参数化绘图程序设计u尺寸驱动程序u鼠标驱动程序l驱动利用AutoCAD提供的PDB模板构成的DCL(Dialog Control Language) 文件创建自己的对话框4. 4. AutoLISPAutoLISP的特点的特点的特点的特点lAutoLISP语言是在普通LISP语言基础上,扩充了许多适用于CAD应用的特殊功能而形成的,是一种仅能用解释方式运行于AutoCAD内部的解释型程序设计语言lAutoLISP语言中的一切成分都是以函数形式给出的,没有语句概念和其它语法结构。

lAutoLISP把数据和程序统一表达为表结构,因此可以把程序当作数据来处理,也可以把数据当作程序来执行lAutoLISP语言中的程序运行过程就是对函数求值得过程,在函数求值过程中实现函数功能lAutoLISP语言的主要控制结构采用递归方式,程序设计简单易懂一、一、一、一、AutoLISPAutoLISP简介简介简介简介 二、二、二、二、AutoLISPAutoLISP的程序结构:的程序结构:的程序结构:的程序结构:AutoLISP程序是由一个或者一系列按照特定顺序排列的标准表组成的,程序所实现的功能就是每个标准表所实现功能的总和7. 1 VisualLISP简介简介1. 1. 标准表:标准表:标准表:标准表:由左右两个括号组成,其功能由括号内的代码实现;标准表中的第一个元素均为操作符或者函数名,其余元素都是相应函数的参数          标准表格式:标准表格式:标准表格式:标准表格式:( (函数名函数名函数名函数名   [<[<参数参数参数参数1>] [<1>] [<参数参数参数参数2>] …… [<2>] …… [<参数参数参数参数n>])n>])          标准表示例:标准表示例:标准表示例:标准表示例:          (setq x 10.0) (setq y 10.0) (setq z (+ x y)) (setq a “Hello World!”) (command “line” “0.0” “10,10” “”) (command “circle” “100,100” “50”)注意:注意:标准表中可包含别的表。

7. 1 VisualLISP简介简介2. 2. AutoLISPAutoLISP程序书写格式的特点程序书写格式的特点程序书写格式的特点程序书写格式的特点lAutoLISP程序是由标准表组成的,因此程序中所有的括号都必须左右匹配;lAutoLISP程序阅读函数时,按照从左到右的规则进行l操作符(函数名)必须放在标准表中第一个元素的位置标准表中的函数与参数、参数与参数之间至少要用一个空格来分开l2个标准表之间和表内的多余空格和回车都是不需要的,因此一个表可以占多行,一行内也可写多个表lAutoLISP程序中用“ ;”作注释,程序执行时会自动跳过每一行中分号以后的部分注释可放于程序中的任何地方lAutoLISP程序的扩展名为(.lsp),并以ASCII码文本文件的形式表达,可用文本编辑软件进行编辑setq x 10.0) (setq y 10.0) (setq z (+x y)) (setq a “Hello World!”) (command “line” “0.0” “10,10” “”) (command “circle” “100,100” “50”)        学习学习学习学习AutoLISPAutoLISP的核心是掌握的核心是掌握的核心是掌握的核心是掌握AutoLISPAutoLISP函数,包括函数,包括函数,包括函数,包括AutoCADAutoCAD自带的内部函数和由用自带的内部函数和由用自带的内部函数和由用自带的内部函数和由用户自行定义的外部函数。

户自行定义的外部函数户自行定义的外部函数户自行定义的外部函数二、二、二、二、AutoLISPAutoLISP的程序结构的程序结构的程序结构的程序结构 三、三、三、三、AutoLISPAutoLISP的内存分配的内存分配的内存分配的内存分配7. 1 VisualLISP简介简介1. 1. AutoLISPAutoLISP运行时所需的两个内存区域:运行时所需的两个内存区域:运行时所需的两个内存区域:运行时所需的两个内存区域:l lHeapHeap(堆区域):(堆区域):(堆区域):(堆区域):存储所有函数和变量程序使用的函数和表越多,变量名越长,函数越复杂,该区域所占的空间越大      Heap::25000 bytesl lStackStack(栈区域):(栈区域):(栈区域):(栈区域):存储函数的变量和局部结构标准表中嵌套的表越多,函数执行的递归次数越多,该区域所占的空间越大     Stack::20000 byets2. 2. 内存出错提示信息内存出错提示信息内存出错提示信息内存出错提示信息l l堆空间用光:堆空间用光:堆空间用光:堆空间用光:Insufficient node space。

l l没有足够的内存装载没有足够的内存装载没有足够的内存装载没有足够的内存装载AutoLISPAutoLISP::::Insufficiecnt memory-AutoLISP disabled注意:注意:注意:注意:AutoCAD平台上运行AutoLISP时,用户不能扩展系统的堆或栈空间 7. 1 VisualLISP简介简介四、四、四、四、AutoLISPAutoLISP程序执行过程程序执行过程程序执行过程程序执行过程l在AutoCAD环境中command命令提示符下输入AutoLISP程序,回车直接运行,返回结果立即显示在文本屏幕上例:例:例:例: (setq string “programming with AutoLISP is great fun!”)l用文本编辑软件编写AutoLISP程序,再用 Load Load 函数在AutoCAD环境中装载并运行例:例:例:例:1.编写编写AutoLISP程序代码,存盘(程序代码,存盘(d:\MyAutoLISP.lsp)                (princ “\n Welcome!)        (defun c:welcome()        (print “AutoLISP welcome you!”))       2.启动启动AutoCAD,加载,加载AutoLISP应用程序应用程序       在在command命令提示符下键入:命令提示符下键入: (load “(load “d:/lisp/myautolisp.lspd:/lisp/myautolisp.lsp”)”)              3. 3. 运行运行运行运行defundefun定义的函数定义的函数定义的函数定义的函数                在在在在commandcommand命令提示行下键入:命令提示行下键入:命令提示行下键入:命令提示行下键入:welcomewelcome,回车,回车,回车,回车 7. 1 VisualLISP简介简介五、五、五、五、VisualLISPVisualLISP:  : Autodesk公司为增强AutoLISP程序开发能力而设计的软件工具。

Visual LISPVisual LISP集成开发环境的组成部分:集成开发环境的组成部分:集成开发环境的组成部分:集成开发环境的组成部分:l语法检查器:语法检查器:可识别错误的AutoLISP结构和内部函数调用中不合适的参数l文件编译器:文件编译器:可改善程序的执行速度并提供一个有效的开发平台l资源管理器:资源管理器:允许用户在一个窗口中一步步地执行AutoLISP程序源代码,并在AutoCAD图形窗口中显示代码执行结果lAutoLISP格式工具:格式工具:可重新安排程序格式,增强程序可读性l检查和观察工具:检查和观察工具:可方便地访问变量和表达式的值,还可浏览AutoCAD图形实体的各项属性值l上下文相关菜单:上下文相关菜单:提供有关AutoLISP函数信息以及对符号名的搜索l项目管理系统:项目管理系统:使用户可以更方便地管理多文件应用程序编译过的AutoLISP文件将被封装为一个单独的模块l窗口保护和恢复功能窗口保护和恢复功能:使用户可以保存并再次使用任一Visual LISP情景窗口环境l智能化的控制台窗口:智能化的控制台窗口:基本功能对应于AutoCAD文本屏幕窗口,同时提供了一些交互特性。

7. 2 AutoLISP程序设计语言程序设计语言•AutoLISP表达式和数据结构•AutoLISP变量•基本输出函数•符号和函数控制 7. 2 AutoLISP程序设计语言程序设计语言一、数据类型一、数据类型一、数据类型一、数据类型1. 1. 整型:整型:整型:整型:3232位带符号的整数位带符号的整数位带符号的整数位带符号的整数. .        范围:范围:范围:范围:-2147483648~+2147483647   (-231~+231-1)           注意:注意:注意:注意:如果输入的整数超过范围,则如果输入的整数超过范围,则AutoLISP将整数转换为实数;将整数转换为实数;                              如果两个整数运算结果超过这个范围,结果将是无效的如果两个整数运算结果超过这个范围,结果将是无效的    例:例:(set a 2147483648)   输出:输出:2.14748e+009   转换为实数转换为实数           (set a (+ 2147483646 3)  输出:输出:-2147483647   无效结果无效结果2. 2. 实型:实型:实型:实型:用双精度的浮点数表示,至少有用双精度的浮点数表示,至少有用双精度的浮点数表示,至少有用双精度的浮点数表示,至少有1414位有效位数的精度,可用科学计数法位有效位数的精度,可用科学计数法位有效位数的精度,可用科学计数法位有效位数的精度,可用科学计数法表示。

表示3. 3. 字符串:字符串:字符串:字符串:字符常数,由双引号引起来的字符系列字符常数,由双引号引起来的字符系列字符常数,由双引号引起来的字符系列字符常数,由双引号引起来的字符系列     字符串长度:字符串长度:不包括双引号的字符个数,最大为不包括双引号的字符个数,最大为100个字符,超过部分无效个字符,超过部分无效  任何字符都可以用任何字符都可以用\nnn的格式表示,的格式表示,\ 是是ASCII码的前导标识字符,码的前导标识字符,nnn是该字是该字符的符的ASCII码例:ABCD可表示为可表示为\101\102\103\104)) 7. 2 AutoLISP程序设计语言程序设计语言控制字符控制字符用用“\”为前导的转义字符表为前导的转义字符表示示用用“\”为前导的为前导的ASCII码数值码数值表示表示反斜杠反斜杠\\\014双引号双引号“ ’ ”双引号“ ’ ”\042Esc键键\e\033回车键回车键\r\015换行换行\n\012Tab键键\t\011注意:注意:注意:注意:其中的字符其中的字符e、、n、、r、、t 都必须是小写都必须是小写常用控制字符的表示方法常用控制字符的表示方法常用控制字符的表示方法常用控制字符的表示方法例:例:(setq a (getpoint “\n请用鼠标指示一个点:请用鼠标指示一个点:”)) (setq a (getpoint “\012请用鼠标指示一个点:请用鼠标指示一个点:”)) 7. 2 AutoLISP程序设计语言程序设计语言4. 4. 表:表:表:表:以以以以“ “ ( ”( ”开始,以配对的开始,以配对的开始,以配对的开始,以配对的“ “ ) ”) ”结束,结束,结束,结束,() ()里可为空,可有若干元素(简单里可为空,可有若干元素(简单里可为空,可有若干元素(简单里可为空,可有若干元素(简单或复杂),还可是其他的表。

或复杂),还可是其他的表或复杂),还可是其他的表或复杂),还可是其他的表表的长度:表的长度:表的长度:表的长度:表中的元素个数表中的元素个数表中的元素个数表中的元素个数例:例:例:例:(1.0 1.0 0.0)    (“this” “that” “the other”)   (1 “ONE”)     ((a b) c (c d))长度:长度:    3                                  3                                 2                     3       (+ 1 2 3)         (sin (* 0.5 pi))长度:长度:    4                          2      用表可以方便地构造出复杂的数据结构用表可以方便地构造出复杂的数据结构5. 5. 选择集:选择集:选择集:选择集:一个或多个图形对象的集合,用户可通过一个或多个图形对象的集合,用户可通过一个或多个图形对象的集合,用户可通过一个或多个图形对象的集合,用户可通过AutoLISPAutoLISP程序向选择集添程序向选择集添程序向选择集添程序向选择集添加或者从选择集中删除图形对象。

加或者从选择集中删除图形对象加或者从选择集中删除图形对象加或者从选择集中删除图形对象例:例:例:例:_$(ssget “X”)   说明:返回一个包含图形文件中所有对象的选择集说明:返回一个包含图形文件中所有对象的选择集6. 6. 实体名:实体名:实体名:实体名:为图形对象指定的为图形对象指定的为图形对象指定的为图形对象指定的1616进制的数字标识通过该标识,可找到实体在图进制的数字标识通过该标识,可找到实体在图进制的数字标识通过该标识,可找到实体在图进制的数字标识通过该标识,可找到实体在图形数据库中的位置,并可进一步对其进行编辑形数据库中的位置,并可进一步对其进行编辑形数据库中的位置,并可进一步对其进行编辑形数据库中的位置,并可进一步对其进行编辑例:例:例:例:_$(entlast)   说明:返回最后一个加入图形文件的对象的实体名说明:返回最后一个加入图形文件的对象的实体名 7. 2 AutoLISP程序设计语言程序设计语言7. VLA7. VLA::::Visual LISPVisual LISP在在在在ActiveXActiveX中使用的对象中使用的对象中使用的对象中使用的对象。

AutoCADAutoCAD的对象如直线、图层、的对象如直线、图层、的对象如直线、图层、的对象如直线、图层、视图、视口等都属于视图、视口等都属于视图、视口等都属于视图、视口等都属于VLAVLA对象8. 8. 文件描述:文件描述:文件描述:文件描述:赋予被打开文件的标识,类似于文件指针赋予被打开文件的标识,类似于文件指针赋予被打开文件的标识,类似于文件指针赋予被打开文件的标识,类似于文件指针例:例:例:例:_$(setq file (open “c:\\1.txt” “r”)) #9. 9. 符号与变量:符号与变量:符号与变量:符号与变量:((((1 1)符号:)符号:)符号:)符号:标识,用来作为变量、函数的名称标识,用来作为变量、函数的名称标识,用来作为变量、函数的名称标识,用来作为变量、函数的名称              规定:不能只包含数字,不能包含:规定:不能只包含数字,不能包含:规定:不能只包含数字,不能包含:规定:不能只包含数字,不能包含:(  ) (  )    .  ‘  “  .  ‘  “  ;,;,;,;,                                            大小写等价。

大小写等价大小写等价大小写等价              例:例:例:例:合法符号:合法符号:合法符号:合法符号:A1   1A    B1   -d    +eA1   1A    B1   -d    +e                              非法符号:非法符号:非法符号:非法符号:(a     )b    ’4    “5(a     )b    ’4    “5                注意:注意:注意:注意:符号的长度如果不是十分必要,最好不要超过符号的长度如果不是十分必要,最好不要超过符号的长度如果不是十分必要,最好不要超过符号的长度如果不是十分必要,最好不要超过6 6个字符2 2)变量的数据类型:)变量的数据类型:)变量的数据类型:)变量的数据类型:变量被赋予的值得类型就是变量本省的类型,程序运行过程中,变量被赋予的值得类型就是变量本省的类型,程序运行过程中,变量被赋予的值得类型就是变量本省的类型,程序运行过程中,变量被赋予的值得类型就是变量本省的类型,程序运行过程中,同一变量可被赋予不同类型的值,可用同一变量可被赋予不同类型的值,可用同一变量可被赋予不同类型的值,可用同一变量可被赋予不同类型的值,可用typetype命令了解变量的数据类型。

命令了解变量的数据类型命令了解变量的数据类型命令了解变量的数据类型 ((((3 3)变量赋值)变量赋值)变量赋值)变量赋值            SetqSetq   函数:函数:函数:函数:   ( (setqsetq   变量变量变量变量1 1   值值值值1 1 变量变量变量变量2 2   值值值值2 2……)……)            例:例:例:例:( (setqsetq a (+ 1 2)) a (+ 1 2))7. 2 AutoLISP程序设计语言程序设计语言((((4 4)预定义符号)预定义符号)预定义符号)预定义符号            NilNil::::如果变量没有被赋值,则其值为如果变量没有被赋值,则其值为如果变量没有被赋值,则其值为如果变量没有被赋值,则其值为NilNil,注意:,注意:,注意:,注意:NilNil不是空串也不是不是空串也不是不是空串也不是不是空串也不是0 0值            T T::::逻辑常量逻辑常量逻辑常量逻辑常量TrueTrue            PAUSEPAUSE::::与与与与commandcommand函数配合使用,用于暂停,等待用户输入。

函数配合使用,用于暂停,等待用户输入函数配合使用,用于暂停,等待用户输入函数配合使用,用于暂停,等待用户输入            PIPI::::圆周率            注意:注意:注意:注意:ØØ每个变量都占用一定的内存空间,为节省存储空间,可重复使用变量名,或将不再使用的变量每个变量都占用一定的内存空间,为节省存储空间,可重复使用变量名,或将不再使用的变量每个变量都占用一定的内存空间,为节省存储空间,可重复使用变量名,或将不再使用的变量每个变量都占用一定的内存空间,为节省存储空间,可重复使用变量名,或将不再使用的变量赋予赋予赋予赋予NilNil,以便释放该变量所占用的内存空间以便释放该变量所占用的内存空间以便释放该变量所占用的内存空间以便释放该变量所占用的内存空间ØØ如果所定义变量名与预定义符号或系统内部函数名称相同,则后面的定义取代前面的定义如果所定义变量名与预定义符号或系统内部函数名称相同,则后面的定义取代前面的定义如果所定义变量名与预定义符号或系统内部函数名称相同,则后面的定义取代前面的定义如果所定义变量名与预定义符号或系统内部函数名称相同,则后面的定义取代前面的定义。

5 5)显示变量的值:)显示变量的值:)显示变量的值:)显示变量的值:在变量名称前加在变量名称前加“ !!”,可在,可在AutoCAD命令提示区看到变量的值命令提示区看到变量的值          可利用这种方法将变量的值直接传递给可利用这种方法将变量的值直接传递给AutoCAD                例:例:例:例:command:(command:(setqsetq a ‘(10.0 10.0)) a ‘(10.0 10.0))                                command:command:lineline                Specify first point !a                Specify first point !a 二、表达式二、表达式二、表达式二、表达式7. 2 AutoLISP程序设计语言程序设计语言1. 1. 操作符前置表示法:操作符前置表示法:操作符前置表示法:操作符前置表示法:函数名和操作符号放在所有操作数前面函数名和操作符号放在所有操作数前面函数名和操作符号放在所有操作数前面函数名和操作符号放在所有操作数前面。

例:例:(set a (* z (+ x y))) 说明:说明:a=z*(x+y) 操作符前置表示法使得运算和函数的调用形式得到统一操作符前置表示法使得运算和函数的调用形式得到统一2. 2. 运算的优先级:运算的优先级:运算的优先级:运算的优先级:函数之间不存在优先的关系,运算的顺序仅由表的层次来决定函数之间不存在优先的关系,运算的顺序仅由表的层次来决定函数之间不存在优先的关系,运算的顺序仅由表的层次来决定函数之间不存在优先的关系,运算的顺序仅由表的层次来决定最里层的表最先被求值,把求值的结果返回给外面的层,一直到求出最终的结果最里层的表最先被求值,把求值的结果返回给外面的层,一直到求出最终的结果最里层的表最先被求值,把求值的结果返回给外面的层,一直到求出最终的结果最里层的表最先被求值,把求值的结果返回给外面的层,一直到求出最终的结果例:例:(set a (* z (+ x y))) 说明:说明:a=z*(x+y)3. 3. AutoLISPAutoLISP的求值过程:的求值过程:的求值过程:的求值过程:函每个表达式都返回一个数值,供外层表达式使用函每个表达式都返回一个数值,供外层表达式使用。

函每个表达式都返回一个数值,供外层表达式使用函每个表达式都返回一个数值,供外层表达式使用如果没有外层表达式,如果没有外层表达式,如果没有外层表达式,如果没有外层表达式,AutoLISPAutoLISP将这个值返回给将这个值返回给将这个值返回给将这个值返回给AutoCADAutoCAD,,,,AutoCADAutoCAD最多显最多显最多显最多显示六位小数示六位小数示六位小数示六位小数 7. 2 AutoLISP程序设计语言程序设计语言3. 3. AutoLISPAutoLISP的求值规则的求值规则的求值规则的求值规则ØØ整型数、实型数、字符串、文件指针和函数,以它们本省的值作为求值的结果;整型数、实型数、字符串、文件指针和函数,以它们本省的值作为求值的结果;整型数、实型数、字符串、文件指针和函数,以它们本省的值作为求值的结果;整型数、实型数、字符串、文件指针和函数,以它们本省的值作为求值的结果;ØØ符号以它们当前的约束值作为求值的结果;符号以它们当前的约束值作为求值的结果;符号以它们当前的约束值作为求值的结果;符号以它们当前的约束值作为求值的结果;ØØ表根据其第一个元素来进行计算:表根据其第一个元素来进行计算:表根据其第一个元素来进行计算:表根据其第一个元素来进行计算:l l如果第一个元素为函数名,则表中的剩余元素作为该函数的变元;如果第一个元素为函数名,则表中的剩余元素作为该函数的变元;如果第一个元素为函数名,则表中的剩余元素作为该函数的变元;如果第一个元素为函数名,则表中的剩余元素作为该函数的变元;l l如果表的第一个元素是一个表,这个表就假设为函数定义,以外层表中剩如果表的第一个元素是一个表,这个表就假设为函数定义,以外层表中剩如果表的第一个元素是一个表,这个表就假设为函数定义,以外层表中剩如果表的第一个元素是一个表,这个表就假设为函数定义,以外层表中剩余的元素作为该函数的变元进行计算;余的元素作为该函数的变元进行计算;余的元素作为该函数的变元进行计算;余的元素作为该函数的变元进行计算;l l如果表的第一个元素是如果表的第一个元素是如果表的第一个元素是如果表的第一个元素是quotequote函数,就不再对这样的表求值,而是直接引用函数,就不再对这样的表求值,而是直接引用函数,就不再对这样的表求值,而是直接引用函数,就不再对这样的表求值,而是直接引用这个表这个表这个表这个表例:例:例:例:( (setqsetq a (quote(10 10))) a (quote(10 10)))     等价于等价于等价于等价于     ( (setqsetq a ’(10 10)) a ’(10 10))    7. 2 AutoLISP程序设计语言程序设计语言三、数据存储结构三、数据存储结构三、数据存储结构三、数据存储结构指针:指针:指针:指针:如果内存单元如果内存单元A的内容是另一个内存单元的内容是另一个内存单元B的地址,则的地址,则A称为指向称为指向B的指针。

的指针节点:节点:节点:节点:如果内存单元如果内存单元A分为左右两个部分,分别存放分为左右两个部分,分别存放2个内存单元个内存单元B、、C的地址,则的地址,则A称为称为左右左右2个指针,具有左右个指针,具有左右2个指针的内存单元称为节点个指针的内存单元称为节点         AotoLISP的的内内存存由由一一系系列列的的节节点点组组成成,,每每个个节节点点长长度度为为12个个字字节节,,等等分分为为两两部部分分,,作作为为左左右右指指针针,,每每个个节节点点都都有有它它的的地地址址AutoLISP通通过过访访问问符符号号、、字字符符串串、、表表等等节节点点对对其进行存取其进行存取1. 1. 符号的存储结构:符号的存储结构:符号的存储结构:符号的存储结构:一个符号至少需要一个符号至少需要3个节点…a1(setq a 1)符号表符号表链接到符号表链尾,并指向存放符号名的节点存放符号名和符号值指针的节点存放符号值的节点…1(setq slot_name 1)slot_name符号表符号表符号名超过6个字符,需申请存放符号名的空间,原半个节点作为指向符号名的指针 7. 2 AutoLISP程序设计语言程序设计语言2. 2. 字符串的存储结构:字符串的存储结构:字符串的存储结构:字符串的存储结构:字符串在内存中是以连续空间存储的字符串在内存中是以连续空间存储的字符串在内存中是以连续空间存储的字符串在内存中是以连续空间存储的。

3. 3. 表的存储结构:表的存储结构:表的存储结构:表的存储结构:用一组节点存储,节点的右指针指向下一个元素的地址,最后一个元素用一组节点存储,节点的右指针指向下一个元素的地址,最后一个元素用一组节点存储,节点的右指针指向下一个元素的地址,最后一个元素用一组节点存储,节点的右指针指向下一个元素的地址,最后一个元素的右指针为空,节点的左指针指向各自的元素的右指针为空,节点的左指针指向各自的元素的右指针为空,节点的左指针指向各自的元素的右指针为空,节点的左指针指向各自的元素1                     2                     3(1 2 3)简单表的存储结构简单表的存储结构1 2                     34(1 (2 3) 4)复杂表的树状存储结构复杂表的树状存储结构 7. 2 AutoLISP程序设计语言程序设计语言4. 4. 点对:点对:点对:点对:只有两个元素,且两个元素都是原子的表只有两个元素,且两个元素都是原子的表只有两个元素,且两个元素都是原子的表只有两个元素,且两个元素都是原子的表形式:形式:(原子原子. 原子原子)例:例:(a.b) (1.2)        点对只用点对只用1个节点存放指针,节点的左指针指向第一个元素,节点的右指针指向第二个节点存放指针,节点的左指针指向第一个元素,节点的右指针指向第二个元素。

个元素1       2(1.2)点对点对       点对可以节省存储空间,且可简化某些函数对表的运算,是点对可以节省存储空间,且可简化某些函数对表的运算,是AutoLISP程序开发中程序开发中常用的数据结构常用的数据结构 7. 2 AutoLISP程序设计语言程序设计语言四、四、四、四、AutoLISPAutoLISP语言的控制流程语言的控制流程语言的控制流程语言的控制流程1. 1. AutoLISPAutoLISP的的的的3 3种基本结构:种基本结构:种基本结构:种基本结构:Ø顺序结构顺序结构Ø分支结构分支结构Ø循环结构循环结构n直到型循环(给定逻辑条件不满足时执行循环体,直到满足为止)n当型循环(当给定逻辑条件满足时执行循环体,直到不满足为止)2. 2. AutoLISPAutoLISP的的的的3 3种控制语句:种控制语句:种控制语句:种控制语句:选择语句、循环语句、转移语句((((1 1)条件语句:)条件语句:)条件语句:)条件语句:If If语句和语句和语句和语句和condcond语句语句语句语句If If语句的基本形式:语句的基本形式:语句的基本形式:语句的基本形式:(if (if testexprtestexpr thenexprthenexpr [ [elseexprelseexpr]) ])例:例:例:例:Command:Command: (if (= 1 3) “Yes!!” “no.”) (if (= 1 3) “Yes!!” “no.”) Command:Command: (if (= 2 (+ 1 1)) “Yes!!”) (if (= 2 (+ 1 1)) “Yes!!”) Command:Command: (if (= 2 (+ 3 4)) “Yes!!”) (if (= 2 (+ 3 4)) “Yes!!”)If语句可嵌套使用 condcond语句的基本形式:语句的基本形式:语句的基本形式:语句的基本形式:( (condcond [(test result …)…]) [(test result …)…])7. 2 AutoLISP程序设计语言程序设计语言例:例:例:例:( (condcond (( ((minuspminusp a) (-a)) ;;; a) (-a)) ;;; 判断判断判断判断a a是否为负数,如果是,返回是否为负数,如果是,返回是否为负数,如果是,返回是否为负数,如果是,返回-a-a (t a) ;;; (t a) ;;;默认情况,用默认情况,用默认情况,用默认情况,用t t作为测试表达式作为测试表达式作为测试表达式作为测试表达式 ) )求a的绝对值例:例:例:例:( (condcond ((= s “Y”) 1) ((= s “Y”) 1) ((=s “y”) 1) ((=s “y”) 1) ((=s “N”) 0) ((=s “N”) 0) ((=s “n”) 0) ((=s “n”) 0) (t nil) (t nil) ) )判断字符串s的值,视情况返回0、1、Nil ((((2 2)循环语句:)循环语句:)循环语句:)循环语句:repeatrepeat循环和循环和循环和循环和whilewhile循环循环循环循环üürepeatrepeat函数的基本形式:函数的基本形式:函数的基本形式:函数的基本形式:(repeat (repeat intint [ [exprexpr…])…])例:例:例:例:Command:Command: ( (setqsetq a 10 b 100) a 10 b 100) 100 100 Command:Command: (repeat 4 ( (repeat 4 (setqsetq a (+ a 10) ( a (+ a 10) (setqsetq b (+b 100)) b (+b 100)) 500 5007. 2 AutoLISP程序设计语言程序设计语言üüWhileWhile函数的基本形式:函数的基本形式:函数的基本形式:函数的基本形式:(while (while testexprtestexpr [ [exprexpr…])…])例:例:例:例:( (setqsetq test 1) test 1) while (<= test 10) while (<= test 10) (……) ;; (……) ;;循环体循环体循环体循环体 setqsetq test (+ 1 test)) test (+ 1 test)) ) )不断对test进行+1操作,直至test>10为止,期间执行循环体  7. 2 AutoLISP程序设计语言程序设计语言四、函数与函数控制四、函数与函数控制四、函数与函数控制四、函数与函数控制1. 1. 定义定义定义定义AutoLISPAutoLISP函数函数函数函数        defun函数格式:函数格式:   (defun 函数名函数名 ([函数参数函数参数][/变量表变量表…]) 表达式表达式…)例:例:例:例:( (defundefun add10 (x) add10 (x) setqsetq x (+ 10 x) x (+ 10 x) ) ) command:command:(setq(setq x 5) x 5) command: command:(add10 x)(add10 x)定义加10的函数函数调用2. 2. 调用调用调用调用AutoLISPAutoLISP函数函数函数函数        (函数名函数名 [函数参数函数参数…])3. 3. 调用调用调用调用AutoCADAutoCAD命令:命令:命令:命令:commandcommand函数函数函数函数        (command “AutoCAD命令命令” “命令所需的数据命令所需的数据”)例:例:例:例:(command “line” “10,10” “” “20,20” “”)(command “line” “10,10” “” “20,20” “”) 7. 2 AutoLISP程序设计语言程序设计语言4. 4. 定义定义定义定义AutoCADAutoCAD命令:命令:命令:命令:defundefun函数函数函数函数        ( (defun C: AutoCAD命令名命令名 (/ 局部变量表局部变量表…) 表达式表达式…)例:例:例:例:( (defundefun c:circ:cir(/ p1 p2)(/ p1 p2) ( (setqsetq p1 ( p1 (getpointgetpoint “\n “\n请指示圆心请指示圆心请指示圆心请指示圆心: ”) ): ”) ) ( (setqsetq p2 ( p2 (getpointgetpoint “\n “\n请指示圆上一点请指示圆上一点请指示圆上一点请指示圆上一点: ”)): ”)) ( (setqsetq r (distance p1 p2) r (distance p1 p2) (command “circle” p1 r) (command “circle” p1 r) ) ) 7. 3 AutoLISP与与AutoCAD的通信的通信•查询与Command函数•显示控制•几何工具的使用方法 7. 3 AutoLISP与与AutoCAD的通信的通信一、查询和命令一、查询和命令一、查询和命令一、查询和命令1. Command1. Command函数:函数:函数:函数:将将AutoCAD命令送到命令送到AutoCAD操作环境的命令行。

操作环境的命令行格式:格式: (command “AutoCAD命令命令” “命令所需的数据命令所需的数据”)说明:说明:函数参数的类型可以是整型、实型、字符串、点、实体名或选择集如果参数是类似于角度、距离和点的数据,则可用字符串或者数据本身的值作为参数输入例:例:例:例:(command “circle” “0,0” “3,3”)(command “circle” “0,0” “3,3”) (command “thickness” 1) (command “thickness” 1) ( (setqsetq pt ‘(1 1 3)) pt ‘(1 1 3)) (set radius 5) (set radius 5) (command “circle” pt radius) (command “circle” pt radius)((1)暂停以等候输入的预定义参数:)暂停以等候输入的预定义参数:pausepause例:例:例:例:(command “circle” “5,5” (command “circle” “5,5” pausepause “line” “5,5” “7,5”) “line” “5,5” “7,5”)注意:注意:注意:注意:暂停等候用户输入时,函数被认为是激活的,用户不能其它的AutoLISP表达式来进行计算。

例:例:例:例:( (setqsetq blkblk “MY_BLOCK”) “MY_BLOCK”) ( (setqsetq oldlayeroldlayer ( (getvargetvar “ “clayerclayer”)”) (command “layer” “set” “NEW_LAY” “”) (command “layer” “set” “NEW_LAY” “”) (command “insert” (command “insert” blkblk pause “” “” pause) pause “” “” pause) (command “layer” “set” (command “layer” “set” oldlayeroldlayer) ) 7. 3 AutoLISP与与AutoCAD的通信的通信((2)将拾取点传入)将拾取点传入AutoCAD命令命令        对需要用户指定拾取点和对象的对需要用户指定拾取点和对象的AutoCAD命令,要将这些点和对象的组合不使用命令,要将这些点和对象的组合不使用pause符号而传入符号而传入command函数,则必须将它们保存在变量中,在传入函数,则必须将它们保存在变量中,在传入command函数函数(其中点可作为字符串传入(其中点可作为字符串传入command函数)函数) 。

例:例:例:例:(command “circle” “5,5” “2”)(command “circle” “5,5” “2”) (command “line” “3,5” “7,5”) (command “line” “3,5” “7,5”) ( (setqsetq e1 ( e1 (entlastentlast)) )) ( (setqsetq point ‘(5 7)) point ‘(5 7)) (command “trim” e1 “” point “”) (command “trim” e1 “” point “”)((3)对)对command函数的函数的undo操作操作        如果想将几条如果想将几条command函数作为一组命令全部撤销,则必须使用函数作为一组命令全部撤销,则必须使用undo begin和和undo end选项例:例:例:例:(command "undo" "be")(command "undo" "be") (command “circle” “5,5” “2”)(command “circle” “5,5” “2”) (command “line” “3,5” “7,5” “”) (command “line” “3,5” “7,5” “”) ( (setqsetq e1 ( e1 (entlastentlast)) )) ( (setqsetq point ‘(5 7)) point ‘(5 7)) (command “trim” e1 “” point “”) (command “trim” e1 “” point “”) (command "undo" “end") (command "undo" “end") 7. 3 AutoLISP与与AutoCAD的通信的通信2. 2. 系统和环境变量的查询和设置系统和环境变量的查询和设置系统和环境变量的查询和设置系统和环境变量的查询和设置查询函数查询函数查询函数查询函数:: (getvar  “AutoCAD系统变量名系统变量名”)说明:说明:获得AutoCAD系统变量的值。

设置函数:设置函数:设置函数:设置函数:(setvar  “AutoCAD系统变量名系统变量名” 系统变量值系统变量值)说明:说明:设置AutoCAD系统变量值AutoCAD系统变量值的类型:系统变量值的类型:整数、实数、字符串、二维点、三维点整数、实数、字符串、二维点、三维点例:例:例:例:(if (< (getvar “filletrad”) 1)            (setvar “filletrad” 1)        )例:例:例:例:(if (< (getvar “isolines”) 8)            (setvar “isolines” 8)        ) 7. 3 AutoLISP与与AutoCAD的通信的通信二、显示控制二、显示控制二、显示控制二、显示控制2. 2. 菜单查询和控制函数:菜单查询和控制函数:菜单查询和控制函数:菜单查询和控制函数:menucmdmenucmd格式:格式:格式:格式:(menucmd string)     说明:说明:控制图形窗口的菜单显示,包括显示、修改和查询当前的子菜单控制图形窗口的菜单显示,包括显示、修改和查询当前的子菜单。

string参数的格式:参数的格式:"menu_area=value" 指定菜单区域或菜单项指定在菜单区域或菜单项上执行的操作例:例:例:例:(setq￿s￿(menucmd￿"P11.3=?"));;;Gets￿the￿status￿of￿the￿menu￿item￿￿￿￿￿￿￿￿(if￿(=￿s￿“”)￿;;;If￿the￿status￿is￿an￿empty￿string,￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿(menucmd￿"P11.3=~");;;￿disable￿the￿menu￿item￿￿￿￿￿￿￿￿)1. 1. 文本输出函数:文本输出函数:文本输出函数:文本输出函数:promptprompt、、、、princprinc、、、、printprint 7. 3 AutoLISP与与AutoCAD的通信的通信3. 3. 控制图形和文本窗口的函数控制图形和文本窗口的函数控制图形和文本窗口的函数控制图形和文本窗口的函数graphscrgraphscr函数:函数:函数:函数:显示图形窗口显示图形窗口显示图形窗口显示图形窗口textscrtextscr函数函数函数函数::显示文本窗口显示文本窗口。

 格式:格式:格式:格式:(redraw [ename [mode]])  参数:参数:参数:参数:ename——实体名;mode——显示模式 例:例:例:例:(redraw ((redraw (entlastentlast) 3)) 3)redrawredraw函数函数函数函数::图形对象重绘函数图形对象重绘函数显示模式参数:显示模式参数:   重绘实体:1    消隐实体:2    亮显实体:3    不亮显实体:4  三、获取用户输入三、获取用户输入三、获取用户输入三、获取用户输入7. 3 AutoLISP与与AutoCAD的通信的通信函数名函数名用户输入类型用户输入类型getint在命令行中输入整数getreal在命令行中输入实数或整数getstring在命令行中输入字符串getpoint在命令行中输入或在绘图区域内拾取点getcorner在命令行中输入或在绘图区域内拾取点getdist在命令行中输入或在绘图区域内拾取点getangle在命令行中输入或在绘图区域内拾取点getorient在命令行中输入或在绘图区域内拾取点getkword在命令行中输入一个预定义的关键字或其缩写 7. 3 AutoLISP与与AutoCAD的通信的通信例:例:例:例:(setq p '(0 0))(getcorner p "input a corner:")例:例:例:例:(initget 1 "Yes No") (setq x (getkword "Are you sure? (Yes or No) "))(if (= "Yes" x) (princ "\nUser press Yes") (princ "\nUser press no"))例:例:例:例:(initget 6) (setq r (getreal "输入半径输入半径")(command "circle" "0,0" r)例:例:例:例:(getpoint '(0 0) "input other pt") 四、几何工具四、几何工具四、几何工具四、几何工具7. 3 AutoLISP与与AutoCAD的通信的通信1. angle1. angle函数:函数:函数:函数:计算直线与x轴的夹角(弧度)。

2. distance2. distance函数:函数:函数:函数:计算2点间的距离3. polar3. polar函数:函数:函数:函数:依靠极坐标获得1个点4. insert4. insert函数:函数:函数:函数:计算2条直线的交点例:例:例:例:(setq pt1 '(3.0 6.0 0.0))(setq pt2 '(5.0 2.0 0.0))(setq base '(1.0 7.0 0.0))(setq rads (angle pt1 pt2))(setq len (distance pt1 pt2))(setq endpt (polar base rads len))5. 5. osnaposnap   函数:函数:函数:函数:对象捕捉函数例:例:例:例:(setq pt2 (osnap pt1 “midp”)捕捉靠近pt1对象的中点例:例:例:例:(setq pt2 (osnap pt1 "_end,_int")) 捕捉靠近pt1对象的端点或交点6. aperture6. aperture系统变量确定在使用对象捕捉时,选择点与对象允许的接近程度 7. 3 AutoLISP与与AutoCAD的通信的通信五、数据转换五、数据转换五、数据转换五、数据转换1. rots1. rots函数:函数:函数:函数:将实数转换为字符串。

将实数转换为字符串          实数的单位由lunits系统变量控制     实数的精度由luprec系统变量控制     结果字符中如何显示前面和后面的0由尺寸变量dimzin控制例:例:例:例:(setq x 17.5)(setq str "\nValue formatted as ")(setq fmtval (rtos x 1 4)) ;模式模式1表示科学计数法表示科学计数法(princ (strcat str fmtval))(setq fmtval (rtos x 2 4)) ;模式模式2表示表示10进制表示进制表示(princ (strcat str fmtval))(setq fmtval (rtos x 3 4)) ;模式模式3表示工程表示表示工程表示(princ (strcat str fmtval))(setq fmtval (rtos x 4 4)) ;模式模式4表示建筑表示表示建筑表示(princ (strcat str fmtval))(setq fmtval (rtos x 5 4)) ;模式模式5表示分数表示表示分数表示(princ (strcat str fmtval))格式:格式:格式:格式:(rtos number [mode [precision]])  2. 2. DistofDistof函数:函数:函数:函数:将字符串转换为实数。

将字符串转换为实数格式:格式:格式:格式:(Distof string [mode]) 7. 3 AutoLISP与与AutoCAD的通信的通信例:例:例:例:(distof "1.7500E+01" 1) ;模式模式1表示科学计数法表示科学计数法  1.7500E+01 (distof "17.50" 2) ;模式模式2表示表示10进制表示进制表示  17.50(distof "1‘-5.50\"" 3) ;模式模式3表示工程表示表示工程表示       1'-5.5"(distof "1‘-5 1/2\"" 4) ;模式模式4表示建筑表示表示建筑表示       1'-5 1/2"(distof "17 1/2" 5) ;模式模式5表示分数表示表示分数表示注意反斜杠 \ 的作用 7. 3 AutoLISP与与AutoCAD的通信的通信3. 3. angtosangtos函数:函数:函数:函数:将角度转换为字符串将角度转换为字符串例:例:例:例:(setq ang 3.14159 str2 "\nAngle formatted as ")(setq fmtval (angtos ang 0 0)) ;模式模式0表示角度表示角度(princ (strcat str2 fmtval))(setq fmtval (angtos ang 1 4)) ;模式模式1表示度表示度/分分/秒形式表示角秒形式表示角度度(princ (strcat str2 fmtval))(setq fmtval (angtos ang 2 4)) ;模式模式2表示梯度表示法表示梯度表示法(princ (strcat str2 fmtval))(setq fmtval (angtos ang 3 4)) ;模式模式3表示弧度表示弧度(princ (strcat str2 fmtval))(setq fmtval (angtos ang 4 2)) ;模式模式4表示测量员表示方式表示测量员表示方式(princ (strcat str2 fmtval)) 格式:格式:格式:格式:(angtos angle [unit [precision]])  7. 3 AutoLISP与与AutoCAD的通信的通信4. 4. angtofangtof函数:函数:函数:函数:将字符串转换为角度。

将字符串转换为角度格式:格式:格式:格式:(angtof string [units]) 例:例:例:例:      (setq a (angtof "180" 0))              ;模式模式0角度表示法角度表示法      (setq b (angtof "180d0'0\"" 1))    ;模式模式1表示度分秒表示法表示度分秒表示法      (setq c (angtof "200.0000g" 2))   ;模式模式2表示梯度表示法表示梯度表示法      (setq d (angtof "3.14159r" 3))      ;模式模式3表示弧度表示法表示弧度表示法      (setq e (angtof "W" 4))                 ;模式模式4表示测量员表示法表示测量员表示法都返回都返回3.14159例:例:例:例:将角度值从弧度转换为角度:先用将角度值从弧度转换为角度:先用angtos函数获得角度的字符串,然函数获得角度的字符串,然后用后用atof函数将字符串转换为实数函数将字符串转换为实数      (setq point1 '(1 1) point2 '(1 2))      (setq rad (angle point1 point2))      (setq degree (atof (angtos rad 0 2))) 7. 3 AutoLISP与与AutoCAD的通信的通信六、坐标系转换六、坐标系转换六、坐标系转换六、坐标系转换(trans pt from to [disp]) 说明:说明:说明:说明:ptpt::::A list of three reals that can be interpreted as either a 3D point or a 3D displacement (vector). fromfrom::::An integer code, entity name, or 3D extrusion vector identifying the coordinate system in which pt is expressed. The integer code can be one of the following:        0 0  World (WCS)        1 1  User (current UCS)        2 2  If used with code 0 or 1, this indicates the Display Coordinate System (DCS) of the current viewport. When used with code 3, it indicates the DCS of the current model space viewport.        3 3    Paper space DCS (used only with code 2) toto::::An integer code, entity name, or 3D extrusion vector identifying the coordinate system of the returned point. See the from argument for a list of valid integer codes. 例:用例:用例:用例:用getpointgetpoint函数获取点后,将该点转换为世界坐标系下的点。

函数获取点后,将该点转换为世界坐标系下的点函数获取点后,将该点转换为世界坐标系下的点函数获取点后,将该点转换为世界坐标系下的点       (setq pnt (getpoint “输入点:输入点:”))(trans pnt 1 0)  7. 4 DCL对话框对话框一、一、一、一、DCLDCL文件结构文件结构文件结构文件结构dialogboxed_colummtoggletoggleboxed_rowradio buttontoggletoggletoggleradio buttonOk_Cance 7. 4 DCL对话框对话框二、二、二、二、DCLDCL语法语法语法语法1. 1. 定义控件定义控件定义控件定义控件格式:格式:格式:格式:name : item1 [ : item2 : item3 … ]           {                 attribute = value;                 …            }说明:说明:说明:说明:FF每个每个每个每个itemitem都是预先定义的控件新定义的控件继承了所有控件都是预先定义的控件新定义的控件继承了所有控件都是预先定义的控件。

新定义的控件继承了所有控件都是预先定义的控件新定义的控件继承了所有控件((((item1…item1…)的属性;)的属性;)的属性;)的属性;FF大括号的属性定义补充或替换继承的定义;大括号的属性定义补充或替换继承的定义;大括号的属性定义补充或替换继承的定义;大括号的属性定义补充或替换继承的定义;FF如果多个如果多个如果多个如果多个itemitem指定相同的属性,则使用第指定相同的属性,则使用第指定相同的属性,则使用第指定相同的属性,则使用第1 1个遇到的属性;个遇到的属性;个遇到的属性;个遇到的属性;2. 2. 引用控件引用控件引用控件引用控件格式:格式:格式:格式:name;;或或       : name           {                 attribute=value;                 …            }例:例:例:例:spacer;spacer;              ok_cancelok_cancel; ; 7. 4 DCL对话框对话框3. 3. 属性和属性值属性和属性值属性和属性值属性和属性值格式:格式:attribute = value;attributeattribute:::: 属性valuevalue::::属性值; ;::::赋值语句结束标志4. 4. 注释:注释:注释:注释:DCL文件中前带文件中前带   // // 的语句是注释,的语句是注释,// // 到行尾的内容被忽略。

到行尾的内容被忽略                              也可使用也可使用也可使用也可使用   /* /*注释文字注释文字注释文字注释文字* */  / 的整段注释的整段注释的整段注释的整段注释 三、控件及其属性三、控件及其属性三、控件及其属性三、控件及其属性7. 4 DCL对话框对话框1. 1. 加框列(加框列(加框列(加框列(boxed_columnboxed_column)和加框行()和加框行()和加框行()和加框行(boxed_rowboxed_row))))属性:属性:属性:属性:标题,标题,标题,标题,如果标题为空,加框列和行内的控件将被无标题的线包围如果标题为空,加框列和行内的控件将被无标题的线包围如果标题为空,加框列和行内的控件将被无标题的线包围如果标题为空,加框列和行内的控件将被无标题的线包围例:例:例:例:      : boxed_column      {            label = “ Insulation:”;            ……      }2. 2. 加框单选列(加框单选列(加框单选列(加框单选列(boxed_radio_columnboxed_radio_column)和加框行()和加框行()和加框行()和加框行(boxed_radio_rowboxed_radio_row))))属性:属性:属性:属性:标题标题标题标题。

                      值:值:值:值:用双引号括起来的表示单选按钮关键字的字符串,其值为用双引号括起来的表示单选按钮关键字的字符串,其值为用双引号括起来的表示单选按钮关键字的字符串,其值为用双引号括起来的表示单选按钮关键字的字符串,其值为1 13. button3. button属性:属性:属性:属性:labellabel、、、、is_defaultis_default、、、、is_cancelis_cancel说明:说明:说明:说明:如果设置为如果设置为true,则用户按回车键的结果与点击该按钮一样;,则用户按回车键的结果与点击该按钮一样;           如果设置为如果设置为true,则用户按,则用户按Esc键的响应与点击该按钮一样键的响应与点击该按钮一样例:例:例:例:      : button      {            key =  “btm_ok”;            label = “OK”            is_default = true;       }例:例:例:例:      : button      {            key =  “btm_cancel”;            label = “Cancel”            is_cancel = true;       } 7. 4 DCL对话框对话框4. 4. Edit_boxEdit_box属性:属性:属性:属性:labellabel、、、、edit_widthedit_width、、、、edit_limitedit_limit、、、、valuevalue、、、、allow_acceptallow_accept。

说明:说明:说明:说明:edit_width是以字符为单位的是以字符为单位的edit_box控件之宽度;控件之宽度;           edit_limit是规定用户能够在是规定用户能够在edit_box控件中输入的字符数;控件中输入的字符数;           value属性值为用引号括起来的字符,对话框可见时出现在属性值为用引号括起来的字符,对话框可见时出现在edit_box中;中;           allow_accept设置为设置为true时,用户按回车键,相当于鼠标选择时,用户按回车键,相当于鼠标选择edit_box5. 5. image_buttonimage_button属性:属性:属性:属性:colorcolor、、、、aspect_ratioaspect_ratio说明:说明:说明:说明:color是背景色,是背景色,0~7或或black、、red、、yellow、、green、、cyan、、blue、、                                                magenta、、white;            aspect_ratio是图像控件的宽和高之比。

是图像控件的宽和高之比例:例:例:例:      : edit_box      {            key = “lyr_ebox”;            value = “0”;            edit_width = 31;            edit_limit =31;      }例:例:例:例:      : image      {            key = “mfsld”;            color = 0;            aspect_ratio = 0.7;       } 7. 4 DCL对话框对话框6. 6. list_boxlist_box属性:属性:属性:属性:labellabel、、、、multiple_selectmultiple_select、、、、listlist、、、、tabstabs、、、、valuevalue、、、、aspect_ratioaspect_ratio说明:说明:说明:说明:multiple_select设置为设置为true时,允许用户在时,允许用户在list_box中选择多行文字;中选择多行文字;           list属性规定列表框中显示文本的初始设置,每行文字用转义字符属性规定列表框中显示文本的初始设置,每行文字用转义字符 \n 分分           开,字符串中可包含制表符,允许特殊的字符串格式化;开,字符串中可包含制表符,允许特殊的字符串格式化;           tab属性是一个包含数值的字符串,规定属性是一个包含数值的字符串,规定list_box中的制表位置;中的制表位置;           value属性是引号括起来的字符串,包含整数,以规定哪一行在初始化中属性是引号括起来的字符串,包含整数,以规定哪一行在初始化中           被选中。

被选中例:例:例:例:      : list_box      {            key = “vpdes”;            value = “”;            width = 60;            height = 10;            tab = “5 17 26”       } 7. 4 DCL对话框对话框6. 6. popup_listpopup_list属性:属性:属性:属性:labellabel、、、、edit_widthedit_width、、、、listlist、、、、tabstabs、、、、valuevalue7. 7. radio_buttonradio_button属性:属性:属性:属性:labellabel、、、、valuevalue说明:说明:说明:说明:value为引号括起来的整数,为引号括起来的整数,“0”或或“1”,,“1”表示单选按钮被选中表示单选按钮被选中8. 8. toggle_buttontoggle_button属性:属性:属性:属性:labellabel、、、、valuevalue说明:说明:说明:说明:value为引号括起来的整数,为引号括起来的整数,“0”或或“1”,,“1”表示复选按钮被选中。

表示复选按钮被选中 7. 4 DCL对话框对话框四、布局和尺寸属性四、布局和尺寸属性四、布局和尺寸属性四、布局和尺寸属性widthwidth(宽度)(宽度)heightheight(高度)(高度)alignmentalignment(对齐)(对齐)children_alignmentchildren_alignment(子控件对齐)(子控件对齐)fixed_widthfixed_width   (固定宽度)(固定宽度) fixed_heightfixed_height (固定高度)(固定高度)children_fixed_widthchildren_fixed_width (子控件固定宽度)(子控件固定宽度)children_fixed_heightchildren_fixed_height(子控件固定高度)(子控件固定高度)四、布局和尺寸属性四、布局和尺寸属性四、布局和尺寸属性四、布局和尺寸属性五、功能属性五、功能属性五、功能属性五、功能属性Is_enabledIs_enabled::::true或或false,指定控件是否可选指定控件是否可选Is_tab_stopIs_tab_stop::::   按按Tab键可逐个通过对话框上键可逐个通过对话框上is_tab_stop=true的控件。

的控件mnemonicmnemonic::::设置一个由设置一个由mnemonic值表示的字符,当按该字符时,聚焦到该空值表示的字符,当按该字符时,聚焦到该空                      间,间, mnemonic字符必须大写且须是控件标题的大写字符之一字符必须大写且须是控件标题的大写字符之一例:例:例:例:      : edit_box      {            label = “A – Top Vert Opng”;            key = “lyr_ebox”;            value = “0”;            edit_width = 31;            edit_limit =31;            mnemonic = “A”;      } 7. 4 DCL对话框对话框六、关键字六、关键字六、关键字六、关键字keykey属性:属性:属性:属性:应用程序与对话框中控件联系的途径应用程序与对话框中控件联系的途径说明:说明:说明:说明:每个激活的控件必须有一个关键字值,并且对于一个对话框是唯一的,关每个激活的控件必须有一个关键字值,并且对于一个对话框是唯一的,关           键字的值是引号括起来的字符串,区分大小写。

键字的值是引号括起来的字符串,区分大小写关键字前缀命名方案:关键字前缀命名方案:关键字前缀命名方案:关键字前缀命名方案:前缀前缀控件类型控件类型btn_按钮按钮tg_复选框复选框rb_单选按钮单选按钮eb_编辑框编辑框im_图像控件图像控件imb_图像按钮图像按钮lb_列表框列表框pl_弹出式列表框弹出式列表框 7. 4 DCL对话框管理对话框管理一、一、一、一、AutoLISPAutoLISP程序控制程序控制程序控制程序控制DCLDCL对话框的方法对话框的方法对话框的方法对话框的方法步骤:步骤:步骤:步骤:((1)用)用load_dialog函数将函数将DCL文件加载到内存中;文件加载到内存中;((2)调用)调用new_dialog函数,将对话框名和函数,将对话框名和DCL标识码作为参数传递给该函数;标识码作为参数传递给该函数;((3)通过设置控件值、列表和图像初始化对话框;)通过设置控件值、列表和图像初始化对话框;((4)调用)调用start_dialog将对话框的控制传递给将对话框的控制传递给AutoCAD并显示出来;并显示出来;((5)调用)调用unload_dialog,在用户响应后从内存中删除对话框。

在用户响应后从内存中删除对话框hello:dialog{ label="Sample Dialog Box"; :text{ label="Hello,world"; } ok_only;}例:例:例:例:hellohello对话框的控制方法对话框的控制方法对话框的控制方法对话框的控制方法用户单击“确定”按钮后,AutoCAD将ok_onlyok_only控件指定动作done_dialogdone_dialog的调用传递给AutoLISP应用程序,并关闭对话框 7. 4 DCL对话框管理对话框管理二、动作表达式和回调二、动作表达式和回调二、动作表达式和回调二、动作表达式和回调action_tileaction_tile函数:函数:函数:函数:将AutoLISP表达式与控件相关联,从而定义对话框中控件被选定时执行的操作格式:格式:格式:格式:( (action_tileaction_tile key action-expression)  key action-expression) get_attrget_attr函数:函数:函数:函数:检索DCL文件中用户定义的属性。

get_tileget_tile函数:函数:函数:函数:获得控件的当前运行值(基于用户对控件的输入)注意:注意:注意:注意:l定义动作表达式必须在调用new_dialog之后,调用start_dialog之前l用户如何选定控件或修改控件内容的信息,将作为回调返回给动作表达式,多数情况下,对话框每个被激活的控件都将产生一个回调定义回调的动作表达表达式通常被当作回调函数引用该函数检查关联控件的合法性,并更新对话框中关于控件值的信息l只有OK按钮(或与之等效的控件)可检查控件的值,以永久保存用户最终选定的设置也就是说,应该在OK按钮的回调中更新与控件值相关联的变量,而不是在单个空间的回调中更新,否则将无法通过Cancel按钮来取消变量的值l如果OK按钮的回调检查到错误,则不应退出对话框,而应显示错误信息,并将焦点返回到错误控件处 7. 4 DCL对话框管理对话框管理1. 1. 动作表达式动作表达式动作表达式动作表达式变量变量变量变量说明说明说明说明$key选定控件的关键字属性,可用于所有动作$value控件当前值得字符串形式,如编辑框中的字符串,或者开关中的“1”或“0”,可用于所有动作如果控件是列表框且未选定项目,则$value变量为nil$data应 用 管 理 的 数 据 , 是 在 调 用 new_dialog后 立 即 使 用client_data_tile来设置的,可用于所有动作。

只有应用程序已经调用client_data_tile将其初始化后,$data才有意义reason原 因 代 码 , 指 示 哪 些 用 户 操 作 可 激 发 动 作 用 于edit_boxlist_boximage_buttonslider控件中,该变量指示动作执行的原因只有动作与上述控件相关联时,才需要对它进行检验动作表达式变量表动作表达式变量表例:例:例:例:(action_tile “edit1” “(setq ns $value)”) $value包含用户输入的字符串,动作表达式将其存入变量ns中 7. 4 DCL对话框管理对话框管理2. 2. 回调原因:指明动作发生的原因,并返回回调原因:指明动作发生的原因,并返回回调原因:指明动作发生的原因,并返回回调原因:指明动作发生的原因,并返回$reason$reason变量中回调原因代码回调原因代码代码代码代码代码说明说明说明说明1用户选择控件,大多数控件可用的值2编辑框:用户已经退出编辑框,但尚未作出最后选择3滑块:用户通过拖动滑块改变滑动条的值,但尚未作出最后选择4双击列表框选项或图像按钮 三、控件处理三、控件处理三、控件处理三、控件处理7. 4 DCL对话框管理对话框管理1. 1. 初始化控件和回调时改变控件的模式初始化控件和回调时改变控件的模式初始化控件和回调时改变控件的模式初始化控件和回调时改变控件的模式l使控件成为对话框的初始化键盘焦点。

l禁用或启用控件l如果控件是编辑框或图像,则高亮显示其内容set_tileset_tile函数:函数:函数:函数:设置控件的值,格式:格式:(set_tile key value) mode_tilemode_tile函数:函数:函数:函数:设置控件模式,格式:格式:(mode_tile key mode) key :指定控件的字符串 value :赋予控件的新值 mode:控件控件模式代码             0 0  启用控件              1 1  禁用控件              2 2  将焦点设置到控件上              3 3  选择编辑框内容              4 4  图像亮显开关 例:例:例:例:注意:注意:当调用mode_tile来禁用带有当前焦点的控件时,必须再次调用mode_tile将焦点设置到另一控件上 7. 4 DCL对话框管理对话框管理2. 2. 单选按钮的处理单选按钮的处理单选按钮的处理单选按钮的处理l单选按钮出现在单选控件组中,每个单选按钮以“1”表示开,“0”表示关l单选控件组的值是当前选定按钮的key属性,又可编程对话框(PDB)功能模块管理一个控件组中的单选按钮组的值,并确保同一时刻只能有一个单选按钮被打开。

l可为每个单选按钮指定一个动作,但更为有效的办法是为整个单选按钮组指定一个动作,然后通过测试单选按钮组的值来确定所选单选按钮及相关联的动作例:例:例:例: 7. 4 DCL对话框管理对话框管理3. 3. 滑块的处理滑块的处理滑块的处理滑块的处理l当处理滑块的动作和回调时,应用程序应检查在回调过程中收到的原因代码l每当到达滑块的增量边界时,都要发生一个回调4. 4. 编辑框的处理编辑框的处理编辑框的处理编辑框的处理编辑框中的字符总是可见的,因此无须处理中间代码;当编辑框上的焦点转移时,编辑框只需返回回调代码 slider_selslider_infomy_slider7. 4 DCL对话框管理对话框管理滑块和编辑框的处理示例程序滑块和编辑框的处理示例程序滑块和编辑框的处理示例程序滑块和编辑框的处理示例程序 。

下载提示
相似文档
正为您匹配相似的精品文档