AutoLISP 这种脚本语言,从诞生之日起就是用作提高AutoCAD的制图效率的。和autocad的srcript脚本相比, 它提供更高级一点功能,能够做到script做不到或者很难做到的一些功能。

autolisp历史太久了,快40年了,市面上各种各样的教材太多了。虽然简体中文的教材不太多,但是,质量都还不错, 不少教材,都强调了合理利用内置命令的做法。

在autolisp语言当中,调用autocad内置命令,现在(2023年)有3中方法,

  • command
  • vl-cmdf
  • command-s

下面尝试做一些详细介绍。之前的一篇博客,也做了一点点介绍,有兴趣的可以去看看。

通过 command 调用autocad内置命令

没有去考证command命令的历史沿革。可以想象的是,这个函数肯定是最早的那批函数之一。autolisp的作用, 就是提供扩展,最基本的扩展方式不就是使用autocad的内置命令吗?

所以,这个函数绝对是最原始的autolisp函数之一。

大概,正是由于command 贴近底层,导致它的兼容性不是很好。为什么呢?因为autocad的命令在不断地变化, 每一次的autocad版本升级,都有可能出现内置命令的改动。当然了,这种改动不是很明显, 尤其对于手动输入命令的方式来说,并不明显。可是,对于依赖于 command 函数 的add-on来说, 这种改动就是很大的兼容性问题了。

通过 vl-cmdf 调用autocad内置命令

vl-cmdfcommand 几乎一模一样,唯一的区别,vl-cmdf会提前计算每个传递过来的参数,如果有错, 会中断整个命令。command 的行为,是跟徒手使用键盘敲击命令一样的,提供1个参数就求值一次,有问题就中断, 这是command 的行为方式。

总的来说,这个函数没有什么出彩的地方,除了它是提前求值,然后,它还引入了一些复杂性。根据官方文档的说法, 有些命令在vl-cmdf 工作正常,但是,换到 command 就不正常了。所以,很难进这个函数到底是有用还是没用。 毕竟,在函数式编程的世界里,同一个函数有各种不同的变种这种事情是再常见不过的事情了。

通过 command-s 调用autocad内置命令

command-s 函数很年轻,autocad2012才引入的,是3个函数中最年轻的一个。根据官方文档的说法, -s 后缀的意思是 subroutine, subroutine是子程序的意思,在 fortranlisp 的年代, subroutine 是个很常见的说法。

具体的细节,官方文档并没有说明,可以猜测出来的是,autocad提供了一个专门的处理 command-s 的 “处理器”, 所以才会比 command 快得多!从我个人的实测结果来看, command-s 确实比 command 快多了, 跟 vl-cmdf 不相上下,比entmake 还是差一点。

后记

从性能角度来讲,能使用vl-cmdf的场合就优先使用它。从兼容性来讲,能使用 command 的就尽量使用它。 至于 command-s ,只能是先通过 command 的验证,再尝试使用 command-s 提高性能。