王淑芳 石平琳
摘要:AutoCAD是美國Autodesk公司開發(fā)的專門用于計算機設(shè)計繪圖工作的軟件,而AutoLISP 是內(nèi)含于AutoCAD軟件內(nèi)、強化AutoCAD的最好、最直接的程序語言。該文介紹AutoLISP的一些基本語法、函數(shù)及作者在使用中編寫的AutoLISP 程序。
關(guān)鍵詞:AutoCAD;Auto LSP;機械制圖
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2014)27-6539-03
Abstract: AutoCAD is the development of America Autodesk company specialize in computer design drawing software, and AutoLISP is embedded in AutoCAD software, strengthen AutoCAD the best, the most direct programming language. This paper introduces the AutoLISP some of the basic grammar, function and writers in the use of the AutoLISP program.
Key words: AutoCAD; Auto LSP; mechanical drawing
1 概述
AutoCAD是一套向量式計算機輔助制圖軟件,可廣泛地應(yīng)用于機械、化工、電機、電器、土木、結(jié)構(gòu)、建筑、水電、消防、室內(nèi)設(shè)計、地理信息、地圖、考古及服裝設(shè)計等各行業(yè)中工作圖繪制。而各行業(yè)都各有其特有的制圖方法及所需的繪圖功能,如果將這些功能都放進來,AutoCAD勢必會變得龐大而笨拙。因此AutoCAD提供了程序應(yīng)用界面,以為平臺,讓用戶或軟件開發(fā)商利用AutoLISP、Visual LISP、VBA、VB、Object ARX(C++)等計算機語言發(fā)展特殊的應(yīng)用程序,同時兼顧軟件的執(zhí)行速度與用戶的工作效率。而由于AutoLISP內(nèi)含于AutoCAD,且簡單易學(xué)、準確無誤等優(yōu)點,深受工程技術(shù)人員的青睞。
AutoLISP程序語言的特點是:語法簡單、功能函數(shù)強大、對編寫環(huán)境不挑剔,直譯式程序、“即寫即測、即測即用”。除一般性的功能函數(shù)外,還擁有大量控制AutoCAD的特殊函數(shù);可直接調(diào)用執(zhí)行所有AutoCAD的命令,并可運用所有的AutoCAD系統(tǒng)變量。
2 AutoLISP的基本語法結(jié)構(gòu)
1. 以括號組成表達式,左、右括號一定要成雙成對且對稱。
2. 表達式格式:(函數(shù)名 運算符 運算符 運算符 …)
或(函數(shù)(式) 自變量 自變量 自變量 …)
或(函數(shù)(式) 元素 元素 元素 …)
1) 操作函數(shù):包括功能函數(shù)(如+、max、setq、min等)和自定義函數(shù)(由設(shè)計者自行定義的新函數(shù)或子程序)
2) 運算符:又稱自變量或元素,包括整數(shù)、實數(shù)、字符串、列表、對象名稱代碼、文件代碼、選擇集代碼。
3. 表達式中的運算符可以是另一個表達式或子程序。
4. 多重的括號表達式運算的先后順序是“由內(nèi)而外,由左而右”。
5. 以文件格式存在的AutoLISP程序,其擴展名必須是“.LSP”.
6. 對于編寫的環(huán)境,最佳選擇是AutoCAD內(nèi)的Visual LISP編輯器。
7. 使用defun功能函數(shù)定義新的命令或新的功能函數(shù)。
8. 新定義的功能函數(shù)名稱,若為“C:函數(shù)名”,則此函數(shù)可以作為AutoCAD的新命令,加載此LISP程序后,可在AutoCAD界面命令行直接輸入新定義的命苦。
9. 加載AutoLISP程序的做法:命令行直接輸入(load “LISP主程序名”)。
10. AutoLISP程序中,分號后的內(nèi)容均為批注,程序不予處理,適時地增加批注,將使程序更具可讀性、學(xué)習(xí)性及完整性。
11. AutoLISP最常用的變量類型是整數(shù)、實數(shù)、字符串、點列表四種,變量的類型依據(jù)給定值二而自動定義,變量會一直保存該值,直到被重新設(shè)定或繪圖退出而自動消失。
12. 以setq功能函數(shù)設(shè)定變量值,語句結(jié)構(gòu)為:(setq 變量名稱 設(shè)定值)。如(setq a 100),即為變量a值設(shè)定為整數(shù)100。
13. 想在AutoCAD的環(huán)境中查看某一變量的值,可在命令行輸入“!變量名”。
14.在使用(defun C:函數(shù)名(自變量/更改變量) …)的程序中,變量若在“/”右邊變量內(nèi),則稱為局部變量,否則為全局變量(注:在AutoLISP中,未賦予值得變量,其返回值皆為nil)。
3 AutoLISP功能函數(shù)
1. 數(shù)學(xué)運算功能函數(shù):共21個,用于數(shù)值之間的數(shù)學(xué)運算。
2. 檢驗和邏輯運算功能函數(shù):共11個,用于數(shù)值或表達式之間的判斷和邏輯運算。
3. 轉(zhuǎn)換運算功能函數(shù):共9個,用于字符串、數(shù)值、整數(shù)、實數(shù)之間的轉(zhuǎn)換。
4. 列表功能函數(shù):共16個,用于形成一個列表或從列表中選取某個所需的數(shù)值。
5. 字符串、字符、文件處理功能函數(shù):共14個,可對字符串、字符、文件進行處理,如改變字符串中字母大小寫、提取所需的字符、計算字符串長度等。
6. 等待輸入功能函數(shù):共10個,請求從鍵盤或用鼠標輸入一個數(shù)值,可以是點、距離、字符串、整數(shù)、實數(shù)、關(guān)鍵詞等。
7. 幾何運算功能函數(shù):共6個,可計算出兩點間的角度值和距離、兩條直線的交點、字符串兩個對角點的坐標值等。
8. 壓對象除了功能函數(shù):共11個,可刪除或取消刪除對象、取出對象名稱的信息列表、創(chuàng)建新的對象列表、選取一個對象等。
9. 選擇集、符號表處理功能函數(shù):共9個,可將對象添加至選擇集或創(chuàng)建一個新的選擇集、將對象從選擇集中移出、計算選擇集的對象個數(shù)、查看符號表、搜索符號等。
10. AutoCAD相關(guān)查詢、控制功能函數(shù):共7個,可調(diào)用AutoCAD命令、查找文件名的路徑及文件名、獲得環(huán)境變量和系統(tǒng)變量的設(shè)置值、設(shè)定系統(tǒng)變量等。
11. 判斷式、循環(huán)相關(guān)功能函數(shù):共5個,可根據(jù)檢驗比較式結(jié)果判斷需執(zhí)行的表達式、可重復(fù)執(zhí)行N次表達式、可進行多條件式的if整合功能等。
12. 函數(shù)處理、定義、追蹤與錯誤處理功能函數(shù):共12個,可列出程序錯誤時的警示信息、自定義函數(shù)或子程序、對函數(shù)設(shè)置追蹤標記和輔助檢錯等。
13.顯示、打印控制功能函數(shù):共16個,對繪圖界面進行切換和清理、將表達式打印于命令區(qū)、重畫整張圖等。
14. 符號、元素、表達式處理功能函數(shù):共12個,可判斷元素是否列表、判斷元素是否被賦值、響應(yīng)表達式是否有值存在等。
另外,還有AutoLISP加載與釋放函數(shù)、內(nèi)存空間管理函數(shù)、DCL對話框相關(guān)函數(shù)等,便于AutoLISP程序的編寫和操作使用。
4 AutoLISP語句的寫法
括號在AutoLISP程序內(nèi)是很重要的符號,所有的函數(shù)語句都必須用括號括住。括號使得AutoLISP的語句產(chǎn)生嵌套功能,內(nèi)層函數(shù)的運算結(jié)果可直接當做外層函數(shù)的操作數(shù)繼續(xù)運算。如果程序中的左右括號不對稱,則程序不是在加載時發(fā)生錯誤,便是在執(zhí)行時死鎖或產(chǎn)生錯誤結(jié)果。范例如下:
1. 計算式32+15-18*2可以表示成(32+15-(18*2) ,它的AutoLISP語句可寫成:
(- (+ 32 15) (* 18 2)),也可以寫成(+ 32 (- 15 (* 18 2))。
2. 假如程序中要賦值變量x=y+z2/5,它的AutoLISP語句可寫成:
(setq x (+ y (/ (* z z) 5.0)))。
3. 在繪圖界面等待輸入一個點或一個數(shù)值,它的AutoLISP語句可寫成:
(setq mycen (getpoint “\nCenter point:”)) ;要求輸入圓心
(setq myrad (getdist mycen “\nRadius:”)) ;要求輸入圓的半徑
當計算式有優(yōu)先級時,最后運算的運算符要先寫出;括號與括號以及括號與運算符或操作數(shù)之間,可以不用空格;除法運算中,如果所有的操作數(shù)都為整數(shù),將得到整數(shù)結(jié)果,若要得到實數(shù)結(jié)果,必須確認至少有一個操作數(shù)是實數(shù)類型。
5 AutoLISP程序范例
范例1. 用AutoLISP程序繪制圖框(程序名為plate.lsp)
在繪制一個零件的工程圖時,需要先繪制圖框。一般在繪制工程圖時,先繪制一個標準圖框,將工程圖按比例縮小繪制,再按原尺寸標注,在此我們可以先在“標注樣式”對話框中設(shè)置繪圖比例(使用全局比例),再加載plate.lsp程序,執(zhí)行plate命令時,程序會自動取得設(shè)置的比例值,將圖框放大(大于1) 或縮?。ㄐ∮?) 繪制,你只需按實際尺寸繪制工程圖,并按測量尺寸標注即可。
(defun c:plate(/ tl tb dd dd1 pqq) ;定義繪制圖框的命令plate
(setvar "cmdecho" 0) ;設(shè)置系統(tǒng)變量cmdecho為0
(setvar "osmode" 0) ;設(shè)置系統(tǒng)變量osmode為0
(setq tl 0 tb 0)
(setq tl (getreal "\n輸入圖幅長度:")) ;繪圖界面中鍵盤輸入
(setq tb (getraal "\n輸入圖幅寬度:")) ;繪圖界面中鍵盤輸入
(setq blyz (getvar "dimscale")) ;取得設(shè)置的比例值
(setvar "ltscale" (* blyz 15.))
(setq tls (* tl blyz) tbs (* tb blyz)) ;將圖框放大或縮小
(command "limits" '(0 0) (list tls tbs))
(commad "layer" "s" "line" "") ;設(shè)置繪制圖框的圖層
(command "pline" '(0 0) (list tls 0) (list tls tbs) (list 0 tbs) "c")
(if (and (> tb 297) (> tl 420)) (setq dd 10. dd1 22.) (setq dd 5. dd1 17.))
(setq dds (* dd blyz) dd1s (* dd1 blyz))
(command "layer" "s" "0" "")
(command "pline" (list (* 25 blyz) dds) (list (- tls dds) dds) (LIST (- TLs dds) (- TBs dds)) (list (* 25 blyz) (- tbs dds)) "c")
(command "pline" (list (* 25 blyz) (- tbs dd1s)) (list (* 85 blyz) (- tbs dd1s)) (list (* 85 blyz) (- tbs dds)) "")
(setq pqq (list (- (car (getvar "limmax")) dds) dds))
(command "insert" "d:/bzj/btl" pqq blyz "" "")
(command "insert" "d:/bzj/dttz" (list 0 dds) blyz "" "")
(command "limits" (list (* 25 blyz) dds)(list (- tls dds) (- tbs dds)))
(command "zoom" "e")
(setvar "osmode" 183); )設(shè)置捕捉
范例2:繪制剖視符號(程序名為psfh.lsp)
需繪制剖面視圖時,需在主要視圖上繪制剖視圖符號,如果一個一個去畫,再添加剖視符號,會花費不少時間,使用此程序,只添加幾個點和剖視符號即可。
(defun dtr(a / a) (* a (/ pi 180)) ) ;將角度值單位轉(zhuǎn)換弧度的子程序
(defun jt(fp ep) ;定義繪制箭頭的子程序
(setq ang (angle fp ep))
(setq jtp1 (polar fp (+ ang (dtr 9.46)) (* 2.5345 blyz)))
(setq jtp2 (polar fp (- ang (dtr 9.46)) (* 2.5345 blyz)))
(command "solid" fp jtp1 jtp2 jtp2 "") )
(defun c:psfh() ;定義繪制剖視符號的命令psfh
(setq blyz (getvar "dimscale"))
(initget 1) ;設(shè)定下次getpoint函數(shù)為有限輸入
(setq pp1 (getpoint "\n輸入剖視符號的起點:"))
(initget 1)
(setq pp11 (getpoint pp1 "\n輸入剖視起點方向點:"))
(initget 1)
(setq pp2 (getpoint pp1 "\n輸入剖視符號的下一個點:"))
(setvar "osmode" 0)
(command "layer" "s" "DIM" "")
(command "line" pp1 (polar pp1 (angle pp1 pp11) (* 7 blyz)) "")
(jt (polar pp1 (angle pp1 pp11) (* 7 blyz)) pp1) ;繪制箭頭
(command "layer" "s" "part" "")
(command "line" pp1 (polar pp1 (angle pp1 pp2) (* 5 blyz)) "")
(setq pp3 (getpoint pp2 "\n輸入剖視符號的下一個點:"))
(while pp3 ;循環(huán)輸入剖視符號點,結(jié)束時直接回車
(command "line" (polar pp2 (angle pp2 pp1) (* 5 blyz)) pp2 (polar pp2 (angle pp2 pp3) (* 5 blyz)) "")
(setq pp1 pp2)
(setq pp2 pp3)
(setq pp3 (getpoint pp2 "\n輸入剖視符號的下一個點:")))
(initget 1)
(setq pp33 (getpoint pp2 "\n輸入剖視終點方向點:"))
(command "line" (polar pp2 (angle pp2 pp1) (* 5 blyz)) pp2 "")
(command "layer" "s" "dim" "")
(command "line" pp2 (polar pp2 (angle pp2 pp33) (* 7 blyz)) "")
(jt (polar pp2 (angle pp2 pp33) (* 7 blyz)) pp2)
(initget 7)
(setq txt (getstring "\n輸入剖視符號標注字母:"))
(setvar "orthomode" 0)
(initget 7)
(setq pst (getpoint "\n輸入剖視符號標注位置:"))
(command "layer" "s" "text" "")
(while pst ;循環(huán)標注剖視符號字母
(command "text" "m" pst (* 4 blyz) "0" txt)
(setq pst (getpoint "\n輸入剖視符號標注位置:")))
(command "layer" "s" "dim" "")
(setvar "osmode" 183))
作者在AutoCAD使用中還標注了其他制圖(繪制異型孔、螺紋孔等)和標注(形位公差、尺寸公差、焊接符號、填寫明細表等)的程序,還編制繪制軸承、螺栓、螺母、墊圈等標準件的程序,縮短了技術(shù)人員的設(shè)計時間,提高了項目研發(fā)速度,得到技術(shù)人員的青睞,現(xiàn)已在我公司得到廣泛使用。
參考文獻:
[1] 藍屹生.AutoLISP學(xué)習(xí)導(dǎo)引[M].中國鐵道出版社出版,2010.
[2] 史宇宏,張傳記.AutoCAD 2011從入門到精通[M].北京希望電子出版社,2011.