ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AutoLISP函数分类复习指南:从基础到实战的查漏补缺

AutoLISP函数分类复习指南:从基础到实战的查漏补缺

简介:《LISP函数大全分类手册》是一份面向AutoLISP初学者与CAD二次开发者的函数速查资料,以PDF形式系统梳理了AutoLISP常用函数,帮助读者在编写和调试LISP程序时快速定位语法与用途。资源包共1个PDF文件,大小约47KB,轻量便携,适合随时查阅。手册按功能划分为数学运算、检验与逻辑运算、转换运算、列表处理等模块,逐条列出函数原型与返回值说明,例如数学运算中的加减乘除、取整、最大公约数,逻辑运算中的比较、位运算与布尔运算,转换运算中的角度与字符串互转、单位换算,以及列表处理中的car、cdr、cons、mapcar、foreach等核心操作,并延伸至字符串、文件、等待输入与几何运算等常用函数。目前已有765人学习下载,内容覆盖AutoLISP编程基础,可作为案头工具书,帮助读者理解函数语义、积累调用经验,进而提升CAD环境下的程序编写效率与灵活性。

1. 从一张函数地图说起:AutoLISP 到底该按什么脉络复习

很多人第一次翻 AutoLISP 函数表,都会陷入同一个困境:函数是散的,今天记一个car,明天背一个entget,真到写程序时还是不知道下一步该调谁。问题不在记忆力,在于没有先建立分类地图。这份《LISP函数大全分类手册》把 AutoLISP 的函数按用途切成十九个大类,从数学运算、逻辑判断、类型转换,一路铺到列表处理、字符串与文件、等待输入、几何运算、对象处理、选择集与符号表、查询控制、流程控制、函数定义与错误处理、显示打印、符号与表达式、加载卸载、内存管理,最后落到 ADS/ARX 外部扩展和 3D 渲染、数据库接口。梳理下来会发现,这张地图本身就是一条学习路径:先掌握数值与列表这两块地基,再往上叠几何与对象操作,最后用流程控制和错误处理把代码串成能跑的程序。它适合已经能看懂基本表达式、但函数调用总是卡壳的人,也适合考前需要快速定位某个函数属于哪一类、参数怎么传的复习者。下面按模块把重点、易错点和查漏方法逐层拆开。

2. 数值、逻辑与转换:三类基础函数的复习重点

2.1 数学运算函数的参数顺序与返回值陷阱

数学运算函数看起来最没门槛,但恰恰是翻车最多的地方。(+ 数值 数值...)返回累计和,(- 数值 数值...)返回第一个数减后面所有数,(* 数值 数值...)返回乘积,(/ 数值 数值...)返回第一个数除以后续数值的商。这里最容易忽略的是除法:AutoLISP 的/在整数参与时可能得到整数截断结果,想要实数商必须保证至少一个操作数是实数。(1+ 数值)和(1- 数值)是自增自减的快捷写法,等价于(+ 数值 1)和(- 数值 1),但只能接受一个参数。(abs 数值)取绝对值,(fix 数值)把数值转成整数,注意fix是截断而非四舍五入,(fix 3.9)得到 3。(gcd 数值1 数值2)求最大公因数,(rem 数值1 数值2)求余数,(max ...)和(min ...)接受任意多个数值。三角函数sin、cos、atan的角度参数一律是弧度,不是度,这是血泪经验里出现频率最高的错误之一。pi是常数,约 3.1415926,直接写pi不加括号。(expt 底数 指数)求幂,(exp 数值)求自然指数,(log 数值)求自然对数,(sqrt 数值)求平方根。复习时建议把每个函数的参数个数和返回类型列成一张小表,写代码前先对一眼。

;; 整数除法会截断,想要实数结果需显式转换 (/ 10 3) ; 返回 3,不是 3.3333 (/ 10.0 3) ; 返回 3.3333 ;; 三角函数用弧度,30 度要先转弧度 (sin (/ pi 6)) ; 返回 0.5

