【文档说明】AutoLisp程序设计教程解析.ppt,共(57)页,196.502 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2170.html
以下为本文档部分文字说明:
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和Gr
anite等,稳定性好,但成本高。(3)完全自主版权的开发,如C++等结合OpenGL进行开发。AutoCAD的二次开发(VisualLisp程序设计)AutoCAD的显著特点之一是它不仅具有强大的图形绘制与编辑功能,而且体系结构开放
,允许用户对其进行定制与开发。可针对工程领域的特殊应用问题,开发一个既有计算分析功能和专用的工程图形数据库,又有强大图形处理功能的CAD应用系统。VisualLisp简介(1)Lisp语言是人工智能领域中广泛采用的一种程序设计语言。AutoLisp程序和autoCAD的绘图命令可
以透明的结合起来,使设计和绘图完全融为一体。还可以实现对AutoCAD图形数据直接访问、修改,为实现对图形的实时修改、交互设计、参数化设计以及在绘图领域中应用人工智能提供了必要的条件。是一种人工智能绘图语言
。VisualLisp简介(2)AutoLISP程序由注释和表达式组成。与其他的高级语言不同的是,它的注释用;来表示。而表达式用的是前缀表示法,即把运算符放在表的第一个元素位置,后面才是其他参数。表达式一般是通过调用函数来执行。变量(1)1.符号:用来作为变
量、函数的名字。符号可包含数据和字符((、)、.、‘、“、;除外)。符号的长度最好不要超过6个字符。2.变量的数据类型:不需对变量事先进行类型说明,变量被赋值时,值的类型就是变量的类型。在程序运行过程中,同一变量在不同的时
刻可以赋予不同类型的值。3.赋值:(setq变量1值1[变量2值2……])表达式(1)表达式相当于程序的语句,主要是由原子或表构成的。1.以表的形式存在的表达式格式:(函数名[变元]……)2.前缀表示法:将函数名放在所有的操作数之前:如x=(a+
b)*c用Lisp表示为:(setqx(*(+ab)c)),相当于说运算符也属于函数。表达式(2)3.表达式的求值过程在Lisp语言中,函数之间不存在优先关系,运算的先后顺序只能通过表的层次来实现,最里层的
表最先被求值,再传给外层的表,直到求值完毕。表达式(3)4.表达式的求值规则(1)整型数、实型数、字符串,以它们本身的值作为求值结果(2)符号以它们当前的约束值作为求值结果(3)表是根据其第一个元素来进行计算的。其中quote函数表
示直接引用,可用单号来表示。如(setqp1(quote(2510)))可写成:(setqp1’(2510))常用内部函数(1)1.计算函数(+nm)、(-nm)、(*nm)、(/nm)(1+m)、(1-m)、(sqrtm)2.关系运算函数(=nm)(/=nm)(<nm)(>
=nm)3.逻辑运算函数(and表达式1表达式2……)(or表达式1表达式2……)(not(项))常用内部函数(2)4.赋值函数(setq<符号1><表达式1>……)5.引用函数(quote<表达式>)或简写成(‘<表达式>)6.转换函数(itoa<整
数>):整数转换为字符串(atoi<字符串>):字符串转换为整数(atof<字符串>):字符串转换为浮点数常用内部函数(3)7.字符串处理函数(strcat<字符串1><字符串2>):将字符串按顺序连结成一个新字符串(substr<字符串><开始><长度>):从开始处截取某长度的字符
串。(strlen<字符串>):求字符串的长度。常用内部函数(4)8.求值函数(distance<点1><点2>):两点之间的距离(polar<点><角度><距离>):以相对极坐标方式返回另一个点(angle<点1><点2>):返回两点连线与X轴正向夹角(osnap<点>
字符串):返回以点来指定对象的捕捉点(car<点或表>):返回第一个元素(cdr<点或表>):返回除第一个元素外内容的表常用内部函数(5)9.主要的交互输入函数(1)(getangle[pt][msg]):等待用户输入角度(2)(getcorner[pt][msg]):等待用户输入一个
角点(3)(getdist[pt][msg]):等待用户输入一个距离(4)(getpoint[pt][msg]):等待用户输入一个点常用内部函数(5)9.command函数:执行AutoCAD标准命令利用command函数
AutoLISP几乎可以调用CAD里的全部命令。格式:(command“AutoCAD命令”“命令所需的数据”……)如画圆:(command“circle”“2,4”5)如直线:(command“line”“100,120””23,1
16”””):调用line、pline、layer时以“”结尾,等效于按一次空格键。自定义函数(1)1.定义函数格式:(defun函数名(变量表/局部变量表)表达式……)如定义一个加10的函数(defunadd10(x)(s
etqx(+10x))2.调用函数格式:(函数名[变元]……)如(sqrt4)(add103)(setqy(add10(+23))自定义函数(2)3.定义AutoCAD命令用defunC:函数可以定义AutoCAD命令,格式如下:(defunC:AutoCAD命令名(/
局部变量表)表达式……如定义通过矩形的对角点画矩形的命令,源代码如下:(defunC:rect(/p1p2p3p4)(setqp1(getpoint“\n输入矩形的一个角点”))(setqp3(getcornerp1“\n输入矩形的另
一个角点”))(setqp2(list(carp3)(cadrp1))(setqp4(list(carp1)(cadrp3)))(command“pline”p1p2p3p4“c”))自定义函数(3)4.递归调用函数:可以在一个函数的内部定义另一个函数,也可以递归地
定义和调用函数如求阶乘(defunfactorial(x)(if(=x0)1(*x(factorial(-x1)))))流程控制(分支结构)1.分支结构(1)cond(测试表达式1结果表达式1)[(测试表达式
2结果表达式2)]……)该函数从第一个表起进行测试,若测试表达式成立,则返回结果表达式的值,否则计算下一个表。如(setqn(cond((<=i1)1)((<=i2)4)((<=i3)10)(t100)))流程控制(分支结构)(2)(if测试条件表达式表达式1[表达式2])如果测试表达式
结果为真,则执行表达式1,否则执行表达式2。如(if(>a1)(setqb2);如果a>1,则b=2(if(>a1)(setqb2)(setqb3);如果a>1,则b=2,否则b=3流程控制(分支结构)3.(progn表达式……)将n个表达式组合成一个
表达式,按顺序计算这n个表达式,并返回最后一个表达式的计算结果。该函数主要用于if函数,利用progn同时执行n个表达式。(if(>a1)(progn(setqb2)(print(listbc)))(progn(setqb4)(print(listb4))(se
tqeb)))流程控制(循环结构)(1)(repeat整数n表达式……)重复执行n次对所有表达式的求值,并返回最后一次最后一个表达式的计算结果。(setqa1b100)(repeat10(setqa(+1a))其他表达式……(setqb
(+10b)))流程控制(循环结构)(2)(while测试式表达式……)若测试结果不为nil,则执行各表达式,直到测试结果为nil。如(setqi1a10)(while(<=i10)(setqa(+a10))其他表达式……(s
etqi(1+i))LISP程序文件1.扩展名:.lsp,以ASCII码文本格式保存。在命令行提示下,可以直接输入表达式定义或调用LISP函数,但不便于保留或调试程序。因此通常以文件形式实现函数的定义和调用。在一个LISP文
件中,可以定义多个函数或命令。程序中的注释1.整行或后半行注释分号“;”开头,到行尾为注释部分。2.整段或行间注释以“;|”开头,以“|;”结尾。如(setqtmode;|此处添加注释|;(getvar“tilemode”)
)VisualLISP的基本操作1.进入VLISP工具菜单\AutoLISP\VisuallISP编辑器或是在命令行的提示下输入命令:vlide.2.切换到AutoCAD窗口窗口\激活AutoCADVisualLisp集成开发环境
1.菜单栏:(1)文件菜单(2)编辑菜单(3)搜索菜单(4)视图菜单(5)工程菜单(6)调试菜单:设置断点或查看变量的状态等(7)工具菜单:设置文本代码的格式、窗口属性、设计开发环境等(8)窗口菜单:
控制窗口的显示模式(9)帮助菜单:在线帮助Lisp环境下加载、执行AutoLisp程序1.加载AutoLisp程序(1)启动VisualLisp集成开发环境工具/AutoLisp/VisualLisp编辑器(2)编辑新程序或打开已有的AutoLisp程序新建文件(3)编写Lisp
程序(4)工具菜单/检查编辑器中的文字检查文字是否有语法错误(5)工具栏/加载活动编辑窗口或工具菜单/编辑器中的文字。调试LISP程序1.启动VisualLISP2.设置其格式并输入程序代码3.保存程序4.加载、运行程序5.设置断点6.单步执行程序(下一嵌套表达式)7.跟踪变量,通过监视窗口添加
跟踪变量,观察变量的值9.跟踪表达式的运行结果:监视最新结果。利用控制台窗口执行LISP程序在控制台窗口中可以直接运行已加载的LISP程序中的函数,方法如下:$(函数名参数1参数2……)应用实例1:画矩形⚫(
defunc:rect1(/p1p2p3p4)⚫(setqp1(getpoint"\n请输入矩形的一个角点:"))⚫(setqp3(getcornerp1"\n请输入矩形的另一个角点:"))⚫(setqp2(list(carp3)(cadrp1)))⚫(setqp4(list
(carp1)(cadrp3)))⚫(command"pline"p1p2p3p4"c")⚫)应用实例2:画旋转矩形⚫(defunc:rect2()⚫(setqp1(getpoint"\n请输入矩形的一个角点:"))⚫(setqw(getdistp1"\n请输入矩形的长:"))
⚫(setqh(getdistp1"\n请输入矩形的宽:"))⚫(setqalf(getanglep1"\n请输入矩形的旋转角:"))⚫;交互方式输入各个参数⚫(setqp2(polarp1alfw))⚫(s
etqp3(polarp2(+alf(*0.5pi))h))⚫(setqp4(polarp1(+alf(*0.5pi))h))⚫(command"pline"p1p2p3p4"c")⚫)应用实例3:画棱形⚫(defunc:lingxing()⚫(setqp1(getpoin
t"输入菱形的一个角点:"))⚫(setqalf(getanglep1"输入菱角:"))⚫(setql(getdistp1"输入菱长:"))⚫(setqp2(polarp1(*0.5(-pialf))l)⚫p3(po
larp2(*0.5(+alfpi))l)⚫p4(polarp1(*0.5(+alfpi))l)⚫)⚫(command"pline"p1p2p3p4"c")⚫(princ)⚫)应用实例4:画垫片⚫(defunc:screw()⚫(setqp(getpoin
t"\n输入圆角矩形的中心点P"))⚫(setqR(getpoint"\n输入圆角矩形的圆角半径R:"))⚫(setqL1(getdist"\n输入螺钉孔的水平间距l1:"))⚫(setqL2(getdist"\n输入圆角矩
形的长度l2:"))⚫(setqW1(getdist"\n输入螺钉孔的垂直间距w1:"))⚫(setqW2(getdist"\n输入圆角矩形的宽w2:"))⚫(setqd1(getdist"\n输入大圆直径d1:"))⚫(setqd2(getdist"\n输入小圆直径d2:"))⚫(com
mand"ucs"p"")⚫(setqa(/L12)b(/W12))⚫(setqp1(listab))⚫(command"circle"p(/d12))⚫(command"circle"p1(/d22))⚫(setqa(-(carp1)l2)b(-(cadrp1)w2))⚫(set
qp2(listab))⚫(command"rectang""F"Rp1p2)⚫)CAD环境下加载和卸载LISP文件1.加载load(1)command:(load“驱动器:\\路径\\文件名”)(2)工具菜单/加载应用程序(
3)间接自动加载:将LISP文件的文件名及路径追加到AutoCAD2002\support\Acad2002Doc.lsp文件的后面2.卸载unload(1)command:(unload“驱动器:\\路径\\文件名”)(2)工具菜单/加载应用程序CAD环境下运行LISP函数在AutoCAD环境
中加载了LISP程序后就可以运行程序中定义的函数了。运行方法有两种:(1)如果LISP函数在LISP程序中以“defunc:函数名”的格式来定义的话,加载该程序后,程序中定义的函数可以作为AutoCAD的命令
来使用(2)如果要运行的LISP函数是其LISP的内部函数或在LISP程序中以“defun函数名”的格式来定义的话,加载该程序后,在CAD命令行提示下用括号括起来的函数名后回车才会执行该函数。如(函数名参数1参数2……)构造应用程序(1)将LISP源代
码编译为可执行程序后再加载执行,可以提高执行的速度及对源代码保密。可vlisp-compile及“文件”菜单/“生成应用程序向导”将Lisp文件编译成应用程序。(1)通过vlisp_complie函数编译单个文
件,格式(vlisp-compile‘mode“filename”[out-filename])如:(vlisp-compile‘st“d:/user/sample.lsp”)构造应用程序(2)(2)加载已编译的程序
在LISP控制台窗口中加载已编译的程序:(load“d:/user1/sample.fas”)或文件菜单下的加载文件/加载LISP文件(3)运行已编译的程序在LISP控制台窗口中输入用括号括起来的函数名,即可运行该函数。使用OpenGL进行CAD系统开
发OpenGL的前身是SGI公司为其图形工作站开发的IRISGL。1992年7月,SGI公司发布了OpenGL的1.0版本。OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。简介⚫OpenGL(OpenGraphics
Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。⚫OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、
Linux、MacOS、OS/2之间进行移植。⚫这个接口由近二百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。在电子游戏工业里,它是颇普遍的,而另一种编程接口系统是仅用于MicrosoftWindows上的Direct3D。⚫OpenG
L常用于CAD、虚拟实境、科学视觉化程序和电子游戏开发。OpenGL基本功能⚫模型绘制⚫模型观察⚫颜色模式的指定⚫光照应用⚫图象效果增强⚫位图和图象处理⚫纹理映射⚫实时动画⚫交互技术GL的平台⚫基于OpenGL标
准开发的应用程序必须运行于32位Windows平台下,如WindowsNT或Windows95以上环境;而且运行时还需有动态接库OpenGL32.DLL、Glu32.DLL,一般在…\WINDOWS\system32里面(注:window2000以上系统均带有OPENGL32.DLL和glu3
2.dll)⚫一般来说,VC6和VS.NET里面就带有GL的基本库–VC6:…\MicrosoftVisualStudio\VC98\Include\GL–VS.NET.2005:…\MicrosoftV
isualStudio8\VC\PlatformSDK\Include\gl–一般是Gl.h,Glaux.h,Glu.h–Lib里也有:OpenGL32.lib,GLu32.lib,GLaux.lib⚫所
以开发者在VC下可以使用–#include<gl\gl.h>//HeaderFileForTheOpenGL32Library–#include<gl\glu.h>//HeaderFileForTheGLu32Library–#include
<gl\glaux.h>//HeaderFileForTheGlauxLibrary实用工具包GLUT⚫GLUT(OpenGLUtilityToolkit)⚫安装:在windows下通过C/C++语言编写GLUT程序,你需要以下三个文件:–GLUT.H-你需要
在你的源代码中包含这个文件。通常情况下,这个文件应该放在你系统的包含目录下的GL文件夹中。–GLUT.LIB(SGIwindows版本)以及glut32.lib(微软版本)-这个文件必须被连接到你的程序中,确保它放在LIB目录中。–g
lut32.dll(Windows)和glut.dll(SGIWindows版本)-根据你所使用的OpenGL选择一个,如果你正在使用微软公司的版本,那么你必须选择glut32.dll。你应该把DLL放置在你的系
统文件夹中。⚫举例:在windowXP下使用VC6安装GLUT–下载glutdlls并解压–复制glut32.dll和glut.dll到…\windows\system32–复制glut.h到...\MicrosoftVisualStudio\VC98\In
clude\GL–复制glut32.lib和glut.lib到…\MicrosoftVisualStudio\VC98\LibOpenGL的一些命名规则⚫所有OpenGL函数采用了以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>库前缀有gl、glu、aux、glut、wgl、
glx等等,分别表示该函数属于OpenGL某开发库等,从函数名后面中还可以看出需要多少个参数以及参数的类型。有的函数参数类型后缀前带有数字2、3、4。2代表二维,3代表三维,4代表alpha值(以后介绍)。有些OpenGL函数最后带一个字母v,表示函数参数可用一个指针指向一个向量
(或数组)来替代一系列单个参数值。如voidglBegin(GLenummode);⚫glColor3f(1.0,0.0,0.0);OpenGL的库函数⚫1、核心库,包含最基本的函数,前缀是gl;用于常规的、核心的图形处理。⚫(1)绘制基本几何图元的函数。如glBegain
()、glEnd()、glNormal*()、glVertex*()。⚫(2)矩阵操作、几何变换和投影变换的函数。⚫(3)颜色、光照和材质的函数。如设置颜色模式函数glColor*()、glIndex*()。⚫(4)显示列表函数,纹理映射函数,特殊效果函数,光栅化、象素操作
函数,选择与反馈函数,曲线与曲面的绘制函数,状态设置与查询函数。OpenGL的库函数⚫2、实用库(OpenGLutilitylibrary),包含的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等前缀为glu。Glu函数通过调用核心库的函数,为开发者提供相对简单的用
法,实现一些较为复杂的操作。⚫如辅助纹理贴图函数,坐标转换和投影变换函数,多边形镶嵌工具,二次曲面绘制工具,非均匀有理B样条绘制工具OpenGL的库函数⚫3、OpenGL辅助库(OpenGLauxiliary期而至library,GLAUX)
,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,前缀为aux。⚫如窗口初始化和退出函数:auxInitDisplayMode()和auxInitPosition()。,窗口处理和时间输入函
数,窗口处理和时间输入函数,三维物体绘制函数:网状体和实心体,如长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四面体auxWire
Tetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶auxWireTeapot()。绘制实心体只要将上述函数中的确"Wire"更换成"
Solid"就可以了。OpenGL的库函数⚫4、OpenGL工具库(penGLUtilityToolkit)⚫(1)窗口操作函数,如:glutInit()glutInitDisplayMode()、glutInitWindowSize()glutInitWind
owPosition()等。(2)回调函数,如响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc()、glutPostRedisplay()、glutReshapeFunc()、glutT
imerFunc()、glutKeyboardFunc()、glutMouseFunc()。(3)创建复杂的三维物体。这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。(4)菜单函数创建添加菜单的函数Glu
tCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu()。(5)程序运行函数。glutMainLoop()
。#include<GL/glut.h>voidrenderScene(void){//绘制一个简单的二维的三角形glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glVertex3f(-0.5,-0.
5,0.0);glVertex3f(0.5,0.0,0.0);glVertex3f(0.0,0.5,0.0);glEnd();glFlush();}voidmain(intargc,char**argv
){glutInit(&argc,argv);//初始化glutglutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);//设置窗口的模式-深度缓存,单缓存,颜色模型glutInitWindowPosition(100,100);//
设置窗口的位置glutInitWindowSize(320,320);//设置窗口的大小glutCreateWindow(“3DTech-GLUTTutorial”);//创建窗口并赋予titleglutDisplayF
unc(renderScene);//调用renderScene把绘制传送到窗口glutMainLoop();//进入循环等待}OpneGL动画实例⚫#include<GL/glut.h>⚫floatang
le=0.0;⚫voidchangeSize(intw,inth){⚫if(h==0)h=1;⚫floatratio=1.0*w/h;⚫glMatrixMode(GL_PROJECTION);⚫glLoadIdentity();⚫glViewport(0,0,w,h);⚫gluPers
pective(45,ratio,1,1000);⚫glMatrixMode(GL_MODELVIEW);⚫glLoadIdentity();⚫gluLookAt(0.0,0.0,5.0,⚫0.0,0.0,-1.0,
⚫0.0f,1.0f,0.0f);⚫}⚫voidrenderScene(void){⚫glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);⚫glPushMatrix();⚫glRotat
ef(angle,0.0,1.0,0.0);⚫glBegin(GL_TRIANGLES);⚫glVertex3f(-0.5,-0.5,0.0);⚫glVertex3f(0.5,0.0,0.0);⚫glVertex3f(0.0,0.5,0.0);⚫glEnd();⚫glPopMatrix();⚫
angle++;⚫glutSwapBuffers();⚫}⚫voidmain(intargc,char**argv){⚫glutInit(&argc,argv);⚫glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|G
LUT_RGBA);//设为双缓冲区,//平滑动画需要⚫glutInitWindowPosition(100,100);⚫glutInitWindowSize(320,320);⚫glutCreateWi
ndow("Lighthouse3D-GLUTTutorial");⚫glutDisplayFunc(renderScene);⚫glutIdleFunc(renderScene);//registerac
allbackfunctiontobecalledwhentheapplicationisidle⚫glutReshapeFunc(changeSize);//Preparingthewindowforareshape⚫glutMainLoop();⚫}OpenGL参考⚫web:–OpenGL
官方主页:http://www.opengl.org–OpenGL2.1Reference:http://www.opengl.org/sdk/docs/man–GLUT:http://www.opengl.org/r
esources/libraries/glut/–NEHE的在线GL教程:http://nehe.gamedev.net⚫specification:–TheOpenGLUtilityToolkit(GLUT)ProgrammingInterface(PDF)–OpenGL
2.1specification(PDF)⚫book:–OpenGL编程指南(四版)(中文),人民邮电出版社–OpenGLShadingLanguageC++中Windows图形编程基础Windows下的图形编程是与硬件无关
的,编程者首先在一个逻辑设备(DC)上实现图形的绘制,然后通过Windows系统提供的一个标准接口(GDI)与设备驱动程序打交道,最后,设备驱动程序在具体的图形设备上将图形实现。6.2.3使用VC++实现图形绘制VC++将所有的Win32API函数封装在MFC中,将设备环境DC封装在C
DC基类中,将GDI封装在CGdiObject基类中。类的成员函数名与相应的Win32API函数名一样,但有些函数的参数数量可能会有所变化。图形交换文件(1)图形交换文件可实现不同语言编写的程序与AutoCAD系统的连接。图形交换文件主要有三种:(1).D
XF:专门格式的ASCII码文本文件,易于为其它程序处理,主要实现高级语言程序与AutoCAD系统连接。(2).DXB:专门格式的二进制文件。是面向具有CAD/camera软件包的用户用某些程序通过外部功能执行的。(3).IG
S:按美国国家标准IGES所规定格式的ASCII码文本文件。图形交换文件(2)4.STEP中性文件采用EXPRESS语言来描述三维建模过程中所生成的三维形体的全部几何和拓朴信息,以及配置信息。为了进行有限元单元的自动剖分,首先需将EXPRESS语言所表达的全部实体信息,转换为某一高
级语言的内存信息。如转换成面向对象C++语言。