AutoLISP 基础——认识自定义函数
AutoLISP 基础——认识自定义函数
2AutoLISP基本函数
;返回1.570796 ;返回-1.570796
二、AutoLISP 基本函数
▪ 讨论与练习 写出y x3 ax2 bx c的AutoLISP表达式
(Setq y (+ (expt x 3) (* a x x) (* b x) c))
写出x * y /(tgx a sin 2 y)的AutoLISP表达式
是整型数,实型数,表达式
(- <数1> <数2>…)返回第一个<数>与后面所有数的差
(* <数> <数>…) 返回所有<数>的乘积
(/ <数1> <数2> …)返回<数1>依次除以其他数后的商
(1+ <数>)
返回<数>有空格)
(1- <数>)
返回<数>减1后的值
(注意:1与-号之间不能有空格)
2、表达式求值规则:①整型数、实型数 和字符串其本身的值就是求值结果;② 表根据第一个元素进行求值
3、最好不要给AutoLISP一些内置函数名 及符号赋值。虽然是有效的,但保留符 号和函数将被重新定义
2.1 赋值与求值函数
▪ 2 再赋值函数
(set <变量> <表达式>)
功能:再赋值函数,给变量的值赋值的函数 格式:只能有两个参数,且对<变量><表达式>都要求值,
二AutoLISP 基本函数
▪ 引言
1 AutoLISP函数分为:系统内部函数和用户自定 义的外部函数
2 AutoLISP函数的调用:通过对标准表来实现, 一般格式: (函数名[参数1][参数2]…)
最新AutoLISP-函数大全资料
一、数学运算功能函数l(+ 数值数值…) 返回:累计实数或整数数值2(- 数值数值…) 返回:差值3(* 数值数值…) 返回:所有数值乘积4(/ 数值数值…) 返回:第一个数值除以第二个以后数值的商5(l+ 数值) 返回:数值+l6(1- 数值) 返回:数值-l7(abs 数值) 返回:数值的绝对值8(atan 数值) 返回:反正切值9(cos 角度) 返回:角度的余弦值,角度值为弧度10(exp 数值) 返回:数值的指数11(expt 底数指数) 返回:底数的指数值12(fix 数值) 返回:将数值转换为整数值13(float数值) 返回:将数值转换为实数值14(gcd 数值1 数值2) 返回:两数值的最大公因数15(log 数值) 返回:数值的自然对数值16(max 数值数值…) 返回:数值中的最大值17(min 数值数值…) 返回:数值中的最小值18 pi 常数∏,其值约为3.141592619(rem数值1数值2) 返回:M数值的相除的余数20(sin角度) 返回:角度的正旋值,角度值为弧度21(sqrt数值) 返回:数值的平方根二、检验与逻辑运算功能函数l(=表达式1表达式2) 比较表达式1是否等于式2,适用数值及字符串2(/=表达式1表达式2) 比较表达式1是否大于等于表达式23(<表达式1表达式2) 比较表达式1是否<小于表达式24(<=表达式1表达式2) 比较表达式1是否<一小于等于表达式25(>表达式1表达式2) 比较表达式1是否>大于表达式26(>=表达式1表达式2) 比较表达式1是否大于等于表达式27(~数值) 返回:数值的位not值,(1的补码)8(and表达式1表达式2…) 返回:逻辑and的结果9(boole函数整数整数…) 返回:位式布尔运算10(eq表达式1表达式2) 比较表达式1与表达式2是否相同,适用列表比较(实际相同)11(equal表达式1表达式2[差量])比较表达式1与表达式2是否相同,差量可省略(内容相同)三、转换运算功能函数l(angtof字符串[模式])返回:角度值的字符串转成实数2(angtos角度[模式[精度]])返回:角度转成的字符串值3(atof字符串)返回:字符串转成实数值4(atoi字符串)返回:字符串转成整数值5(cvunit数值原始单位转换单位)返回:数值转换单位后的值转换根据acad.nut文件6(distof字符串[模式])返回:根据模式将字符串转成实数值7(itoa整数)返回:整数转成字符串8(rtos数值模式[精度])返回:实数转成字符串9(trans点原位置新位置[位移])返回:转换坐标系统值四、列表处理功能函数1(append列表列表……)结合所有列表成一个列表2(assoc关键元素联合列表)根据关键元素找寻联合列表中关系信息3(car列表)返回列表中的第一个元素,通常用来求X坐标4(cadr列表)返回列表中的第二个元素,通常用来求y坐标5(caddr列表)返回列表中的第三个元素,通常用来求Z坐标6(cdr列表)返回:除去第一个元素后的列表7(cons新元素列表)返回:将新元素添加到列表8(foreach名称列表表达式)返回:将列表的每一元素对应至名称再根据表达式执行响应9(length列表)返回:列表内的元素数量10(list元素元素…)返回:将所有元素合并为一列表11(listp元素)返回:判断元素是否为一串12(mapcar函数列表1列表2…)返回:将列表1、列表2列表的元素配合函数,求得新列表13(member关键元素列表)返回:根据关键元素(含似后的列表14(nthn列表)返回:列表的第n个元素15(reverse列表)返回:将列表元素根据顺序颠倒过来的列表16(subst新项旧项列表)返回:替换新旧列表后的列表五、字符串、字符、文件处理函数l(ascii字符串)返回:字符串第一个字符的“ASCII”码2(chr整数)返回:整数所对应的ASCII单一字符串3(close文件名称)关闭文件4(open文件名模式)返回:打开文件代码,准备读取或写入信息5(read字符串)返回:列表中的字符串的第一组元素6(read-char[文件代码])返回:通过键盘或文件中读取单一字符7(read-line[文件代码])返回:经由键盘或文件中读取一行字符串8(strcase字符串[字样])返回:转换字符串大小写9(strcat字符串1字符串2…)返回:将各字符串合并为一个字符串10(strlen字符串)返回:字符串构成的字符数(即字符串长度)11(substr字符串起始长度)返回:取出于字符串‘12(wcmatch字符串格式)返回:T或nil,将字符串与通用字符进行比较13(write-char数值[文件代码])返回:将一ASCII字符写到文件或屏幕14(write-line字符串[文件代码])返回:将字符串写到文件或屏幕上六、等待输入功能函数l(getangle[基点][提示])请求输入十进制角度数值,响应一个弧度值提示及参考点可有可无2(getcorner基点[提示])请求输入另一矩形框对角点坐标3(getdist[基点][提示])请求输入一段距离4(getint[提示])请求输入一个整数值5(getkword[提示]请求输入“关键词”6(getorient[基点][提示])请求输入十进制角度,响应一弧度值不受angbase、angdir影响7(getPoint[基点][提示])请求输入一个点的坐标8(getreal[提示]请求输入一个实数9(getstring[提示])请求输入一个字符串10(initget[位]字符串)设定下次getxxx函数的有效输入七、几何运算功能函数7.l(angle点1点2)取得两点的角度弧度值7.2(distance点1点2)取得两点的距离7.3(inters点1点2点3点4[模式])取得两条线的交点7.4(osnap点模式字符串)按照捕捉模式取得另一坐标点7.5(polar基点弧度距离)按照极坐标法取得另一坐标点7.6(textbox对象列表)取得文字字符串的两个对角点坐标八、对象处理功能函数8.l(entdel对象名称)删除或取消删除对象8.2(entget对象名称[应用程序列表])取出对象名称的信息列表8.3(entlast)取出图形信息中的最后一个对象8.4(entmake对象列表)建立一个新的对象列表8.5(entmod对象列表)根据更新的信息列表更新屏幕上元体8.6(entnext[对象名称])找寻图面中的下一个对象8.7(entsel[提示])请求选取一个对象,响应包含对象名称及选点坐标的列表;8.8(entupd对象名称)更新屏幕上复元体图形8.9(handent图码)返回:图码的元体名称8.10(nentsel[提示])返回:BLOCK所含副元体对象信息列表8.11(nentselp[提示][点])返回:BLOCK所含副元体对象信息似4*4矩形表示)九、选择集、符号表处理函数9.l(ssadd[对象名称][选择集])将对象加入选择集或建立一新选择集9.2(ssdel对象名称选择集)将对象自选择集中移出9.3(ssget[模式][点1][点2]取得一个选择集9.4(ssget”X”[过滤列表])取得根据过滤列表所指定范围的选择集9.5(sslenth选择集)计算选择集的对象个数9.6(ssmemb对象名称选择集)响应对象名称是否包含于选择集内9.7(ssname选择集索引值)根据索引值取出选择集中的对象名称9.8(tblnext符号表名称[T])检视符号表,有效的符号表:”LAYER”、”LTYPE”、”VIEW”、”STYLE”、”BLOCK”9.9(tblsearch符号表名称符号)在符号表中搜寻符号十、AutoCAD相关查询、控制功能函数10.l(command”AutoCAD命令”…)超重量级函数,调用执行AutoCAD命令10.2(findfile文件名)返回:该文件名的路径及文件名10.3(getfiled标题内定档名扩展名旗号)通过标准AutoCAD文件对话DCL 对话框获得文件10.4(getenv”环境变量”)取得该环境变量的设定值,以字符串表示10.5(getvar”系统变量”)取得该系统变量的设定值,以字符串表示10.6(setvar”系统变量”值)设定该系统变量的值10.7(regapp应用类项)将目前的AutoCAD图形登记为一个应用程序名称十一、判断式、循环相关功能函数11.1(If<比较式><表达式1>[表达式2]检算比较式结果,如果为真,执行<表达式1>,否则执行<表达式2>11.2(repeat次数[<表达式><表达式>…])重复执行N次表达式11.3(While<比较式><表达式>…)当条件成立则执行表达式内容11.4(cond<比较式1><表达式1>多条件式的if整合功能<比较式2><表达式2><比较式3><表达式3>)11.5(prong表达式1表达式2…)连接其中的表达式为一组,常用于配合if、cond等函数十二、函数处理、定义、追踪与错误处理功能函数12.l(*error*字符串)程序错误时的警示信息12.2(alert字符串)以对话框式显示出警告字符串12.3(apply功能函数列表)将功能函数与列表结合后执行12.4(defun名称自变量列表表达式_.)自定函数或子程序12.5(eval表达式)返回:表达式的执行结果12.6(exit)强制退出目前的应用程序12.7(lambda自变量表达式)定义未命名的函数12.8(progn表达式1表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数12.9(quit)强制退出目前的应用程序12.10(tablet代码[列1列2列3方向])取用或建立对数字板的校调12.11(trace函数…)对函数设定追踪标记,辅助检错12.12(untrace函数…)对函数设定解除追踪标记十三、显示、打印控制功能函数l(gfaphscr)作图环境切换到图形画面2(grclear)暂时清除模前的屏幕画面3(grdraw起点终点颜色[亮显])暂时性的画出一条线4(grread[追踪])由输入设备读取追踪值5(grtext位置字符串[亮显])将字符串显示在状态列或屏幕菜单上6(grvecs向量列表[转置矩阵])暂时性的画出多条线7(menucmd字符串);提供在AlltOLISP中调用各菜单8(Prinl[表达式[文件代码]]将表达式打印于命令区或已打开的文件句柄字符则以“\”为前缀展开9(pinc[表达式[文件代码]]除句柄字符则不以”\”为前缀展外开其余同Prinl10(print[表达式[文件代码]]除表达式会往下一新行列出,及空一格外其余同prinl11(prompt信息)将信息显示于屏幕的命令区,并随后响应一个nil信息12(redraw[对象名称[模式]])重绘整张图或根据对象名称重绘该图形13(terpri)在屏幕上显示新列14(textscr)作图环境切换到文字画面15(textpage)清除文字画面文字类似DOS的cls命令16(vports)返回:窗口组态列表十四、符号、元素、表达式处理功能函数l(atom元素)如果元素不是列表,响应T,否则为nil2(atoms-family格式闲号列表])返回:一组己定义函数的符号列表3(boundp表达式)返回:T或nil,响应表达式是否有值存在4(minusp元素)返回:T或n儿元素是否为负值5(not元素)返回:T或n儿判定元素是否为ni16(null元素)返回:T或nil判定元素是否被赋予nil值7(numberp元素)返回:T或nil,元素是否为整数或实数8(quote表达式)响应表达式未检算前状态,同“‘”功能9(set符号表达式)将表达式结果设定给带单引号’符号10(setq符号1表达式1[符号2表达式2]…)设定表达式结果给各符号11(type元素)返回:元素的信息型态12(zerop元素)返回:T或nil,元素是否为0值十五、ADS、ARX、AutoLISP加载与卸载函数15.l(ads)返回:目前加载ADS程序列表15.2(arx)返回:目前加载ARX程序列表15.3(arxload应用程序[出错处理]))返回:加载ARX程序15.4(arxunload应用程序[出错处理]))返回:卸载ARX程序15.5(ver)返回:目前AutoLISP版本字符串15.6(loadLSP文件名[加载失败])加载AutoLISP文件(*.lsp) 15.7(xload应用程序[错处理])加载ADS应用程序15.8(xunloa应用程序[出错处理])卸载ADS应用程序十六、内存空间管理函数l(alloc数值)以节点数值设定区段大小2(expand数值)以区段数值配置节点空间3(gc)强制收回废内存4(mem)显示目前的内存使用状态5(xdroom对象名称)返回对象扩展信息允许使用的内存空间6(xdsize列表)返回对象扩展信息所占用的内存空间十七、其它重要的功能函数l(acad_colordlg颜色码旗号)显示出标准AutoCAD颜色选择对话框2(acad_helpdlg求助文件名主题)显示出标准AutoCAD求助对话框3(acad_strlsort字符串列表)作字符串列表排序4(bherrs)取得bhatch与bpcly失败所产生的错误信息5(bhatch点[选择集[向量]])根据Pickpoint选点方式调用bhatch命令,绘制选集区域的剖面线6(bpoly点[选择集[向量]])根据Pickpoint选点方式调用bpoly命令并产生一定域Polyline7(cal计算式字符串)执行如CAL计算功能十八、ADS、ARX外部定义的3D函数18.1(align自变量1自变量2....)执行如ALIGN命令各选项顺序18.2(c:3dsin模式3DS文件名)导入3DS文件18.3(C:3dsout模式3DS文件名)输出3DS文件18.4(c:background模式[选项])设定渲染背景18.5(C:fog模式[选项])设定渲染的雾效果18.6(C:light模式[选项])设定渲染的灯光控制18.7(c:lsedit模式【选项1】设定渲染的景物控制18.8(C:lslib模式[选项])管理景物图库18.9(c:matilb模式材质材质库名)管理材质数据库18.10(c:mirror3d自变量1自变量2……)执行如MIRROR3D命令18.11(C:psdrap模式)根据模式设定值(0或1),传唤psdrap命令18.12(C:psfill对象名称图案名称[自变量1[自变量2]])以POStSCript 图案填满18.13(c:psin文件名位置比例)插入一个Postscript(*.eps)文件18.14(c:render[渲染文件])执行渲染效果18.15(C:rfileopt格式自变量1自变量2自变量3…)设定执行渲染选项18.16(c:replay影像文件名影像类别[选项])展示影像文件TGA、BMP、TIF18.17(C:rmat模式选项)控管材质建立、贴附、编辑、分离18.18(c:rotate3d自变量1自变量2…)执行如ROTATE3D命令各选项顺序18.19(C:rpref模式选项[设定])渲染环境设定18.20(c:saveimg影像文件名影像类别[选项])储存图像文件TGA、BMP、TIF18.21(c:scene模式[选项])SCENE场景管理18.22(C:setuv模式选集自变量1自变量2…)SETUV贴图模式管理18.23(C:showmat自变量1)显示对象的材质贴附信息18.24(C:solprof自变量1自变量工..)建立3D实体的轮廓影像18.25(C:StatS[渲染信息文件])显示渲染信息统计信息十九、ADS、ARX外部定义的数据库相关函数19.l(c:aseadmin自变量1自变量2…)管理外部数据库19.2(c:aseexportt自变量1自变量2…)输出信息19.3(c:aselinks自变量1自变量2…)连接对象与信息19.4(c:aserow自变量1自变量2…)管理外部信息表格19.5(c:aseselect自变量1自变量2…)建立外部信息与对象选集19.6(c:asesqled自变量1自变量2…)执行SQL程序。
第5章 AutoLISP基本函数
第5章 AutoLISP基本函数函数是AutoLISP语言处理数据的基本工具,学习AutoLISP编程最主要的是要掌握AutoLISP语言系统内部函数和符号的基本用法。
如:函数的调用格式,即函数名、参数的个数及类型;函数的功能、求值情况及返回值类型等。
AutoLISP基本函数主要包括:数值函数、赋值与求值函数、表处理函数、字符串处理函数、逻辑运算函数和控制结构函数等。
5.1 数值函数数值函数用于处理整型数和实型数,数值函数包括:基本算术函数、三角函数、数据类型转换函数。
数值函数的返回值类型取决于参数表中参数的数据类型。
AutoLISP中数值计算要遵循整实原则,具体运算规则为:A.整整得整;B.实实得实;C.整实得实。
例:command: (/ 18 4 2) 返回: 2command: (* 4.5 2.0) 返回:9.0command: (+ 6 4.2) 返回:10.25.1.1 基本算数函数这类函数包括:+、-、*、/、1-、1+、abs、sqrt、min、max、expt、exp、log、gcd、rem 1) (+ 〈数〉〈数〉… )功能: 求表中所有整数或实数的和。
例如:Command:(+ 1.2 3.1 3.8)返回:8.12) (- 〈数〉〈数〉… )功能: 求表中第 1 个数减去后面所有数的差, 当表中只有一个数时, 返回这个数的相反数。
例如:Command:(- 8. 1 5)返回:3.1Command:(- 0.25)返回:-0.253) ( *〈数〉〈数〉… )功能: 求表中所有数的积, 例如:Command:( * 0.0174533 30)返回:0.5235994) (/ 〈数〉〈数〉… )功能: 求表中第1 个数除以后面所有数的商。
例如:cmnmand:(/ 10 5 2.0)返回:1.05) (1+ 〈数〉)功能: 求一个整数或实数加 1 的和。
例如:Command:(1+ 2.7)返回:3.76) (1- 〈数〉)功能: 求一个整数或实数减 1 的差。
AutoCAD二次开发实用教程第3章 AutoLISP基本函数
第3章 AutoLISP基本函数
3.1.1 计算函数 11.(LOG <数>) 该函数是EXP的反函数,返回值为<数>的自然对数值,其 数据类型为实型数。 例如:
(LOG (LOG (LOG (LOG
3) 返回1.098610 1) 返回0.00000 1.22) 返回0.198850 -90) 返回错误:没有为参数定义函数: -90
(ATAN -1.0) 返回-0.785398(弧度),即-45° 如果<数1>和<数2>都存在了,则返回<数1>/<数2>的反正切 值(单位为弧度)。 (ATAN 2.0 3.0) 返回值0.588002(弧度) (ATAN 2.0 -3.0) 返回值2.553590(弧度) (ATAN -2.0 3.0) 返回值-0.588002(弧度) (ATAN -2.0 -3.0) 返回值-2.553590(弧度)
第3章 AutoLISP基本函数
3.1.1 计算函数 5.(/ <数1> <数2>…) 本函数返回<数1>除以<数2>,再除以<数3>…依次做除法运 算的结果。如果仅提供了一个<数>,则返回<数>除以1的 结果。
各个<数>类型不同,计算结果不同,返回值类型也不同。 例如: (/ 9 2) 返回值4 (/ 9 2.0) 返回值4.5000 (/ 9 (/ 2 3)) error:divide by zero (/ 9 (/ 2.0 3)) 返回13.5000 (/ 4) 返回4 (相当于4÷1=4)
返回4.0700 返回9.0000 返回-1 返回9.0000 返回2.0
AUTO LISP函数参考
AUTO LISP函数参考1(10版本)以下为十年前纯手工录入的函数参考手册,以分享给爱好LISP这方面的朋友参考!AutoLISP提供了大量的预定义函数。
若将函数名(大小写都可)作为表中的第一个元素函数变元(若有的话)作为表中后面的元素,就可以调用那个函数。
本章按字母顺序列出AutoLISP所有基本函数。
用户会发现其中许多函数都是标准函数,可在LISP程序设计语言中找到。
还有一些函数是由 AutoCAD提供的且专用于交互图形环境。
1 FLATLAND 系统变量--与老版本的兼容性AutoLISP版本10支持AutoCAD的最新增强型三维图形功能,则时继续保证与AutoCAD老版本的兼容性。
FLATLAND系统变量就是用来控制该兼容性的。
当FLATLAND为零时,实现新三维功能;否则各函数操作与AutoLISP版本9的一样。
FLATLANDR的设置作用于下列AutoLISP函数:DISTANCE GRREAD POLARENTGET INITGET TBLNEXTGETDIST INTERS TBLSEARCHGETPOINT OSNAP在各函数说明中,已注明FLATLAND对上述函数起作用的方式。
2 ( + <数> <数> ...)这个函数返回所有<数>的总和。
其中的<数>可以是整型或实型的。
如果所有的<数>都是整数,其结果也是整数;如果其中有一个是实型的,那么其它整型数将转换为实型数结果将是实型数。
例如:(+ 1 2) returns 3(+ 1 2 3 4.5) returns 10.5(+ 1 2 3 4.0) returns 10.03 ( - <数> <数> ...)这个函数把第一个<数>减去第二个<数>,返回它们的差。
如果给定的<数>多于两个,那么将第一个<数>减去其后所有数之和,并返回最后的结果。
第三章AutoLISP的基本函数
• • • • • • • •
_$ (setq d 'c) C _$ (set d 2) 2 _$ c 2 _$ 注意:使用set函数时,符号的值不为符号出错。
• • • • • • • • • • • • • • •
_$ (setq d nil) nil _$ (set d 2) ; 错误: 参数类型错误: symbolp nil _$ 3.1.3禁止求值函数quote 等同于单引号(„),调用格式为(quote expr),例如 (quote (+ 6 5))等同 ‘(+ 6 5) 注意求值与不求值的区别 例如 $ (setq a '(+ 6 5)) (+ 6 5) _$ (setq a (+ 6 5)) 11 _$ 该函数在引用表中经常用到,例如
• • • • • •
_$ (last '(a b c)) C _$ (last '(2)) ;只有一个元素 2 _$ (last nil) nil
(nth n lst) 返回表的第 n 个元素,从零排序,其中n>=0,若n大于表的最大元 素号,返回nil。 • _$ (nth 2 '(a (a b) (c d) e)) • (C D) • _$ (nth 5 '(x y)) • nil 3.3.2表的构造与修改函数 5.
返回顶层第一个元素 一般性表 ls t为 点对 返回点对左元素 nil(空表) 返回nil
• • • • • • • • 2.
_$ (car '(x y z)) X _$ (car „((a b (c)) d 5)) (A B (C)) _$ (car '(0 . "LINE")) 0 _$ (car '()) nil (cdr lst)
C#自定义autolisp函数研究
C#自定义autolisp函数研究本人是lisp爱好者,初学C#对AutoCAD编程。
从教材上看到C#可以自定义autolisp函数。
教材例子:定义一个命名为DisplayFullName 的AutoLISP 函数。
虽然在 .NET 工程中定义的这个方法接收一个值,但是这个AutoLISP 函数期待两个字符串值以给出合适的输出。
加载 .NET 工程到AutoCAD 中。
预期运行效果如下:在命令提示中输入下列的命令:(displayfullname "First" "Last")下面是这个AutoLISP 函数执行后输出窗口中显示的:Name: First Last自定义代码如下:C#using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;[LispFunction("DisplayFullName")]public static void DisplayFullName(ResultBufferrbArgs){if (rbArgs != null)string strVal1 = "";string strVal2 = "";intnCnt = 0;foreach (TypedValuerb in rbArgs){if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text) {switch(nCnt){case 0:strVal1 = rb.Value.ToString();break;case 1:strVal2 = rb.Value.ToString();break;}nCnt = nCnt + 1;}}Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nName: " + strVal1 + " " + strVal2);}(注:本例子来自于《开发人员手册中文版》)我们看到这个例子中自定义的autolisp函数是(displayfullname),它接收两个字符串参数,没有返回参数。
第5章 AutoLISP基本函数
第5章 AutoLISP基本函数函数是AutoLISP语言处理数据的基本工具,学习AutoLISP编程最主要的是要掌握AutoLISP语言系统内部函数和符号的基本用法。
如:函数的调用格式,即函数名、参数的个数及类型;函数的功能、求值情况及返回值类型等。
AutoLISP基本函数主要包括:数值函数、赋值与求值函数、表处理函数、字符串处理函数、逻辑运算函数和控制结构函数等。
5.1 数值函数数值函数用于处理整型数和实型数,数值函数包括:基本算术函数、三角函数、数据类型转换函数。
数值函数的返回值类型取决于参数表中参数的数据类型。
AutoLISP中数值计算要遵循整实原则,具体运算规则为:A.整整得整;B.实实得实;C.整实得实。
例:command: (/ 18 4 2) 返回: 2command: (* 4.5 2.0) 返回:9.0command: (+ 6 4.2) 返回:10.25.1.1 基本算数函数这类函数包括:+、-、*、/、1-、1+、abs、sqrt、min、max、expt、exp、log、gcd、rem 1) (+ 〈数〉〈数〉… )功能: 求表中所有整数或实数的和。
例如:Command:(+ 1.2 3.1 3.8)返回:8.12) (- 〈数〉〈数〉… )功能: 求表中第 1 个数减去后面所有数的差, 当表中只有一个数时, 返回这个数的相反数。
例如:Command:(- 8. 1 5)返回:3.1Command:(- 0.25)返回:-0.253) ( *〈数〉〈数〉… )功能: 求表中所有数的积, 例如:Command:( * 0.0174533 30)返回:0.5235994) (/ 〈数〉〈数〉… )功能: 求表中第1 个数除以后面所有数的商。
例如:cmnmand:(/ 10 5 2.0)返回:1.05) (1+ 〈数〉)功能: 求一个整数或实数加 1 的和。
例如:Command:(1+ 2.7)返回:3.76) (1- 〈数〉)功能: 求一个整数或实数减 1 的差。
Autolisp基础教程
Autolisp基础教程ㄟAutolisp基础教程单元一:AutoLISP主角潇洒登场(setver “cmdecho” 0) 设定指令不相应(steq “filedia” 0)设定打开文件的时候不弹出窗口一. AutoLISP 是何方神圣?1、AutoLISP是AutoCAD的最佳拍檔!2、AutoLISP内含于AutoCAD软件内,不用另外花钱买!3、AutoLISP是强化AutoCAD最好、最直接的『程序语言』!4、AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能!若说AutoLISP的出现,是替AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张!5、AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷!二. AutoLISP 程序语言的特质分析:学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序!语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而有其独特的风格!功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合AutoCAD的特殊函数,再加上AutoLISP可直接呼叫执行所有AutoCAD的指令,以及掌握运用所有的AutoCAD系统变量,功能之强大令人欣喜不已!撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows的记事本、PE2、PE3、DW3、书中仙、汉书、EDIT....等直译式程序:不用再作编译,『即写即测、即测即用』,马上可以在AutoCAD中响应效果,马上就有成就感!横跨各作业平台:悠然自得,虽然AutoCAD有DOS、Windows版本之分但是AutoLISP却可在不改写的原貌下,加载与执行!三.撰写AutoLISP 的动机?1、欲强化AutoCAD 原有指令时.2、欲创造更有用的AutoCAD 新指令.3、欲简化繁琐的环境设定或绘图步骤时.4、欲处理参数式绘图时.5、欲做图面资料读文件、写文件.6、欲做AutoCAD 演示文稿展示时.7、欲达到真正灵活掌控AutoCAD 时.8、欲提升自己跨上AutoCAD 高手列车时.四.AutoLISP 的效益评估?1. 对公司负责人或设计主管而言:A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沉思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』!B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?!C. 千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关AutoCAD 支持软件。
AutoLisp语言的学习和使用(1)
第七节AutoLISP语言及其程序设计LISP(List Processing)是一种计算机的表处理语言。
LISP语言是人工智能领域中广泛应用的一种程序语言。
AutoLISP语言是一种运行在AutoCAD环境下的LISP编程语言,或称为AutoCAD的一种嵌入式语言。
它采用了与CommandLISP(一种通用的LISP语言版本)相近的语法及习惯约定,并吸收了LISP语言的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为一体。
利用AutoLISP语言编程可以实现对AutoCAD当前图形数据库进行直接访问和修改。
在LISP语言中,最基本的数据类型是符号表达式。
LISP语言的特点是程序和数据都采用符号表达式的形式,即一个LISP程序可以把另一个LISP程序作为它的数据进行处理。
因此使用LISP语言编程十分灵活,看起来是一个一个的函数调用。
支持递归定义也是Auto LISP语言的重要特性。
AutoLISP语言是提供给用户的主要二次开发工具之一。
用AutoLISP语言编写应用程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应用户的特殊需要。
AutoCAD软件的开发者——AutoDesk公司许诺,将保证今后AutoCAD软件对AutoLISP语言的支持。
掌握使用和编制AutoLISP应用程序的方法和技术将大大提高用户的工作效率和二次开发水平,增强AutoCAD的灵活性,并将得到长期、稳定的技术支持。
1.1 AutoLISP语言的基本知识1.1.1 AutoLISP语言的特性AutoLISP语言是一种解释型语言,它的特点如下:1.解释型语言编程语言有两种基本类型:解释型和编译型。
AutoLISP属于解释型语言。
在解释型语言中,用户编写的源程序直接由解释器解释并执行。
而在编译型的语言中,源代码首先要编译为一种中间格式(目标文件),然后再与所需的库文件链接,生成机器码可执行文件。
第二章 Auto LISP基本函数
13. 求数的绝对值函数 ABS 调用格式 (abs <数>) 功用 求<数>的绝对值。 求值结果 返回<数>的绝对值 (abs 2) 返回值 2.0000000 (abs -14.03) 返回值 14.030000 2.1.2 三角函数 三角函数的参数值的类型可为整型数或实型数,返回值的类型是实型 数。 1. 求正弦值函数 SIN 调用格式 (sin <角度>) 其参数<角度>为数字原子,<角度>用弧度表示。若角度为度要化为弧 度。 功用 求<角度>的正弦值 (sin 2.0) 返回值 0.909297
9. 求e的n次幂函数 EXP 的 次幂函数 调用格式 (exp <数>) 功用 该函数是求e的<数>次幂的值,e为自然对数的底数e=2.718282 求值结果 返回e的<数>次幂的值,其数据类型事实型数,例如: (exp 1.0) 返回值 2.718282 (exp 0) 返回值 1.000000 10. 求数的幂次方函数 EXPT 调用格式 (expt <底数> <幂>) 功用 该函数是求底数的幂次方的值。 求值结果 返回底数的幂次方的值,例如: (expt 2 4) 返回值 16 (expt 12 0) 返回值 1 (expt 3 -2) 返回值 0 (expt 0.2 0.1) 返回值 0.034054
11. 求自然对数的函数 LOG 调用格式 (log <数>) <数>必须为大于零的数。 功用 求<数>的自然对数。该函数是exp的反函数 求值结果 返回值为<数>的自然对数值,其数据类型总为实型数,例如: (log 3) 返回值 1.098610 (log 1) 返回值 0.000000 12. 求数的平方根函数 SQRT 调用格式 (sqrt <数>) 功用 求<数>的平方根 求值结果 返回值为<数>的平方根其数据类型为实型数,例如: (sqrt 4.0) 返回值 2.000000 (sqrt 4) 返回值 2.000000 (sqrt (/ 4 2.0) 返回值 1.414214
AutoLISP的基本函数
第八讲:AutoLISP的基本函数AutoLISP程序可看作是一个一个函数的调用。
函数的调用格式:(函数名[<参数1>] [<参数2>] ⋯[<参数n>])2.1 赋值函数与求值函数1 赋值函数格式:(setq <sym1> <expr1> [<sym2> <expr2>] ⋯)依次将每个表达式<expr>的值赋给符号<sym>,要求参数必须成对出现,返回最后一个表达式的值。
例如:command: (setq a 5.0)5.0000command: !a5.0000command : (setq x12 2.5 y12 (+ x12 2.0))4.5000相当于(setq x12 2.5)(setq y12 (+ x12 2.0))2 禁止求值函数格式:(quote <expr>)阻止求值器对其参数<expr>求值,返回没被求值的表达式。
’(+ 6 5) 简写形式,等效的表达形式是( quote (+ 6 5))作用:可以“保护”一些表达式作为数据使用,而不是作为AutoLISP函数调用被求值。
例如:command : (car ‘(1 2 3)) 等效于(car (list 1 2 3))取表中第一个元素1返回结果2.2 数值函数数的运算遵循以下规则:(1)若参数表中的所有参数都为整型数,则AutoLISP求值器对参数表做整型运算,返回整型数值。
(2)若参数表中有一个实型数,则对表中的参数进行浮点数学运算,返回实型数。
2.2.1 算术运算函数1(+ <number> <number> ⋯)返回所有<number>的和(+ 20 5 13) 返回38(+ -20 5.5)返回-14.5000(+ (setq x 2) (+ x 3.0) 6.5) 返回13.5000注意:多个整数相加时,要防止总和超出范围而出错。
AutoLISP语言的基本函数
函数应用举例:
(car „(x y z)) 返回:X ; (car „((a b (c) ) (d) 5)) 返回:(A B (C)) • (cdr „(x y z)) 返回:(Y Z);(cdr „(0 . “LINE”)) 返回:“LINE” • (cadr „( 5 8 12)) 返回:8 ; (caddr „(5 8 12)) 返回:12 • (last „(a b c d)) 返回:D • (nth 2 „(a b c d)) 返回:C; • (nth 0 „(10 13 25 34 46)) 返回:10
log sqrt
abs
(log [数] ) (sqrt [数])
(abs [数] )
返回[数]的自然对数 返回[数]的平方根
返回[数]的绝对值
2. 三角函数
三角函数参数值的类型可为实型数或整型数,返回值的类型总 是实型数。参数[角度]必须用弧度,如(/ pi 6) 或 (* 0.017453 30) 表示角度为30度时的弧度值。
联结表的检索函数assoc
• 调用格式:(assoc [关键字] [联结表]) • 功能:根据[关键字],检索特定的[联结 表],返回包含[关键字]的子表或点对表, 如果没有找到包含[关键字]的项,则返 回nil。
说明:
• 1). [关键字]可以为任意的表达式,而不只限于符号原子,如字符 串、数字、表等。 • 2). 如果[联结表]中有与[关键字]相同的点对或子表,则assoc只返 回最前面出现的点对或子表。 • 例如:(setq BL „((NAME . BOX) (L . 50) (W . 30) (H . 40))) • (assoc „NAME BL) 返回: (NAME . BOX) • (assoc „H BL) 返回:(H . 40) • 又如:用line命令绘了一条直线后,在图形数据库中就有了相应 的记录,该记录是以A表的形式给出的, 如将该表赋给变量ft: • (setq ft „((-1 . <Entity name:60000048>) (0 . “LINE”) (8 . “1”) • (10 2.0000 3.5000) (11 4.0000 7.0000))) • 则 (cdr (assoc 10 ft )) 将返回起点坐标:(2.0000 3.5000) • (cdr (assoc 11 ft )) 将返回端点坐标:(4.0000 7.0000)
AutoLISP
AutoLISP语言第一节概述1.1简介AutoLISP是一种嵌入AutoCAD内部的LISP语言。
它可让用户和AUTOCAD 开发者以非常强大的高级语言编写出宏语言程序和函数,它非常适合于图形的应用,LISP很易于学习和使用,它也非常灵活多变。
1.2AUTOLIAP中的数据类型.表.符号.字符串.实型数.整型数.文件指针.AUTOCAD实体名.AUTOCAD选择集.子程序整型数是16位带符号的数,因此,它的范围是在—32768和+32767之间。
实型数是以双精度的浮点数表示。
字符串可以是任意长度,它们的存贮空间是动态分配的。
1.3AUTOLISP的求值程序、词汇约定每一个LISP解释程序的核心就是求值程序。
求值程序装入用户的输入行,对它进行计算,并返回一些结果。
AUTOLISP的输入可以采用好几种形式。
它们可以在运行AUTOCAD时从键盘输入,也可以从ASCII文件读入,或者可以从字符串变量读入。
在所有这些形式中,必须要遵守上定的约定:1.符号名称可以由除下列字符之外的所有可打印字符序列组成:().’”;2.符号和函数名称(子程序)在AUTOLISP中大小写等效。
符号名称不能以数字开头。
3.实型数由一个或多个数字组成,后面跟着小数点,再就是一个或多个数字;如:“.4”并不被认作为实型数,“0.4”才是正确的写法。
4.文字字符串是一个由双引号引起来的字符序列。
在引起来的字符串中,可以使用反斜号,使得其中包括的控制字符可被正确识别,规定:\\ 表示字符“\”\n 表示换行\e 表示ESC\r 表示回车\t 表示光标\nnn 表示其八进制码为nnn的字符第二节AUTOLISP函数AUTOLISP提供了大量的预定义函数,本节介绍一些主要的函数。
需要说明的是,逻辑常数T与NIL这两个值相当于逻辑上的真与假。
是两个特殊原子。
这两个原子的值预先设置为T和NIL;常数PI表示数学上的π,它不是一个函数。
2.1数值运算函数1.(+ 〈数〉〈数〉…)函数返回所有数的总和2.(—〈数〉〈数〉…)函数返回所有数的差3.(* 〈数〉〈数〉…)函数返回所有数的积4.(/ 〈数〉〈数〉…)函数返回所有数的商其中的〈数〉可以是整型的,也可以是实型的。
AutoCAD-AutoLISP基本函数
atan(x/y) 值,其中x,y为弧度。
• (rem x y)
余数函数,求x/y的余数,其中x,y为整
型或实型数。
• (max x1 x2 ……) 中的最大值。
最大值函数,求出x1,x2,……
• (min x1 x2 ……) 中的最小值。
最小值函数,求出x1,x2,……
2021/7/1
11
(2)几何函数
加运算,求x1 + x2 + ……之和。 减运算,求x1 - x2 - ……之差。 乘运算,求x1 * x2 * ……之积。 除运算,求x1 / x2 / ……之商。 增量运算,返回x + 1。 减量运算,返回x - 1。 绝对值函数,求x的绝对值。 平方根函数,求x的平方根。 任意次方函数,求xp的值。
值为:0 — 十进制角度,1 — 度/分/秒,2 — 百分度,3 — 弧度, 4 — 勘测单位角度。 • 参数precision指定转换后小数点之后的小数位数,对应系统变量为 AUPREC。 • 例如:在命令行中输入 • 命令: (angtos 0.785398 0 4)
• "45.0000" • 命令: (angtos -0.785398 0 4)
• 角度格式化函数angtos,该函数把以弧度为单位的角度数值angle按 照指定的角度格式mode和精度precision转换成字符串,角度值angle 的大小在[0, 2π]之间。中括号“[ ]”内的参数可以不写。
• 参数angle可以是整型或实型常量、变量或表达式。 • 参数mode为角度格式编码,对应的系统变量为ANNITS。Mode的取
2021/7/1
9
3.3 数学几何函数
• (1)数学函数
AutoLISP程序入门教学资料
AutoLISP程序入门教学资料AutoLISP程序入门-教学资料一. AutoLISP简介(优越性及缺点)AutoLISP语言是开发Autocad的主要工具,是LISP语言和Autocad有机结合的产物,在Autocad的发展及壮大过程中起到了重要的作用。
正是以AutoLISP为代表的开放式结构,才使Autocad在众多的CAD软件竞争中长期处于不败之地。
AutoLISP是一种解释型语言,可直接在Autocad中运行,而不象编译型语言必须借助于编译器对原程序进行编译和连接,才能生成可执行的代码模块,用户只需借助于文本编辑器(例如DOS的"EDIT"程序)即可进行编程。
AutoLISP(List Processing Language)是一种表处理语言?quot;表"是AutoLISP语言独有的数据结构,在AutoLISP中广泛使用,表是在一个变量中储存大量相关数据的有效方法。
例如AutoCAD中以三个实数(X Y Z)这种表的形式来表示三维点。
二. 在AutoLISP的赋值方法不象大多数计算机语言采用"中缀法"来表示程序语句(表达式),而采用"前缀法"。
例如:C语言中为实型数X赋值125.0,写成:X = 125.0;运算符"="放在操作数X和125.0之间。
而AutoLISP中则写成:(setq X 125.0)运算符"setq"放在操作数X和125.0之前。
"setq"是AutoLISP最主要的赋值函数,几乎所有的变量赋值都要依?quot;setq"来实现。
三. 如何向AutoCAD增加一个新命令(或如何定义一个函数)一般程序的结构组成及加载在下面的例子中,我们将了解AutoLISP语言一般程序的结构组成、如何定义一个在AutoCAD中可执行的函数、"setq"的用法以及如何在AutoCAD中加载程序。
AutoLISP(1)概述、基本函数、表处理函数、绘图函数
石家庄铁道学院工业设计系
计 算 机 绘 图
LISP语言的突出特点是程序和数据都取符号表达 式的形式,即一个LISP程序可以把另一个LISP程 序作为它的数据处理。 LISP是求值型而不是编译型或解 释型的语言。
石家庄铁道学院工业设计系
计 算 机 绘 图
Auto LISP语言的特点 语言的特点
AutoLISP是为扩展和自定义AutoCAD功能而设计 的一种编程语言。 八十年代中期,AutoLISP被引入AutoCAD R2.16 版中作为应用程序编程接口(API) ,至今仍然是其 主要的程序设计语言。 LISP之所以被选为AutoCAD最初的应用程序编程 接口,是因为只有它才适合于工程中的非结构化 设计过程。
石家庄铁道学院工业设计系
计 算 机 绘 图
例: (moo “Hello” 5) (moo “Hi” 1 2 3) (moo 1 2 3) (moo “Hello”) 正确 正确 不正确 不正确
石家庄铁道学院工业设计系
计 算 机 绘 图
二、函数 函数是AutoLISP中的基本数据,函数能对数据进 行一系列的处理,并返回其结果。 AutoLISP函数的规则: AutoLISP函数必须放在括号里,所有的括号应当 匹配 函数从左往右读 括号中的第一个原子为函数操作符,为一个命令, 告 诉 AutoLISP做什么。
石家庄铁道学院工业设计系
计 算 机 绘 图
六、点对
点对也是一种表,表中有两个元素,两个元素中间 有圆点“.”,圆点与前后元素之间必须各有一个空 格,例如 (A . B) 就是一个点对,A和B与圆点之间用空格分开,A 和B均为S表达式,A称为点对的左元素,B称为点 对的右元素。点对也可以嵌套。 点对常用于构造联结表。
Autolisp加载文件操作方法及自定义函数
Autolisp加载文件操作方法及自定义函数说明:本文件的函数与过程主要是针对程序初始化操作,可以批量加载文件,当文件不在Autocad支持搜索路径中时,选择文件后自动将路径添加到AutoCad支持搜索路径中。
对于常规的批量加载文件,可以自定义个简化程序,不作环境变量的操作。
;;****************************************************************************** ********;;;;本程序由红色金刚石开发,你可以任意使用,如果你有好的意见和建议请给作者反馈;;;;****************************************************************************** ********;;****************************************************************************** ********;;;;文件名:LoadFile.lsp;;;;功能:文件加载函数;;;;需要引用的文件:string.lsp dir.lsp;;;;函数一Loadlsp--加载文件;;;;函数二LoadSTRING--加载string.lsp;;;;函数三LoadDIR--加载dir.lsp;;;;函数四GetDir--目录选择对话框,获取文件夹路径;;;;函数五LoadFile加载文件。
在支持路径中搜索lsp文件,找到就加载,;;没有找到就选择目录或文件;;;与函数Loadlsp不同之处添加了错误捕获;;;;函数六LoadFiles加载lsp文件列表。
在支持路径中搜索lsp文件,;;找到就加载,没有找到就选择目录或文件;;;;函数七GetSupportPath获取支持搜索路径;;这个方法还不如基础函数编写,一句代码解决“getevn"ACAD"”;;;;****************************************************************************** ********;;****************************************************************************** ********;;;;函数名:Loadlsp;;;;功能:加载lsp文件。
AutoLISP简介
AutoLISP简介AutoLISP规定了函数的形式:一: ( function argument )1.( ) 括号,表示执行某一函数,而括号中的内容即所要执行的部分.2.function 表示函数名. AutoLISP就是根据菡数名来区分各基本函数和用户自定义的函授数的.3.argument表示函数的参4.如果函数中套有函数称为嵌套函授数. AutoLISP允许用户使用诸如下列嵌套函授数:( fun1 (fun2 argu2) (fun3 argu3))(1)括号“(” 和“)”要匹配使用,用户在编写AutoLISP程序时一定要注意左\右手枪号匹配问题.(2)AutoLISP程序中,所有的括号( )和双引号" " 都必须在英文状态下输入,即必须是半角符号,为AutoLISP不识加紧中文全角符号.二: 设置变量函数( setq或SETQ )格式:(setq 变量名1值1[变量名2值2变量名3值3···])功能:创建给定的变量,并赋特定值.说明:(1)setq函数允许用户同时设置多个变时并赋予相应的数值.(2)对于字符串类型的值,应加上“”以于区分.注意:各变量名\数值之间只用空格隔开,而不能用其它标点符号,如要把3赋给变量abc可采用setq abc 3)方式.三: 执行AutoCAD标准命令( command )格式: ( command" 标准命令" "具体参数1" "具体参数2" ······)例如: (1)如果要画从(5,3)到(7,8)再到@10<0 三点的联机,可采用:( command " Line" "5,3" "7,8" "@10<0" "")(2)如果用户从已经定义的P1点到P2点画一条直线,可采用:( command "Line" P1 P2 "")四: 选择定点( getpoint)格式: getpoint("\n操作提示:")功能:用户可通过键盘输入体的坐标参数,可以用十字光标在屏幕区域内选取一点,通过该函数, AutoLISP就得知了用户所选取的点的坐标值.说明:(1)A utoLISP将首先显示用户设置的操作提示,在此提示下,才可确定某一给定一点.(2)G etpoint的操作提示中\n表示换行.通常,我们都是用(setq P1(getpoint"\n请输入第一点的坐标: "))这和方式来选取给定的点,并把该点坐标赋给变量P1.五: 目标捕捉( osnap)格式; osnap 给定顶点名称“目标捕捉方式”功能:以某种特定的目标捕捉方式, 捕捉最近给定顶点的某个特殊点.语名( setq Pt2(osnap pt1 "midp"))表示捕捉靠近Pt1端的中点,并把该中点坐标赋给Pt2六: 提取实体名称( entlast)格式: entlast功能:将用户的操作的上一实体的名称提取出来.( setq m (entlast))表示把用户的操作的上一实体的名称提取出来.并赋于m 这样AutoCAD就可以通过变量m来识别图形实体.例如:(1) Command :(command "circle" "5,5" "2") 以(5,5)这点为圆心,2为半径画一个圆.(2) Command :(command"line" "3,5" "7,5" "") 以这2点画一条直线,然后结束命令(3)Command :(setq el (entlast))(4)Command :(setq pt "5,7") 将点(5,7)赋给变量pt(5)Command :(command "trim" el "" pt "") 剪切多余的线.通过entlast 函数得知用户操作的上一实体为直线,并把该直线的实体名赋给变量el 这样el 就代表该直线.用户自定义函数AutoLISP提拱defun函数用以自定义用户函数,操作格式如下:( defun c :XXX( )表达式)现就该格式作说明:(1):defun 函数后面所跟C :XXX( )是一种特定的格式,XXX是用户定义函数的函数名.(2):表达工可由AutoLISP基本函数变量\字符串和运算符等组成,是用户定义函数的核心部.(3):定义完函数后,用户就可像AutoLISP基本函数一样调用XXX( )函数.注意:(1):defun 函数后所跟的C并不是代表硬盘驱动器符C,而是代表command line fuuction (命令行函数).(2):用这种方式所定义的函数XXX( ) 是无参函数,即不允许携带参数.(3):定义后,该函数XXX( ),还可以像AutoCAD基本命令一样,在command: 提示符下输入XXX并回车激活运行.(4):XXX( )函数, 还可以像AutoCAD透明命令一样,在某一函数运行过程中XXX形式运行.例如:( defun C : LXH( )(setq P1( getpoint"\ n请确定零件标注线第一点: ")(setq P2( getpoint"\ n请确定零件标注线第二点: "))( command "Line" P1P2 "@5<0" "")(setp P3 ( osnap P2 "midp" ))(command "dtext" " J " " bc" P350 )( Princ ))。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 4-2 (defun absv(x) ;定义一个绝对值函数
(if (>= x 0)
x ;单一变量表达式
(- x)
)
)
⑤ 如果我们需要定义一个匿名函数,则可以使用 lambda 函数,除
函数名"缺失" 外,其它都和 defun 相同。匿名函数在使用时定
义,普通的函数则可以在使用前,或任何你觉得需要的时候定
((lambda(x y z) (* x y z)) 3 4 5)是合理的。 ③ 参数可以是:数字(整数、实数)、字符串、T、nil、表(如果此
表是表、函数,就构成了复杂表,这就是lisp程序)、函数。 ④ 表可以作为函数的参数。如(+ 1 (- 5 2) 3)中,表(- 5 2)就作为+函数
的参数。 ⑤ 表的返回值也可以传递给其它变量,如(setq x (+ 1 2 3)) ⑥ 接受输入参数,如(- 5 2)中,-函数接受5和2两个参数。
是表。每个表都返回一个可由外层表达式使用的值。如果没有外
层表达式,AutoLISP 将则该值返回给AutoCAD 命令行。例如,
如下代码调用了三个函数:
(fun1 (fun2 arguments)(fun3 arguments))
;式 1-1
第一个函数 fun1 有两个参数,另两个函数 fun2 和 fun3 分别作为
2. 匿名函数 在一下表达循环的函数(比如 mapcar、forearch 等)的使用中,我 们往往见到使用 lambda 定义的匿名函数,这些函数内容我们也可以作 为一个"模块"定义为一个有名函数,然后对函数名进行引用,不过那样 会占用更多的资源,相对而言也就不够效率了。
七、 函数的作用机理
函数在不同情况下使用,其作用机理也是不同的。根据其和"外界"的 交互作用的不同,笔者将函数的作用机理归结为"返回值作用"和"过程作 用" 。
函数同为数据对象,就意味着我们可以像对待其他对象那样把它传递 给其他函数。这种性质对于 AutoLISP 这种自底向上程序设计至关重要。 AutoLISP 函数语法的描述遵循如下
这是 AutoLISP 中系统自带函数的一般性语法,也包括用其它语言定 义的函数。
所有 AutoLISP 表达式的格式都如下所示:
上式一对英文括号组成的表达式,称之为表,Lisp语言也称为表的语 言。表有两种形式,一种是“口袋式”表;一种是“函数式”表。前者 如’(0 0)表示一个2维点,前面加’表示此表不求值。如果不加‘,则通 常是认为是“函数式”表。“函数式”表如下:
① 结构特点:左括号(紧跟函数,函数所需要的参数,右括号)结束。 ② 函数是指:系统定义的函数、自定义的函数、匿名函数lambda。如
有重复使用代码的地方,定义函数是必要的,通常可以提高运行速 度。
1. 作为"模块"的自定义函数 程序应该有良好的结构,不仅仅是便于阅读,同时也对程序的运行 效率有一定影响。多数的高级语言通过模块和转移(goto)来完成程序 的结构化,和这些高级语言 不同的一点,AutoLISP 可以通过自定义函 数来完成这些要求,不需要编译就可以直接使用的代码,相比其他语言 来说,更具灵活性。作为"模块"使用的典型的自定义函数主要有两类, 一类是为对话框控件定义的动作函数,如: 例 6-1
综合以上描述,我们可以看到"函数"的基本组成: 输入值:一般称为参数; 表达式:函数体,是代码的集合,共同组成上面所说的"法则";
输出值:表达式对应输入值的(唯一)结果,通常称为"返回值 ";
封装:不同的语言,封装的意义也不同,在开放式的 AutoLISP 语言中, "封 装"并不意味着编译或打包,只使之以完整的函数体 驻留在内存中也应可以称为"封装" ;
二、 什么是函数 函数一词最早来源于数学,维基百科这样说:函数是将唯一的输出
值赋予每一输入的"法则"以及该输出值与对应输入值的集合。 在程序设计语言中,可以将一段经常需要使用的代码封装起 来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集 合,这就是程序中的函数。
从以上意义上,笔者建议使用"程序名(或部分字母)+特殊字符+ 函数名"这种命名方式,如 ca_main、tr:trans等。
虽然没有明确限制, 但一些前缀在 AutoCAD 中有自己的意义。比 如"ai_"AutoCAD(随系统附带的扩展函数),"acet_" AutoCAD ExpressTools 附带的扩展函数)等,另外一些著名的第三方 Lisp 扩展 库,都会有自己的"专属"前缀,使用时也都应该注意避免。
以上所说的是一般意义上的函数,也可以理解为有名函数,在 AutoLISP 中还有一种可以理解为"临时"定义的一次性的匿名函数 (lambda 表达式)即没有名字的函数,lambda 表达式基于数学上闭包 问题中ห้องสมุดไป่ตู้"演算"而得名,因为无名,所以无法重复调用,其它规则均不 违背。
六、 何时使用自定义函数
义。
⑥ 除此之外,给符号名赋值的 set 族函数也可以用来定义函数,这
个问题将在后面会阐述。
⑦ 只有函数接受参数输入,如(setq tt '(* x 3)),tt是一个表,不是函
数,故(tt 3)是错误的。(setq tt +)从此以后tt代表函数+,故(tt 1
2 3)是正确的。
⑧ 表可以作为参数传递给其它函数,换言之,函数每个参数都可以
细斟酌。 对于我们这些少量编程的 AutoCAD 的用户而言,过度复杂的函数
名也会给使用带来不便,所以,只要有限的标识,起到便于识别的目的 即可。
除非声明成局部变量,否则函数一经定义并加载,函数会驻留在 AutoCAD 的内存中,不同程序的同名函数会相互干扰,造成程序不可 用或结果错误,因此,在函数的命名时,也应考虑不同程序间函数的相 互避让。
这里所说的"符号"包括函数名、参数名和变量名。 需要说明的是,AutoLISP 函数名和变量名使用同一个命名空间(部 分其它的 LISP语言函数和变量使用不同的命名空间) 也就是说,变量 和函数重名时会冲突,后面定义(赋值)的会替代前面的。 可以看出,AutoLISP 的命名规则是很"宽松"的,除常见的字母数字 命名外,如"abc_1、+3+、xd::abc、<3"这类看似怪异的名字都是合法 的。 即便如此,也有些看似合法的名字是不能使用的,主要有: 系统的内部函数名,如 princ,car 等; 系统保留的常量名或其它符号,如 pi、t、nil、pause、^C 等; 系统有其它解释的符号组合,如 1e2(科学计数法) +3、-2(数 值)。 其它一些用于表达方向的字母(N、S、E、W)及表达角度的字母 (r、g、d)等 在某些时候也会产生意想不到的错误,所以,在使用的时候也应该 谨慎。因为 AutoLISP 对多字节字符的支持不是太好,所以,虽然理论 上可以使用汉字来作为函数名(或变量名),但实际上还是应该尽量避 免的,否则可能会出现无法预料的错误。 一些特殊的表达方式在 AutoLISP 中有特殊的含义,这些包括前缀c: 和函数名s::startup,前者表示定义了一个外部函数,而后在则定义了一个 自动执行函数。 我们用"c:3"来定义一个外部函数,使用命令"3"来执行,看起来这不 符合规则,似乎使用了数字"3"来作为函数名了,但其实不然,函数名是 "c:3" 。可以看出AutoLISP 中(或者说是 AutoCAD 中) 命令名是有独 立空间的。即便如此,我们也不建议这样用,一般说来,函数、变量, 尤其是命令的命名应 该能表达某种意义,向使用者和阅读者传递某种相 关的信息,而过度简单且不能引起联想的纯数字是无法承载这个任务 的。 从这个意义来说,函数名(或变量名)的命名每一个字节都应该仔
(function arguments)
;式 3-1
四、 函数的定义 一般说来,函数通过 defun 系列函数来定义,语法如下:
(defun sym argument-list expr ...) ;式 4-1
① defun 函数定义一个名为sym的函数(defun是系统定义的一个函 数,其功能就是用来用户定义自己的函数)。
② 函数名后面跟随参数列表argument-list,参数列表中对函数使用的 参数和局部变量进行声明,如果不申明任何参数和局部变量,必
须在函数名后提供一对空括号或者 nil (注:isp 语言中 nil 和一 对空括号是等价的)。不管是否需要声明参数,但"参数列表"项 是必须的,这是函数区别于赋值的一个重要特点。 ③ expr 为函数sym执行时的AutoLISP 表达式,可以是数字(整数、 实数)、字符串、T、nil、表、函数。见如下例 4-2 ④ AutoLISP 定义的函数本身是无法包括"可选参数"的,函数定义 时,参数数量一经声明,使用时就无法增减,否则就会出现"参数 太多(少)"的错误。例如: 例 4-1 (defun tan(x) ;定义一个正切函数,函数名 tan,有一个参数 x (/ (sin x) (cos x)) ;函数体 ) 使用这个函数时,必须而且只能输入一个变量,否则出错。而系统 自己定义的函数,参数的数量可是变的,如+。
可以经常调用:这是"函数"定义的一个基本要求,不能经常调用 就不必封装成函数了。
三、 AutoLISP 函数表达式 与很多的高级语言不同,函数也是AutoLISP(注:所有种类的Lisp