可以在启动时加载 AutoLISP 程序,并在绘图任务期间在特定的时间执行命令或函数。

基于 AutoCAD 的产品将自动加载用户可定义的三个文件的内容:acad.lspacaddoc.lsp 和当前自定义文件附带的 MNL 文件。

默认情况下,acad.lsp 文件仅在启动程序时加载一次,而 acaddoc.lsp 可随每个文档(或图形)一起加载。这样可使用户将加载“acad.lsp”文件和启动应用程序相关联,将“acaddoc.lsp”文件和文档或图形启动相关联。通过更改 ACADLSPASDOC 系统变量的设置,可以修改加载这些启动文件的默认方法。

如果这些文件之一定义了特殊类型的 S::STARTUP 函数,则此函数在图形初始化完成后立即运行。另外,APPLOAD 命令提供了“启动组”选项,用于加载指定的应用程序,而无需编辑任何文件。

acad.lspacaddoc.lsp 启动文件不随基于 AutoCAD 的产品一起提供。这些文件可以由用户来创建和维护。

注: 从基于 AutoCAD 2014 的产品开始,当 SECURELOAD 系统变量设定为 1 或 2 时,自定义应用程序必须在安全模式下工作。在安全模式下进行操作时,程序限制为从受信任的位置加载和执行包含代码的文件;受信任的位置由 TRUSTEDPATHS 系统变量指定。

自动加载命令

当加载 AutoLISP 文件时,文件中的命令定义会占用内存,不管是否实际使用了这些命令。AutoLISP autoload 函数无需将整个程序加载到内存中即可使某个命令可用。将下列代码添加到 acaddoc.lsp 文件将自动加载 cmds.lsp 文件的 CMD1、CMD2 和 CMD3 命令和 newcmd.lsp 文件的 NEWCMD 命令。

