关于自动加载和运行 AutoLISP 例程
可以在启动时加载 AutoLISP 程序,并在绘图任务期间在特定的时间执行命令或函数。 基于 AutoCAD 的产品和 AutoCAD LT 会自动加载三个用户可定义文件的内容:
默认情况下,“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”启动文件未随产品一起提供。用户可以自行创建和维护这些文件。 注: 从基于 AutoCAD 2014 的产品开始,当 SECURELOAD 系统变量设置为 1 或 2 时,自定义应用程序必须在安全模式下工作。当在安全模式下运行时,产品仅限于从受信任的位置加载和执行包含代码的文件;受信任的位置由 TRUSTEDPATHS 系统变量指定。
命令自动加载器当加载 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 启动文件的加载取决于其修改时间戳记;除非指定完整的文件名(包括文件扩展名),否则将加载时间戳记为最近的 LSP 文件。
ACAD.LSP 或 ACADLT.LSP 文件如果经常使用特定的 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") 注: 请勿修改保留的“acad<版本>.lsp”或“acadlt<版本>.lsp”文件。Autodesk 提供了“acad<版本>.lsp”或“acadlt<版本>.lsp”文件,其中包含所需的版本特定的 AutoLISP 定义函数。该文件会在加载“acad.lsp”或“acadlt.lsp”文件之前就立即加载到内存中。“<版本>”表示产品的版本;例如,acad2024.lsp将是基于 AutoCAD 和 AutoCAD 2024 的产品加载的文件,而acadlt2024.lsp将是 AutoCAD LT 2024 加载的文件。
ACADDOC.LSP 或 ACADLTDOC.LSP 文件“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") 注: 请勿修改保留的“acad<版本>doc.lsp”或“acadlt<版本>doc.lsp”文件。Autodesk 提供了“acad<版本>doc.lsp”或“acadlt<版本>doc.lsp”文件,其中包含所需的版本特定的 AutoLISP 定义函数。该文件会在加载“acaddoc.lsp”或“acadltdoc.lsp”文件之前就立即加载到内存中。“<版本>”表示产品的版本;例如,acad2024doc.lsp将是基于 AutoCAD 和 AutoCAD 2024 的产品加载的文件,而acadlt2024doc.lsp将是 AutoCAD LT 2024 加载的文件。
MNL 文件和 AutoLISP 菜单自定义当产品加载自定义 (CUI/CUIx) 文件时,它会搜索具有匹配文件名的 MNL 文件。如果找到该文件,就会将其加载到内存中。此函数可确保加载正确操作用户界面元素所需的 AutoLISP 函数。 注: AutoCAD LT 不支持自动加载 MNL 文件,但可以使用 AutoLISP LOAD 函数从其他 LISP 文件加载这些文件。
例如,如果产品加载名为“custom.cuix”的自定义文件,则它会查找名为“custom.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”、“acadlt.lsp”、“acaddoc.lsp”或“acadltdoc.lsp”)会与自动加载的任何 MNL 文件一起加载到内存中。通常,这并不会引起问题,除非要使用 command 函数,该函数在图形初始化之前不保证能够正常工作。 注: AutoCAD LT 不支持自动加载 MNL 文件,但可以使用 AutoLISP LOAD 函数从其他 LISP 文件加载这些文件。
如果用户定义的函数 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 函数必须已使用 defun-q 函数而不是 defun 进行定义。
由于 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 函数,这都能够正常工作。 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-5-13 08:46
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.