A-A+

AutoCAD中AutoLISP程序的自动加载

2015年07月04日 CAD 阅读 3,526 views 次

关键字:AutoLISP AutoCAD 自动加载

KeywordAutoLISP AutoCAD autoload

摘要:介绍了启动AutoCAD和文档初始化两种情况下AutoLISP程序的自动加载方法,并介绍了初始化文档后AutoLISP程序的自动运行方法。

AbstractThe paper introduced the autoload of AutoLISP program ,when the AutoCAD application started or the AutoCAD application initialized the document. After the document was initialized, the method by which theAutoLISP program can autorun was given.

1.AutoLISP 自动加载文件acad.lspacaddoc.lsp

用于AutoLISP程序自动加载的文件有两个:acad.lspacaddoc.lsp。默认情况下acad.lsp文件仅在程序启动时被加载一次(可通过修改变量ACADLSPASDOC的值使acad.lsp在每个打开的文件中均加载),而acaddoc.lsp可随每个文档的打开而加载。在一般情况下不建议修改ACADLSPASDOC的默认值,这样可使用户将加载acad.lsp文件和启动应用程序相关联,将“acaddoc.lsp”文件和文档或图形启动相关联。在程序启动或文档打开(创建)时,将搜索所有支持文件搜索路径中的相应的acad.lsp而将其进行加载。但是AutoCAD 根据库路径中定义的次序搜索acaddoc.lsp文件(关于库搜索路径的搜索次序参见参考文献1)。因此,使用此功能,可以在每个图形目录下放置不同的acaddoc.lsp文件,这样可以对某些类型的图形或作业加载特定的 AutoLISP 程序。

除了acad.lspacaddoc.lspAutoCAD还提供了两个类似的带有版本号的文件,如AutoCAd2010中提供了acad2010.lspacad2010doc.lsp。虽然带有版本号的这两个文件也会自动加载,但是这两个文件中包含了AutoCAD程序正常运行所必须的lisp函数,因此不建议修改这两个文件。acad2010.lsp将在acad.lsp之前被加载到内存中,同样acad2010doc.lsp也将在acaddoc.lsp之前加载到内存中。

这两个文件中均可以包含一个或多个程序的 AutoLISP 代码,也可以仅包含一系列 load autoload 函数调用。如:

(load "mydocumentapp1")

(load "build")

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

2.自动加载函数loadautoload

2.1 load

此函数的格式为:(load filename [onfailure])

1filename:当文件名中不包含扩展名时,autocad在加载时将按照以下顺序搜索文件.vlx->.fas->.lsp当搜索到第一个文件时则停止搜索。文件名中可以包含有文件的绝对路径,如果不含有绝对路径则按照库搜索路径的搜索次序(参考文献1)进行搜索,当搜索到第一个文件时则将其进行加载而停止搜索。

2onfailure:当加载失败时执行的动作。

3)返回值:当加载成功时返回值不确定,当加载失败时返回onfailure定义的错误信息。

2.2 autoload

此函数格式为:(autoload filename cmdlist)

1filename:此函数只支持.lsp.arx.exe三种文件的搜索,而不支持.vlx.fas文件,搜索方法同load函数。

2cmdlist:待加载文件中所包含命令的列表。

3)返回值:nil

函数示例:

(autoload "BONUSAPP" '("APP1" "APP2" "APP3"))

待加载文件BONUSAPP中包含了三个命令:APP1APP2APP3.

2.3 函数比较

使用loadcommand函数进行自动加载时,不管是否使用此命令,在实际中此命令的定义都要占用内存。而autoload函数无需将整个函数加载到内存中就可以使某个命令可用。当第一次使用autoload列表cmdlist中的命令时,autocad会将对应的filename中的程序加载到内存中然后继续该命令。

3. S::STARTUP 函数

此函数在图形初始化之后执行所需要的启动操作。启动lisp文件acad.lspacaddoc.lspMNL在图形初始化之前已加载到内存中,通常这并不会造成什么问题。但是如果这些文件中使用了command函数,此函数在图形初始化之前并不能保证可以正常工作。因此,在启动文件中如果使用command函数,应将其放在S::STARTUP函数中。

S::STARTUP函数必须使用defun-q关键字来定义,而不是使用defun关键字。由于S::STARTUP 函数可以在许多位置(acad.lspacaddoc.lspMNL 文件或从这些文件中加载的其他任何 AutoLISP 文件)定义,而后面定义的S::STARTUP函数将替换先前定义的 S::STARTUP 函数。为了确保启动函数能够与其他函数协同工作,一般使用如下格式进行S::STARTUP函数的定义:

(defun-q MYSTARTUP ( )

... your startup function ...

)

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

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

4. 自动加载时的错误预警

如果在加载启动文件时发生 AutoLISP 错误,则此文件剩下的部分将被忽略并且不被加载。通常,在启动文件中指定的文件不存在或不在 AutoCAD 库路径中时都会出错。如果在出现加载错误时需要进行报错和控制,就要在 load 函数中使用 onfailure 参数。如果 load 函数调用成功,则返回文件中最后一个表达式的值(通常是最后定义的函数名或关于该函数的使用消息)。如果调用失败,则返回 onfailure 参数的值。如下所示:

(princ (load "mydocapp1" "nMYDOCAPP1.LSP file not loaded."))

(princ (load "build" "nBUILD.LSP file not loaded."))

(princ (load "counter" "nCOUNTER.LSP file not loaded."))

(princ)

load 函数返回的值传递给 princ 函数,从而在命令提示下显示此返回值。 例如,如果AutoCAD 加载 mydocapp1.lsp 文件时出错,则 princ 函数将显示未加载“MYDOCAPP1.LSP”文件,而 AutoCAD 将继续加载剩下的两个文件。

如果在acad.lspacaddoc.lsp  MNL 文件中使用 command 函数,则它只应从defun 语句中调用一次。请使用 S::STARTUP 函数定义在开始绘图任务时需立即执行的那些命令。

参考文献:

【1】 坐倚北风网,AutoCAD的文件组织形式和搜索路径,http://www.leanwind.com/archives/65.html

【2】 AutoCAD2010帮助文档

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: