開發軟件
AutoCAD軟件包中包含大多數用于産生圖形的命令,但仍有某些命令未被提供。
現在,已經有數以百計的第三方軟件開發人員使用AutoLISP語言編制各種應用程序軟件包,例如,本文作者開發了一個名為SMLayout的軟件包,用它可以産生各種複雜幾何圖形的平面布局圖,這些幾何圖形包括管道的交叉部、過渡都、圓柱、彎管接頭、圓錐以及罐頂。目前社會上非常需要AutoLISP程序員為應用軟件及客戶菜單的開發提供顧問。
在本章中,我們假定讀者已經熟悉了AutoCAD命令及AutoCAD的系統變量。但是,在開始學習AutoLISP時,卻并不需要你是一位AutoCAD或編程專家。同時,本章還假定讀者并無編程方面的知識。
如果你熟悉任何一種編程語言,那麼學習AutoLISP就會很容易。對各種函數的評細探讨以及對例題的逐步講解會使你學起來很有興趣。本章讨論常用的AutoLISP函數以及它們S程序編制中的應用。對于本章中未涉及的函數,請參閱Autodesk公司的《AutoLISP程序員參考手冊》。AutoLISP對硬件沒有任何特殊要求。如果系統能夠運行AutoCAD,那麼同樣也可以運行AutoLISP。AutoLISP程序可以使用任何文本編輯器進行編制。
數學運算
任何編程語言都提供數學函數。在AutoLISP中,同樣提供了編程以及數學計算所需的大部分數學函數,你可以使用AutoLISP對數字進行加、減、乘、除運算,還可以得到以弧度表示的角度的正弦值、餘弦值及反正切值等。使用AutoLISP還可以進行許多其他計算。這一節主要讨論AutoLISP程序語言支持的常用數學函數。
加法
格式(+num1num2num3...)
此函數(+)計算加号(+)右邊所有數字的和(+num1num2num3...)。這些數字可以是整數或實數。如果均為整數,則和為整數;如果均為實數,則和為實數。但是如果既有整數又有實數,則和為實數。如下所示,在前兩個例子中,所有數字均為整數,所以結果是整數。在第三個例子中,一個是實數(50.0),故結果為實數。
示例:
Command:(+25)返回7
Command:(+230450)返回86
Command:(+230450.0)返回86.0
減法
格式(-num1num2num3...)
此函數(-)從第一個數中減去第二個數(num1-num2)。如果多于兩個數,就用第一個數字減去其後所有數字的和[num1-(num2+num3...)]。在下面的第一個例子中,28減去14後返回14。因為兩個數均為整數,結果亦為整數。在第三個例子中20與10.0相加,并用50減去兩數的和(30.0),返回一個實數20.0。
示例:
Command:(-2814)返回14
Command:(-25711)返回7
Command:(-502010.0)返回20.0
Command:(-2030)返回-10
Command:(-20.030.0)返回-10.0
乘法
格式(*num1num2num3…)
此函數(*)計算乘号右邊所有數字的乘積(num1×num2×num3...)。若均為整數,它們的乘積亦為整數;若其中含有一個實數,乘積即為實數。
示例:
Command:(*25)返回10
Command:(*253)返回30
Command:(*2532.0)返回60.0
Command:(*2-5.5)返回-11.0
Command:(*2.0-5.5-2)返回22.0
除法
格式(/num1num2num3…)
此函數(/)用第一個數除以第二個數。如果多于兩個數,就用第一個數除以其後所有數的乘積[num1/(num2×num3×...)]。在下面的第四個例子中,用200除以5.0與4的乘積[200/(5.0×4)]。
示例:
Command:(/30)返回30
Command:(/32)返回1
Command:(/3.02)返回1.5
Command:(/200.05.04)返回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
絕對數字
格式(absnum)
abs函數返回一個數的絕對值。該數可以是整數或者實數。在下面的第二個例子中,由于-20的絕對值為20,故函數返回20。
(abs20)返回20
(abs-20)返回20
(abs-20.5)返回20.5
三角函數
sin函數
格式(sinangle)
sin函數計算一個角(以弧度表示)的正弦值。在下面的第二個例子中,sin函數計算Pi(180度)的正弦值并返回0。
示例:
Command:(sin0)返回0.0
Command:(sinPi)返回0.0
Command:(sin1.0472)返回0.866027
cos函數
格式(cosangle)
cos函數計算一個角(以弧度表示)的餘弦值。在下面的第三個例子中,cos函數計算Pi(180度)的餘弦值并返回-1.0。
示例:
Command:(cos0)返回l.0
Command:(cos0.0)返回1.0
Command:(cosPi)返回-1.0
Command:(cos1.0)返回0.540302
atan函數
格式(atannum1)
atan函數計算數的反正切值,返回角度以弧度表示。下面的第二個atan函數計算1.0的反正切值并返回0.785398(弧度)。
示例:
Command:(atan0.5)返回0.463648
Command:(atan1.0)返回0.785398
Command:(atan-1.0)返回-0.785398
兩個參數的atan函數
格式(atannum1num2)
還可以在atan函數中再指定一個數。若指定了第二個數,函數将以弧度形式返回(num1/num2)的反正切值。在下面的第一個例子中,第一個數(0.5)除以第二個數(1.0),atan函數計算商(0.5/1=0.5)的反正切值。
示例:
Command:(atan0.51.0)返回0.463648弧度
Command:(atan203.0)返回0.588003弧度
Command:(atan2.0-3.0)返回2.55359弧度
Command:(atan-2.03.00)返回-0.5880033弧度
Command:(atan-2.0-3.0)返回-2.55359弧度
Command:(atan1.00.0)返回1.5708弧度
Command:(atan-0.50.0)返回-1.5708弧度
angtos函數
格式(angtosangle[made[precision]])
angtos函數以字符串格式返回以弧度表示的角度值。字符串格式由made和precision的設置決定。
示例:
Command:(angtos0.58800304)返回“33.6901"
Command:(angtos2.5535904)返回“145.3099"
Command:(angtos1.570804)返回“90.0000"
Command:(angtos-1.570802)返回“270.00"
注意在(angtosangle[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(
等于
格式(=atom1atom2…)
該函數(=)檢查兩個元素是否相等。若相等,條件為真,函數返回T。同樣,若指定的元素不相等,條件為假,函數返回nil。
示例:
(=55)返回T
(=549)返回nil
(=5.55.55.5)返回T
(="yes"“yes”)返回T
(=“yes""yes"“no”)返回nil
不等于
格式(/=atom1atom2…)
該函數(/=)檢查兩個元素是否不相等。若不相等,條件為真,函數返回T。同樣,若指定的元素相等,條件為假,函數返回nil。
示例:
(/=504)返回T
(/=5050)返回nil
(/=50-50)返回T
(/=“yes”“no”)返回T
小于
格式(
該函數(<)檢查第一個元素(atoml)是否小于第H個元素(atomZ)。若為真,函數返回T,否則返回nil。
示例:
(<35)返回T
(<534)返回nil
(<“x”“y”)返回T
小于等于
格式(<=atom1atom2...)
該函數(<=)檢查第一個元素(atom1)是否小于等于第二個元素(atom2),若是,函數返回T,否則返回nil。
示例:
(<=1015)返回T
(<=“c”“b”)返回nil
(<=2.00)返回T
大于
格式(>atom1atom2…)
該函數(>)檢查第一個元素(atom1)是否大于第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,15大于10,因此,關系表達式為真,且函數返回T。在第二個例子中,10大于9,但9并不大于其後的9,因此函數返回nil。
示例:
(>1510)返回T
(>1099)返回nil
(>“c”“b”)返回T
大于等于
格式(>=atom1atom2…)
該函數(>=)檢查第一個元素(atom1)的值是否大于等于第二個元素(atom2)。若是,函數返回T,否則返回nil。在下面第一個例子中,78大于但木等于50,因此,函數返回T。
示例:
(>=7850)返回T
(>="x"“y")返回nil
abs返回參數的絕對值
(absnumber)
參數number
返回值參數的絕對值
示例(abs100)返回100
(abs-3)返回3
8.acad_colordlg
顯示标準的AutoCAD顔色選擇對話框
(acad_colordlgcolornum[flag])
參數
colornum
整數,其取值範圍是0-256(包括0和256),它用于指定顔色對話框的缺省的顔色代碼。
flag
如可選參數flag設為nil,禁用“随層”和“随塊”按鈕;省略flag參數或将其設為非nil值,則可啟用“随層”和“随塊”按鈕。
colornum為0時代表BYBLOCK(随塊),為256時代表BYLAYER(随層)。
返回值
用戶所選擇的顔色代碼,如果用戶取消該對話框則返回nil。
示例
下列代碼提示用戶選擇一種顔色,如果不選則指定綠色為缺省顔色:
(acad_colordlg3)
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")(101.02.00.0)(112.01.00.0)(2100.00.01.0)))(entmakenew_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語言的主要控制結構是采用遞歸方式。遞歸方式的使用,使得程序設計簡單易懂。
主要工具
文本編輯器、格式編排器、語法檢查器、源代碼調試器、檢驗和監視工具、文件編譯器、工程程序系統、上下文相關幫助與自動匹配功能和智能化控制平台。



















