程式語言介紹
第一篇關於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程式編制中的套用。對於本章中未涉及的函式,請參閱Autodesk公司的《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
小於
格式(<atom1 atom2…)
該函式(<)檢查第一個元素(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語言的主要控制結構是採用遞歸方式。遞歸方式的使用,使得程式設計簡單易懂。
主要工具
文本編輯器、格式編排器、語法檢查器、原始碼調試器、檢驗和監視工具、檔案編譯器、工程程式系統、上下文相關幫助與自動匹配功能和智慧型化控制平台。