(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) (autoload "NEWCMD" '("NEWCMD"))

第一次在命令提示下输入自动加载的命令时,AutoLISP 将从关联文件加载完整的命令定义。AutoLISP 还提供用于 ObjectARX 应用程序的 autoarxload 函数。

注: 名称相似的 AutoLISP 启动文件的加载由它们的编辑时间决定。除非指定完整的文件名(包括文件扩展名),否则将加载最近编辑过的 LSP 文件。

ACAD.LSP 文件

如果定期使用特定的 AutoLISP 程序,则可以创建一个“acad.lsp”文件。启动 AutoCAD 时,将搜索 acad.lsp 文件的支持文件搜索路径。找到“acad.lsp”文件后,会将其加载到内存。

由于“acad.lsp”文件用于特定应用程序的启动程序,因此“acad.lsp”文件中定义的所有函数和变量只能在第一个图形中使用。应该把需要在所有文档中使用的程序从“acad.lsp”文件移到“acaddoc.lsp”文件。

可以用 ACADLSPASDOC 系统变量替代建议使用的 acad.lspacaddoc.lsp 功能。如果 ACADLSPASDOC 系统变量设定为 0(默认设置),则“acad.lsp”文件仅加载一次,即在应用程序启动时加载。如果设定为 1,则在创建新图形或打开现有图形时,将重新加载 acad.lsp 文件。

“acad.lsp”文件可以包含一个或多个程序的 AutoLISP 代码,也可以仅包含一系列 load 函数调用。后一种方法比较合适,因为对它的修改比较简单。如果将以下代码另存为 acad.lsp 文件,则文件 mysessionapp1.lspdatabasesynch.lspdrawingmanager.lsp 将在每次启动程序时加载。

(load "mysessionapp1") (load "databasesynch") (load "drawingmanager")

注: 请勿修改保留的 acad<版本>.lsp 文件。Autodesk 提供 acad<版本>.lsp 文件,其中包含所需的、版本特定的且由 AutoLISP 定义的函数。此文件在加载“acad.lsp”文件之前加载到内存。<版本> 表示基于 AutoCAD 的产品的版本;例如,acad2015.lsp 可能是由基于 AutoCAD 2015 的产品加载的文件。

ACADDOC.LSP 文件

acaddoc.lsp 文件用于与每个文档(或图形)的初始化关联。如果每次启动新图形(或打开现有图形)时都要加载某个 AutoLISP 程序库,则此文件很有用。

每次打开图形时,AutoCAD 都在库路径中搜索“acaddoc.lsp”文件。如果找到该文件,就把它加载到内存中。无论如何设置 ACADLSPASDOC,acaddoc.lsp 文件始终与每个图形一起加载。

大多数用户会对所有基于文档的 AutoLISP 例行程序采用“acaddoc.lsp”文件。程序根据库路径中定义的次序搜索 acaddoc.lsp 文件。因此,使用此功能,可以在每个图形目录下放置不同的 acaddoc.lsp 文件,这样可以对某些类型的图形或作业加载特定的 AutoLISP 程序。

acaddoc.lsp 文件可以包含一个或多个程序的 AutoLISP 代码,也可以仅包含一系列 load 函数调用。后一种方法比较合适,因为对它的修改比较简单。如果将下列代码另存为 acaddoc.lsp 文件,则在每次打开新文档时,将加载文件 mydocumentapp1.lspbuild.lspcounter.lsp

(load "mydocumentapp1") (load "build") (load "counter")

注: 请勿修改保留的 acad<版本>doc.lsp 文件。Autodesk 提供 acad<版本>doc.lsp 文件,其中包含所需的、版本特定的且由 AutoLISP 定义的函数。此文件在加载“acaddoc.lsp”文件之前加载到内存。<版本> 表示基于 AutoCAD 的产品的版本;例如,acad2015doc.lsp 可能是由基于 AutoCAD 2015 的产品加载的文件。

MNL 文件和 AutoLISP 菜单自定义

当程序加载自定义 (CUI/CUIx) 文件时,将搜索具有匹配文件名的 MNL 文件。如果找到该文件,就把它加载到内存中。此功能可以确保加载正确操作用户界面元素所需的 AutoLISP 函数。

例如,自定义文件 acad.cuix 将查找文件 acad.mnl,它可能定义在自定义文件中由用户界面元素所使用的许多 AutoLISP 函数。MNL 文件在“acaddoc.lsp”文件后加载。

注: 如果用 AutoLISP command 函数加载自定义文件(其语法类似于 (command "menu" "newmenu")),则在整个 AutoLISP 程序运行后,才加载关联 MNL 文件。

(command "menu" "newmenu") (princ "Newmenu utilities… Loaded.") (Princ)

在此例中,调用 princ 函数可用于显示状态消息。第一次使用 princ 时,将在命令提示下显示如下信息:

新菜单实用工具…已加载。

第二次调用 princ 函数将退出 AutoLISP 函数。如果不对 princ 函数进行第二次调用,则刚才显示的消息将会再次显示。像以前提到的那样,可以在 load 函数调用中包含 onfailure 参数作为额外的预防措施。

S::STARTUP 函数:初始化之后执行

用户可以定义 S::STARTUP 函数,以在图形初始化之后执行所需的启动操作。

启动 LISP 文件(“acad.lsp”“acaddoc.lsp”和 MNL)在图形完成初始化之前已全部加载到内存中。通常这并不会造成问题,除非使用了 command 函数,此函数在图形初始化前不能保证正常工作。

如果用户定义的函数 S::STARTUP 包含在 acad.lspacaddoc.lsp 或 MNL 文件中,则输入新图形或打开现有图形时将调用此函数。因此,可以在 AutoLISP 启动文件中包含 S::STARTUP 函数的定义以执行任何设置操作。

例如,如果要通过添加一条消息然后切换到 BHATCH 命令来替代标准 HATCH 命令,请使用包含以下代码的 acaddoc.lsp 文件:

(defun C:HATCH ( )  (alert "Using the BHATCH command!")  (princ " Enter OLDHATCH to get to real HATCH command. ")  (command "BHATCH")  (princ) ) (defun C:OLDHATCH ( )  (command ".HATCH")  (princ) ) (defun-q S::STARTUP ( )  (command "undefine" "hatch")  (princ " Redefined HATCH to BHATCH! ") )

图形初始化之前,用 defun 函数定义了 HATCH 和 OLDHATCH ,命令的新定义。图形初始化之后,S::STARTUP 函数被调用并且 HATCH 命令的标准定义被解除。

注: 还需提及的是,S::STARTUP 函数必须使用 defun-q 函数而不是 defun 定义。

由于 S::STARTUP 函数可以在许多位置(“acad.lsp”“acaddoc.lsp”、MNL 文件或从这些文件中加载的其他任何 AutoLISP 文件)定义 ,因此可以替换先前定义的 S::STARTUP 函数。

下例显示了一种确保启动函数与其他函数协同工作的方法。

(defun-q MYSTARTUP ( )

... your startup function ...

) (setq S::STARTUP (append S::STARTUP MYSTARTUP))

上面的代码把启动函数附加到现有的 S::STARTUP 函数中,然后重定义 S::STARTUP 函数以包含该启动代码。不管以前的 S::STARTUP 函数是否存在,它都可以正常工作。

,