AutoLISP是由歐特克公司開發的一種LISP程序語言,LISP是List Processor的縮寫。通過autolisp編程,可以節省工程師很多時間。AutoLISP作為嵌入在AutoCAD內部的具有智能特點的編程語言,是開發應用AutoCAD不可缺少的工具。
程序語言介紹
第一篇關于LISP的參考文獻是由John McCarthy 在1960年4月的《ACM通訊》中發表的。
除了Fortran和COBOL,大多數在六十年代早期開發出來的語言都過時了,可是LISP卻生存下來,并且已經成為人工智能(AI)的首選程序序言。AutoLISP解釋程序位于AutoCAD軟件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解釋程序,這樣,只有通過AutoCAD R2.18及更高版本才可以使用AutoLISP語言。
開發軟件
AutoCAD軟件包中包含大多數用于產生圖形的命令,但仍有某些命令未被提供。例如,AutoCAD中沒有在圖形文本對象內繪制矩形及作全局改變的命令。通過AutoLISP,你可以使用AutoLISP程序語言編制能夠在圖形文本對象內繪制矩形或作全局選擇性改變的程序。事實上,可以用AutoLISP編制任何程序,或把它嵌入到菜單中,這樣定制你的系統會取得更高的效率。
現在,已經有數以百計的第三方軟件開發人員使用AutoLISP語言編制各種應用程序軟件包,例如,本文作者開發了一個名為SMLayout的軟件包,用它可以產生各種復雜幾何圖形的平面布局圖,這些幾何圖形包括管道的交叉部、過渡都、圓柱、彎管接頭、圓錐以及罐頂。目前社會上非常需要AutoLISP程序員為應用軟件及客戶菜單的開發提供顧問。
在本章中,我們假定讀者已經熟悉了AutoCAD命令及AutoCAD的系統變量。但是,在開始學習AutoLISP時,卻并不需要你是一位AutoCAD或編程專家。同時,本章還假定讀者并無編程方面的知識。如果你熟悉任何一種編程語言,那么學習AutoLISP就會很容易。對各種函數的評細探討以及對例題的逐步講解會使你學起來很有興趣。本章討論常用的AutoLISP函數以及它們S程序編制中的應用。對于本章中未涉及的函數,請參閱歐特克公司的《AutoLISP程序員參考手冊》。AutoLISP對硬件沒有任何特殊要求。如果系統能夠運行AutoCAD,那么同樣也可以運行AutoLISP。AutoLISP程序可以使用任何文本編輯器進行編制。
數學運算
任何編程語言都提供數學函數。在AutoLISP中,同樣提供了編程以及數學計算所需的大部分數學函數,你可以使用AutoLISP對數字進行加、減、乘、除運算,還可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP還可以進行許多其他計算。這一節主要討論AutoLISP程序語言支持的常用數學函數。
加法
格式(+ num1 num2 num3...)
此函數(+)計算加號(+)右邊所有數字的和(+ num1 num2 num3...)。這些數字可以是整數或實數。如果均為整數,則和為整數;如果均為實數,則和為實數。但是如果既有整數又有實數,則和為實數。如下所示,在前兩個例子中,所有數字均為整數,所以結果是整數。在第三個例子中,一個是實數(50.0),故結果為實數。
示例:
Command:(+2 5)返回 7
Command:(+2 30 4 50)返回86
Command:(+2 30 4 50.0)返回 86.0
減法
格式(- num1 num2 num3...)
此函數(-)從第一個數中減去第二個數(num1-num2)。如果多于兩個數,就用第一個數字減去其后所有數字的和[num1-(num2+num3...)]。在下面的第一個例子中,28減去14后返回14。因為兩個數均為整數,結果亦為整數。在第三個例子中20與10.0相加,并用50減去兩數的和(30.0),返回一個實數20.0。
示例:
Command:(- 28 14) 返回14
Command:(- 25 7 11)返回7
Command:(- 50 20 10.0)返回20.0
Command:(- 20 30)返回-10
Command:(- 20.0 30.0)返回-10.0
乘法
格式(* num1 num2 num3…)
此函數(*)計算乘號右邊所有數字的乘積( num1×num2×num3...)。若均為整數,它們的乘積亦為整數;若其中含有一個實數,乘積即為實數。
示例:
Command:(* 2 5) 返回10
Command:(* 2 5 3) 返回30
Command:(* 25 3 2.0) 返回150.0
Command: (* 2 -5.5) 返回-11.0
Command: (* 2.0 -5.5 -2) 返回22.0
除法
格式( / num1 num2 num3…)
此函數(/)用第一個數除以第二個數。如果多于兩個數,就用第一個數除以其后所有數的乘積[num1/(num2 × num3 ×...)]。在下面的第四個例子中,用200除以5.0與4的乘積[200/(5.0×4)]。
示例:
Command:(/ 30)返回 30
Command:(/ 3 2)返回1
Command:(/3.0 2) 返回 1.5
Command:(/ 200.0 5.0 4)返回 10.0
Command:(/ 200 -5)返回-40
Command:(/ -200 -5.0)返回40.0
增量數字
格式(1+ number)
此函數(l+)使數字與1(整數)相加,返回一個增加1的數。在下面的第二個例子中,1與-10.5相加返回-9.5。
示例:
(1+ 20)返回 21
(1+ -10.5)返回-9.5
減量數字
格式(1- number)
此函數(1-)從數字中減去1(整數),并返回一個減去1的數。在下面的第二個例子中-10.5減去1返回-11.5。
示例:
(1- 10)返回9
(1- -10.5)返回-11.5
絕對數字
格式(abs num)
abs函數返回一個數的絕對值。該數可以是整數或者實數。在下面的第二個例子中,由于-20的絕對值為20,故函數返回20。
(abs 20)返回 20
(abs -20)返回20
(abs -20.5)返回20.5
三角函數
sin函數
格式( sin angle)
sin函數計算一個角(以弧度表示)的正弦值。在下面的第二個例子中,sin函數計算Pi(180度)的正弦值并返回0。
示例:
Command:(sin 0)返回0.0
Command:(sin Pi)返回0.0
Command:(sin 1.0472)返回0.866027
cos函數
格式(cos angle)
cos函數計算一個角(以弧度表示)的余弦值。在下面的第三個例子中,cos函數計算Pi(180度)的余弦值并返回-1.0。
示例:
Command:(cos 0)返回l.0
Command:(cos 0.0)返回1.0
Command:(cos Pi)返回-1.0
Command:(cos 1.0)返回0.540302
atan函數
格式( atan num1)
atan函數計算數的反正切值,返回角度以弧度表示。下面的第二個atan函數計算1.0的反正切值并返回0.785398(弧度)。
示例:
Command:(atan 0.5)返回0.463648
Command:(atan 1.0)返回0.785398
Command:(atan -1.0)返回-0.785398
兩個參數的atan函數
格式( atan num1 num2)
還可以在atan函數中再指定一個數。若指定了第二個數,函數將以弧度形式返回(num1/num2)的反正切值。在下面的第一個例子中,第一個數(0.5)除以第二個數(1.0),atan函數計算商(0.5/1=0.5)的反正切值。
示例:
Command:(atan 0.5 1.0)返回0.463648弧度
Command:(atan 20 3.0)返回0.588003弧度
Command:(atan 2.0 -3.0)返回2.55359弧度
Command:(atan -2.0 3.00)返回-0.5880033弧度
Command:(atan -2.0 -3.0)返回-2.55359弧度
Command:(atan 1.0 0.0)返回1.5708弧度
Command:(atan -0.5 0.0)返回-1.5708弧度
angtos函數
格式(angtos angle[made[precision]])
angtos函數以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的設置決定。
示例:
Command:(angtos 0.588003 0 4)返回“33.6901"
Command:(angtos 2.55359 0 4)返回“145.3099"
Command:(angtos 1.5708 0 4)返回“90.0000"
Command:(angtos -1.5708 0 2)返回“270.00"
注意 在(angtos angle[mode[precision]])中:
angle是以弧度表示的角度值。
mode是與AutoCAD系統變量AUNITS相對應的angtos模式。
AutoCAD中可用模式如下:
ANGTOS模式 編輯格式
0 十進制角度
1 度/分/秒
2 梯度
3 弧度
4 測量單位
precision是一個整數,用于控制小數的位數,與AutoCAD系統變量AUPREC相對應。其最小值為0,最大值為4。
在上面的第一個例子中,angle為0.588003弧度,mode為0(十進制角度),precision為4(小數點后有四位)。函數返回33.6901。
表達式
在程序中,通常都需要測試某些特定的條件。若條件為真,程序執行某些功能,若不為真,執行另外一些功能。例如,條件表達式(if(< X 5)),若變量x的值小于5,測試結果為真。編程過程中經常要用到這種類型的測試條件。本節討論在AutoLISP編程中要用到的各種關系表達式。
等于
格式(= atom1 atom2…)
該函數(=)檢查兩個元素是否相等。若相等,條件為真,函數返回T。同樣,若指定的元素不相等,條件為假,函數返回nil。
示例:
(= 5 5)返回T
(= 5 49)返回nil
(= 5.5 5.5 5.5)返回T
(= "yes"“yes”)返回T
(=“yes" "yes" “no”)返回nil
不等于
格式(/= atom1 atom2…)
該函數(/=)檢查兩個元素是否不相等。若不相等,條件為真,函數返回T。同樣,若指定的元素相等,條件為假,函數返回nil。
示例:
(/=50 4)返回T
(/= 50 50)返回nil
(/= 50 -50)返回T
(/= “yes” “no”)返回T
小于
格式( 該函數(<)檢查第一個元素(atoml)是否小于第H個元素(atomZ)。若為真,函數返回T,否則返回nil。 示例: (< 3 5)返回T (< 5 3 4)返回nil (< “x” “y”)返回T 小于等于 格式(<= atom1 atom2...) 該函數(<=)檢查第一個元素(atom1)是否小于等于第二個元素(atom2),若是,函數返回T,否則返回nil。 示例: (<= 10 15)返回T (<=“c”“b”)返回nil (<= 2.0 0)返回T 大于 格式(> atom1 atom2…) 該函數(>)檢查第一個元素(atom1) 是否大于第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,15大于10,因此,關系表達式為真,且函數返回T。在第二個例子中,10大于9,但9并不大于其后的9,因此函數返回nil。 示例: (> 15 10)返回T (>10 9 9)返回nil (>“c”“b”)返回T 大于等于 格式(>= atom1 atom2…) 該函數(>=)檢查第一個元素(atom1)的值是否大于等于第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,78大于但木等于50,因此,函數返回T。 示例: (>= 78 50) 返回T (>= "x"“y") 返回nil abs 返回參數的絕對值 (ABS number) 參數 number 返回值 參數的絕對值 示例 (abs 100) 返回100 (abs -3) 返回3 8.acad_colordlg 顯示標準的AutoCAD顏色選擇對話框 (acad_colordlg colornum [flag]) 參數 colornum 整數,其取值范圍是 0-256 (包括 0 和 256),它用于指定顏色對話框的缺省的顏色代碼。 flag 如可選參數 flag 設為 nil,禁用“隨層”和“隨塊”按鈕;省略 flag 參數或將其設為非 nil 值,則可啟用“隨層”和“隨塊”按鈕。 colornum 為 0 時代表 BYBLOCK(隨塊),為 256 時代表 BYLAYER(隨層)。 返回值 用戶所選擇的顏色代碼,如果用戶取消該對話框則返回 nil。 示例 下列代碼提示用戶選擇一種顏色,如果不選則指定綠色為缺省顏色: (acad_colordlg 3) 9.acad-pop-dbmod 恢復 DBMOD 系統變量的值到最近用 acad-push-dbmod 保存的值 (acad-pop-dbmod) 該函數使用 acad-push-dbmod 控制 DBMOD 系統變量。DBMOD 系統變量跟蹤圖形的修改狀態和觸發保存圖形請求。 返回值 如果成功時返回 T;否則,如果堆棧為空時,返回 nil。 10 . acad-push-dbmod 儲存 DBMOD 系統變量的當前值 (acad-push-dbmod) 該函數使用 acad-pop-dbmod 來控制 DBMOD 系統變量。用戶可使用該函數來更改圖形而保持 DBMOD 系統變量不變。DBMOD 系統變量跟蹤圖形的修改狀態和觸發保存圖形請求。 該函數在 acapp.arx 中實現,acapp.arx 默認狀態下是加載的。該函數可將 DBMOD 系統變量的當前值轉到內部堆棧。要使用 acad-push-dbmod 和 acad-pop-dbmod,必須先進行 acad-push-dbmod 操作,再使用 acad-pop-dbmod 來恢復 DBMOD 系統變量的初始狀態。 返回值 總是返回 T。 示例 以下例子顯示了怎樣儲存圖形的修改狀態,接著對圖形進行修改,最后恢復初始狀態。 (acad-push-dbmod)(setqnew_line '((0 . "LINE") (100 . "AcDbEntity") (8 . "0") (100 . "AcDbLine") (10 1.0 2.0 0.0) (11 2.0 1.0 0.0) (210 0.0 0.0 1.0)))(entmake new_line) ; DBMOD 被設置標志 1(command "_color" "2") ; DBMOD 被設置標志 4(command "_-vports" "_SI") ; DBMOD 被設置標志 8(command "_vpoint" "0,0,1") ; DBMOD 被設置標志 16(acad-pop-dbmod) ; DBMOD 被設置回初始值 AUTOLISP嵌入AutoCAD的目的使用戶充分利用AutoCAD進行二次開發;實現直接增加、修改AutoCAD的命令,隨意擴大圖形編輯功能,建立圖形庫和數據庫并對當前圖形進行直接訪問和修改,開發CAD軟件包等。 符號(SYM) 字符串(STR) 表(LIST) 文件描述符(FILE) AutoLISP的內部函數(SUBP) AutoCAD的選擇集(PICKSET) AutoCAD的實體名(ENAME) 函數分頁表(PAGETB) 一、實現參數化繪圖程序設計,包括尺寸驅動程序、鼠標拖動程序等。到目前為止,大多數參數化程序都是針對二維平面圖形編制的。實際上,立體圖同樣可以實現參數化繪圖,AutoCAD中編制實體的立體圖參數化程序比其三維視圖程序更簡單,而且立體圖生成后,可以很方便地生成三視圖、剖面圖和軸測圖。 二、構成DCL文件創建自己的對話框。驅動利用AutoCAD提供的PDB模塊構成DCL文件創建自己的對話框。 可以直接調用AutoCAD中的全部命令; 具備一般高級語言的基本結構和功能; 具有強大的圖形處理功能。 1.AutoLISP語言是在普通的LISP語言基礎上,擴充了許多適用于CAD應用的特殊功能而形成的,一種僅能以解釋方式運行于AutoCAD內部的解釋性程序設計語言。 2.AutoLISP語言中的一切成分都是以函數的形式給出的,它沒有語句概念或其他語法結構。執行AutoLISP程序就是執行一些函數,再調用其他函數。 3.AutoLISP把數據和程序統一表達為表結構,即S-表達式處理,故也可把程序當作數據來處理,也可把數據當作程序來執行。 4.AutoLISP語言中的程序運行過程就是對函數求值過程,是在對函數求值過程中實現函數功能。 5.AutoLISP語言的主要控制結構是采用遞歸方式。遞歸方式的使用,使得程序設計簡單易懂。 文本編輯器、格式編排器、語法檢查器、源代碼調試器、檢驗和監視工具、文件編譯器、工程程序系統、上下文相關幫助與自動匹配功能和智能化控制平臺。 參考資料 >嵌入目的
數據類型
典型應用
命令特點
功能
主要工具