如何自動加載和運(yùn)行AutoLISP程序
發(fā)布時(shí)間:2023-07-26 08:55 [ 我要自學(xué)網(wǎng)原創(chuàng) ] 發(fā)布人: samohu 閱讀: 3459

可以在啟動時(shí)加載 AutoLISP 程序,并在繪圖任務(wù)期間在特定的時(shí)間執(zhí)行命令或函數(shù)。

基于 AutoCAD 的產(chǎn)品將自動加載用戶可定義的三個(gè)文件的內(nèi)容:acad.lspacaddoc.lsp 和當(dāng)前自定義文件附帶的 MNL 文件。

默認(rèn)情況下,acad.lsp 文件僅在啟動程序時(shí)加載一次,而 acaddoc.lsp 可隨每個(gè)文檔(或圖形)一起加載。這樣可使用戶將加載“acad.lsp”文件和啟動應(yīng)用程序相關(guān)聯(lián),將“acaddoc.lsp”文件和文檔或圖形啟動相關(guān)聯(lián)。通過更改 ACADLSPASDOC 系統(tǒng)變量的設(shè)置,可以修改加載這些啟動文件的默認(rèn)方法。

如果這些文件之一定義了特殊類型的 S::STARTUP 函數(shù),則此函數(shù)在圖形初始化完成后立即運(yùn)行。另外,APPLOAD 命令提供了“啟動組”選項(xiàng),用于加載指定的應(yīng)用程序,而無需編輯任何文件。

acad.lsp  acaddoc.lsp 啟動文件不隨基于 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)加載 AutoLISP 文件時(shí),文件中的命令定義會占用內(nèi)存,不管是否實(shí)際使用了這些命令。AutoLISP autoload 函數(shù)無需將整個(gè)程序加載到內(nèi)存中即可使某個(gè)命令可用。將下列代碼添加到 acaddoc.lsp 文件將自動加載 cmds.lsp 文件的 CMD1、CMD2 和 CMD3 命令和 newcmd.lsp 文件的 NEWCMD 命令。

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

第一次在命令提示下輸入自動加載的命令時(shí),AutoLISP 將從關(guān)聯(lián)文件加載完整的命令定義。AutoLISP 還提供用于 ObjectARX 應(yīng)用程序的 autoarxload 函數(shù)。

注: 名稱相似的 AutoLISP 啟動文件的加載由它們的編輯時(shí)間決定。除非指定完整的文件名(包括文件擴(kuò)展名),否則將加載最近編輯過的 LSP 文件。

ACAD.LSP 文件

如果定期使用特定的 AutoLISP 程序,則可以創(chuàng)建一個(gè)“acad.lsp”文件。啟動 AutoCAD 時(shí),將搜索 acad.lsp 文件的支持文件搜索路徑。找到“acad.lsp”文件后,會將其加載到內(nèi)存。

由于“acad.lsp”文件用于特定應(yī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)用程序啟動時(shí)加載。如果設(shè)定為 1,則在創(chuàng)建新圖形或打開現(xiàn)有圖形時(shí),將重新加載 acad.lsp 文件。

“acad.lsp”文件可以包含一個(gè)或多個(gè)程序的 AutoLISP 代碼,也可以僅包含一系列 load 函數(shù)調(diào)用。后一種方法比較合適,因?yàn)閷λ男薷谋容^簡單。如果將以下代碼另存為 acad.lsp 文件,則文件 mysessionapp1.lspdatabasesynch.lsp  drawingmanager.lsp 將在每次啟動程序時(shí)加載。

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

注: 請勿修改保留的 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)。如果每次啟動新圖形(或打開現(xiàn)有圖形)時(shí)都要加載某個(gè) AutoLISP 程序庫,則此文件很有用。

每次打開圖形時(shí),AutoCAD 都在庫路徑中搜索“acaddoc.lsp”文件。如果找到該文件,就把它加載到內(nèi)存中。無論如何設(shè)置 ACADLSPASDOC,acaddoc.lsp 文件始終與每個(gè)圖形一起加載。

大多數(shù)用戶會對所有基于文檔的 AutoLISP 例行程序采用“acaddoc.lsp”文件。程序根據(jù)庫路徑中定義的次序搜索 acaddoc.lsp 文件。因此,使用此功能,可以在每個(gè)圖形目錄下放置不同的 acaddoc.lsp 文件,這樣可以對某些類型的圖形或作業(yè)加載特定的 AutoLISP 程序。

acaddoc.lsp 文件可以包含一個(gè)或多個(gè)程序的 AutoLISP 代碼,也可以僅包含一系列 load 函數(shù)調(diào)用。后一種方法比較合適,因?yàn)閷λ男薷谋容^簡單。如果將下列代碼另存為 acaddoc.lsp 文件,則在每次打開新文檔時(shí),將加載文件 mydocumentapp1.lsp、build.lsp  counter.lsp。

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

注: 請勿修改保留的 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ù)。如果不對 princ 函數(shù)進(jìn)行第二次調(diào)用,則剛才顯示的消息將會再次顯示。像以前提到的那樣,可以在 load 函數(shù)調(diào)用中包含 onfailure 參數(shù)作為額外的預(yù)防措施。

S::STARTUP 函數(shù):初始化之后執(zhí)行

用戶可以定義 S::STARTUP 函數(shù),以在圖形初始化之后執(zhí)行所需的啟動操作。

啟動 LISP 文件(“acad.lsp”、“acaddoc.lsp”和 MNL)在圖形完成初始化之前已全部加載到內(nèi)存中。通常這并不會造成問題,除非使用了 command 函數(shù),此函數(shù)在圖形初始化前不能保證正常工作。

如果用戶定義的函數(shù) S::STARTUP 包含在 acad.lsp、acaddoc.lsp 或 MNL 文件中,則輸入新圖形或打開現(xiàn)有圖形時(shí)將調(diào)用此函數(shù)。因此,可以在 AutoLISP 啟動文件中包含 S::STARTUP 函數(shù)的定義以執(zhí)行任何設(shè)置操作。

例如,如果要通過添加一條消息然后切換到 BHATCH 命令來替代標(biāo)準(zhǔn) 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 函數(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ù)。

下例顯示了一種確保啟動函數(shù)與其他函數(shù)協(xié)同工作的方法。

(defun-q MYSTARTUP ( )

... your startup function ...

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

上面的代碼把啟動函數(shù)附加到現(xiàn)有的 S::STARTUP 函數(shù)中,然后重定義 S::STARTUP 函數(shù)以包含該啟動代碼。不管以前的 S::STARTUP 函數(shù)是否存在,它都可以正常工作。

,
AutoCAD2023視頻教程
我要自學(xué)網(wǎng)商城 ¥80 元
進(jìn)入購買
文章評論
添加表情
遵守中華人民共和國的各項(xiàng)道德法規(guī),
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭議評論。
參與本評論即表明您已經(jīng)閱讀并接受
上述條款。
V
特惠充值
聯(lián)系客服
APP下載
官方微信
返回頂部
分類選擇:
電腦辦公 平面設(shè)計(jì) 室內(nèi)設(shè)計(jì) 室外設(shè)計(jì) 機(jī)械設(shè)計(jì) 工業(yè)自動化 影視動畫 程序開發(fā) 網(wǎng)頁設(shè)計(jì) 會計(jì)課程 興趣成長 AIGC