本教程是AutoLisp編程語言的入門指南。說是入門指南,其實不過是集合了我學習過程中的一些摘抄、筆記和自己的一些想法。對於文章中摘抄的部分,我會盡可能給出出處,不僅僅是對於原創作者勞動的尊重,更是方便讀者查詢更多的學習資料。
本文將通過幾個簡單的例子展示了AutoLisp語言的語法結構和規則。這樣做的好處是可以盡快的入門,培養對AutoLisp編程的興趣。但是由於缺少系統性的知識學習,很難有進一步的發展和提高。因此,建議學習基礎教程后,再系統地閱讀AutoLisp官方的開發者文檔(百度完網盤地址,密碼: xuw6),只有這樣才能真正實現從入門到精通,而不是從入門到放棄。
你的第一段AutoLisp代碼
打開AutoCAD,並在命令提示框(command prompt)中輸入:
(alert "Hello and welcome to AutoLisp!")

按下回車鍵,下面的對話框將會出現在屏幕上。

很好!這就是你的第一段AutLisp的代碼。不管怎樣,你至少可以使用AutoLisp語言控制AutoCAD做一些事情了。
也許你已經注意到了,這個語句被一對圓括號()包圍了起來,實際上這就形成了一個所謂的表 (LISP就是表處理——List Processing的英文縮寫) 。這個表有兩個參數組成,分別是alert和“Hello and welcome to AutoLisp”,兩個參數之間用空格隔開。表的第一個參數alert是一個函數名,它的功能是彈出一個帶有警告信息的對話框;而第二個參數是一個字符串,是alert函數的參數,即警告信息的內容。
你的第二段AutoLisp代碼
接下來我們嘗試一個稍微復雜的例子。
輸入以下代碼並敲擊回車。
(setq a ( getpoint "\n選擇第一個點 : "))
在AutoCAD工作空間內單擊某個點,然后接着輸入以下代碼並回車。
(setq b ( getpoint "\n選擇第二個點 : ")
再次點擊某個點,然后繼續輸入以下代碼並回車。
(command "Line" a b "")
最后,被選取兩點之間的一條直線段被創建出來。
回頭再來看一看代碼:
(setq a ( getpoint "\n選擇第一個點 : "))
這句話的意思是,在命令提示框中顯示字符串信息,並等待用戶點擊某個點,當用戶點擊某個點后,把這個點的坐標賦值給變量a。相似地,第二行的代碼將用戶點擊的某個點的坐標賦值給變量b。如果你想檢查變量的值究竟是多少,只需在變量名前加一個 ! 即可。例如在命令提示框中輸入:
!a
敲擊回車,在命令提示框中可能會出現:
(2729.0 1382.4 0.0)
這也是一個表,表中的三個參數分別為點的x、y和z軸的坐標。事實上在AutoLisp的程序和數據都是表結構。細心的你可能發現了(圓括號里可以還有圓括號),AutoLisp語言允許表的嵌套,也就是說,一個表可以當作另一個表的參數。
最后一行代碼中的command用來調用AutoCAD命令“Line”來畫一條直直線段,從變量a的位置開始,到變量b的位置結束,""是一個空字符串,告訴AutoCAD關閉這個命令。
到目前為止,我們只是在命令提示框中輸入代碼,這樣做太麻煩了,尤其是當代碼變多的時候。下面一個小節教你如何把代碼存儲在文件中使用。
把AutoLisp代碼存儲在文件當中
實際上,AutoLisp文件就是以lsp為后綴的ASCII碼文本文件。打開windows自帶的記事本(或者任何的文本編輯器,例如notepad++,UltraEdit和sublime等),在文件中輸入如下代碼:
(defun testline () ;定義一個函數 (setq a (getpoint "\n選擇第一個點 : ")) ;得到第一個點的坐標賦值給a (setq b (getpoint "\n選擇第二個點 : ")) ;得到第二個點的坐標賦值給b (command "Line" a b "") ;連接兩點畫直線 ) ;函數定義結束
在AutoLisp程序中,在分號;
后面的內容均為批注,程序不做處理。適當的增加批注,將使程序更具有可讀性。
保存文件並將文件命名為testline.lsp。(文件名可以是任何允許的文件名,有漢字也沒問題,但是后綴一定是lsp)。打開AutoCAD,在命令提示框中輸入命令:
appload
在彈出的對話框中,選擇剛剛創建的文件,點擊加載,如果出現安全提示,請選擇始終加載或加載一次。如下圖:


此時在命令提示框中出現:
已成功加載 testline.lsp
關閉加載/卸載應用程序對話框。autoLisp程序就加載成功了。然后輸入命令:
(testline)
此后,你定義的函數就開始工作了。每次調用命令的時候都要輸入圓括號,還是有點不方便,能不能去掉呢?肯定可以!只需對原代碼進行小小的修改——在testline前面加上c:
即可。
(defun c:testline () ;定義一個函數 (setq a (getpoint "\n選擇第一個點 : ")) ;得到第一個點的坐標賦值給a (setq b (getpoint "\n選擇第二個點 : ")) ;得到第二個點的坐標賦值給b (command "Line" a b "") ;連接兩點畫直線 ) ;函數定義結束
重新加載這個程序,在AutoCAD中輸入命令:
testline
是不是感覺好多了。如果你是個處女座,你可能會發現,每次運行命令結束后,在命令提示框中會出現一個煩人的nil
。如圖所示:

為了去掉這個
nil
,AutoLisp提供了
(princ)
函數。最后這個程序變成了以下的樣子:
(defun c:testline () ;定義一個函數 (setq a (getpoint "\n選擇第一個點 : ")) ;得到第一個點的坐標賦值給a (setq b (getpoint "\n選擇第二個點 : ")) ;得到第二個點的坐標賦值給b (command "Line" a b "") ;連接兩點畫直線 (princ) ; 清除 nil ) ;函數定義結束
再試一次,是不是感覺清爽多了。
在本例中,defun
定義了一個AutoLisp函數,函數名為testline
,函數名前面的c:
表示這個函數名可以像AutoCAD命令一樣直接調用。下面一個小節將會詳細介紹defun
的用法。
函數的定義(defun)
使用defun可以在AutoLisp程序中定義一個函數,其格式為:
(defun [函數名] ([全局變量1] [全局變量2] .../ [局部變量1] [局部變量2]) [表達式1] [表達式2] ...)
是不是有點懵,感覺亂七八糟的。在AutoLisp程序中,換行跟空格的作用是一樣的,多個空格也相當於一個空格。這樣我們就可以合理的使用縮進和換行讓代碼更加清晰有條理。
一般的,我們常常把函數寫成以下的樣子:
(defun [函數名] ([全局變量1] [全局變量2] .../ [局部變量1] [局部變量2]) [表達式1] [表達式2] ... )
defun這個函數至少需要三個參數。第一個參數是要定義的函數的名稱——[函數名]。第二個參數是變量表,變量表由全局變量和局部變量組成(全局變量和局部變量之間要用斜桿/
將他們分隔開),變量表可以為空表()
。第三個參數是表達式,一個函數至少要有一個表達式。
[函數名]
:如果函數名以'c:'開頭,表示注冊一個AutoCAD命令,即在命令提示框中直接輸入函數名就可以直接調用這個函數(就像AutoCAD本身自己的命令一樣)。
[變量表]
:局部變量在函數執行完畢后就被釋放,而全局變量在函數執行完畢后依然存在。
[表達式]
:當函數被調用時,表達式的內容將被執行。表達式實際上就是表。
值得注意的是,最后一個表達式的結果將作為函數的返回值。
舉個例子:
(defun myfunc (x y) ...) ;有兩個全局變量 (defun myfunc (/ a b) ...) ;有兩個局部變量 (defun myfunc (x / temp) ...) ;有一個全局變量,一個局部變量 (defun myfunc () ...) ;沒有變量,即變量表是空表
再舉一個例子,這個函數將會返回輸入角度相應的弧度值:
(defun dtor (a) (* PI ( / a 180.0) )
小節
是到了總結一下的時候了。您讀完這個教程,如果有以下幾點感想,我的目的就達到了。
- AutoLisp語言是帶有一堆圓括號的奇怪語言。(因為它是表處理語言,表處理語言,表處理語言,重要的事情說三遍!)
- 知道如何在AutoCAD加載一個AutoLisp程序。
- 了解如何定義一個函數,基本了解defun的使用規則。
作者:吳吉光
鏈接:https://www.jianshu.com/p/e933f3b87a74
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。