AutoLisp入門基礎(chǔ)教程(1)


本教程是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)安全提示,請選擇始終加載或加載一次玄组。如下圖:


加載/卸載應(yīng)用程序
安全提示

此時在命令提示框中出現(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

為了去掉這個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á)到了翻默。

  1. AutoLisp語言是帶有一堆圓括號的奇怪語言。(因?yàn)樗潜硖幚碚Z言恰起,表處理語言修械,表處理語言,重要的事情說三遍<炫巍)
  2. 知道如何在AutoCAD加載一個AutoLisp程序肯污。
  3. 了解如何定義一個函數(shù),基本了解defun的使用規(guī)則吨枉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹦渣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子貌亭,更是在濱河造成了極大的恐慌柬唯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃庭,死亡現(xiàn)場離奇詭異锄奢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剧腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門拘央,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人书在,你說我怎么就攤上這事灰伟。” “怎么了儒旬?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵栏账,是天一觀的道長。 經(jīng)常有香客問我栈源,道長挡爵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任凉翻,我火速辦了婚禮了讨,結(jié)果婚禮上捻激,老公的妹妹穿的比我還像新娘。我一直安慰自己前计,他們只是感情好胞谭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著男杈,像睡著了一般丈屹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伶棒,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天旺垒,我揣著相機(jī)與錄音,去河邊找鬼肤无。 笑死先蒋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宛渐。 我是一名探鬼主播竞漾,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窥翩!你這毒婦竟也來了业岁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寇蚊,失蹤者是張志新(化名)和其女友劉穎笔时,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗岸,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡允耿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年系枪,在試婚紗的時候發(fā)現(xiàn)自己被綠了恬叹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姚垃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盼忌,我是刑警寧澤积糯,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站谦纱,受9級特大地震影響看成,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跨嘉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一川慌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦梦重、人聲如沸兑燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽降瞳。三九已至,卻和暖如春蚓胸,著一層夾襖步出監(jiān)牢的瞬間挣饥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工沛膳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扔枫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓锹安,卻偏偏與公主長得像茧吊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子八毯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容