利用lisp進行AutoCAD二次開發(環境說明、檔案讀取、以及表格建立與寫值)
今天學習的這個例子是lisp計算機語言程式設計,說到這門計算機語言還是大學的時候接觸的,不過那時候都是停留在瞭解的層面上,後面編寫AutoCAD二次開發程式幾乎是用的是C#。所以對lisp不熟,就別提關於lisp在AutoCAD方面的介面。而今天所以又撿起這麼計算機語言,是出於兩方面原因,首先在AutoCAD明經測繪GIS板塊中有相當一部分程式碼是lisp編寫的,這部分程式碼非常實用於測繪GIS日常生產。另外一個方面是,在AutoCAD論壇中,autoLisp版塊非常活躍,這裡常常匯聚著一些業界的大牛,在這裡開源了相當一部分程式碼。可以說,是一部分相當不錯的資料。
使用lisp開發AutoCAD程式開發環境為AutoCAD自帶的編輯器。具體介面如下圖所示。
程式碼只要寫在空白處,儲存為.lsp字尾檔案即可。下面來說一下,常用的除錯鍵,F8為單步除錯,為巢狀的方式,會層層的深入。而如果想一個一個表示式除錯,只要shift+F8即可。而下面截圖中按鈕是對程式碼的執行,程式碼的檢查,由於lisp以非常繁瑣的連結串列方式,即括號的方式編寫,所以使用這幾個功能對程式碼的檢查是十分有必要的。
類似於C#,JAVA計算機語言,我們在除錯的時候需要對我們的變數值進行檢視,在AutoCAD中可以使用如下圖的監視視窗。在視窗中輸入變數的值,可以檢視程式執行中,變數值的變化。
而我們在開發中,往往需要對程式碼進行類似C#一樣,將AutoCAD新增到程序中除錯,在AutoCAD自帶的編輯器中,我們只要使用啟用AutoCAD即可。具體如下圖所示。
好了,關於編寫AutoCAD開發的lisp程式方面的環境,以及常用的快捷鍵就說明完,當然了,更多的相關的知識,大家可以檢視網路的相關資料,這裡就不做詳細的說明。
今天學習的這個例子是利用AutoCAD物件,利用反射呼叫函式開啟檔案視窗,讀取檔案。然後讀檔案該目錄下的dwg字尾的檔案。再由AutoCAD裡面建立表格,將檔名填寫到表格裡面,整個程式就作完工作。在這裡例子,我們將會學到AutoCAD物件的連結,模型空間中新增表格,表格單元格的填寫。就lisp語法而言,有物件的反射呼叫,迴圈的使用。可以說是學習AutoCAD在lisp開發不錯的例子。具體的實現程式碼如下圖所示。
(defun c:GET_FILES ( / sh folder folderobject result) (vl-load-com) (command "cmdecho" 0) (setq sh (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" )) (setq folder (vlax-invoke-method sh 'BrowseForFolder 0 "" 0 )) (vlax-release-object sh) (setq folderobject (vlax-get-property folder 'Self)) (setq result (vlax-get-property FolderObject 'Path)) (setq Files_Folder (vl-directory-files result "*.dwg")) (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-ActiveDocument acadObj)) (setq pt (vlax-3d-point 0 0 0)) (setq modelSpace (vla-get-ModelSpace doc)) (setq MyTable (vla-Addtable modelSpace pt (+ (length Files_Folder) 2) 2 10 100)) (vla-ZoomExtents acadObj) (vla-setText MyTable 0 0 "圖形檔案列表") (vla-setText MyTable 1 0 "序號") (vla-setText MyTable 1 1 "檔名") (if (/= (length Files_Folder) 0) (repeat (setq N (length Files_Folder)) (setq e (nth (setq N (- N 1)) Files_Folder)) (setq fsl (strlen e)) (Setq Fsl (- fsl 4)) (setq Fname (substr e 1 fsl)) (vla-setText MyTable (+ N 2) 0 (+ N 1)) (vla-setText MyTable (+ N 2) 1 Fname) ) (princ "\n無 *.DWG 字尾的檔案") ) (command "cmdecho" 1) (princ) )
下面來看一下錄製的gif效果。
更多內容,請關注公眾號