AutoLISP 程序通常仅需很少的更改就能在最新版本上运行。
但是,AutoLISP 程序在最新版本上可能不再正确运行,因为已更改或已弃用 AutoLISP 函数或基于 AutoCAD 的产品命令或者系统变量。
查看自定义程序,查找指定为“已废弃”的命令和系统变量。在某些情况下,已废弃的命令或系统变量仍可供自定义程序使用,即使它在命令提示下无法直接输入或者无法从用户界面访问也是如此。
尝试在自定义程序中使用已废弃的命令或系统变量时,以下技术可能很有用:
AutoLISP 环境已更新,以支持 Unicode 字符,这会影响用于操作或返回字符串值的函数。有关已为 Unicode 支持更新哪些函数的详细信息,请参见 AutoLISP 新特性或更改内容。
根据程序中使用的函数,可能需要更改它们来处理 Unicode 字符。例如,ASCII 函数的返回值现在可以大于 255,或在将 Unicode 字符传递给函数时,返回值会有所不同(与早期版本相比)。可以使用 LISPSYS 系统变量来标识和控制加载到程序中的默认 AutoLISP 环境;0 和 2 = MBCS 支持(传统环境)和 1 = Unicode 支持。
以下代码段显示了如何确定当前加载到程序中的 AutoLISP 环境以及如何基于加载的环境控制代码执行:
(if (= (getvar "LISPSYS") 1) (alert (strcat "Unicode support enabled" "\n(ASCII \"€\") returns 8364" ) ) (alert (strcat "MBCS (Legacy) support enabled" "\n(ASCII \"€\") returns 128" ) ) )
INSERT 命令现在显示“块”选项板,而新的 CLASSICINSERT 命令显示“旧版”“插入”对话框。如果 AutoLISP 程序依赖于使用“插入”对话框,需要更改现有程序。以前,可能使用以下 AutoLISP 语句来显示“插入”对话框:
(initdia) (command "insert")
若要继续使用 AutoLISP 程序显示“插入”对话框,需要更改现有程序才能利用以下方法之一:
(initcommandversion 2) (initdia) (command "insert")
(command "classicinsert")
LOCALE 系统变量现在返回一个代码,它包含表示当前语言的两个或多个字母的缩写形式,而不是表示语言和子语言的三个字母的缩写形式。两个或多个字母的缩写形式基于使用 LOCALE_SISO639LANGNAME 常量的 Windows GetLocaleInfo 函数。
在 AutoCAD 2019 系列产品之前,此代码显示为三个字母的缩写形式,由使用 LOCALE_SABBREVLANGNAME 常量的 Windows GetLocaleInfo 函数返回。三个字母的缩写形式基于两条信息;两个字母的语言缩写形式以及指示子语言的第三个字母。例如,ENU 表示英语语言 (EN) 和作为子语言的美国 (U) 的组合。
CDATE 和 DATE 系统变量中存储的值不再将当前日期\时间精确表示到最接近的毫秒或百分之一秒。现在,这两个系统变量表示的值的最小时间单位是秒。如果需要追踪的时间间隔小于一秒,请考虑使用 MILLISECS 系统变量返回的值,该系统变量存储了工作站启动后的时间差(以毫秒为单位)。
以下日期\时间相关的系统变量也受毫秒删除的影响:
如果任何现有的程序需要时间差异精确到最接近的毫秒,则您可以获取存储在 MILLISECS 系统变量中的值的最后两位或三位数字,并将它们附加到由 CDATE 系统变量返回的值,该值将产生一个与基于 AutoCAD 2016 产品及更早版本中的 CDATE 系统变量所返回的值相当的值。以下代码示例显示了如何基于目标 AutoCAD 版本获取包含毫秒的日期/时间值:
; Returns a CDATE value that includes milliseconds based on release ; Usage: (CDate) ; Replaces (rtos (getvar "CDATE") 2 8) (defun CDate ( / ms) ; Check to see which AutoCAD release is being used (if (<= (atof (getvar "ACADVER")) 22.0) (rtos (getvar "CDATE") 2 8) (progn ; Get the current milliseconds and append it to the CDATE value (setq ms (itoa (getvar "MILLISECS"))) (strcat (rtos (getvar "CDATE") 2 6)(substr ms (- (strlen ms) 2))) ) ) )
随 AutoCAD 2016 Update 1 引入的 EPDFSHX 系统变量已重命名为 PDFSHX。作为名称更改的结果,必须修改任何参照 EPDFSHX 系统变量的 AutoLISP 语句。在自定义程序中,这些函数最可能会受到此更改的影响:
现在可以对 AutoLISP 文件进行数字签名。对 AutoLISP 文件进行数字签名允许将该文件加载到 AutoCAD 图形环境中,而不警告用户该文件不受信任。带数字签名的 VLX 文件无法在基于 AutoCAD 2015 或更早版本的产品中加载。
osnap 函数不再支持快速 (qui) 对象捕捉模式。必须从所有使用 AutoLISP 程序中的 osnap 函数的语句中删除 qui 模式的参照。如果未删除该模式,osnap 函数将返回 nil,而不是绘图区域中有效点的坐标值。