AutoLisp从入门到放弃(二)
AutoLisp入门
一、AutoLisp简介
- AutoLisp是Autodesk公司开发的一种Lisp语言,旨在节省工程师的绘图时间,后也用来制作一些简单的绘图插件,甚至完成一个完整的CAD二次开发项目。
二、你的第一行AutoLisp代码
(prompt "\nHello, Welcome to AutoLisp!")
上述代码的作用是在AutoCAD命令行输出一个字符串:Hello,Welcome to AutoLisp!,直接将这行代码复制到AutoCAD的命令行中,按下回车,会看到如下结果:
如图,可以看到,我们要输出的字符串在执行完这行代码之后在命令行中进行了显示。
三、AutoLisp代码的基本语法规则
如果你是一个C/C++程序员,那么你可能会对上述的代码结构很反感,这完全不像是一门编程语言。但是如果你更深入的了解Lisp语法规则之后就会发现,你的第一感觉是正确的(至少我现在还是这么认为)。接下来我们就来介绍一下Lisp的语法规则:
- 规则1:
所有函数、表达式都要包含在括号内,左括号“ ( ”与右括号“ ) ”一定要成对出现,括号内部的字符串的双引号“ " ”与“ " ”也要成对出现。
- 规则2:
表达式格式:(函数名 运算符 运算符 运算符)
* 函数名:功能函数与自定义函数。
* 运算符:AutoLisp中的所有数据类型(原子和列表)。
其实AutoLisp的核心语法规则就只有上述两点,极其简陋,这里不再进行展开介绍,我们后续通过实际代码来理解更加直观易懂。
四、AutoLisp数据类型
在上述内容中,我们提到了AutoLisp表达式中的运算符可以是所有数据类型,那么AutoLisp中都为我们定义了哪些数据类型呢?
整形(INT) | 即整数,整数由数字和正负号组成,正号可省略。 |
实型(REAL) | 带小数点的数。(注:-1~1之间的小数中的0不可以省略) |
字符串(STR) | 字符串的最大长度为100,空字符串可以用""表示。 |
列表(LIST) | 用括号将多个数据合并为一个数据的数据类型。 |
函数(SUBS) | 函数相当于子程序或过程。可分为内部函数和外部函数。 |
文件描述符(FILE) | 类似于文件指针,是AutoLISP赋于被打开文件的标识号。 |
图元名(ENAME) | AutoCAD为图形对象指定的16进制的数字标识。 |
选择集(PICKSET) | 一个或多个图形对象命名的集合。 |
VLA对象 | VLA 对象是ActiveX 应用程序的主要组成部分。 |
上述九种就是AutoLisp的数据类型,我们在后续的学习中都会使用到。
五、AutoLisp函数的定义
知道了AutoLisp的语法结构和数据类型,我们就可以编写AutoLisp代码了。接下来我们要实现一个简单的加法运算,在这个函数中,我们需要用到以下函数:
- defun:定义函数关键字,用于定义用户命令。
- setq:AutoLisp中的赋值函数,相当于 "=",具体用法符合语法规则2
(setq 表达式1 表达式2) ;; 将表达式2的值赋给表达式1
- +:数学库函数。求两个数的和。
(+ 表达式1 表达式2) ;; 计算表达式1与表达式2的和
(defun Add()
(setq #iNum1 1) ;; 赋值
(setq #iNum2 2)
(setq #iNumSum (+ #iNum1 #iNum2)) ;; 求和
)
将上述代码直接复制到AutoCAD命令行之后,命令行会输出函数名 ADD,表明这个函数加载成功。接下来我们在命令行中直接输入
(Add)
会看到如下效果:
上述内容介绍了如何定义一个简单的求和函数并执行,可能大家已经注意到了以下几个问题,
- 我们的函数中没有声明任何变量,都是直接赋值的。
- 定义Add函数的时候,我们在Add后面有一个空的括号。
- 第二行和第四行代码中出现的之前没有提到过的符号 ";;" 和汉字。
接下来我们逐一解答上述三个问题:
- AutoLisp中没有指代变量类型的标识符,所有变量都是直接使用的,变量的类型就是最后一次操作该变量的数据类型。例如:有一个变量a,将其赋值为整型的数据1,这时a变量的类型就是整型;在之后的运算中,又将一个实型的数据0.1赋值给变量a,这时a变量的类型又变成了实型。基于这种特性,我们使用变量的时候需要特别小心,最好的办法就是人为的为变量加上前缀,这样就能放心的使用所有变量了。
- Add后面的()实际上是这个函数的参数和变量列表,括号中的参数和变量使用 "/" 分割。
- AutoLisp中使用";" ";;" ";;;" 来注释代码,所有分号之后的语句都是注释掉的语句。
接下来,我们对上述的代码做简单的调整如下:
(defun Add(#iNum1$ #iNum2$ / #iNumSum)
(setq #iNumSum (+ #iNum1$ #iNum2$)) ;; 求和
)
如下图所示重复上述加载、执行操作,会得到如下结果:
在这次执行结果中,我们在输入命令的时候不是简单的输入了一个(Add),而是输入了
(Add 1 2)
这是因为,我们这一次定义的函数中,Add后边的括号中加入了参数和变量列表,"/"之前的为参数列表,表明我们需要在调用这个函数的时候传入两个参数,"/" 之后的部分是我要在这个函数中用到的变量(代码中所有#、$等标识符都是区别不同类型的变量的标识,没有实际意义)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)