做autocad的二次开发,就免不了要跟系统变量打交道。有些功能,通过调用系统变量,实现起来就变得简便了。 有些功能,离开了系统变量,可能就无法通过autolisp/visual lisp来实现。

长时间以来,在公开资料上,无论是autocad安装文件附带的帮助文件,还是官方网站的帮助文件,能查询到的和时间相关的系统变量, 都只有两个,即cdate和date。

cdate系统变量

cdate只读的实数值,表示的是当前的日期和时间。

其整数部分,表示当前日期,格式为YYYYMMDD。 其小数部分,以24时制表示当前时间,格式为HHMMSS。 例如,2006 年二月九日下午 3:05 显示为 20060209.150500

date系统变量

date也是只读的实数值,表示的是当前的日期和时间,使用的是Julian日期格式,表示自公元前 4713年1月1日12:00 a.m. (B.C.E.) 起的天数。

它的值是以天为单位的,在用date值计时的时候,用2次返回值的差,乘以86400.0即可得到以秒为单位的时间。

millisecs系统变量

尽管这个millisecs长期不在官方资料上出现,但是,广大的开发人员早就了解了这个系统变量,应用到了二次开发当中。

在官方文件中,millisecs首见于2018版autocad的帮助文件,是以“新引入”的系统变量的身份出现的。 那么,这个所谓的新引入的系统变量millisecs,到底是什么功能呢?

millisecs,保存的就是操作系统自启动以来所运行的时间,单位是毫秒。根据官方文档的说法,它的值等效于windows api GetTickCount的返回值,操作系统重启以后,返回值就清零了,所以,millisecs的值也清零了。

用法举例

这3个系统变量,虽然都能获取当前时间,但是,差异也是很明显的,因此,用法上也是有区别的。

获取当前的日期和时间

使用cdate值,转换为字符串以后稍加编辑即可。

虽然date也能实现这个功能,但是要从Julian日期格式转换,没有必要弄得那么麻烦。

millisecs则无法实现这个功能。

计时器

计时器,也就是计算两个时刻之间的时间差,这3个系统变量都可以实现这个功能。

使用cdate值的话,需要分别计算整数部分和小数部分的差值,然后对整数和小数部分分别进行单位换算, 如此这般,才能得到时间差,比较繁琐。

使用date值的话,差值乘以86400.0即可得到以秒为单位的时间,很便利。

使用millisecs值的话,差值乘以0.001即可得到以秒为单位的时间,也很便利。

事实上,老手写的autolisp插件,多半是用millisecs值实现计时器,新手则使用cdate值更多。

按照autodesk官方文档的说法,自autocad2017开始,cdate值不再提供毫秒级精度, 那么,在需要精确计时的情况下,就只能选择使用millisecs值了。