本教程是AutoLisp編程語言的入門指南绰沥。說是入門指南,其實(shí)不過是集合了我學(xué)習(xí)過程中的一些摘抄姑原、筆記和自己的一些想法。對于文章中摘抄的部分呜舒,我會盡可能給出出處页衙,不僅僅是對于原創(chuàng)作者勞動的尊重,更是方便讀者查詢更多的學(xué)習(xí)資料阴绢。
本文將通過幾個簡單的例子展示了AutoLisp語言的語法結(jié)構(gòu)和規(guī)則店乐。這樣做的好處是可以盡快的入門,培養(yǎng)對AutoLisp編程的興趣呻袭。但是由于缺少系統(tǒng)性的知識學(xué)習(xí)眨八,很難有進(jìn)一步的發(fā)展和提高。因此左电,建議學(xué)習(xí)基礎(chǔ)教程后廉侧,再系統(tǒng)地閱讀AutoLisp官方的開發(fā)者文檔(百度完網(wǎng)盤地址,密碼: xuw6)篓足,只有這樣才能真正實(shí)現(xiàn)從入門到精通段誊,而不是從入門到放棄。
你的第一段AutoLisp代碼
打開AutoCAD栈拖,并在命令提示框(command prompt)中輸入:
(alert "Hello and welcome to AutoLisp!")
按下回車鍵连舍,下面的對話框?qū)霈F(xiàn)在屏幕上。
很好涩哟!這就是你的第一段AutLisp的代碼索赏。不管怎樣盼玄,你至少可以使用AutoLisp語言控制AutoCAD做一些事情了。
也許你已經(jīng)注意到了潜腻,這個語句被一對圓括號()包圍了起來埃儿,實(shí)際上這就形成了一個所謂的表 (LISP就是表處理——List Processing的英文縮寫) 。這個表有兩個參數(shù)組成融涣,分別是alert和“Hello and welcome to AutoLisp”童番,兩個參數(shù)之間用空格隔開。表的第一個參數(shù)alert是一個函數(shù)名威鹿,它的功能是彈出一個帶有警告信息的對話框剃斧;而第二個參數(shù)是一個字符串,是alert函數(shù)的參數(shù)专普,即警告信息的內(nèi)容。
你的第二段AutoLisp代碼
接下來我們嘗試一個稍微復(fù)雜的例子弹沽。
輸入以下代碼并敲擊回車檀夹。
(setq a ( getpoint "\n選擇第一個點(diǎn) : "))
在AutoCAD工作空間內(nèi)單擊某個點(diǎn),然后接著輸入以下代碼并回車策橘。
(setq b ( getpoint "\n選擇第二個點(diǎn) : ")
再次點(diǎn)擊某個點(diǎn)炸渡,然后繼續(xù)輸入以下代碼并回車。
(command "Line" a b "")
最后丽已,被選取兩點(diǎn)之間的一條直線段被創(chuàng)建出來蚌堵。
回頭再來看一看代碼:
(setq a ( getpoint "\n選擇第一個點(diǎn) : "))
這句話的意思是,在命令提示框中顯示字符串信息沛婴,并等待用戶點(diǎn)擊某個點(diǎn)吼畏,當(dāng)用戶點(diǎn)擊某個點(diǎn)后,把這個點(diǎn)的坐標(biāo)賦值給變量a嘁灯。相似地泻蚊,第二行的代碼將用戶點(diǎn)擊的某個點(diǎn)的坐標(biāo)賦值給變量b。如果你想檢查變量的值究竟是多少丑婿,只需在變量名前加一個 ! 即可性雄。例如在命令提示框中輸入:
!a
敲擊回車,在命令提示框中可能會出現(xiàn):
(2729.0 1382.4 0.0)
這也是一個表羹奉,表中的三個參數(shù)分別為點(diǎn)的x秒旋、y和z軸的坐標(biāo)。事實(shí)上在AutoLisp的程序和數(shù)據(jù)都是表結(jié)構(gòu)诀拭。細(xì)心的你可能發(fā)現(xiàn)了(圓括號里可以還有圓括號)迁筛,AutoLisp語言允許表的嵌套,也就是說耕挨,一個表可以當(dāng)作另一個表的參數(shù)瑰煎。
最后一行代碼中的command用來調(diào)用AutoCAD命令“Line”來畫一條直直線段铺然,從變量a的位置開始,到變量b的位置結(jié)束酒甸,""是一個空字符串魄健,告訴AutoCAD關(guān)閉這個命令。
到目前為止插勤,我們只是在命令提示框中輸入代碼沽瘦,這樣做太麻煩了,尤其是當(dāng)代碼變多的時候农尖。下面一個小節(jié)教你如何把代碼存儲在文件中使用析恋。
把AutoLisp代碼存儲在文件當(dāng)中
實(shí)際上,AutoLisp文件就是以lsp為后綴的ASCII碼文本文件盛卡。打開windows自帶的記事本(或者任何的文本編輯器助隧,例如notepad++,UltraEdit和sublime等)滑沧,在文件中輸入如下代碼:
(defun testline ()
;定義一個函數(shù)
(setq a (getpoint "\n選擇第一個點(diǎn) : "))
;得到第一個點(diǎn)的坐標(biāo)賦值給a
(setq b (getpoint "\n選擇第二個點(diǎn) : "))
;得到第二個點(diǎn)的坐標(biāo)賦值給b
(command "Line" a b "")
;連接兩點(diǎn)畫直線
) ;函數(shù)定義結(jié)束
在AutoLisp程序中并村,在分號;
后面的內(nèi)容均為批注,程序不做處理滓技。適當(dāng)?shù)脑黾优⒘梗瑢⑹钩绦蚋哂锌勺x性。
保存文件并將文件命名為testline.lsp令漂。(文件名可以是任何允許的文件名膝昆,有漢字也沒問題,但是后綴一定是lsp)叠必。打開AutoCAD荚孵,在命令提示框中輸入命令:
appload
在彈出的對話框中,選擇剛剛創(chuàng)建的文件纬朝,點(diǎn)擊加載处窥,如果出現(xiàn)安全提示,請選擇始終加載或加載一次玄组。如下圖:
此時在命令提示框中出現(xiàn):
已成功加載 testline.lsp
關(guān)閉加載/卸載應(yīng)用程序?qū)υ捒蛱霞荨utoLisp程序就加載成功了。然后輸入命令:
(testline)
此后俄讹,你定義的函數(shù)就開始工作了哆致。每次調(diào)用命令的時候都要輸入圓括號,還是有點(diǎn)不方便患膛,能不能去掉呢摊阀?肯定可以!只需對原代碼進(jìn)行小小的修改——在testline前面加上c:
即可。
(defun c:testline ()
;定義一個函數(shù)
(setq a (getpoint "\n選擇第一個點(diǎn) : "))
;得到第一個點(diǎn)的坐標(biāo)賦值給a
(setq b (getpoint "\n選擇第二個點(diǎn) : "))
;得到第二個點(diǎn)的坐標(biāo)賦值給b
(command "Line" a b "")
;連接兩點(diǎn)畫直線
) ;函數(shù)定義結(jié)束
重新加載這個程序胞此,在AutoCAD中輸入命令:
testline
是不是感覺好多了臣咖。如果你是個處女座,你可能會發(fā)現(xiàn)漱牵,每次運(yùn)行命令結(jié)束后夺蛇,在命令提示框中會出現(xiàn)一個煩人的nil
。如圖所示:
為了去掉這個
nil
酣胀,AutoLisp提供了(princ)
函數(shù)刁赦。最后這個程序變成了以下的樣子:
(defun c:testline ()
;定義一個函數(shù)
(setq a (getpoint "\n選擇第一個點(diǎn) : "))
;得到第一個點(diǎn)的坐標(biāo)賦值給a
(setq b (getpoint "\n選擇第二個點(diǎn) : "))
;得到第二個點(diǎn)的坐標(biāo)賦值給b
(command "Line" a b "")
;連接兩點(diǎn)畫直線
(princ)
; 清除 nil
) ;函數(shù)定義結(jié)束
再試一次,是不是感覺清爽多了闻镶。
在本例中甚脉,defun
定義了一個AutoLisp函數(shù),函數(shù)名為testline
铆农,函數(shù)名前面的c:
表示這個函數(shù)名可以像AutoCAD命令一樣直接調(diào)用牺氨。下面一個小節(jié)將會詳細(xì)介紹defun
的用法。
函數(shù)的定義(defun)
使用defun可以在AutoLisp程序中定義一個函數(shù)墩剖,其格式為:
(defun [函數(shù)名] ([全局變量1] [全局變量2] .../ [局部變量1] [局部變量2]) [表達(dá)式1] [表達(dá)式2] ...)
是不是有點(diǎn)懵猴凹,感覺亂七八糟的。在AutoLisp程序中涛碑,換行跟空格的作用是一樣的精堕,多個空格也相當(dāng)于一個空格孵淘。這樣我們就可以合理的使用縮進(jìn)和換行讓代碼更加清晰有條理蒲障。
一般的,我們常常把函數(shù)寫成以下的樣子:
(defun [函數(shù)名] ([全局變量1] [全局變量2] .../ [局部變量1] [局部變量2])
[表達(dá)式1]
[表達(dá)式2]
...
)
defun這個函數(shù)至少需要三個參數(shù)瘫证。第一個參數(shù)是要定義的函數(shù)的名稱——[函數(shù)名]揉阎。第二個參數(shù)是變量表,變量表由全局變量和局部變量組成(全局變量和局部變量之間要用斜桿/
將他們分隔開)背捌,變量表可以為空表()
毙籽。第三個參數(shù)是表達(dá)式,一個函數(shù)至少要有一個表達(dá)式毡庆。
[函數(shù)名]
:如果函數(shù)名以'c:'開頭坑赡,表示注冊一個AutoCAD命令,即在命令提示框中直接輸入函數(shù)名就可以直接調(diào)用這個函數(shù)(就像AutoCAD本身自己的命令一樣)么抗。
[變量表]
:局部變量在函數(shù)執(zhí)行完畢后就被釋放毅否,而全局變量在函數(shù)執(zhí)行完畢后依然存在。
[表達(dá)式]
:當(dāng)函數(shù)被調(diào)用時蝇刀,表達(dá)式的內(nèi)容將被執(zhí)行螟加。表達(dá)式實(shí)際上就是表。
值得注意的是,最后一個表達(dá)式的結(jié)果將作為函數(shù)的返回值捆探。
舉個例子:
(defun myfunc (x y) ...) ;有兩個全局變量
(defun myfunc (/ a b) ...) ;有兩個局部變量
(defun myfunc (x / temp) ...) ;有一個全局變量然爆,一個局部變量
(defun myfunc () ...) ;沒有變量,即變量表是空表
再舉一個例子黍图,這個函數(shù)將會返回輸入角度相應(yīng)的弧度值:
(defun dtor (a)
(* PI ( / a 180.0)
)
小節(jié)
是到了總結(jié)一下的時候了曾雕。您讀完這個教程,如果有以下幾點(diǎn)感想雌隅,我的目的就達(dá)到了翻默。
- AutoLisp語言是帶有一堆圓括號的奇怪語言。(因?yàn)樗潜硖幚碚Z言恰起,表處理語言修械,表處理語言,重要的事情說三遍<炫巍)
- 知道如何在AutoCAD加載一個AutoLisp程序肯污。
- 了解如何定義一個函數(shù),基本了解defun的使用規(guī)則吨枉。