1. 程式人生 > >利用lisp進行AutoCAD二次開發(環境說明、檔案讀取、以及表格建立與寫值)

利用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效果。

                                                                                更多內容,請關注公眾號