AutoLisp入门基础教程(1)


本教程是AutoLisp编程语言的入门指南。说是入门指南,其实不过是集合了我学习过程中的一些摘抄、笔记和自己的一些想法。对于文章中摘抄的部分,我会尽可能给出出处,不仅仅是对于原创作者劳动的尊重,更是方便读者查询更多的学习资料。

本文将通过几个简单的例子展示了AutoLisp语言的语法结构和规则。这样做的好处是可以尽快的入门,培养对AutoLisp编程的兴趣。但是由于缺少系统性的知识学习,很难有进一步的发展和提高。因此,建议学习基础教程后,再系统地阅读AutoLisp官方的开发者文档(百度完网盘地址,密码: xuw6),只有这样才能真正实现从入门到精通,而不是从入门到放弃。

你的第一段AutoLisp代码


打开AutoCAD,并在命令提示框(command prompt)中输入:

(alert "Hello and welcome to AutoLisp!")

按下回车键,下面的对话框将会出现在屏幕上。



很好!这就是你的第一段AutLisp的代码。不管怎样,你至少可以使用AutoLisp语言控制AutoCAD做一些事情了。
也许你已经注意到了,这个语句被一对圆括号()包围了起来,实际上这就形成了一个所谓的表 (LISP就是表处理——List Processing的英文缩写) 。这个表有两个参数组成,分别是alert和“Hello and welcome to AutoLisp”,两个参数之间用空格隔开。表的第一个参数alert是一个函数名,它的功能是弹出一个带有警告信息的对话框;而第二个参数是一个字符串,是alert函数的参数,即警告信息的内容。

你的第二段AutoLisp代码


接下来我们尝试一个稍微复杂的例子。
输入以下代码并敲击回车。

(setq a ( getpoint "\n选择第一个点 : "))

在AutoCAD工作空间内单击某个点,然后接着输入以下代码并回车。

