首页 / 资讯中心 / 文章详情

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

AutoLISP函数分类复习指南:从基础到实战的查漏补缺 ★ FEATURED ARTICLE
简介《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.52.2 检验与逻辑运算eq和equal的区别是必考点比较函数分两组。数值和字符串比较用、/、、、、它们逐项比较表达式返回T或nil。列表比较则要用eq和equal。eq判断两个表达式是否实际相同对列表来说比较的是引用是否一致equal判断内容是否相同还可以带一个差量参数用于实数比较时容忍浮点误差。这是复习中最容易混淆的一对两个内容一样但分别构造的列表eq返回nilequal返回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.0X 坐标 (cadr pt) ; 20.0Y 坐标 (caddr pt) ; 5.0Z 坐标 (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 起始为 1nth 索引为 0 (substr hello 2 3) ; 返回 ell (nth 2 (list a b c)) ; 返回 c3.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)) ) ;; 输出 012345.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不带引号否nil6. 易漏点与易错点复习时最该盯住的五个地方6.1 易漏点一substr起始为 1nth索引为 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的模式和精度。第三遍过组合把经常一起出现的函数配成对或组比如anglepolar、entgetsubstentmod、ssgetssnamesslength、openread-lineclose每组写一个最小可运行示例。查漏补缺时建议用一张三列清单函数名、所属分类、上次用错的地方。每次写代码遇到报错或结果不对就回填一行。坚持一段时间后这张清单会变成个人专属的易错点地图比任何通用手册都准。下面这张表可以作为复习时的快速索引按模块列出核心函数和检查项。模块核心函数检查项数学运算-*/fixrem除法是否整数截断角度是否弧度逻辑比较eqequaland列表比较是否用equal类型转换atofatoiitoartos模式参数是否匹配列表处理carcdrconsmapcarforeachnth索引从 0substr从 1字符串文件strcatsubstropenclose文件是否成对关闭等待输入getpointgetangleinitgetgetangle与getorient区别几何运算angledistancepolarintersinters模式是否漏写对象处理entgetentmodentmake是否先取后改再写回选择集ssgetssnamesslength索引从 0过滤列表格式流程控制ifcondwhileprogn多语句分支是否用progn从那以后我每次写 AutoLISP 之前都强制走一遍「分类定位 → 参数确认 → 组合示例」这三步哪怕只是改一个坐标点也先问自己这个函数属于哪一类、参数顺序对不对、有没有配对的函数忘了调。希望这份梳理能帮到你少走一点我当年踩过的弯路。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站