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的使用规则。
 
 
29人点赞
 
 


作者:吴吉光
链接:https://www.jianshu.com/p/e933f3b87a74
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2020-04-05 12:24  天涯海角路  阅读(2757)  评论(0编辑  收藏  举报