2.2 检验与逻辑运算:eq和equal的区别是必考点

比较函数分两组。数值和字符串比较用=、/=、<、<=、>、>=,它们逐项比较表达式,返回T或nil。列表比较则要用eq和equal。eq判断两个表达式是否实际相同,对列表来说比较的是引用是否一致;equal判断内容是否相同,还可以带一个差量参数,用于实数比较时容忍浮点误差。这是复习中最容易混淆的一对:两个内容一样但分别构造的列表,eq返回nil,equal返回T。逻辑运算里and返回逻辑与结果,(~ 数值)返回按位取反,(boole 函数 整数 整数...)做位式布尔运算,参数里的函数编号决定运算类型。not和null都判断是否为nil,但not更偏向逻辑取反,null更偏向值检查,实际写代码时两者常可互换,但复习时要清楚它们的语义侧重。

(setq a (list 1 2 3)) (setq b (list 1 2 3)) (eq a b) ; nil,引用不同 (equal a b) ; T,内容相同 (equal 1.0 1.0001 0.001) ; T,差量内视为相等

2.3 转换运算:字符串与数值之间的双向通道

转换函数是数据进出的关口。(angtof 字符串 [模式])把角度字符串转实数,(angtos 角度 [模式 [精度]])把角度转字符串,(atof 字符串)转实数,(atoi 字符串)转整数,(itoa 整数)转字符串,(rtos 数值 模式 [精度])把实数按模式转字符串,(distof 字符串 [模式])按模式转实数。(cvunit 数值 原始单位 转换单位)做单位换算,换算依据是acad.nut文件,单位名称必须写对,否则返回nil。(trans 点 原位置 新位置 [位移])做坐标系统转换,参数是坐标系代码,写错坐标系会导致点坐标完全偏移。复习时把atof/atoi/itoa/rtos四个放一起记,它们是最常用的字符串数值互转组合,angtof/angtos和distof则带模式参数,模式值不同输出格式不同,考试或实际写图时容易因为模式写错导致角度或距离显示异常。

3. 列表、字符串与文件:数据处理的三大件

3.1 列表处理函数:car/cadr/caddr与坐标提取

列表是 LISP 的命脉。(car 列表)取第一个元素,(cadr 列表)取第二个,(caddr 列表)取第三个,这三个组合常用来从点坐标列表里取 X、Y、Z。(cdr 列表)返回去掉第一个元素后的列表,(cons 新元素 列表)把新元素加到列表头部,(append 列表 列表...)把多个列表合并成一个,(list 元素 元素...)把散元素打包成列表。(length 列表)返回元素个数,(nth n 列表)取第 n 个元素,索引从 0 开始,这是易错点。(reverse 列表)颠倒顺序,(subst 新项 旧项 列表)替换列表中的旧项,(assoc 关键元素 联合列表)在联合列表中按关键元素查找,常用于取对象属性。(member 关键元素 列表)返回从关键元素开始到列表末尾的子列表。(mapcar 函数 列表1 列表2...)把函数逐元素应用到列表上,返回新列表,是批量处理的利器。(foreach 名称 列表 表达式)遍历列表执行表达式,适合带副作用的操作。(listp 元素)判断是否为列表。复习时把car/cdr/cons三件套和mapcar/foreach的适用场景分清楚:要生成新列表用mapcar,要遍历执行用foreach。