(setq b ( getpoint "\n选择第二个点 : ")

再次点击某个点,然后继续输入以下代码并回车。

(command "Line" a b "")

最后,被选取两点之间的一条直线段被创建出来。
回头再来看一看代码:

(setq a ( getpoint "\n选择第一个点 : "))

这句话的意思是,在命令提示框中显示字符串信息,并等待用户点击某个点,当用户点击某个点后,把这个点的坐标赋值给变量a。相似地,第二行的代码将用户点击的某个点的坐标赋值给变量b。如果你想检查变量的值究竟是多少,只需在变量名前加一个 ! 即可。例如在命令提示框中输入:

!a

敲击回车,在命令提示框中可能会出现:

(2729.0 1382.4 0.0)

这也是一个表,表中的三个参数分别为点的x、y和z轴的坐标。事实上在AutoLisp的程序和数据都是表结构。细心的你可能发现了(圆括号里可以还有圆括号),AutoLisp语言允许表的嵌套,也就是说,一个表可以当作另一个表的参数。
最后一行代码中的command用来调用AutoCAD命令“Line”来画一条直直线段,从变量a的位置开始,到变量b的位置结束,""是一个空字符串,告诉AutoCAD关闭这个命令。
到目前为止,我们只是在命令提示框中输入代码,这样做太麻烦了,尤其是当代码变多的时候。下面一个小节教你如何把代码存储在文件中使用。

把AutoLisp代码存储在文件当中


实际上,AutoLisp文件就是以lsp为后缀的ASCII码文本文件。打开windows自带的记事本(或者任何的文本编辑器,例如notepad++,UltraEdit和sublime等),在文件中输入如下代码:

(defun testline ()
    ;定义一个函数 

    (setq a (getpoint "\n选择第一个点 : "))
    ;得到第一个点的坐标赋值给a
    (setq b (getpoint "\n选择第二个点 : "))
    ;得到第二个点的坐标赋值给b 
    (command "Line" a b "")
    ;连接两点画直线

)   ;函数定义结束

在AutoLisp程序中,在分号;后面的内容均为批注,程序不做处理。适当的增加批注,将使程序更具有可读性。
保存文件并将文件命名为testline.lsp。(文件名可以是任何允许的文件名,有汉字也没问题,但是后缀一定是lsp)。打开AutoCAD,在命令提示框中输入命令:

appload

在弹出的对话框中,选择刚刚创建的文件,点击加载,如果出现安全提示,请选择始终加载或加载一次。如下图:


加载/卸载应用程序
安全提示

此时在命令提示框中出现:

已成功加载 testline.lsp

关闭加载/卸载应用程序对话框。autoLisp程序就加载成功了。然后输入命令:

(testline)

此后,你定义的函数就开始工作了。每次调用命令的时候都要输入圆括号,还是有点不方便,能不能去掉呢?肯定可以!只需对原代码进行小小的修改——在testline前面加上c:即可。

(defun c:testline ()
    ;定义一个函数 

    (setq a (getpoint "\n选择第一个点 : "))
    ;得到第一个点的坐标赋值给a
    (setq b (getpoint "\n选择第二个点 : "))
    ;得到第二个点的坐标赋值给b 
    (command "Line" a b "")
    ;连接两点画直线

)   ;函数定义结束

重新加载这个程序,在AutoCAD中输入命令:

testline

是不是感觉好多了。如果你是个处女座,你可能会发现,每次运行命令结束后,在命令提示框中会出现一个烦人的nil。如图所示:

烦人的nil

为了去掉这个nil,AutoLisp提供了(princ)函数。最后这个程序变成了以下的样子:

(defun c:testline ()
    ;定义一个函数 

    (setq a (getpoint "\n选择第一个点 : "))
    ;得到第一个点的坐标赋值给a
    (setq b (getpoint "\n选择第二个点 : "))
    ;得到第二个点的坐标赋值给b 
    (command "Line" a b "")
    ;连接两点画直线
        (princ)
          ; 清除 nil
)   ;函数定义结束

再试一次,是不是感觉清爽多了。
在本例中,defun定义了一个AutoLisp函数,函数名为testline,函数名前面的c:表示这个函数名可以像AutoCAD命令一样直接调用。下面一个小节将会详细介绍defun的用法。

函数的定义(defun)


使用defun可以在AutoLisp程序中定义一个函数,其格式为:

(defun [函数名] ([全局变量1] [全局变量2] .../ [局部变量1] [局部变量2]) [表达式1] [表达式2] ...)

是不是有点懵,感觉乱七八糟的。在AutoLisp程序中,换行跟空格的作用是一样的,多个空格也相当于一个空格。这样我们就可以合理的使用缩进和换行让代码更加清晰有条理。
一般的,我们常常把函数写成以下的样子:

(defun [函数名] ([全局变量1] [全局变量2] .../ [局部变量1] [局部变量2]) 
       [表达式1] 
       [表达式2] 
       ...
)

defun这个函数至少需要三个参数。第一个参数是要定义的函数的名称——[函数名]。第二个参数是变量表,变量表由全局变量和局部变量组成(全局变量和局部变量之间要用斜杆/将他们分隔开),变量表可以为空表()。第三个参数是表达式,一个函数至少要有一个表达式。
[函数名] :如果函数名以'c:'开头,表示注册一个AutoCAD命令,即在命令提示框中直接输入函数名就可以直接调用这个函数(就像AutoCAD本身自己的命令一样)。
[变量表]:局部变量在函数执行完毕后就被释放,而全局变量在函数执行完毕后依然存在。
[表达式]:当函数被调用时,表达式的内容将被执行。表达式实际上就是表。
值得注意的是,最后一个表达式的结果将作为函数的返回值。
举个例子:

(defun myfunc (x y) ...)                ;有两个全局变量
(defun myfunc (/ a b) ...)              ;有两个局部变量
(defun myfunc (x / temp) ...)           ;有一个全局变量,一个局部变量
(defun myfunc () ...)                   ;没有变量,即变量表是空表

再举一个例子,这个函数将会返回输入角度相应的弧度值:

(defun dtor (a)
       (* PI ( / a 180.0)
)

小节


是到了总结一下的时候了。您读完这个教程,如果有以下几点感想,我的目的就达到了。

  1. AutoLisp语言是带有一堆圆括号的奇怪语言。(因为它是表处理语言,表处理语言,表处理语言,重要的事情说三遍!)
  2. 知道如何在AutoCAD加载一个AutoLisp程序。
  3. 了解如何定义一个函数,基本了解defun的使用规则。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容