可以在启动时加载 AutoLISP 程序,并在绘图任务期间在特定的时间执行命令或函数。
基于 AutoCAD 的产品和 AutoCAD LT 会自动加载三个用户可定义文件的内容:
用户可定义的文件 | Windows | Mac OS | ||
---|---|---|---|---|
AutoCAD | AutoCAD LT | AutoCAD | AutoCAD LT | |
acad.lsp | ✓ | -- | ✓ | -- |
acaddoc.lsp | ✓ | -- | ✓ | -- |
acadlt.lsp | -- | ✓ | -- | -- |
acadltdoc.lsp | -- | ✓ | -- | -- |
MNL 文件与当前自定义文件一起提供 | ✓ | -- | ✓ | -- |
默认情况下,“acad.lsp”或“acadlt.lsp”文件仅在产品启动时加载一次,而“acaddoc.lsp”或“acadltdoc.lsp”文件会随每个文档(或图形)一起加载。这让您可以将加载“acad.lsp”或“acadlt.lsp”文件与应用程序启动相关联,并将加载“acaddoc.lsp”或“acadltdoc.lsp”文件与文档(或图形)启动相关联。可以通过更改 ACADLSPASDOC 系统变量的设置,来修改加载这些启动文件的默认方法。
如果这些文件之一定义了特殊类型的“S::STARTUP”函数,则此例程会在图形初始化完成后立即运行。此外,APPLOAD 命令提供了“启动组”选项,用于加载指定的应用程序,而无需编辑任何文件。
“acad.lsp”或“acadlt.lsp”和“acaddoc.lsp”或“acadltdoc.lsp”启动文件未随产品一起提供。用户可以自行创建和维护这些文件。
当加载 AutoLISP 文件时,无论是否实际使用命令,文件中的命令定义都会占用内存。AutoLISP 的“autoload”函数无需将整个例程加载到内存中,即可使命令可用。将以下代码添加到“acaddoc.lsp”或“acadltdoc.lsp”文件会自动加载“cmds.lsp”文件中的 CMD1、CMD2 和 CMD3 命令以及“newcmd.lsp”文件中的 NEWCMD 命令。
(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) (autoload "NEWCMD" '("NEWCMD"))
首次在命令提示下输入自动加载的命令时,AutoLISP 会从关联文件加载完整的命令定义。AutoLISP 还提供了用于 ObjectARX 应用程序的“autoarxload”函数。
如果经常使用特定的 AutoLISP 例程,则可以创建“acad.lsp”或“acadlt.lsp”文件。当启动 AutoCAD 时,它会搜索支持文件搜索路径以查找“acad.lsp”或“acadlt.lsp”文件。如果找到“acad.lsp”或“acadlt.lsp”文件,则会将其加载到内存中。
由于“acad.lsp”或“acadlt.lsp”文件旨在用于应用程序特定的启动例程,因此“acad.lsp”或“acadlt.lsp”文件中定义的所有函数和变量仅在第一个图形中可用。您可能希望将所有文档中应可用的例程从“acad.lsp”或“acadlt.lsp”文件移动到“acaddoc.lsp”或“acadltdoc.lsp”文件中。
“acad.lsp”或“acadlt.lsp”和“acaddoc.lsp”或“acadltdoc.lsp”的建议功能可以替换为 ACADLSPASDOC 系统变量。如果 ACADLSPASDOC 系统变量设置为 0(默认设置),则“acad.lsp”或“acadlt.lsp”文件仅加载一次:在应用程序启动时。如果设置为 1,则在创建新图形或打开现有图形时,将重新加载“acad.lsp”或“acadlt.lsp”文件。
“acad.lsp”或“acadlt.lsp”文件可以包含一个或多个例程的 AutoLISP 代码,也可以仅包含一系列“load”函数调用。后一种方法更可取,因为修改更容易。如果将以下代码另存为“acad.lsp”或“acadlt.lsp”文件,则每次启动产品时都会加载“mysessionapp1.lsp”、“databasesynch.lsp”和“drawingmanager.lsp”文件。
(load "mysessionapp1") (load "databasesynch") (load "drawingmanager")
“acaddoc.lsp”或“acadltdoc.lsp”文件旨在与每个文档(或图形)初始化相关联。如果要加载每次启动新图形(或打开现有图形)时都可用的 AutoLISP 例程库,则此文件很有用。
每次打开图形时,AutoCAD 都会搜索库路径以查找“acaddoc.lsp”或“acadltdoc.lsp”文件。如果找到该文件,就会将其加载到内存中。无论如何设置 ACADLSPASDOC,“acaddoc.lsp”或“acadltdoc.lsp”文件始终会与每个图形一起加载。
大多数用户会对所有基于文档的 AutoLISP 例程采用一个“acaddoc.lsp”或“acadltdoc.lsp”文件。产品会按照库路径定义的顺序搜索“acaddoc.lsp”或“acadltdoc.lsp”文件;因此,使用此功能时,可以在每个图形目录下放置不同的“acaddoc.lsp”或“acadltdoc.lsp”文件,这会为特定类型的图形或作业加载特定 AutoLISP 例程。
“acaddoc.lsp”或“acadltdoc.lsp”文件可以包含一个或多个例程的 AutoLISP 代码,也可以仅包含一系列“load”函数调用。后一种方法更可取,因为修改更容易。如果将以下代码另存为“acaddoc.lsp”或“acadltdoc.lsp”文件,则每次打开新文档时都会加载“mydocumentapp1.lsp”、“build.lsp”和“counter.lsp”文件。
(load "mydocumentapp1") (load "build") (load "counter")
当产品加载自定义 (CUI/CUIx) 文件时,它会搜索具有匹配文件名的 MNL 文件。如果找到该文件,就会将其加载到内存中。此函数可确保加载正确操作用户界面元素所需的 AutoLISP 函数。
例如,如果产品加载名为“custom.cuix”的自定义文件,则它会查找名为“custom.mnl”的文件,该文件可能会定义自定义文件中的用户界面元素使用的许多 AutoLISP 函数。MNL 文件在“acaddoc.lsp”文件之后加载。
(command "menu" "newmenu") (princ "Newmenu utilities… Loaded.") (Princ)
在此例中,调用 princ 函数可用于显示状态消息。第一次使用 princ 时,将在命令提示下显示如下信息:
新菜单实用工具…已加载。
第二次调用 princ 会退出 AutoLISP 函数。如果没有第二次调用 princ,则消息会显示两次。像以前提到的那样,可以在 load 函数调用中包含 onfailure 参数作为额外的预防措施。
可以定义 S::STARTUP 函数,以在图形初始化之后执行任何所需的设置操作。
在图形完全初始化之前,启动 LISP 文件(“acad.lsp”、“acadlt.lsp”、“acaddoc.lsp”或“acadltdoc.lsp”)会与自动加载的任何 MNL 文件一起加载到内存中。通常,这并不会引起问题,除非要使用 command 函数,该函数在图形初始化之前不保证能够正常工作。
如果用户定义的函数 S::STARTUP 包含在“acad.lsp”、“acadlt.lsp”、“acaddoc.lsp”、“acadltdoc.lsp”或 MNL 文件中,则当输入新图形或打开现有图形时会调用此函数。因此,可以在 AutoLISP 启动文件中包含 S::STARTUP 的定义以执行任何设置操作。
例如,如果要通过添加一条消息然后切换到 BHATCH 命令来替换标准 HATCH 命令,请使用包含以下代码的“acaddoc.lsp”或“acadltdoc.lsp”文件:
(defun C:HATCH ( ) (alert "Using the BHATCH command!") (princ "\nEnter OLDHATCH to get to real HATCH command.\n") (command "BHATCH") (princ) ) (defun C:OLDHATCH ( ) (command ".HATCH") (princ) ) (defun-q S::STARTUP ( ) (command "undefine" "hatch") (princ "\nRedefined HATCH to BHATCH!\n") )
在图形初始化之前,使用 defun 函数定义 HATCH 和 OLDHATCH 的新定义。在图形初始化之后,将调用 S::STARTUP 函数并取消定义 HATCH 的标准定义。
由于 S::STARTUP 函数可以在许多位置(“acad.lsp”、“acadlt.lsp”、“acaddoc.lsp”、“acadltdoc.lsp”、MNL 文件或从这些文件加载的任何其他 AutoLISP 文件)进行定义,因此可以替换先前定义的 S::STARTUP 函数。
以下示例显示了一种确保启动函数可以与其他函数一起工作的方法。
(defun-q MYSTARTUP ( )
... 您的启动函数 ...
) (setq S::STARTUP (append S::STARTUP MYSTARTUP))
上面的代码会将启动函数附加到现有 S::STARTUP 函数,然后重新定义 S::STARTUP 函数以包含您的启动代码。无论之前是否存在 S::STARTUP 函数,这都能够正常工作。