(setq pt (list 10.0 20.0 5.0)) (car pt) ; 10.0,X 坐标 (cadr pt) ; 20.0,Y 坐标 (caddr pt) ; 5.0,Z 坐标 (mapcar '1+ (list 1 2 3)) ; 返回 (2 3 4)

3.2 字符串、字符与文件处理:读写文件的完整链路

字符串函数里,(ascii 字符串)返回第一个字符的 ASCII 码,(chr 整数)返回对应字符,(strlen 字符串)返回长度,(strcat 字符串1 字符串2...)拼接,(substr 字符串 起始 长度)截取子串,起始位置从 1 开始,不是 0,这是和nth相反的地方,极易记混。(strcase 字符串 [字样])转换大小写,字样参数控制转大写还是小写。(wcmatch 字符串 格式)做通配符匹配,返回T或nil。文件操作链路是(open 文件名 模式)打开文件返回文件代码,模式有读、写、追加等,然后用(read-line [文件代码])读一行或(read-char [文件代码])读一个字符,写入用(write-line 字符串 [文件代码])或(write-char 数值 [文件代码]),最后必须(close 文件名称)关闭。(read 字符串)从字符串中读第一组元素。复习时把substr的 1 起始和nth的 0 起始单独标出来,这是查漏补缺时最值得反复确认的一对。

(setq f (open "data.txt" "r")) (setq line (read-line f)) (close f) ;; substr 起始为 1,nth 索引为 0 (substr "hello" 2 3) ; 返回 "ell" (nth 2 (list "a" "b" "c")) ; 返回 "c"

3.3 等待输入函数:getxxx系列与initget的配合

等待输入函数负责和用户交互。(getangle [基点] [提示])请求角度,返回弧度;(getcorner 基点 [提示])请求矩形对角点;(getdist [基点] [提示])请求距离;(getint [提示])请求整数;(getreal [提示])请求实数;(getstring [提示])请求字符串;(getpoint [基点] [提示])请求点坐标;(getkword [提示])请求关键词;(getorient [基点] [提示])请求角度但不受angbase、angdir影响。(initget [位] 字符串)用来设定下一次getxxx的有效输入,位参数控制是否允许空输入、零、负值等,字符串参数列出关键词。复习重点是getangle和getorient的区别:前者受角度基准和方向设置影响,后者不受,需要绝对角度时用getorient。initget的关键词要和getkword配合,关键词字符串用空格分隔,大小写不敏感。

4. 几何、对象与选择集:图纸操作的核心模块

4.1 几何运算函数:角度、距离、交点与捕捉

几何函数直接服务于绘图。(angle 点1 点2)返回两点连线的弧度角,(distance 点1 点2)返回两点距离,(inters 点1 点2 点3 点4 [模式])求两条线的交点,模式参数控制是否延长线求交。(osnap 点 模式字符串)按捕捉模式取得另一个坐标点,模式字符串如"mid"、"end"、"cen"等。(polar 基点 弧度 距离)按极坐标从基点偏移出新的点,这是画等距点、旋转点最常用的函数。(textbox 对象列表)取得文字字符串的两个对角点坐标,用于计算文字占位。复习时把polar和angle配成一对:先用angle求方向,再用polar沿该方向偏移距离,这是构造新点的标准套路。inters的模式参数容易漏写,漏写时默认不延长,两条线段不相交就返回nil。

(setq p1 (list 0 0) p2 (list 10 0)) (setq ang (angle p1 p2)) ; 0.0 (setq p3 (polar p1 ang 5)) ; (5.0 0.0) (setq p4 (polar p1 (/ pi 2) 5)) ; (0.0 5.0)

4.2 对象处理函数:entget/entmod/entmake的更新链路

对象处理围绕实体名称展开。(entget 对象名称 [应用程序列表])取出对象信息列表,返回的是关联列表,里面每个子列表以组码开头。(entmod 对象列表)根据更新后的信息列表更新屏幕上的实体,这是修改对象的必经之路。(entmake 对象列表)建立新对象,(entdel 对象名称)删除或取消删除对象,注意它是对同一个对象做删除和恢复的切换。(entlast)取图形中最后一个对象,(entnext [对象名称])找下一个对象,(entsel [提示])请求选取一个对象并返回对象名称和选点坐标,(entupd 对象名称)更新复元体图形,(handent 图码)按图码返回实体名称,(nentsel [提示])返回块内副元体信息,(nentselp [提示] [点])返回带 4×4 矩阵的块内副元体信息。复习重点是entget取出的关联列表结构:组码 0 是对象类型,组码 8 是图层,组码 10 是起点,组码 62 是颜色。改对象时先entget,用subst替换对应组码的子列表,再entmod写回,顺序不能乱。

(setq e (car (entsel))) (setq ed (entget e)) (setq ed (subst (cons 8 "NewLayer") (assoc 8 ed) ed)) (entmod ed)

4.3 选择集与符号表:ssget过滤与tblnext遍历

选择集函数管理批量对象。(ssadd [对象名称] [选择集])把对象加入选择集或新建选择集,(ssdel 对象名称 选择集)移出,(ssget [模式] [点1] [点2])取得选择集,(ssget "X" [过滤列表])按过滤列表取选择集,(sslength 选择集)返回对象个数,(ssmemb 对象名称 选择集)判断对象是否在选择集内,(ssname 选择集 索引值)按索引取对象名称,索引从 0 开始。符号表函数里(tblnext 符号表名称 [T])检视符号表,有效名称包括"LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK",(tblsearch 符号表名称 符号)在符号表中搜寻符号。复习时注意ssget "X"的过滤列表写法:过滤列表是关联列表,如'((0 . "LINE") (8 . "0"))表示取图层 0 上的所有直线。tblnext第一次调用取第一个条目,第二次调用取下一个,传T参数可以回到表头重新遍历。

5. 流程、函数与错误处理:让代码真正跑起来

5.1 判断式与循环:if/cond/while/repeat的选择

流程控制决定代码走向。(if 比较式 表达式1 [表达式2])检算比较式,为真执行表达式1,否则执行表达式2。(cond (比较式1 表达式1) (比较式2 表达式2) ...)是多条件分支,相当于多个if的整合。(while 比较式 表达式...)当条件成立时循环执行,(repeat 次数 [表达式...])重复执行 N 次。(progn 表达式1 表达式2...)把多个表达式连成一组,常配合if和cond使用,因为if的分支默认只接受一个表达式,要执行多句就得用progn包起来。复习时把progn和cond的配合单独练一遍:cond的每个分支如果有多条语句,也要用progn包裹。while和repeat的区别在于前者条件驱动、次数不定,后者次数固定。

(setq i 0) (while (< i 5) (princ i) (setq i (1+ i)) ) ;; 输出 01234

5.2 函数定义与追踪:defun、lambda与trace

函数处理模块负责组织代码。(defun 名称 自变量列表 表达式...)定义自定义函数或子程序,(lambda 自变量 表达式)定义未命名函数,(apply 功能函数 列表)把函数和列表结合后执行,(eval 表达式)返回表达式执行结果。(trace 函数...)对函数设定追踪标记辅助检错,(untrace 函数...)解除追踪。(*error* 字符串)是程序错误时的警示信息,(alert 字符串)以对话框显示警告,(exit)和(quit)强制退出。复习重点是defun的自变量列表写法:局部变量用/分隔,如(defun foo (a b / c d) ...)表示a、b是参数,c、d是局部变量。trace在调试递归函数时特别有用,能看到每次调用的参数和返回值。

5.3 显示打印与符号表达式:princ/print/prompt的差异

显示控制函数影响输出格式。(princ [表达式 [文件代码]])打印表达式,字符串不带引号前缀;(print [表达式 [文件代码]])打印后换行并空一格;(prompt 信息)在命令区显示信息并返回nil;(terpri)换行;(redraw [对象名称 [模式]])重绘图形;(textscr)切到文字画面,(graphscr)切到图形画面,(grclear)清屏。符号与表达式处理里,(setq 符号1 表达式1 [符号2 表达式2]...)是最常用的赋值,(set 符号 表达式)给带单引号的符号赋值,(quote 表达式)返回未检算状态,等价于'。(type 元素)返回元素类型,(atom 元素)判断是否非列表,(boundp 表达式)判断是否有值,(numberp 元素)判断是否数值,(minusp 元素)判断是否负值,(zerop 元素)判断是否为零,(null 元素)判断是否为nil。复习时把princ、print、prompt三者的输出差异用一张表对比,写交互提示时选错函数会导致输出多出引号或换行。

函数字符串输出换行返回值
princ不带引号否表达式值
print带引号是表达式值
prompt不带引号否nil

6. 易漏点与易错点:复习时最该盯住的五个地方

6.1 易漏点一:substr起始为 1,nth索引为 0

为什么漏:两个函数都涉及位置,但一个从 1 数,一个从 0 数,复习时容易凭感觉写。怎么补:把这两个函数写在同一行注释里,每次用到就默念一遍「字符串从 1,列表从 0」,并在代码里加注释标记。

6.2 易漏点二:三角函数用弧度不用度

为什么漏:日常说角度都是度,但sin、cos、atan的参数是弧度,getangle返回的也是弧度。怎么补:所有涉及角度的计算,先确认单位,需要度转弧度时用(/ 度 pi 180),或者直接用pi构造弧度值。

6.3 易漏点三:eq与equal混用

为什么漏:两者都返回T或nil,名字也像。怎么补:记住eq比引用,equal比内容,列表比较一律用equal,需要容忍浮点误差时加差量参数。

6.4 易漏点四:entmod前忘记entget取最新数据

为什么漏:直接构造关联列表去entmod,结果组码不全或顺序不对,更新失败。怎么补:修改对象的固定流程是entget取原列表,用subst替换目标组码,再entmod写回,三步不能省。

6.5 易漏点五:文件打开后忘记close

为什么漏:程序跑完没报错,但文件句柄没释放,下次打开可能失败。怎么补:把open和close成对写,中间用read-line或write-line,写完立刻close,不要等到函数结束才补。

7. 复习清单:从函数分类到查漏补缺的落地方法

复习 AutoLISP 函数,最有效的方式不是从头背到尾,而是按分类做三遍过滤。第一遍过地图:把十九个大类写在纸上,每类下面默写三个最常用的函数,写不出来的就是薄弱区。第二遍过参数:对每个函数,确认参数个数、参数类型、返回值类型,尤其是那些有可选参数的函数,如equal的差量、inters的模式、angtos的模式和精度。第三遍过组合:把经常一起出现的函数配成对或组,比如angle+polar、entget+subst+entmod、ssget+ssname+sslength、open+read-line+close,每组写一个最小可运行示例。

查漏补缺时,建议用一张三列清单:函数名、所属分类、上次用错的地方。每次写代码遇到报错或结果不对,就回填一行。坚持一段时间后,这张清单会变成个人专属的易错点地图,比任何通用手册都准。下面这张表可以作为复习时的快速索引,按模块列出核心函数和检查项。

模块核心函数检查项
数学运算+-*/fixrem除法是否整数截断,角度是否弧度
逻辑比较=eqequaland列表比较是否用equal
类型转换atofatoiitoartos模式参数是否匹配
列表处理carcdrconsmapcarforeachnth索引从 0,substr从 1
字符串文件strcatsubstropenclose文件是否成对关闭
等待输入getpointgetangleinitgetgetangle与getorient区别
几何运算angledistancepolarintersinters模式是否漏写
对象处理entgetentmodentmake是否先取后改再写回
选择集ssgetssnamesslength索引从 0,过滤列表格式
流程控制ifcondwhileprogn多语句分支是否用progn

从那以后我每次写 AutoLISP 之前,都强制走一遍「分类定位 → 参数确认 → 组合示例」这三步,哪怕只是改一个坐标点,也先问自己这个函数属于哪一类、参数顺序对不对、有没有配对的函数忘了调。希望这份梳理能帮到你,少走一点我当年踩过的弯路。

本文还有配套的精品资源,点击获取

返回列表