可以在啟動(dòng)時(shí)加載 AutoLISP 程序,并在繪圖任務(wù)期間在特定的時(shí)間執(zhí)行命令或函數(shù)。
基于 AutoCAD 的產(chǎn)品將自動(dòng)加載用戶可定義的三個(gè)文件的內(nèi)容:acad.lsp、acaddoc.lsp 和當(dāng)前自定義文件附帶的 MNL 文件。
默認(rèn)情況下,acad.lsp 文件僅在啟動(dòng)程序時(shí)加載一次,而 acaddoc.lsp 可隨每個(gè)文檔(或圖形)一起加載。這樣可使用戶將加載“acad.lsp”文件和啟動(dòng)應(yīng)用程序相關(guān)聯(lián),將“acaddoc.lsp”文件和文檔或圖形啟動(dòng)相關(guān)聯(lián)。通過更改 ACADLSPASDOC 系統(tǒng)變量的設(shè)置,可以修改加載這些啟動(dòng)文件的默認(rèn)方法。
如果這些文件之一定義了特殊類型的 S::STARTUP 函數(shù),則此函數(shù)在圖形初始化完成后立即運(yùn)行。另外,APPLOAD 命令提供了“啟動(dòng)組”選項(xiàng),用于加載指定的應(yīng)用程序,而無需編輯任何文件。
acad.lsp 和 acaddoc.lsp 啟動(dòng)文件不隨基于 AutoCAD 的產(chǎn)品一起提供。這些文件可以由用戶來創(chuàng)建和維護(hù)。
注: 從基于 AutoCAD 2014 的產(chǎn)品開始,當(dāng) SECURELOAD 系統(tǒng)變量設(shè)定為 1 或 2 時(shí),自定義應(yīng)用程序必須在安全模式下工作。在安全模式下進(jìn)行操作時(shí),程序限制為從受信任的位置加載和執(zhí)行包含代碼的文件;受信任的位置由 TRUSTEDPATHS 系統(tǒng)變量指定。
自動(dòng)加載命令
當(dāng)加載 AutoLISP 文件時(shí),文件中的命令定義會(huì)占用內(nèi)存,不管是否實(shí)際使用了這些命令。AutoLISP autoload 函數(shù)無需將整個(gè)程序加載到內(nèi)存中即可使某個(gè)命令可用。將下列代碼添加到 acaddoc.lsp 文件將自動(dòng)加載 cmds.lsp 文件的 CMD1、CMD2 和 CMD3 命令和 newcmd.lsp 文件的 NEWCMD 命令。
(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) (autoload "NEWCMD" '("NEWCMD"))
第一次在命令提示下輸入自動(dòng)加載的命令時(shí),AutoLISP 將從關(guān)聯(lián)文件加載完整的命令定義。AutoLISP 還提供用于 ObjectARX 應(yīng)用程序的 autoarxload 函數(shù)。
注: 名稱相似的 AutoLISP 啟動(dòng)文件的加載由它們的編輯時(shí)間決定。除非指定完整的文件名(包括文件擴(kuò)展名),否則將加載最近編輯過的 LSP 文件。
ACAD.LSP 文件
如果定期使用特定的 AutoLISP 程序,則可以創(chuàng)建一個(gè)“acad.lsp”文件。啟動(dòng) AutoCAD 時(shí),將搜索 acad.lsp 文件的支持文件搜索路徑。找到“acad.lsp”文件后,會(huì)將其加載到內(nèi)存。
由于“acad.lsp”文件用于特定應(yīng)用程序的啟動(dòng)程序,因此“acad.lsp”文件中定義的所有函數(shù)和變量只能在第一個(gè)圖形中使用。應(yīng)該把需要在所有文檔中使用的程序從“acad.lsp”文件移到“acaddoc.lsp”文件。
可以用 ACADLSPASDOC 系統(tǒng)變量替代建議使用的 acad.lsp 和 acaddoc.lsp 功能。如果 ACADLSPASDOC 系統(tǒng)變量設(shè)定為 0(默認(rèn)設(shè)置),則“acad.lsp”文件僅加載一次,即在應(yīng)用程序啟動(dòng)時(shí)加載。如果設(shè)定為 1,則在創(chuàng)建新圖形或打開現(xiàn)有圖形時(shí),將重新加載 acad.lsp 文件。
“acad.lsp”文件可以包含一個(gè)或多個(gè)程序的 AutoLISP 代碼,也可以僅包含一系列 load 函數(shù)調(diào)用。后一種方法比較合適,因?yàn)閷?duì)它的修改比較簡(jiǎn)單。如果將以下代碼另存為 acad.lsp 文件,則文件 mysessionapp1.lsp、databasesynch.lsp 和 drawingmanager.lsp 將在每次啟動(dòng)程序時(shí)加載。
(load "mysessionapp1") (load "databasesynch") (load "drawingmanager")
注: 請(qǐng)勿修改保留的 acad<版本>.lsp 文件。Autodesk 提供 acad<版本>.lsp 文件,其中包含所需的、版本特定的且由 AutoLISP 定義的函數(shù)。此文件在加載“acad.lsp”文件之前加載到內(nèi)存。<版本> 表示基于 AutoCAD 的產(chǎn)品的版本;例如,acad2015.lsp 可能是由基于 AutoCAD 2015 的產(chǎn)品加載的文件。
ACADDOC.LSP 文件
acaddoc.lsp 文件用于與每個(gè)文檔(或圖形)的初始化關(guān)聯(lián)。如果每次啟動(dòng)新圖形(或打開現(xiàn)有圖形)時(shí)都要加載某個(gè) AutoLISP 程序庫(kù),則此文件很有用。
每次打開圖形時(shí),AutoCAD 都在庫(kù)路徑中搜索“acaddoc.lsp”文件。如果找到該文件,就把它加載到內(nèi)存中。無論如何設(shè)置 ACADLSPASDOC,acaddoc.lsp 文件始終與每個(gè)圖形一起加載。
大多數(shù)用戶會(huì)對(duì)所有基于文檔的 AutoLISP 例行程序采用“acaddoc.lsp”文件。程序根據(jù)庫(kù)路徑中定義的次序搜索 acaddoc.lsp 文件。因此,使用此功能,可以在每個(gè)圖形目錄下放置不同的 acaddoc.lsp 文件,這樣可以對(duì)某些類型的圖形或作業(yè)加載特定的 AutoLISP 程序。
acaddoc.lsp 文件可以包含一個(gè)或多個(gè)程序的 AutoLISP 代碼,也可以僅包含一系列 load 函數(shù)調(diào)用。后一種方法比較合適,因?yàn)閷?duì)它的修改比較簡(jiǎn)單。如果將下列代碼另存為 acaddoc.lsp 文件,則在每次打開新文檔時(shí),將加載文件 mydocumentapp1.lsp、build.lsp 和 counter.lsp。
(load "mydocumentapp1") (load "build") (load "counter")
注: 請(qǐng)勿修改保留的 acad<版本>doc.lsp 文件。Autodesk 提供 acad<版本>doc.lsp 文件,其中包含所需的、版本特定的且由 AutoLISP 定義的函數(shù)。此文件在加載“acaddoc.lsp”文件之前加載到內(nèi)存。<版本> 表示基于 AutoCAD 的產(chǎn)品的版本;例如,acad2015doc.lsp 可能是由基于 AutoCAD 2015 的產(chǎn)品加載的文件。
MNL 文件和 AutoLISP 菜單自定義
當(dāng)程序加載自定義 (CUI/CUIx) 文件時(shí),將搜索具有匹配文件名的 MNL 文件。如果找到該文件,就把它加載到內(nèi)存中。此功能可以確保加載正確操作用戶界面元素所需的 AutoLISP 函數(shù)。
例如,自定義文件 acad.cuix 將查找文件 acad.mnl,它可能定義在自定義文件中由用戶界面元素所使用的許多 AutoLISP 函數(shù)。MNL 文件在“acaddoc.lsp”文件后加載。
注: 如果用 AutoLISP command 函數(shù)加載自定義文件(其語法類似于 (command "menu" "newmenu")),則在整個(gè) AutoLISP 程序運(yùn)行后,才加載關(guān)聯(lián) MNL 文件。
(command "menu" "newmenu") (princ "Newmenu utilities… Loaded.") (Princ)
在此例中,調(diào)用 princ 函數(shù)可用于顯示狀態(tài)消息。第一次使用 princ 時(shí),將在命令提示下顯示如下信息:
新菜單實(shí)用工具…已加載。
第二次調(diào)用 princ 函數(shù)將退出 AutoLISP 函數(shù)。如果不對(duì) princ 函數(shù)進(jìn)行第二次調(diào)用,則剛才顯示的消息將會(huì)再次顯示。像以前提到的那樣,可以在 load 函數(shù)調(diào)用中包含 onfailure 參數(shù)作為額外的預(yù)防措施。
S::STARTUP 函數(shù):初始化之后執(zhí)行
用戶可以定義 S::STARTUP 函數(shù),以在圖形初始化之后執(zhí)行所需的啟動(dòng)操作。
啟動(dòng) LISP 文件(“acad.lsp”、“acaddoc.lsp”和 MNL)在圖形完成初始化之前已全部加載到內(nèi)存中。通常這并不會(huì)造成問題,除非使用了 command 函數(shù),此函數(shù)在圖形初始化前不能保證正常工作。
如果用戶定義的函數(shù) S::STARTUP 包含在 acad.lsp、acaddoc.lsp 或 MNL 文件中,則輸入新圖形或打開現(xiàn)有圖形時(shí)將調(diào)用此函數(shù)。因此,可以在 AutoLISP 啟動(dòng)文件中包含 S::STARTUP 函數(shù)的定義以執(zhí)行任何設(shè)置操作。
例如,如果要通過添加一條消息然后切換到 BHATCH 命令來替代標(biāo)準(zhǔn) HATCH 命令,請(qǐng)使用包含以下代碼的 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 函數(shù)定義了 HATCH 和 OLDHATCH ,命令的新定義。圖形初始化之后,S::STARTUP 函數(shù)被調(diào)用并且 HATCH 命令的標(biāo)準(zhǔn)定義被解除。
注: 還需提及的是,S::STARTUP 函數(shù)必須使用 defun-q 函數(shù)而不是 defun 定義。
由于 S::STARTUP 函數(shù)可以在許多位置(“acad.lsp”、“acaddoc.lsp”、MNL 文件或從這些文件中加載的其他任何 AutoLISP 文件)定義 ,因此可以替換先前定義的 S::STARTUP 函數(shù)。
下例顯示了一種確保啟動(dòng)函數(shù)與其他函數(shù)協(xié)同工作的方法。
(defun-q MYSTARTUP ( )
... your startup function ...
) (setq S::STARTUP (append S::STARTUP MYSTARTUP))
上面的代碼把啟動(dòng)函數(shù)附加到現(xiàn)有的 S::STARTUP 函數(shù)中,然后重定義 S::STARTUP 函數(shù)以包含該啟動(dòng)代碼。不管以前的 S::STARTUP 函數(shù)是否存在,它都可以正常工作。
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。