天天看點

AuToCAD啟動自定義加載程式研究

CAD檔案加載順序: acad2006.lsp (AutoCAD使用) acad.rx (使用者自定義的*.arx檔案加載清單) 注:在CAD2006中,由錯誤提示懷疑:*.arx檔案檢測先于acad2006.lsp加載。 acad.lsp (使用者自定義的Lsp自動加載程式) acad2006doc.lsp (AutoCAD使用) acetutil.fas (Express Tools初始化程式) acaddoc.lsp (使用者自定義的Lsp自動加載程式) mymenu.mnc (使用者自定義或第三方編譯菜單檔案) mymenu.mnl (使用者自定義或第三方菜單檔案) acad.mnc (AutoCAD編譯菜單檔案) acad.mnl (AutoCAD菜單檔案) acetmain.mnc (Express Tools編譯菜單檔案) acetmain.mnl (Express Tools菜單) 使用“對話框方式”加載的檔案 s::startup (自動執行函數,可用于自定義狀态欄等) 系統資料庫法加載順序未知。 注意: 1.如果acad.lsp、acaddoc.lsp或MNL檔案中包含自定義函數S::STARTUP,那麼,建立新圖形或打開現有圖形時就會調用這個函數。是以,在 LISP啟動檔案中添加S::STARTUP函數定義,就可以執行全部所需的安裝操作。如果需要關于“S::STARTUP”函數的詳細資訊,請參閱“AutoCAD 2000 Customization Guide”的第六章。 2.預設情況下,acad.lsp 僅在啟動 AutoCAD 時加載一次,而 acaddoc.lsp 可随每個文檔(或圖形)一起加載。這樣可使使用者将加載 acad.lsp 檔案和啟動應用程式相關聯,将 acaddoc.lsp 檔案和文檔或圖形啟動相關聯。通過更改 ACADLSPASDOC 系統變量的設定,可以修改加載這些啟動檔案的預設方法。在CAD2006中,第一次建立圖形時,也會出現對話框詢問:acad.lsp是僅在啟動 AutoCAD 時加載一次,還是随每個文檔(或圖形)一起加載。 不同位置的acad.lsp 和acaddoc.lsp按如下順序加載: CAD安裝目錄(即:acad.exe所在檔案夾) “支援檔案搜尋路徑”所包含的檔案夾的逆序加載 Dwg檔案所在檔案夾(打開Dwg檔案時加載) 有關同名覆寫的問題:l 同名檔案被最後加載的版本覆寫。 比如:你定義了一系列自己編制的lisp程式并放在acad.lsp檔案中,但該acad.lsp放在CAD安裝目錄中。當“支援檔案搜尋路徑”所包含的檔案夾中,由于未知原因出現了一個與你自定義的acad.lsp檔案不同的acad.lsp檔案時, 你自定義的acad.lsp檔案就不會被加載。解決的辦法是将後加載的acad.lsp檔案删除或用自己定義的acad.lsp替換放後加載的acad.lsp檔案,或将自己定義的acad.lsp放在更靠後加載的目錄中。 l 同名函數(或指令)被最後加載的版本覆寫。 知道AutoCAD 2000啟動時各個檔案加載的順序,可能就會明白一個檔案對另一個檔案的影響。例如,已經在從acad.lsp檔案加載的LISP程式中定義了一個函數,但是在啟動AutoCAD 2000後,這個函數卻不工作。這是因為acaddoc.lsp是在acad.lsp檔案之後加載,此函數已經被acaddoc.lsp檔案重新定義了。 l 加載的dll檔案同名但dll裡的函數不同名,dll不會互相覆寫。 --------------------------------------------------------------------------------------------------------------------- 關于CAD啟動時自動加載程式的研究(二) 1.Lisp法:a.在ACAD.EXE所在目錄加入acad.lsp或acaddoc.lsp acad.lsp或acaddoc.lsp檔案内容: (defun S::STARTUP() ;函數名不可以改變 (command "_netload" "my.dll"); my.dll為相對路徑也可用絕對路徑 ) 或:(load “1111.lsp”)在1111.lsp檔案中調用my.dll。 b.修改AutoCAD 2006/Support/acad2006.lsp或cad2006doc.lsp檔案,裡面加入加載代碼。(加載代碼同上。) c.修改你的菜單組對應的同名的MNL檔案,裡面加入加載代碼。 MNL檔案其實是一種與菜單同名,擴充名為MNL的LISP檔案。它随同名菜單加載。 acad.mnl的位置:C:/Documents and Settings/使用者名/Application Data/Autodesk /AutoCAD 2006/R16.2/chs/Support/acad.mnl 缺點: a.可能被其他第三方程式修改時覆寫。 b.如果使用acad.lsp,建立文檔時出現:“是否讀入每個圖形時都加載“acad.lsp”的提示。 2.對話框方式: a。菜單:工具->加載應用程式,(或用指令:_APPLOAD) b。啟動組:“内容”按鈕, c。“添加”按鈕 等同于如下系統資料庫操作:[HKEY_CURRENT_USER/Software/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Profiles/<<未命名配置>>/Dialogs/Appload/Startup] "NumStartup"="1" //啟動組加載的項目數 "1Startup"="C://Program Files//AutoCAD 2006//222.lsp" //數字1表示在cad中加載的順序,後面是加載檔案的路徑。 注意: a.此方法在CAD2006以下版本中,隻能加載lisp、VBA、arx等,不能加載dll。但可通過lisp間接加載dll。 b.此方法每次打開一個新的文檔就會自動加載啟動組中指定的檔案。 c.(網友發言)加到啟動組裡面有時候不能加載,尤其是打開新圖的時候。 -------------------------------------------------------------------------------------------------------------------- 3.系統資料庫法:(注意:檢查LOADER的路徑是否正确) 在系統資料庫加入如下項值: [HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Applications/my] "MANAGED"=dword:00000001 "LOADER"="C://Program Files//AutoCAD 2006//my.dll" "LOADCTRLS"=dword:00000002 "DEION"="my" 說明: a. 非托管的ARX程式是指用C++編譯的以.arx為字尾的動态連結庫檔案;托管的ARX程式是指由.net程式(C#,C++.net或VB.net)編譯的以.dll為字尾的動态連結庫檔案。托管的程式和非托管的程式相比,隻要多建立一個“MANAGED”鍵,并設為Ox01,告訴CAD這是托管程式即可。VBA,lisp的系統資料庫加載法參見“2. 對話框方式”。 b. 系統資料庫鍵值"LOADCTRLS"控制說明,控制ARX程式的加載方式 0x01:Load the application upon detection of proxy object.    當代理對像被控知時另載相應ARX程式. 0x02:Load the application upon AutoCAD startup.    當AutoCAD啟動時加載相應ARX程式. 0x04:Load the application upon invocation of a command.    當輸入指令時加載相應ARX程式. 0x08:Load the application upon request by the user or another application.    當有使用者或别的程式請求時加載相應ARX程式. 0x10:Do not load the application.    從不加載該應用程式. 0x20:Load the application transparently.    顯式加載該應該程式.(不知該項譯法是否有誤) c. 當my。dll中有指令時,還需要添加一個子鍵: [HKEY_LOCAL_MACHINE/SOFTWARE/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Applications/my/Commands] "StartmyApp"="StartmyApp" -StartmyApp 是你程式中一個有效的指令。 這樣,你的程式就會在AutoCAD 啟動時加載并初始化。你可以添加代碼到程式的如下地方(VB.Net代碼): Public Sub StartmyApp() ..... End Sub 然後在ACAD.LSP, ACAD.MNL, 或其他自動載入的檔案裡調用StartmyApp指令。 優點:隻要項鍵值不同就不會被覆寫,是以建議鍵名使用gid。 --------------------------------------------------------------------------------------------------------------------- 于CAD啟動時自動加載程式的研究(四) 4.子程序法:将二次開發的程式做成EXE程式。啟動該程式會自動啟動CAD子程序,關閉程式時可以關閉CAD子程序。 5.ACAD.RX檔案法:在AutoCAD 啟動檔案acad.rx 中指定待裝入的ARX 應用程式名。acad.rx 是ASCII 文本檔案,每個ARX 應用程式必須單獨占一行,AutoCAD 啟動時會自動裝載該檔案中的ARX 應用程式。另外,應確定$ACAD 路徑定義中包括檔案acad.rx 的存放目錄。 6.配置檔案法:可以把自己配置的AUTOCAD啟動時加載的東西,儲存成一個的配置檔案。然後在AUTOCAD啟動快捷方式中用參數: /p 你的配置檔案名。這樣就可以在啟動的時候加載自己的CAD環境。 具體如下:菜單:工具--選項(或用指令:_OPTIONS),“配置”頁籤,選擇配置檔案後,點選“輸出”。可以輸出一個擴充名為arg的文本檔案,儲存到某個位置,然後再桌面上将cad 的快捷方式複制一個,右鍵屬性,将目标中"C://My Programs//Auto CAD//acad.exe"的後面加上/p "d:/test/test.arg" (注意:雙引号,不是漢字的,而是英文的!) 有些指令要求:将加載的檔案的路徑,加入搜尋路徑。方法如下: 加入搜尋路徑:菜單:工具->選項,(或用指令:_OPTIONS)選中“支援檔案搜尋路徑”,點“添加”,點“浏覽”,選擇要添加的路徑,點“确定”。 等同于如下系統資料庫操作:注意需要先關閉CAD [HKEY_CURRENT_USER/Software/Autodesk/AutoCAD/R16.2/ACAD-4001:804/Profiles/<<未命名配置>>/General] "ACAD"="C://Documents and Settings//使用者名//Application Data//Autodesk//AutoCAD 2006//R16.2//chs//support;C://Program Files//AutoCAD 2006//support;C://Program Files//AutoCAD 2006//fonts;C://Program Files//AutoCAD 2006//help;C://Program Files//AutoCAD 2006//Express;C://Program Files//AutoCAD 2006//support//color;C://Program Files//AutoCAD 2006//myfile;" 注意:此法每次打開一個新的文檔就會自動加載系統資料庫中指定的檔案。 -------------------------------------------------------------------------------------------------------------------- 關于CAD啟動時自動加載程式的研究(五)附: CAD加載指令:appload (加載VBA,Arx,Lisp), netload(加載dll),arxload(加載Arx),load(加載Lisp),autoload(加載Lisp),autoarxload(加載Arx) 加載二次開發線程的方法:loadDVB(加載VBA的方法)和loadARX(加載ARX的方法) 用acrxLoadModule() 或AcRxDynamicLinker::loadModule() 函數,在一個ARX 應用程式裡裝載另一個ARX 應用程式。這兩個函數的原型是: ---- int acrxLoadModule(char * moduleName, int printit); ---- virtual Adesk::Boolean AcRxDynamicLinker::loadModule (char * fileName, int printIt) = 0; ---- 其中各參數含義如下: ---- moduleName:待裝載的ARX 應用程式名;ARX 應用程式擴充名預設為.ARX,如果不是.ARX,則此處char * moduleName 參數必須包括應用程式擴充名。 ---- fileName:含義與上述moduleName 相同。但是fileName 必須包括待裝載的ARX 應用程式的路徑和擴充名。 ---- printit:取0 則不顯示裝載結果,取非0 值則顯示。當printit 取非0 值時,如裝載成功,則在AutoCAD 指令視窗顯示“Runtime Extension is already loaded./",否則,顯示“AcRxDynamicLinker failed to load /"。 ---- acrxLoadModule() 與AcRxDynamicLinker::loadModule 不同的是:acrxLoadModule() 從$ACAD 定義的AutoCAD 搜尋路徑自動搜尋待裝載的ARX 應用程式,并預設ARX 應用程式擴充名為.ARX。 int ads_arxload(const char *ArxAppName) 函數。在ADS 或ARX 程式裡使用 該函數可将一個ARX 子產品裝載到相應的ADS 或ARX 程式裡。該函數的傳回值表示裝載結果。與該函數對應的AutoLISP 函數是(arxload)。 用ads_arxload() 和acrxLoadModule() 裝入一個ARX 應用程式的差別是:用ads_arxload() 裝入的ARX 應用程式不僅注冊成一個ADS 程式,同時還注冊成一個ARX 程式。 -------------------------------------------------------------------------------------------------------------------- 關于CAD啟動時自動加載程式的研究(六) 菜單的加載:AutoCAD啟動時将自動加載預設的基本菜單檔案“acad.mnu ”,其預設路徑可在“工具→選項→檔案→工作支援檔案搜尋路徑”中檢視。 其中,字尾為mnu的是原始 ASCII 菜單檔案,mnc是已編譯的菜單檔案,mns是源菜單檔案。 AutoCAD啟動時會在預設路徑中按mns→mnc→mnu的順序依次查找,找到任何一類檔案都可生成mnc檔案并加載。如這些檔案均未找到,将彈出上述資訊視窗。按“确定”進入AutoCAD後工具欄就丢失了,而且相應菜單中沒有恢複工具欄的功能。但此時指令行還可以使用,隻需要輸入“menu”指令,就會彈出一個“選擇菜單檔案”視窗,找到上述任何一類菜單檔案打開即可恢複工具欄。 如果檔案損壞或被删除,可以從其它AutoCAD運作正常的計算機上拷貝一個菜單檔案按同樣的方法加載。當然還可以把可正常使用的菜單檔案拷貝到預設路徑下,這樣AutoCAD将自動加載而不用我們手動設定,此時可用“options”指令進入“選項”視窗檢視預設路徑。 在加載自定義菜單時,如果通過MENU加載,就會把acad.cui趕跑了。如果想保留acad.cui(CAD預設菜單),應該用MENULOAD來加載(局部加載),這樣兩個菜單都在,如果不用了,也可以通過這個指令來解除安裝。用了之後如果不解除安裝,退出cad之後下次啟動還會加載自定義菜單。 怎樣在Auto CAD 2006 加載自定義菜單檔案? 問題:我想在Auto CAD 2006 加載自定義菜單檔案,不改變acad.cui的原有菜單隻是在其後加一欄菜單(在"幫助"菜單POP12後加"自定義"菜單POP13) 回答:你可以用寫字闆程式打開acad.MNU檔案,然後按照其格式把POP13的内容寫進去,存盤後,重新啟動ACAD就行了。如果還不行,就在啟動ACAD後鍵入指令MENU,然後根據提示選擇ACAD.MNU。

繼續閱讀