AutoLisp从入门到放弃(四)
本章开始介绍如何通过在AutoLisp代码中使用Command命令在AutoCAD中实现绘图操作。
一、Command命令
如果你对AutoCAD有一定的了解,就会知道,高效的绘图方式往往离不开一系列的绘图命令的,我们姑且把所有绘图命令称之为Command命令。
如果想要在AutoLisp代码中实现绘图的操作,使用Command命令无疑是最简单的实现方式,接下来,我们就来学习一下如何在AutoLisp中使用Command命令。
二、Command命令的使用
目标:在AutoCAD中绘制一条直线,直线的两个端点由使用者来指定。
要实现上述目标,我们至少应该掌握如下两个AutoLisp函数:
(GetPoint "") ;; 交互方式获得点坐标.
(command "AutoCAD指令" ...) ;; 执行AutoCAD指令进行绘图.
接下来,我们就可以根据上述函数来实现绘制直线的功能了。
(defun C:Drawline(/ #ptSta #ptEnd)
(setq #ptSta (getpoint "\n请指定直线的起点:"))
(setq #ptEnd (getpoint "\n请指定直线的终点:"))
(command "line" #ptSta #ptEnd "")
)
在AutoCAD执行上面定义的函数,结果如图所示。
三、关闭人机对话
我们可以发现,在执行command命令进行绘图操作的时候,命令行中会将绘制直线的步骤全部都显示出来,这是因为我们在执行command命令的时候实际上就是不断的向命令行中输入参数进行绘图的。
也就是说,我们把直接在AutoCAD中输入命令的绘图操作封装到了一个函数里边,所以这里可以看到所有的绘制步骤。
但是在有些情况下,我们的绘图步骤是向被别人看见,而且如果反显的信息太多,极易使人反感。其实,在AutoCAD中是存在这样一个系统变量(CMDECHO)的,它可以控制是否显示绘图过程中的所有人机对话(关于系统变量这里不做过多解释说明)。
接下来我们就来看一下如何在代码中设置这个系统变量,这里我们需要用到如下两个函数:
(getvar "") ;; 获取系统变量
(setvar "") ;; 设置系统变量
(defun C:Drawline(/ #iCmdEcho #ptSta #ptEnd)
(setq #iCmdEcho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq #ptSta (getpoint "\n请指定直线的起点:"))
(setq #ptEnd (getpoint "\n请指定直线的终点:"))
(command "line" #ptSta #ptEnd "")
(setvar "CMDECHO" #iCmdEcho)
)
将改动之后的代码加载到AutoCAD中,再次执行命令,我们可以看到,命令行中不会把绘制直线的步骤显示出来了。
四、关于返回值
如果仔细观察前面的示例不难发现,在每次执行完自定一操作之后,命令行中总是会出现一个莫名奇妙的数据,在第一段代码中,命令执行结束之后命令出现了一个 nil,在第二段代码执行结束之后,命令行出现了一个 0 。这些数据是怎样出来的呢?
回忆之前的学习,我们发现几乎所有的代码到最后都会多输出一个数据,这个就是AutoLisp的返回值了。
简单来说,AutoLisp函数中默认将函数中的最后一个表达式的计算结果作为函数的返回值。结合前两个例子,可以发现,第一个例子中的最后一个表达式的是一个绘制直线的command命令,command命令的执行结果为 nil ;第二个例子中最后一个表达式是设置系统变量,执行结果是设置到这个系统变量里的值;这两个表达式返回了不同的结果,这些不同的结果都可以是这个函数的返回值。
但是,绝大多数情况下,我们是不需要看见最后这个返回值的,所以,我们需要想办法让这个返回值消失或者不显示,这就需要用到了下面这个函数:
(princ) ;; 用于吸收函数返回值,在函数末尾添加,之后函数便不再有返回值
我们把princ加入到上述代码中:
(defun C:Drawline(/ #iCmdEcho #ptSta #ptEnd)
(setq #iCmdEcho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq #ptSta (getpoint "\n请指定直线的起点:"))
(setq #ptEnd (getpoint "\n请指定直线的终点:"))
(command "line" #ptSta #ptEnd "")
(setvar "CMDECHO" #iCmdEcho)
(princ)
)
这样,函数返回值就被消除了,显示在命令行中的字符串全是我们想要的了。