本文适合刚刚开始学习lisp,尝试写出自己的cad插件的读者。对于资深的插件开发人员或者专业的软件工程师来说,本文的某些观点、术语可能很不准确,欢迎批评指正。
最近收到不少朋友的私信,询问cad插件的事情,想自己写插件,感到无从下手。我的建议是学习lisp,因为autolisp简单易学还跨平台,几乎可以兼容现有的各种主流商业cad,如bricscad、浩辰、中望。相对而言,vba和.net要复杂得多入门起来更加困难,写出来的cad插件通用性也不如lisp。
对于正在学习或刚刚开始学习lisp的朋友,有以下3点具体建议,做到了基本上就可以写出能正常运行的cad插件了。
搞清楚需求,明确插件的功能
需求问题其实是一个很复杂、很困难的问题,某种程度上可能永远也无法搞清楚需求,但是这个是最基本的、无法绕开的问题,试想,没有需求的话费时费力写cad插件干啥呢?
我就经常遇到这样的情况。闲鱼上经常有朋友发来消息,说想要定制cad插件,然后就跟他/她吧啦吧啦聊天,帮他分析需求。往往是花了十几二十几分钟时间,聊天、分析、梳理之后,发现根本不需要做插件,使用cad内置功能再加上优化工作流程,辅之以左手键之类的快捷命令,就能搞定他/她的问题了。
那么,怎么搞清楚需求,进而明确插件的功能呢?
简单来讲,重现一遍自己的手动操作,分析手动操作的每个步骤、环节就可以了。对于高频、重复的步骤和环节,就是可以考虑做成cad插件,让电脑代劳的,电脑无法代劳的采用人脑去完成。
话说回来,真就有人无法重现自己的手动操作,这一类朋友可能只能寻求他人的帮助了,比如找人定制插件。
学会使用vl-cmdf
vl-cmdf是autocad内置的一个调用cad命令的函数。比如:
(vl-cmdf "line" "0,0,0" "1000,0,0" "")
这个语句就是使用vl-cmdf函数,调用cad命令 line,画一条(0,0,0)点到(1000,0,0)点的直线。
能调用cad命令的函数,autocad还提供了command 和command-s,command-s在2012版及之后的版本中可用。从通用性上来讲,command函数是通用性最强的,不挑autocad的版本,支持lisp插件的其他商业cad软件也都支持这个函数。
考虑到各cad软件的实际的市场占有率状况,这个小节的标题就用了vl-cmdf函数,毕竟autocad几乎是一家独大。推荐使用vl-cmdf,还有另外一个原因,vl-cmdf的性能远高于command和command-s,当执行命令的语句在几十几百条的时候就能明显感觉到性能的差异了。
vl-cmdf的用法,从前面画直线的语句就可以略知一二了,它跟手动输入命令在cad里边执行几乎是一样的。注意,是几乎一样,细节上还是有差别,这里不展开讲,以后有机会再详细写写。
总之,在cad里边画图的时候是怎么操作的,把每个步骤、环节的参数直接写到vl-cmdf函数后边就可以了,然后执行这条lisp语句,就能像自己动手操作一样完美重现把图画出来了。比如画一个圆:
(vl-cmdf "circle" "0,0,0" "1000" "")
上面这条lisp语句,就是在(0,0,0)点画一个半径为1000的圆。是不是已经感觉学会写插件了?
使用局部变量
cad插件的lisp代码写到一定程度之后,就会考虑把自己的lisp插件做成可以直接在cad命令行调用的形式,比如有个非常流行的插件,输入Y 就能打开使用。怎么才能做到呢?把lisp语句写进函数就可以了。
(defun c:xy()
(vl-cmdf "line" "0,0,0" "1000,0,0" "")
(vl-cmdf "circle" "0,0,0" "1000" ""))
上面这段lisp代码,就定义了一个名叫c:xy的函数,在cad命令行输入xy,就会自动执行画直线和画圆的操作了。
那么假如我要在原点以外的地方画线画圆,是不是要每个不同的点写一个不同的函数呢,能不能直接在屏幕上选取坐标点呢?当然是可以的,引入一个变量保存选取的点坐标就行了。
(defun c:xy (/ pt1)
(setq pt1 (getpoint))
(vl-cmdf "line" pt1 "1000,0,0" "")
(vl-cmdf "circle" pt1 "1000" ""))
上面这个函数,运行之后,cad会提示选取一个点,选取之后就会用那个点坐标来画线画圆了。这个函数里边的pt1,就是用来保存点坐标的变量,把它写进函数名后面的括号内,前面加个斜线和空格就表示它是一个局部变量,只是在函数c:xy内部起作用的,函数以外是不起作用的。
在autolisp里边,和局部变量对应的就是全局变量,全局变量就是到处都起作用的。全局变量和局部变量的相关知识通过搜索引擎能很方便地获取到,这里也不展开讲了。
只讲一个原则,任何时候,都要尽可能使用局部变量,少用全局变量,最好不用全局变量。
结语
谢谢您的阅读。
能看到这里的朋友,估计已经学会了怎么写出自己的第一个lisp插件了,没写出来的话,把前文的lisp代码复制到自己的cad里边跑一遍试试吧。