AutoLISP 程序通常仅需很少的更改就能在最新版本上运行。
但是,AutoLISP 程序在最新版本上可能不再正确运行,因为已更改或已弃用 AutoLISP 函数或基于 AutoCAD 的产品命令或者系统变量。
注: 从基于 AutoCAD 2014 的产品开始,当 SECURELOAD 系统变量设置为 1 或 2 时,自定义应用程序必须在安全模式下工作。当在安全模式下进行操作时,基于 AutoCAD 的产品限制为从受信任的位置加载和执行包含代码的文件;受信任的位置由 TRUSTEDPATHS 系统变量指定。有关详细信息,请参见“关于安全性和病毒防护”。
概述
- 已废弃的命令和系统变量
-
查看自定义程序,查找指定为“已废弃”的命令和系统变量。在某些情况下,已废弃的命令或系统变量仍可供自定义程序使用,即使它在命令提示下无法直接输入或者无法从用户界面访问也是如此。
注: 即使已废弃的命令或系统变量仍可用于自定义程序,但不能保证在将来版本的产品中继续有效。建议您重写自定义程序以避免使用任何已废弃的命令或系统变量。
尝试在自定义程序中使用已废弃的命令或系统变量时,以下技术可能很有用:
- 在命令名称前添加句号作为前缀。例如,.BLIPMODE 允许使用 BLIPMODE 命令。
- 避免使用 COMMAND 函数执行已废弃的系统变量,因为这可能导致出现“未知命令”错误消息;请改用 GETVAR 和 SETVAR 函数。例如,(getvar "BLIPMODE") 返回 BLIPMODE 系统变量的当前值。
注: 使用上述技术无法恢复已从产品中删除的命令和系统变量。
基于 AutoCAD 2021 的产品
- Unicode 支持
-
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"
)
)
)
注: 使用 Visual LISP 集成开发环境 (VL IDE) 或 MAKELISPAPP 命令编译 AutoLISP 源 (LSP) 文件时,LISPSYS 系统变量的当前值控制编译文件所用的格式。使用设置为值 1 的 LISPSYS 编译的文件(Unicode 格式)无法加载到 AutoCAD 2020 及更早版本中。编译文件之前,将 LISPSYS 设置为值 0 或 2,以确保它们也可以在早期版本中加载,但这样做将限制 Unicode 支持。
基于 AutoCAD 2020 的产品
- INSERT 命令
-
INSERT 命令现在显示“块”选项板,而新的 CLASSICINSERT 命令显示“旧版”“插入”对话框。如果 AutoLISP 程序依赖于使用“插入”对话框,需要更改现有程序。以前,可能使用以下 AutoLISP 语句来显示“插入”对话框:
(initdia)
(command "insert")
若要继续使用 AutoLISP 程序显示“插入”对话框,需要更改现有程序才能利用以下方法之一:
基于 AutoCAD 2019 的产品及更高版本
- LOCALE 系统变量
-
LOCALE 系统变量现在返回一个代码,它包含表示当前语言的两个或多个字母的缩写形式,而不是表示语言和子语言的三个字母的缩写形式。两个或多个字母的缩写形式基于使用 LOCALE_SISO639LANGNAME 常量的 Windows GetLocaleInfo 函数。
在 AutoCAD 2019 系列产品之前,此代码显示为三个字母的缩写形式,由使用 LOCALE_SABBREVLANGNAME 常量的 Windows GetLocaleInfo 函数返回。三个字母的缩写形式基于两条信息;两个字母的语言缩写形式以及指示子语言的第三个字母。例如,ENU 表示英语语言 (EN) 和作为子语言的美国 (U) 的组合。
基于 AutoCAD 2017 的产品及更高版本
- CDATE、DATE 和其他日期\时间相关的系统变量
-
CDATE 和 DATE 系统变量中存储的值不再将当前日期\时间精确表示到最接近的毫秒或百分之一秒。现在,这两个系统变量表示的值的最小时间单位是秒。如果需要追踪的时间间隔小于一秒,请考虑使用 MILLISECS 系统变量返回的值,该系统变量存储了工作站启动后的时间差(以毫秒为单位)。
以下日期\时间相关的系统变量也受毫秒删除的影响:
- TDCREATE
- TDINDWG
- TDUCREATE
- TDUPDATE
- TDUSRTIMER
- TDUUPDATE
如果任何现有的程序需要时间差异精确到最接近的毫秒,则您可以获取存储在 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)))
)
)
)
- EPDFSHX 系统变量
-
随 AutoCAD 2016 Update 1 引入的 EPDFSHX 系统变量已重命名为 PDFSHX。作为名称更改的结果,必须修改任何参照 EPDFSHX 系统变量的 AutoLISP 语句。在自定义程序中,这些函数最可能会受到此更改的影响:
- GETVAR - 将返回一个 nil 值,而不是 0 或 1 的整数值
- SETVAR - 可能会停止程序的执行并生成错误消息;错误:已拒绝 AutoCAD 变量设置:“epdfshx”
- COMMAND - 可能会停止程序的执行并生成错误消息 EPDFSHX 未知命令“EPDFSHX”
基于 AutoCAD 2016 的产品及更高版本
- 数字签名的文件
-
现在可以对 AutoLISP 文件进行数字签名。对 AutoLISP 文件进行数字签名允许将该文件加载到 AutoCAD 图形环境中,而不警告用户该文件不受信任。带数字签名的 VLX 文件无法在基于 AutoCAD 2015 或更早版本的产品中加载。
- osnap 函数
-
osnap 函数不再支持快速 (qui) 对象捕捉模式。必须从所有使用 AutoLISP 程序中的 osnap 函数的语句中删除 qui 模式的参照。如果未删除该模式,osnap 函数将返回 nil,而不是绘图区域中有效点的坐标值。
|