
CAD二次开发教程(AUTOLISP).ppt
26页单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,Cad,二次开发,-AUTOLISP,入门,一、,LISP,编程语言概述,AutoLISP,是由,Autodesk,公司开发的一种,LISP,程序语言(,LISP,是,List,Processor,的缩写)第一篇关于,LISP,的参考文献是由,John McCarthy,在,1960,年,4,月的,ACM,通讯,中发表的除了,FORTRAN,和,COBOL,,大多数在六十年代早期开发出来的语言都过时了,可是,LISP,却生下来,并且已经成为人工智能(,AI,)的首选 程序序言AutoLISP,解释程序位于,AutoCAD,软件包中,然而,AutoCAD R2.17,及更低版本中并不包含,AutoLISP,解释程序,这样,只有通过,AutoCAD,2.18,及更高版本才可以使用,AutoLISP,语言AutoCAD,软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供例如,,AutoCAD,中没有在图形文本对象内绘制矩形及作全局改变的命令。
通过,AutoLISP,,你可以使用,AutoLISP,程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序事实上,可以用,AutoLISP,编制任,何,程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率二、基本语法,1,、一个表达式必须使用配对的括号2,、数学运算,1.,加法,格式,(+num1 num2 num3.),此函数()计算加号()右边所有数字的和,(+num1 num2 num3.),2.,减法,格式,(-num1 num2 num3.,),此函数()从第一个数中减去第二个数(,num1-num2,),4.,除法,格式(,/num1 num2 num3,),此函数()用第一个数除以第二个数如果多于两个数,就用第一个数除以其后所有数的乘积,num1/,(,num2 num3,.,),3,、关系表达式,1.,等于,格式(,=atom1 atom2,),该函数(,=,)检查两个元素是否相等若相等,条件为真,函数返回同样,若指定的元素不相等,条件为假,函数返回,nil,2.,不等于,格式(,=atom1 atom2,),该函数(,=,)检查两个元素是否不相等若不相等,条件为真,函数返回。
同样,若指定的元素相等,条件为假,函数返回,nil,3.,小于,格式(,atom1 atom2,),该函数()检查第一个元素(,atom,)是否小于第个元素(,atom,)若为真,函数返回,否则返回,nil,4.,小于等于,格式,(,=atom1 atom2.,),该函数,(=),检查第一个元素(,atom1,)的值是否大于等于第二个元素(,atom2,)若是,函数返回,否则返回,nil,三、基本函数,1.defun,函数,defun,函数用于在,AutoLISP,程序中定义函数,其格式为:,(defun name,argument,),其中,name,函数名,argument,参数列表,示例:,(defun ADNUM,(),定义了一个函数,ADNUM,,此函数无参数,也无局部变量(,Local,symbols,)这就意味着程序中用到所有变量均为全局变量全局变量的值在程序结束时不会丢失defun ADNUM(,b c),,定义了一个含有三个参数、和,c,的函数,ADNUM,变量、从程序外部获取它们的值defun ADNUM,(,/,),定义了一个含有两个局部变量和的函数,ADNUM,。
局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用defun,:,ADNUM,(),在函数名前加上:后,此函数就可以通,过在,AutoCAD,的,Command,:提示符后输入其函数名来执行如果没有使用:,函数名则必须置于圆括号中注意,AutoLISP,包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些,AutoLISP,内置函数的保留名称列表2.setq,函数,setq,函数用于给变量赋值,其格式如下:,(,setq name value,Name value,),其中,Name,变量名,value,赋予变量的值,赋予变量的值可以是任何表达式,(,数字表达式,字符串表达式或既含有字母又含有数字的表达式,),若该值为字符串,其长度不可超过,100,个字符Command,:(,setq,12,),Command,:(,setq,8.5,12,),3,、,Command,函数,Command,函数用于在,AutoLISP,程序内部执行标准的,AutoCAD,命令AutoCAD,命令名及命令选项必须置于双引号内Command,函数的格式为:,(,Command,“,Commandname,”,),其中,Command,AutoLISP,函数,Commandname,AutoCAD,命令,示例:,(,Command,“,line,”,Pt1 Pt2,“”,),“,line,”,AutoCAD,命令,Pt1,第一点,Pt2,第二点,“”,用于返回,相当于,“,回车,”,键,4.getpoint,函数,getpoint,函数暂停程序的运行,允许用户输入一个点的、坐标或、坐标。
该点的坐标可以由键盘或使用屏幕光标输入getpoint,函数的格式为:,(,getPoint,Point,Prompt,),其中,point,输入一个点,或选择一个点,prompt,将显示在屏幕上的提示,示例:,(,setq Pt1,(,getpoint,),(,setq Pt1,(,getPoint,“,选择第一点,”,),有上面几个函数就可以开始编程了:,例,1,编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如三角形本例中,程序的输入为三个点的坐标,期望的输出为一个三角形用以生成该三角形的处理过程为:由,P1,到,P2,、由,P2,到,P3,、到,P3,到,P1,各画一条直线弄清这三部分就会使编程过程更清晰该程序提示输入三点,,1,;,提示选取点进可以是在屏幕上点取,也可以是输入坐标,2,;,程序将依此三点画出一个三角形,3,4,(defun,:,triang1(),5,(,setq P1,(,getPoint,“,选择第一点:,”,),6,(,setq,2,(,getPoint,“,选择第二点:,”,7,(,setq,3,(,getPoint,“,选择第三点:,”,),8,(,Command,“,line,”,P1 P2 P3,“,”,),9,),10,说明,第,1,3,行,前三行为注释行,用于描述程序中的函数。
这几行很重要因为有它们,编辑程序会变得简单一些可以在任何必要的时候使用注释所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略第,4,行:行为空行,用于分隔程序与注释部分空行还可以用来分隔程序的不同模块这样便于区分程序的不同部分空行对程序没有影响第,5,行:(,defun C:triang1(),本行中,,defun,为一个,AutoLISP,函数,它定义了函数,TRIANG1,TRIANG1,为该函数的函数名由于此函数名前带有:,因此该函数可以像,AutoCAD,命令一样被执行若没有:,TRIANG1,命令只能置于圆括号中执行(,TRIANG1,)此函数带有三个全局变量(,P1,P2,,,P3,)第一次编写,AutoLISP,程序时,保持变量为全局变量是个好习惯这是因为装入并运行程序后,可以通过在,AutoCAD,命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(,Command,:!,P1,)一旦程序通过测试并运行正常,就应该使它们成为局部变量,(defun,:,TRIANG1,(,P1 P2 P3,),第,6,行:(,setq P1,(,getpoint,“,Enter first Point,triangle,:,),本行中,,getpoint,函数暂停程序的运行,允许用户输入三角形的第一个点。
提示信息,Enter first Point of,triangle,显示在屏幕的提示区内可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点随后,setq,函数将这些坐标赋予变量,P1,的作用是回车,其后的表达式将被打印在下一行上(,“,”,代表,“,),第行和第,8,行:(,setq,2,(,getpoint,“,Enter second Point of triangle,:,”,)及(,setq,3,(,getpoint,“,Enter third Point of triangle,:,”,),这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予,2,和,3,的作用是回车,因此输入提示显示在下一行中第,9,行:(,Command,“,line,”,P1 P2 P3,“,”,),本行中,,Command,函数用来输入,AutoCAD,的,line,命令,然后从,P1,到,P2,,,P2,到,P3,各画一条直线表示,“,”,选项)把最后一点,3,与第一点,P1,连接起来所有的,AutoCAD,命令及选项在,AutoLISP,程序中使用时都必须置于双引号内变量,P1,、,2.,3,之间用空格分隔。
第,10,行,本行仅包含一个用于表明函数,TRIANG1,定义完成的右括号该括号也可以写在上一行中把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束然而某些程序中,同一程序内的多个定义及模块需要明确区分开括号及空行有助于明确定义或程序段的起始和结束再增加几个函数,SSGET,格式:,(ssget sel-method pt1 pt2 pt-list filter-list),格式解释:,sel-method,:,字符串,指定对象选择方法,Pt1,pt2,选择方法相关的点,Pt-list,点表,filter-list,,过滤器,Sslength,用法:求出一个选择集中的对象(图元)数目,并将其作为一个整数返回,格式:,(sslength ss),格式说明:,ss,,选择集名称,Ssname,用法:提取选择集 中指定图元的图元名,格式:,(ssname ss index),格式说明:,ss,选择集名,,index:,整数,表示选择集的第几个图元,第一个是(,ssname ss 0),以此类推,Repeat,用法:对循环体中的每一个表达式进行指定次数的求值计算,格式:,(repeat int expr.),格式说明:,Int:,整数,表示 循环的次数,Expr:,表达式,所要进行循环的表达式,案例,1,:,凤凰城,J,区,测量队送来的地籍图门墩没有填充,门墩数量,808,个,但做小宗地图门墩必须用白色实心填充。
思路:构造算法,算法,1,、利用,CAD,本身的命令建立选择集逐个填充,算法,2,、利用图元组码生成填充,第一算法要简单一些,采用第一个,步骤:,1,、建立选择集,2,、提取单个图元用命令进行填充,(defun c:tch(/en n en_n),(setqen(ssget),;,建立选择集,n 0,;,初始化计数器,),(repeat(sslength en),;,进入循环,(setq en_n(ssname en n),;,提取图元名,n (1+n),;,计数器加,1,,为提取下一 选择对象做准备,),(command-bhatch p solid s en_n ),;,调入,CAD,命令,执行操作,),;,退出循环,),更高一层:图元组码,一、组码概述:,组码也就是,DXF,码,是以数据形式标记,CAD,图形的一种。












