
AutoLisp程序设计教程解析.ppt
57页CAD/CAE/CAM系统的编程基础与二次开发技术商业化的CAD/CAE/CAM系统在某些方面难以满足工程需要,为提高和扩展系统的功能,需要对CAD/CAE/CAM系统进行开发开发的方式主要有三种:(1)在通用CAD/CAE/CAM软件基础进行二次开发,如SolidEdge,SolidWorks,AutoCAD等CAD系统的二次开发2)基于CAD/CAE/CAM软件平台的开发如当前流行的图形核心技术开发平台有ACIS、Parasolid、CAS.CADE和Granite等,稳定性好,但成本高3)完全自主版权的开发,如C+等结合OpenGL进行开发AutoCAD的二次开发(Visual Lisp程序设计)AutoCAD的显著特点之一是它不仅具有强大的图形绘制与编辑功能,而且体系结构开放,允许用户对其进行定制与开发可针对工程领域的特殊应用问题,开发一个既有计算分析功能和专用的工程图形数据库,又有强大图形处理功能的CAD应用系统Visual Lisp简介(1)Lisp语言是人工智能领域中广泛采用的一种程序设计语言AutoLisp 程序和autoCAD的绘图命令可以透明的结合起来,使设计和绘图完全融为一体。
还可以实现对AutoCAD图形数据 直接访问、修改,为实现对图形的实时修改、交互设计、参数化设计以及在绘图领域中应用人工智能提供了必要的条件是一种人工智能绘图语言Visual Lisp简介(2)AutoLISP程序由注释和表达式组成与其他的高级语言不同的是,它的注释用;来表示而表达式用的是前缀表示法,即把运算符放在表的第一个元素位置,后面才是其他参数表达式一般是通过调用函数来执行变量(1)1.符号:用来作为变量、函数的名字符号可包含数据和字符(、)、.、“、;除外)符号的长度最好不要超过6个字符2.变量的数据类型:不需对变量事先进行类型说明,变量被赋值时,值的类型就是变量的类型在程序运行过程中,同一变量在不同的时刻可以赋予不同类型的值3.赋值:(setq 变量1 值1 变量2 值2)表达式(1)表达式相当于程序的语句,主要是由原子或表构成的1.以表的形式存在的表达式 格式:(函数名 变元)2.前缀表示法:将函数名放在所有的操作数之前:如x=(a+b)*c 用Lisp表示为:(setq x(*(+a b)c),相当于说运算符也属于函数表达式(2)3.表达式的求值过程 在Lisp语言中,函数之间不存在优先关系,运算的先后顺序只能通过表的层次来实现,最里层的表最先被求值,再传给外层的表,直到求值完毕。
表达式(3)4.表达式的求值规则(1)整型数、实型数、字符串,以它们本身的值作为求值结果(2)符号以它们当前的约束值作为求值结果(3)表是根据其第一个元素来进行计算的其中quote函数表示直接引用,可用 单号来表示如(setq p1(quote(25 10)可写成:(setq p1(25 10)常用内部函数(1)1.计算函数(+n m)、(-n m)、(*n m)、(/n m)(1+m)、(1-m)、(sqrt m)2.关系运算函数(=n m)(/=n m)(=n m)3.逻辑运算函数(and 表达式1 表达式2)(or 表达式1 表达式2)(not(项)常用内部函数(2)4.赋值函数 (setq )5.引用函数 (quote)或简写成()6.转换函数 (itoa):整数转换为字符串 (atoi):字符串转换为整数 (atof):字符串转换为浮点数常用内部函数(3)7.字符串处理函数 (strcat ):将字符串按顺序连结成一个新字符串(substr ):从开始处截取某长度的字符串strlen ):求字符串的长度常用内部函数(4)8.求值函数 (distance ):两点之间的距离 (polar ):以相对极坐标方式返回另一个点(angle ):返回两点连线与X轴正向夹角(osnap 字符串):返回以点来指定对象的捕捉点(car):返回第一个元素(cdr):返回除第一个元素外内容的表常用内部函数(5)9.主要的交互输入函数(1)(getangle pt msg):等待用户输入角度(2)(getcorner pt msg):等待用户输入一个角点(3)(getdist pt msg):等待用户输入一个距离(4)(getpoint pt msg):等待用户输入一个点常用内部函数(5)mand函数:执行AutoCAD标准命令 利用command函数AutoLISP几乎可以调用CAD里的全部命令。
格式:(command“AutoCAD 命令”“命令所需的数据”)如画圆:(command“circle”“2,4”5)如直线:(command “line”“100,120”23,116”):调用line、pline、layer时以“”结尾,等效于按一次空格键自定义函数(1)1.定义函数格式:(defun 函数名(变量表/局部变量表)表达式)如定义一个加10的函数(defun add10(x)(setq x(+10 x)2.调用函数格式:(函数名变元)如(sqrt 4)(add10 3)(setq y(add10(+2 3)自定义函数(2)3.定义AutoCAD命令用defun C:函数可以定义AutoCAD命令,格式如下:(defun C:AutoCAD命令名(/局部变量表)表达式如定义通过矩形的对角点画矩形的命令,源代码如下:(defun C:rect(/p1 p2 p3 p4)(setq p1(getpoint“n 输入矩形的一个角点”)(setq p3(getcorner p1“n 输入矩形的另一个角点”)(setq p2(list(car p3)(cadr p1)(setq p4(list(car p1)(cadr p3)(command“pline”p1 p2 p3 p4“c”)自定义函数(3)4.递归调用函数:可以在一个函数的内部定义另一个函数,也可以递归地定义和调用函数如求阶乘(defun factorial(x)(if(=x 0)1 (*x(factorial(-x 1)流程控制(分支结构)1.分支结构 (1)cond(测试表达式1 结果表达式1)(测试表达式2 结果表达式2)该函数从第一个表起进行测试,若测试表达式成立,则返回结果表达式的值,否则计算下一个表。
如 (setq n(cond(=i 1)1)(=i 2)4)(a 1)(setq b 2);如果a1,则b=2 (if(a 1)(setq b 2)(setq b 3);如果a1,则b=2,否则 b=3流程控制(分支结构)3.(progn 表达式)将n个表达式组合成一个表达式,按顺序计算这n个表达式,并返回最后一个表达式的计算结果该函数主要用于if函数,利用progn同时执行n个表达式if(a 1)(progn(setq b 2)(print(list b c)(progn(setq b 4)(print(list b 4)(setq e b)流程控制(循环结构)(1)(repeat 整数n 表达式)重复执行n次对所有表达式的求值,并返回最后一次最后一个表达式的计算结果setq a 1 b 100)(repeat 10(setq a(+1 a)其他表达式(setq b(+10 b)流程控制(循环结构)(2)(while 测试式 表达式)若测试结果不为nil,则执行各表达式,直到测试结果为nil如(setq i 1 a 10)(while (=i 10)(setq a(+a 10)其他表达式 (setq i (1+i)LISP程序文件1.扩展名:.lsp,以 ASCII码文本格式保存。
在命令行提示下,可以直接输入表达式定义或调用LISP函数,但不便于保留或调试程序因此通常以文件形式实现函数的定义和调用在一个LISP文件中,可以定义多个函数或命令程序中的注释1.整行或后半行注释 分号“;”开头,到行尾为注释部分2.整段或行间注释以“;|”开头,以“|;”结尾如(setq tmode ;|此处添加注释此处添加注释|;(getvar“tile mode”)Visual LISP的基本操作1.进入VLISP 工具菜单AutoLISPVisual lISP 编辑器或是在命令行的提示下输入命令:vlide.2.切换到AutoCAD窗口 窗口激活AutoCAD Visual Lisp集成开发环境1.菜单栏:(1)文件 菜单(2)编辑菜单(3)搜索菜单(4)视图菜单(5)工程菜单(6)调试菜单:设置断点或查看变量的状态等(7)工具菜单:设置文本代码的格式、窗口属性、设计开发环境等(8)窗口菜单:控制窗口的显示模式(9)帮助菜单:帮助Lisp环境下加载、执行AutoLisp程序1.加载AutoLisp程序(1)启动Visual Lisp集成开发环境 工具/AutoLisp/Visual Lisp编辑器(2)编辑新程序或打开已有的AutoLisp程序 新建文件(3)编写Lisp程序(4)工具菜单/检查编辑器中的文字 检查文字是否有语法错误(5)工具栏/加载活动编辑窗口或工具菜单/编辑器中的文字。
调试LISP程序1.启动Visual LISP2.设置其格式并输入程序代码3.保存程序4.加载、运行程序5.设置断点6.单步执行程序 (下一嵌套表达式)7.跟踪变量,通过监视窗口添加跟踪变量,观察变量的值9.跟踪表达式的运行结果:监视最新结果利用控制台窗口执行LISP程序 在控制台窗口中可以直接运行已加载的LISP程序中的函数,方法如下:$(函数名 参数1 参数2)应用实例1:画矩形l(defun c:rect1(/p1 p2 p3 p4)l (setq p1(getpoint n 请输入矩形的一个角点:)l (setq p3(getcorner p1 n 请输入矩形的另一个角点:)l (setq p2(list(car p3)(cadr p1)l (setq p4(list(car p1)(cadr p3)l (command pline p1 p2 p3 p4 c)l )应用实例2:画旋转矩形l(defun c:rect2()l (setq p1(getpoint n 请输入矩形的一个角点:)l (setq w(getdist p1 n 请输入矩形的长:)l (setq h(getdist p1 n 请输入矩形的宽:)l (setq alf(getangle p1 n 请输入矩形的旋转角:)l ;交互方式输入各个参数l (setq p2(polar p1 alf w)l (setq p3(polar p2(+alf(*0.5 pi)h)l (setq p4(polar p1(+alf(*0.5 pi)h)l (command pline p1 p2 p3 p4 c)l )应用实例3:画棱形l(defun c:lingxing()l (setq p1(getpoint 输入菱形的一个角点:)l (setqalf(getangle p1 输入菱角:)l (setql(getdist p1 输入菱长:)l (setqp2(polar p1(*0.5(-pi alf)l)l p3(polar p2(*0.5(+alf pi)l)l p4(polar p1(*0.5(+alf pi)l)l )l (command pline p1 p2 p3 p4 c)l (princ)l)应用实例4:画垫片l(defun c:screw()l (setq p(getpoint n输入圆角矩形的中心点P)l (setq R(getpoint n输入圆角矩形的圆角半径R:)l (setq L1(getdist n输入螺钉孔的水平间距l1:)l (setq L2(getdist n输入圆角矩形的长度l2:)l (setq W1(getdist n输入螺钉孔的垂直间距w1:)l (setq W2(getdist n输入圆角矩形的宽w2:)l。












