版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章AutoCAD的參數(shù)化繪圖技術(shù)4.1概述4.2AutoLISP語言基礎(chǔ)4.3AutoLISP的常用函數(shù)4.4AutoLISP參數(shù)化繪圖程序設(shè)計4.5AutoLISP參數(shù)化繪圖應(yīng)用4.1概述
參數(shù)化繪圖是通過變化參數(shù)從而驅(qū)動圖形繪制的一種方法。
參數(shù)化繪圖分類LISP、AutoLISP與VisualLISPAutoLISP的調(diào)試環(huán)境 1.參數(shù)化繪圖分類
(1)程序參數(shù)化繪圖程序參數(shù)化繪圖是用一組約束參數(shù)描述圖形對象,并將其約束關(guān)系記錄在程序中,然后通過調(diào)用一系列的繪圖命令繪制圖形。運行時,只需輸入約束參數(shù)值,就可以自動繪制出符合結(jié)構(gòu)形狀要求的圖形。
優(yōu)缺點:編制相應(yīng)的程序,編程工作量大、柔性和直觀性較差,但是對于系列化和標(biāo)準化程度比較高的一些圖形,通過程序?qū)崿F(xiàn)參數(shù)化繪圖,圖形繪制便捷快速。程序參數(shù)化繪圖的一般流程1.參數(shù)化繪圖分類
(2)交互參數(shù)化繪圖
使用者在屏幕上直接采用交互方式繪制圖形草圖,通過標(biāo)注決定圖形大小、形狀、位置等的尺寸(或設(shè)定尺寸代碼),系統(tǒng)就可以自動根據(jù)尺寸值驅(qū)動來生成符合尺寸要求的圖形。
優(yōu)缺點:直觀、方便,不需編制程序。但該方法需要用戶掌握軟件繪制和尺寸標(biāo)注的方法才能較好完成參數(shù)化繪圖。4.1概述
參數(shù)化繪圖是通過變化參數(shù)從而驅(qū)動圖形繪制的一種方法。
參數(shù)化繪圖分類LISP、AutoLISP與VisualLISPAutoLISP的調(diào)試環(huán)境2.LISP、AutoLISP與VisualLISPLISP(ListProcessing)是人工智能領(lǐng)域中廣泛采用的一種程序設(shè)計語言,主要用于人工智能、機器人、專家系統(tǒng)、博弈、定理證明等領(lǐng)域。LISP語言處理的對象是符號表達式,因此也稱為符號式語言。LISP語法簡單,數(shù)據(jù)類型豐富,程序編寫簡潔、靈活,利用LISP語言可以很容易實現(xiàn)新函數(shù)、新命令的定義和調(diào)用。2.LISP、AutoLISP與VisualLISPAutoLISP是為AutoCAD二次開發(fā)專門設(shè)計的編程語言,它起源于LISP語言,嵌入在AutoCAD內(nèi)部,是AutoCAD和LISP語言相結(jié)合的產(chǎn)物。利用AutoLISP語言可以進行復(fù)雜圖形的自動化繪制、各種工程的分析計算,還可以通過定義新的AutoCAD命令、驅(qū)動對話框、控制菜單,為AutoCAD擴充具有一定智能化和參數(shù)化的功能。2.LISP、AutoLISP與VisualLISPVisualLISP是為加速AutoLISP程序開發(fā)而設(shè)計的一個軟件集成開發(fā)環(huán)境。VisualLISP包括文本編輯器、格式編排器、語法檢查器、源代碼調(diào)試器、檢驗和監(jiān)視工具、文件編譯器、工程管理系統(tǒng)、上下文相關(guān)幫助與自動匹配功能,以及智能化控制臺等。在VisualLISP集成環(huán)境下可以便捷、高效地開發(fā)AutoLISP程序。4.1概述
參數(shù)化繪圖是通過變化參數(shù)從而驅(qū)動圖形繪制的一種方法。
參數(shù)化繪圖分類LISP、AutoLISP與VisualLISPAutoLISP的調(diào)試環(huán)境4.1概述
參數(shù)化繪圖(參數(shù)化繪圖分類、AutoCAD的程序參數(shù)化繪圖)LISP、AutoLISP與VisualLISPAutoLISP的調(diào)試環(huán)境3.AutoLISP的調(diào)試環(huán)境1)VisualLISP工作界面3.AutoLISP的調(diào)試環(huán)境2)VisualLISP環(huán)境下的程序加載運行AutoLISP程序前首先需加載AutoLISP程序。在VisualLISP環(huán)境下,打開已編寫好的AutoLISP程序文件進行加載。加載方式有兩種,即完整地加載AutoLISP程序文件和局部地加載文件中的部分程序。3.AutoLISP的調(diào)試環(huán)境3) VisualLISP環(huán)境下的程序調(diào)試1)括號或雙引號配對檢查2)可視化調(diào)試工具調(diào)試—監(jiān)視3)可視化調(diào)試工具調(diào)試—斷點4.2AutoLISP語言基礎(chǔ)LISP(ListProcessingLanguage)是一種計算機的表處理語言,由麥卡賽(J.Mccarthy)于1960年提出并由麻省理工學(xué)院的研究小組實現(xiàn)的。4.2.1AutoLISP的數(shù)據(jù)類型
整型數(shù)(INT)、實型數(shù)(REAL)、符號(SYM)、字符串(STR)、表(LIST)、文件描述符(FILE)、AutoLISP的內(nèi)部函數(shù)(SUBR)、AutoCAD的實體名(ENAME)、AutoCAD的選擇集(PICKSET)、ARX外部函數(shù)等。
1.整型數(shù)整型數(shù)即整數(shù),是由0,1,2,…,9,+,-字符組成的。+號可有可無。例如12,-34,0等。
2.實型數(shù)實型數(shù)用雙精度的浮點數(shù)表示并具有至少14位有效精度。
3.符號符號是由除(、)、*、′、″、;之外的字符組成的序列,并且不能全部為數(shù)字。
4.字符串字符串是由兩個雙引號引起來的字符序列。雙引號是字符串的定界符。比如“123”,“”。
5.表表由若干個元素依次排列而成,并帶有一對圓括號(一個左括號,一個右括號)。比如(123),(),(+xy),’(4ab)。表只有定義后才能被AutoLISP系統(tǒng)所識別和接受。
4.點表
AutoLISP中的點是用表來表示的。(1022)表示二維點表,(5064)表示三維點。點表中第一個元素代表x坐標(biāo),第二個元素代表y坐標(biāo),第三個元素代表z坐標(biāo)。
在編寫AutoLISP程序時,點的獲得通常有三種途徑:(1)由單引號引出的表來表示,如′(4.525)分別表示三維點。注意用這種方式表示點時,表內(nèi)的元素必須是具體的數(shù),而不能是變量或表達式,如′(xy)不表示點。
(2)由list函數(shù)定義點,在后面介紹。
(3)由getpoint函數(shù)獲得點,在后面介紹。4.2.2幾個概念
1.常數(shù)
AutoLISP中有三個常數(shù):PI、T和NIL(大、小寫等效)。PI代表數(shù)學(xué)上的π,它的值是3.141593。
T代表邏輯真,即成立。
NIL代表邏輯假,即不成立;
NIL還代表空,即無值。
三個常數(shù)的名字不能作為變量的名字用,否則會失去常數(shù)的意義。
2.原子原子是最終的數(shù)據(jù)。原子分符號原子、數(shù)字原子和串原子三類。原子是程序處理中最小的、不可再分的數(shù)據(jù)單元。
符號原子一般用于變量名或函數(shù)名;
數(shù)字原子是指具體某一個整數(shù)或?qū)崝?shù)。
3.表達式原子和表統(tǒng)稱為表達式。在學(xué)習(xí)AutoLISP函數(shù)時,凡是出現(xiàn)表達式的地方,可認為是一個原子或表。
4.2.3AutoLISP的程序結(jié)構(gòu)大多數(shù)程序設(shè)計語言采用“中綴表示法”來表示程序語句,如在BASIC、C語言中,給變量x賦值為15.0,寫成如下語句:X=15.0
中綴表示法:在這種表示法中,運算符(=)放在兩個操作數(shù)(x和15.0)中間。
在AutoLISP語言中,采用的則是“前綴表示法”,即把運算符放在操作數(shù)之前,并把運算符(即AutoLISP的函數(shù)名)和操作數(shù)(即調(diào)用函數(shù)的參數(shù))用圓括號括起來,以表的形式表示。
X=15.0
(setqx15.0)
x=(a+b)*c
(setqx(*(+ab)c))
;ThisprogramprintstheASCIIs(30-90)tothescreen.(defunC:PASCII(/as)(setqas30)(while(<=as90)(princ(chras))(princ"\n")(setqas(+as1))))(1)分號(;)開始的部分代表注釋。
(2)AutoLISP程序中,除字符串外,字母大、小寫等效。
(3)在AutoLISP程序中,表與表之間可以有空格,也可以沒有空格。
(4)函數(shù)名后一般應(yīng)至少留一個空格,但當(dāng)函數(shù)名后為一個表或字符串時可不留空格。(princ(chras))(princ“\n”)(princ“\n”)(5)表內(nèi)元素之間應(yīng)至少留一個空格作為元素分隔符,但元素與子表或字符串之間也可不留空格。
(setqas(+as1))(setqas(+as1))
4.3AutoLISP的常用函數(shù)4.3.1基本函數(shù)4.3.2程序控制函數(shù)4.3.3交互輸入函數(shù)4.3.4其他函數(shù)4.3.1基本函數(shù)函數(shù)說明+加函數(shù):計算加號右邊所有操作數(shù)的總和-減函數(shù):計算第一個操作數(shù)逐次減去后面所有操作數(shù)的差*乘函數(shù):計算所有操作數(shù)的乘積/除函數(shù):計算第一個操作數(shù)逐次除以后面操作數(shù)的商1+增量函數(shù):返回操作數(shù)加1的結(jié)果1-減量函數(shù):返回操作數(shù)減1的結(jié)果1.算術(shù)運算函數(shù)4.3.1基本函數(shù)函數(shù)說明abs絕對值函數(shù)求出所列操作數(shù)的絕對值sin求出給定角度的正弦值cos求出給定角度的余弦值atan若只給一個操作數(shù),則求出該數(shù)的反正切值;若給出兩個操作數(shù),則求出第一個操作數(shù)除以第二個操作數(shù)之商的反正切值sqrt求出所給操作數(shù)的平方根expt求出〈底數(shù)〉的〈冪〉次方2.標(biāo)準函數(shù)4.3.1基本函數(shù)函數(shù)說明exp求出e的〈數(shù)〉次方(即ex值)log求出給定操作數(shù)的自然對數(shù)gcd求出所列操作數(shù)的最大公約數(shù)max求出所列操作數(shù)的最大值min求出所列操作數(shù)的最小值rem求出第一個操作數(shù)除以第二個操作數(shù)的余數(shù)2.標(biāo)準函數(shù)4.3.1基本函數(shù)函數(shù)說明setq按照變量和表達式出現(xiàn)的順序依次把表達式的值賦給變量distance求出兩點之間的距離angle求出由點1到點2的向量與X軸正向的夾角polar求出一個點osnap用于捕捉屏幕上可見實體上的特殊點,如端點、圓心、交點、中點等3.賦值與求值函數(shù)4.3.1基本函數(shù)4.表處理函數(shù)函數(shù)說明list形成一個表,該表的元素按一定順序排列而成cons表構(gòu)造函數(shù)append將所列〈表〉中的元素放在一起,得到一個表reverse將給定表的元素順序倒置,得到一個表length求出給定表中元素的個數(shù)(即表的長度)car求出給定表中第一個元素cdr求出給定表中除第一個元素之外的所有元素組成的表cadr求出給定表中第二個元素last求出給定表中的最后一個元素nth求出給定表中第n個元素。注意序號n從0開始4.3.1基本函數(shù)5.Command函數(shù)返回4.3.1基本函數(shù)算術(shù)運算函數(shù)
算術(shù)運算函數(shù)的參數(shù)(即變元)值的類型可以是整型數(shù)或?qū)嵭蛿?shù)。
函數(shù)運算結(jié)果的類型由標(biāo)準規(guī)則確定,即:若所有參數(shù)都是整型,則結(jié)果也是整型;若其中有一個參數(shù)是實型,則結(jié)果為實型。注意1.(+〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出所列數(shù)的總和。例如:
(+20.0)結(jié)果為20.0(+415)結(jié)果為19(+3.54.752.5-6)結(jié)果為4.75請寫出下面表達式的表形式和結(jié)果
23+100-45+4.02.(-〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出第一個數(shù)逐次減去后面數(shù)的差。若只有一個數(shù),那么用零減去這個數(shù)作為函數(shù)的結(jié)果。例如:
(-8)結(jié)果為-8
(-5040)結(jié)果為10
(-5040.0-2.5)結(jié)果為12.53.(*〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出所列數(shù)的乘積。例如:
(*8)結(jié)果為8
(*25)結(jié)果為10
(*23-4.5)結(jié)果為-27.04.(/〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出第一個數(shù)逐次除以后面數(shù)的商。若只有一個數(shù),函數(shù)結(jié)果為該數(shù)本身。例如:
(/8)結(jié)果為8
(/152)結(jié)果為7(/152.0)結(jié)果為7.5(/5524.0)結(jié)果為6.875注意區(qū)別5.(1+〈數(shù)〉)這個函數(shù)求出所列數(shù)加1的結(jié)果。例如:(1+7)結(jié)果為8(1+-13.5)結(jié)果為-12.56.(1-〈數(shù)〉)這個函數(shù)求出所列數(shù)減1的結(jié)果。例如:
(1-7)結(jié)果為6(1--13.5)結(jié)果為-14.5返回函數(shù)表三角函數(shù)
1、(sin〈角度〉)求出給定角度的正弦值。結(jié)果為實型數(shù),角度的單位為弧度。
(sin1.0)結(jié)果為0.841471(sin(/pi4))結(jié)果為0.7071072、(cos〈角度〉)求出給定角度的余弦值。結(jié)果為實型數(shù),角度的單位為弧度。
(cos0)結(jié)果為1.0(cospi)結(jié)果為-1.0
3(atan〈數(shù)1〉[〈數(shù)2〉])
(1)若沒有〈數(shù)2〉,這個函數(shù)求出〈數(shù)1〉的反正切值,結(jié)果為用弧度表示的角,取值范圍為-π/2到π/2。
(atan1.0)結(jié)果為0.785398(即π/4)(atan-1.0)結(jié)果為-0.785398(即-π/4)
(2)若〈數(shù)1〉和〈數(shù)2〉都提供了,則求出〈數(shù)1〉/〈數(shù)2〉的反正切值,其單位為弧度,角度范圍為-π到π。此時,〈數(shù)1〉、<數(shù)2〉分別相當(dāng)于y坐標(biāo)和x坐標(biāo)。(atan2.03.0)結(jié)果為0.588003(第Ⅰ象限角)
(atan2.0-3.0)結(jié)果為2.55359(第Ⅱ象限角)
(atan-2.0-3.0)結(jié)果為-2.55359(第Ⅲ象限角)
(atan-2.03.0)結(jié)果為-0.588003(第Ⅳ象限角)
(atan1.00)結(jié)果為1.5708(π/2)
(atan-2.00)結(jié)果為-1.5708(-π/2)其它數(shù)值運算函數(shù)
1.(abs〈數(shù)〉)求出所列數(shù)的絕對值。
(abs100)結(jié)果為100(abs-10.5)結(jié)果為10.52(sqrt
〈數(shù)〉)這個函數(shù)求出所列數(shù)的平方根,其結(jié)果為實型數(shù)。
(sqrt4)結(jié)果為2.0(sqrt2.0)結(jié)果為1.41421
3(expt〈底數(shù)〉
〈冪〉)這個函數(shù)求出〈底數(shù)〉的〈冪〉次方。如果兩個數(shù)都是整型數(shù),其結(jié)果也是整型數(shù);否則,結(jié)果為實型數(shù)。
(expt24)結(jié)果為16(expt3.02.0)結(jié)果為9.05.(log
〈數(shù)〉)這個函數(shù)求出〈數(shù)〉的自然對數(shù),其結(jié)果為實型數(shù)。
(log2.71828)結(jié)果為0.999999(log1)結(jié)果為0.0
對于一般對數(shù)可用換底公式logab=lnb/lna求出。
6.(gcd〈數(shù)1〉〈數(shù)2〉)這個函數(shù)求出〈數(shù)1〉和〈數(shù)2〉的最大公約數(shù)?!磾?shù)1〉和〈數(shù)2〉為正整數(shù)。
(gcd1035)結(jié)果為5(gcd2849)結(jié)果為77.(max〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出所列〈數(shù)〉的最大值。例如:(max1235)結(jié)果為35(max-86492150)結(jié)果為1508.(min〈數(shù)〉〈數(shù)〉…)這個函數(shù)求出所列〈數(shù)〉的最小值。例如:
(min1235)結(jié)果為12(min-86492150)結(jié)果為-869.(rem〈數(shù)1〉〈數(shù)2〉…)這個函數(shù)求出〈數(shù)1〉除以〈數(shù)2〉的余數(shù),用余數(shù)再除以后面的數(shù),得出最后的余數(shù)。例如:
(rem4212)結(jié)果為6(rem-86492)結(jié)果為-1(rem24.516)結(jié)果為8.5返回函數(shù)表賦值函數(shù)
1.(setq〈變量1〉〈表達式1〉[〈變量2〉〈表達式2〉]…)
在給變量命名時,要求名字不能和AutoLISP的內(nèi)部函數(shù)名相同,否則該內(nèi)部函數(shù)失效。(setqa10)(setqc“if”)(setqe‘(123))(setqp1(/pi4))(setqb10.0)(setqx1y2z7)求值函數(shù)(幾何運算函數(shù))
1.(distance〈點1〉
〈點2〉)
這個函數(shù)求出兩點之間的距離,結(jié)果為實型數(shù)。例如:
(distance′(12)′(73))結(jié)果為6.082763(distance′(12.5)′(7.72.5))結(jié)果為6.72.(angle〈點1〉〈點2〉)
這個函數(shù)求出由〈點1〉到〈點2〉的向量與X軸正向的夾角,單位為弧度,取值范圍為0~2π。若所給點為三維點,則將其投影到當(dāng)前作圖平面計算。例如:
(angle′(51)′(21))結(jié)果為3.141593(angle′(1.01.0)′(1.04.0))結(jié)果為1.5707973.(polar〈點〉〈角度〉〈距離〉)
這個函數(shù)求出一個點,函數(shù)中〈角度〉指已知點與待求點連線形成的向量與X軸正向的夾角,〈角度〉單位為弧度,可取正值或負值?!淳嚯x〉指已知點與待求點之間的距離。例如:(polarp1pi100)
(polar′(1.01.0)(/pi4)(sqrt2.0))結(jié)果為(2.02.0)
(polar′(22)(/pi4)2)結(jié)果為(0.5857860.585786)
polar函數(shù)求點方便,在編寫繪圖程序時經(jīng)常采用。4.(osnap
〈點〉
〈目標(biāo)捕捉種類字符串〉)
這個函數(shù)捕捉屏幕上可見實體上的特殊點。
〈點〉為靶區(qū)中心點,用來指明實體;目標(biāo)捕捉種類可以是一個或者多個,如“cen”、“mid”、“end”、“cen”等。這個函數(shù)求出實體上符合捕捉種類的一個點。當(dāng)實體上符合捕捉種類的點有多個時,取離靶區(qū)中心點最近的點作為該函數(shù)的結(jié)果。
(setqt(getpoint“\nSpecifyarc,circle:”))
(setqp(osnapt“cen”))(setqp1(osnapt“nea”))5.(eval〈表達式〉)
這個函數(shù)求出〈表達式〉的計算結(jié)果。例如:
(setqa120b‘a(chǎn))則有
(evala)結(jié)果a為120
(evalb)結(jié)果b為120(此時,eval函數(shù)引起再求值)返回函數(shù)表表處理函數(shù)表是AutoLISP語言中最基本的數(shù)據(jù)類型,表處理函數(shù)主要對表進行構(gòu)造、分離、訪問與修改。
1.(list〈表達式〉…)這個函數(shù)的結(jié)果是一個表,該表的元素按〈表達式〉順序排列而成。例如:
(list3.56.8)結(jié)果為(3.56.8)
(setqx4.0y5.0)(setqpt(listxy))結(jié)果pt為(4.05.0)2.(cons〈項〉
〈表〉)一個表構(gòu)造函數(shù)?!错棥荡碓踊虮?。這個函數(shù)把〈項〉作為元素加入到〈表〉的開頭,得到新元素加入之后的表。例如:
(cons5′(89))結(jié)果為(5
8
9)
(cons′(45)′(89))結(jié)果為((45)89)(cons′a′(bcd))結(jié)果為(ABCD)(機內(nèi)表示時字母采用大寫,下同)3.(append〈表〉…)
將所列〈表〉中的元素放在一起,得到一個表。例如:
(append′(ab)′(cd))結(jié)果為(ABCD)
(append′((a)(b))′((c)(d)))結(jié)果為((A)(B)(C)(D))
4.(reverse〈表〉)得到一個元素順序倒置的表。例如:
(reverse′(abcd))結(jié)果為(DCBA)
(reverse′(a(bc)d))結(jié)果為(D(BC)A)5.(length〈表〉)這個函數(shù)求出〈表〉中元素的個數(shù)(即表的長度)。例如:
(length′(abcd))結(jié)果為4(length′(ab(cd)))結(jié)果為3(length′())結(jié)果為06.(car〈表〉)這個函數(shù)求出〈表〉中第一個元素。例如:
(car′(abcd))結(jié)果為A(car′((ab)c))結(jié)果為(AB)通常利用此函數(shù)從點表中提取x坐標(biāo)。例如:(setqpt′(42))(setqx(carpt))結(jié)果x為47.(cdr〈表〉)
這個函數(shù)的結(jié)果是除第一個元素之外的所有元素組成的表。例如:
(cdr′(abc))結(jié)果為(BC)(cdr′((ab)c))結(jié)果為(C)8.(cadr〈表〉)
這個函數(shù)求出〈表〉中第二個元素。通常利用此函數(shù)從點表中提取y坐標(biāo)。例如:
(setqpt′(42))(setqy(cadrpt))結(jié)果y為29.(last〈表〉)
這個函數(shù)求出〈表〉中的最后一個元素。例如:
(last′(a
b
c
d))結(jié)果為D
(last′(abc(de)))結(jié)果為(DE)利用此函數(shù)可從點表中提取z坐標(biāo)。例如:(setqpt′(203015.5))(setqz(lastpt))結(jié)果z為15.510.(nth〈n〉〈表〉)這個函數(shù)求出〈表〉中第n個元素。表中元素的序號從左往右依次為0、1、2、3…。例如:
(nth3′(abcde))結(jié)果為D
(nth0′(a
b
c
d
e))結(jié)果為A
(nth5′(abcde))結(jié)果為nil11.(subst〈新項〉〈舊項〉〈表〉)
從〈表〉中搜索〈舊項〉,將〈表〉中出現(xiàn)的〈舊項〉用〈新項〉替換,并返回替換的表。如果〈表〉中沒有找到〈舊項〉,函數(shù)將返回沒有更改的〈表〉。例如:
(subst’ab’cd′(abcdef))結(jié)果為(ABABEF)12.(assoc〈項〉〈聯(lián)結(jié)表〉)
這個函數(shù)在〈聯(lián)結(jié)表〉中搜索,把〈項〉作為關(guān)鍵元素,找出相應(yīng)的款項。此函數(shù)具有查表的功能?!绰?lián)結(jié)表〉是由若干個表聯(lián)結(jié)而成的一個表,它經(jīng)常被用于存儲數(shù)據(jù),這些數(shù)據(jù)可用關(guān)鍵元素存取。例如:
(setqal′((M63.210)(M8413)(M10516)(M12618)))(assoc′M8al)結(jié)果為(M8413)返回函數(shù)表Command函數(shù)
Command函數(shù)的調(diào)用格式為
(command〈變元〉…)變元代表AutoCAD命令名及命令執(zhí)行時的所需數(shù)據(jù)。命令包括AutoCAD內(nèi)部命令及自己開發(fā)的命令等。命令名、字母相應(yīng)的選擇項等要用雙引號引起來,LAYER命令中的層名、線型名以及TEXT命令注寫的字符串等也必須用雙引號引起來。(setqp1‘(1030)p2‘(2060))(command“pline”p1“w”0.80.8p2“”)
(command“l(fā)ayer”“s”“1”“”)(command“text”p1510“absd”“”)
使用command函數(shù)時要注意以下幾點:
(1)變元為兩個連著的雙引號(即“”)時表示回車。
(2)不帶變元的command函數(shù)即(command),等效于Esc,用來中止命令。
(3)幾個命令及其數(shù)據(jù)可以寫在一個command函數(shù)中,對于重復(fù)執(zhí)行的命令,要求必須寫出命令名,不能用回車代替。
(4)一個命令及其數(shù)據(jù)可分開寫在兩個或兩個以上的command函數(shù)中。
(command″pline″p1p2p3)(commandp4p5p6)
等效于
(command″pline″p1p2p3p4p5p6)
(5)人機交互以對話框形式執(zhí)行的命令,當(dāng)在command函數(shù)中調(diào)用該命令時,通常該命令會以命令行方式執(zhí)行,command函數(shù)的變元按命令提示來確定(這一點對命令組文件、菜單文件也是適應(yīng)的)。返回函數(shù)表4.3.2程序控制函數(shù)關(guān)系函數(shù)邏輯函數(shù)條件函數(shù)和順序處理函數(shù)循環(huán)函數(shù)返回函數(shù)表關(guān)系函數(shù)(比較函數(shù),全部成立,函數(shù)結(jié)果為T;否則結(jié)果為nil。)
1.(=〈數(shù)〉〈數(shù)〉…)
(=44.0)結(jié)果為T
(=494950)結(jié)果為nil2.(/=〈數(shù)〉〈數(shù)〉…)
(/=1020)結(jié)果為T(/=19195)結(jié)果為nil
3.(<〈數(shù)〉〈數(shù)〉…)(<3520)結(jié)果為nil(<238)結(jié)果為T4.(>〈數(shù)〉
〈數(shù)〉…)(>2017)結(jié)果為T
(>744)結(jié)果為nil5.(<=〈數(shù)〉〈數(shù)〉…)
(<=299)結(jié)果為T6.(>=〈數(shù)〉〈數(shù)〉…)
(>=749)結(jié)果為nil返回函數(shù)表邏輯函數(shù)
1.(and〈表達式〉…)
這個函數(shù)求出所列〈表達式〉的邏輯“與”,即當(dāng)所有的〈表達式〉同時為T時,函數(shù)結(jié)果為T;如果其中任何一個〈表達式〉為nil時,函數(shù)結(jié)果為nil。例如:
(setqa10b20)(and(>a5)(<b25))結(jié)果為T(and(>b5)(<b15))結(jié)果為nil2.(or〈表達式〉…)
這個函數(shù)求出所列〈表達式〉的邏輯“或”,即當(dāng)所有的〈表達式〉同時為nil時,函數(shù)結(jié)果為nil;如果其中有一個〈表達式〉為T時,則函數(shù)結(jié)果為T。例如:
(setqa10b20)(or(<a5)(>a15))結(jié)果為nil(or(<b5)(>b15))結(jié)果為T
3.(not〈項〉)
這個函數(shù)求出所列〈項〉的邏輯“非”,即當(dāng)〈項〉的值為nil(邏輯假或空)時,函數(shù)結(jié)果為T;否則函數(shù)結(jié)果為nil。例如:
(setqa10b20cnil)(nota)結(jié)果為nil(notc)結(jié)果為T(not(or(<a5)(>b25)))結(jié)果為T(not(or(<a15)(>b15)))結(jié)果為nil返回函數(shù)表條件函數(shù)和順序處理函數(shù)
1.if函數(shù)(if〈測試式〉
〈式1〉[〈式2〉])在if函數(shù)中,〈測試式〉為具有邏輯值的表達式,如關(guān)系函數(shù)、邏輯函數(shù)等,〈式1〉、〈式2〉限于單個表達式。
測試式〈式2〉
〈式1〉YN
。。。2.cond函數(shù)
(cond(〈測試式1〉〈結(jié)果1〉)
(〈測試式2〉〈結(jié)果2〉)
…
(〈測試式n〉〈結(jié)果n〉)
)
〈測試式1〉〈結(jié)果1〉〈測試式2〉〈結(jié)果2〉〈測試式n〉〈結(jié)果n〉TTTNILNILNILNIL
【例4.3】求mn(n為大于或等于0的整數(shù))。當(dāng)n≥0時,mn=m×mn
-1;當(dāng)n=0時,m0=1??梢姡髆n和mn
-1的過程是一樣的,只是自變量n換成n-1,因此,求mn可采用遞歸定義的方法編程。程序如下
(defunpower(mn)(cond((=n0)1);(n=0函數(shù)結(jié)果為真)
(T(*m(powerm(1-n))))))
調(diào)用程序:(power212)結(jié)果為40963.progn函數(shù)(progn〈表達式〉…)Progn函數(shù)用于順序控制。該函數(shù)按順序計算每一個〈表達式〉。如if函數(shù)中的〈式1〉、〈式2〉只能為一個表達式,若要在此處完成多個表達式的計算,可使用progn函數(shù)。
(if(=n1)(progn(setqx(+x30))(command“text”(listxy)50“X”))
(setqx50))返回函數(shù)表循環(huán)函數(shù)
1.(repeat〈數(shù)〉〈表達式〉…)例:
(setqa10b100)(repeat4(setqa(+a10))(setqb(+b10)))
上述程序運行結(jié)果:a為50,b為140。
2.(while〈測試式〉
〈表達式〉…)
這個函數(shù)先計算〈測試式〉,若其值為T,則計算后面的若干個〈表達式〉(即循環(huán)體),然后再計算〈測試式〉,這樣循環(huán)反復(fù),直到〈測試式〉的值是nil為止。例:(setqa1b10);循環(huán)變量a必須有初值
(while(<=a10)(setqb(+b10))(setqa(+a1));循環(huán)變量在循環(huán)體內(nèi)必須變化
)
上述程序共循環(huán)10次,變量b共賦值10次,結(jié)果b=110。返回函數(shù)表4.3.3交互輸入函數(shù)AutoLISP語言具有較強的人機交互能力,它提供了一類交互輸入函數(shù),通過鍵盤、數(shù)字化儀或鼠標(biāo)器可完成各種數(shù)據(jù)(包括數(shù)值、點、角度、字符串)的輸入。交互輸入函數(shù)的基本格式為
(〈函數(shù)名〉[〈提示〉])
這類函數(shù)執(zhí)行時暫停下來等待用戶輸入。1.(getint[〈提示〉])等待用戶輸入一個整型數(shù),函數(shù)結(jié)果是整型數(shù)。例如:
(setqn(getint″\nEnteranumber:″))
當(dāng)函數(shù)執(zhí)行時,屏幕上出現(xiàn):
Enteranumber:2.(getreal[〈提示〉])
函數(shù)結(jié)果為由該數(shù)轉(zhuǎn)換而成的實型數(shù)。例如:
(setqsf(getreal″\nScalefactor:″))Scalefactor:2.0↙或2↙
結(jié)果sf為2.0。
3.(getangle[〈提示〉])
等待用戶輸入一個角度。若用戶輸入一個數(shù),函數(shù)結(jié)果是得到由該數(shù)代表的角度度數(shù)轉(zhuǎn)化而成的弧度值。若用戶輸入一個點,系統(tǒng)會詢問第二個點,函數(shù)結(jié)果得到由第一點到第二點構(gòu)成的向量與X軸正向的夾角,單位為弧度。例如:
(setqang(getangle″\nAngle:″))Angle:45↙
結(jié)果ang為0.785398(π/4的值)。4.(getdist[〈點〉][〈提示〉])
這個函數(shù)執(zhí)行時暫停下來等待用戶輸入一個距離值?!袋c〉是任選的基點。函數(shù)結(jié)果是一個實型數(shù)。例如:
(setqd(getdist″\nDistance:″))Distance:20↙(或輸入一個點,則系統(tǒng)提示輸入第二個點,即通過輸入兩個點指定距離值)5.(getstring[T][〈提示〉])函數(shù)結(jié)果得到一個字符串。若函數(shù)中有T時,輸入的字符串中可含有空格,結(jié)束輸入時只能用回車鍵。輸入字符串時不要加雙引號,系統(tǒng)會自動加上作為函數(shù)的執(zhí)行結(jié)果。(setqfname(getstring“\nEnterfilename:”))
執(zhí)行時:Enterfilename:pp.lsp6.(getpoint[〈提示〉])
這個函數(shù)執(zhí)行時暫停下來等待用戶輸入一個點,函數(shù)執(zhí)行結(jié)果是得到一個點表。輸入點時可以采用點的各種輸入方法輸入。
(setqp(getpoint“\nEnterpoint:”))
Enterpoint:40,50返回函數(shù)表4.3.4其他函數(shù)文件管理函數(shù)輸入、輸出函數(shù)系統(tǒng)變量函數(shù)實體訪問函數(shù)(第5章)返回函數(shù)表文件管理函數(shù)
1.(open〈文件名〉
〈狀態(tài)〉)open函數(shù)打開一個名為〈文件名〉的文件,以便AutoLISP的輸入、輸出函數(shù)對這個文件進行讀或?qū)憽:瘮?shù)的結(jié)果產(chǎn)生一個文件描述符或稱為文件指針(文件描述符也是AutoLISP的一種數(shù)據(jù)類型),供輸入、輸出函數(shù)使用。open函數(shù)必須和賦值函數(shù)一起使用,用變量記錄文件描述符。例如:(setqf(open“c:\\acad\\file.dat”“w”))〈文件名〉是一個字符串,這個字符串由文件名和擴展名組成。文件名前還可加盤符或目錄名(即Windows中的文件夾名),如“b:file.dat”、“\\subdir\\file.dat”(AutoLISP字符串中兩個反斜杠起一個反斜杠作用,也可以用一個斜扛“/”代替兩個反斜杠)等?!礌顟B(tài)〉為讀/寫標(biāo)志,分別為“r”(讀)、“w”(寫)、“a”(追加),r、w、a必須為小寫。
“r”用于對已有文件打開進行讀操作。
“w”用于打開一個新文件進行寫操作。
“a”用于打開一個文件進行追加操作,若指定的文件不存在,作用同“w”;若指定的文件存在,則打開該文件,并把記錄指針移到現(xiàn)有記錄尾部,凡是要寫入文件的內(nèi)容都將追加到現(xiàn)有記錄的后面。
2.(close〈文件描述符〉)close函數(shù)關(guān)閉指定的文件,把寫入的內(nèi)容保存在文件中。
〈文件描述符〉是open函數(shù)產(chǎn)生的。此函數(shù)一般和open函數(shù)配對使用。例如:(closef)close的作用是在寫文件時把駐留在內(nèi)存磁盤緩沖區(qū)上的部分數(shù)據(jù)寫入指定文件中而不致引起這部分數(shù)據(jù)丟失。3.(load〈文件名〉)
load函數(shù)把〈文件名〉所代表的AutoLISP源程序文件從磁盤裝入內(nèi)存。執(zhí)行一個AutoLISP程序首先要使用load函數(shù)。返回函數(shù)表輸入、輸出函數(shù)
1.(prompt〈信息〉)
這個函數(shù)將〈信息〉內(nèi)容顯示在屏幕上,〈信息〉為字符串類型。例如:
(prompt″\nMeasurementvalueis10.000″)2.(princ〈表達式〉[〈文件描述符〉])
此函數(shù)將〈表達式〉的值寫到屏幕或?qū)懙接伞次募枋龇当硎镜拇蜷_文件中。
〈表達式〉的值可為多種數(shù)據(jù)類型,若為字符串時,不輸出雙引號。princ輸出時不換行,只有當(dāng)輸出的字符串中含有換行控制字符“\n”
時才換行輸出。(princ“Book”)屏幕上顯示Book
若希望輸出的結(jié)果帶雙引號,則應(yīng)在內(nèi)層每個雙引號前加一個反斜杠:(princ″\″Book\″″)
結(jié)果在屏幕上顯示″Book″。3.(read-line[〈文件描述符〉])這個函數(shù)從(1)未指定〈文件描述符〉:鍵盤輸入;
(2從由〈文件描述符〉表示的打開文件中讀入一個字符串。字符串中的字符包括一行開始到回車之間的所有字符。假設(shè)有文件test.dat,內(nèi)容如下:((N1234)(N2678))要把它賦值給一個變量,程序如下:
(setqf(open″test.dat″″r″))(setqte(read-linef))(closef)(setqt1(readte))te為字符串類型,用read將雙引號取掉,結(jié)果t1的值就是上面的表。4.(write-line〈字符串〉[〈文件描述符〉]這個函數(shù)把字符串寫到屏幕上(未指定〈文件描述符〉時)或?qū)懙接伞次募枋龇当硎镜拇蜷_文件中,寫完換行。
寫〈字符串〉時不輸出雙引號。例如,要把表((12)(34)(56))寫到文件resl.dat中,程序如下:(setqf(open″resl.dat″″w″))(write-line″((12)(34)(56))″f)(closef)結(jié)果resl.dat內(nèi)容為:
((12)(34)(56))返回函數(shù)表系統(tǒng)變量函數(shù)
1.(setvar〈系統(tǒng)變量名〉〈值〉)
此函數(shù)為AutoLISP的系統(tǒng)變量設(shè)置一個新的值,新值為給定的〈值〉。系統(tǒng)變量名要用雙引號引起來,系統(tǒng)變量名大、小寫等效。例如:(setvar″FILLETRAD″10)
此函數(shù)把圓角半徑改為10。
使用setvar函數(shù)設(shè)置系統(tǒng)變量時,應(yīng)注意以下兩點。(1)AutoCAD的系統(tǒng)變量分為兩類:一類是只讀的,用戶不能修改其值;另一類是可讀寫的,用戶可以獲取或修改其值。setvar函數(shù)只能改變可讀寫的系統(tǒng)變量的值。(2)每個系統(tǒng)變量的值都有規(guī)定的數(shù)據(jù)類型。在用setvar函數(shù)修改系統(tǒng)變量的值時,修改值的類型與范圍必須與系統(tǒng)變量的要求相符。2.(getvar〈系統(tǒng)變量名〉)此函數(shù)用于獲得系統(tǒng)變量的當(dāng)前值。系統(tǒng)變量名要用雙引號引起來。AutoCAD系統(tǒng)變量的值都可用getvar來獲得。例如:
(getvar″FILLETRAD″)結(jié)果為10.0(當(dāng)前值)
下面兩個程序是系統(tǒng)變量函數(shù)應(yīng)用的例子。程序1:
(defunC:CLS()(command″zoom″″a″)(setqwL(getvar″extmin″)wr(getvar″extmax″))(command″erase″″c″wLwr″″)(command″redraw″))上述程序的作用是清除繪圖區(qū)圖形。程序2:(defunsetv(k)(if(〉k0)(progn(setvar″blipmode″1);BLIPMODE:設(shè)置單擊鼠標(biāo)是否在屏幕上顯示一個點標(biāo)記。1為打開點標(biāo)記。(setvar″cmdecho″1))(progn(setvar″blipmode″0);CMDECHO:lisp運行命令時是否回顯提示和輸入,1打開回顯,0關(guān)閉回顯(setvar″cmdecho″0))))返回函數(shù)表實體訪問函數(shù)
1.(entnext[〈實體名〉])實體名是AutoLISP的一種數(shù)據(jù)類型。如同文件描述符一樣,對用戶而言它是不透明的,使用時經(jīng)常要和賦值函數(shù)配合使用。
entnext函數(shù)給出圖形數(shù)據(jù)庫中〈實體名〉之后的第一個沒有刪除的實體名稱。若函數(shù)中未指定〈實體名〉,則其給出圖形數(shù)據(jù)庫中第一個沒有刪除的實體名稱。2.(entlast)
這個函數(shù)給出圖形數(shù)據(jù)庫中最后那個沒刪除的實體名稱,此函數(shù)常被用來獲得新實體的名稱。
3.(ssadd[〈實體名〉[〈選擇集〉]])
這個函數(shù)的功能是將〈實體名〉加入到〈選擇集〉中去?!催x擇集〉是選中的圖形實體的集合,它也是AutoLISP的一種數(shù)據(jù)類型。ssadd函數(shù)有下面三種使用形式:(ssadd)——構(gòu)成沒有實體的新的選擇集;
(ssadd〈實體名〉)——構(gòu)成一個包含指定實體名稱的新的選擇集;
(ssadd〈實體名〉〈選擇集〉)——將〈實體名〉所指的實體加到〈選擇集〉中。4.(sslength〈選擇集〉)
這個函數(shù)給出〈選擇集〉中圖形實體的數(shù)目(整型數(shù))。
5.(ssdel〈實體名〉
〈選擇集〉)
這個函數(shù)從〈選擇集〉中刪除由〈實體名〉指定的實體,此時在形成的新選擇集中已沒有這個元素。如果指定的實體不在〈選擇集〉中,則函數(shù)結(jié)果為nil。
程序2:
(defunselstuff(e)(setqss(ssadd))(if(nulle)(setqss(ssadd(setqe(entnext))ss)))(while(setqe(entnexte))(setqss(ssaddess)))ss)返回函數(shù)表4.4AutoLISP參數(shù)化繪圖程序設(shè)計4.4.1自定義函數(shù)4.4.2自定義命令4.4.1自定義函數(shù)1.用defun定義函數(shù)自定義函數(shù)的格式為:
(defun
〈函數(shù)名〉
〈變元表〉
〈表達式1〉
〈表達式2〉…
)(1)〈函數(shù)名〉是用戶所定義的函數(shù)名稱,要求它不能和AutoLISP內(nèi)部函數(shù)名相同,否則內(nèi)部函數(shù)會失效,也不能和變量名相同,否則自定義函數(shù)會失效。
(2)〈變元表〉是一個函數(shù)的參數(shù)表。①(〈形參1〉
〈形參2〉…)②()③(〈形參1〉
〈形參2〉…
/〈局部變量1〉〈局部變量2〉…)④(/〈局部變量1〉
〈局部變量2〉…)(3)〈表達式1〉、〈表達式2〉、……等是函數(shù)的定義體,它們在函數(shù)執(zhí)行時依次進行運算,完成所需的功能。這些表達式可以是內(nèi)部函數(shù),也可以是對其他自定義函數(shù)的調(diào)用(即函數(shù)嵌套),還可以是對自定義函數(shù)本身的調(diào)用(即遞歸定義)。
在書寫程序時,表達式可以單獨成行,也可以首尾相連書寫,格式比較自由。
(defunrafg(p1/t)(setqt10)(setqp1(*pit)))
編寫繪圖自定義函數(shù)實現(xiàn)參數(shù)化繪圖的基本步驟:1、先分析圖形,確定圖形參數(shù)(形狀參數(shù)、位置參數(shù));
2、編程獲得圖形點;
3、調(diào)用command函數(shù)繪圖。【例4.1】編寫繪制圖帶導(dǎo)線的電阻符號的自定義函數(shù)。設(shè)電阻符號的有關(guān)參數(shù)取為定值,其長為8、寬為3、線寬取0.5。解:繪圖參數(shù)有:圖形位置的基點(x0,y0);導(dǎo)線的方位角a(為便于調(diào)用函數(shù),單位取為度);與導(dǎo)線有關(guān)的長度為s1、s。(defunres(x0y0s1sa)
(setqa(*a(/pi180)));把a化為弧度
(setqp5(polar(listx0y0)as1))(setqp6(polar(listx0y0)a(+s18)))(setqp7(polar(listx0y0)as))(setqp1(polarp5(+a(*0.5pi))1.5))(setqp2(polarp1a8))(setqp3(polarp2(+a(*1.5pi))3))(setqp4(polarp3(+api)8))(command″line″(listx0y0)p5″″)(command″line″p6p7″″)(command″pline″p1″w″0.50.5p2p3p4″c″)(command″redraw″))
2.自定義函數(shù)的調(diào)試和調(diào)用函數(shù)的調(diào)用分命令行調(diào)用和文件調(diào)用。
命令行調(diào)用就是在“Command:”下調(diào)用;文件調(diào)用就是在LISP文件、菜單文件或命令組文件中調(diào)用。(1)首先用文本編輯器(如Windows記事本)建立包含一個或多個自定義函數(shù)的LISP文件,文件名的擴展名通常為“.lsp”;(2)然后用load函數(shù)把文件從磁盤裝入內(nèi)存;(3)最后按調(diào)用格式調(diào)用自定義函數(shù)。文本編輯器:存為“resistor.lsp”Command:(load“resistor”)Command:(res0010280)Command:(res00102890)
3.其他類型的自定義函數(shù)其設(shè)計目的是為了得到某些數(shù)據(jù)。【例4.2】定義一個將度化為弧度的函數(shù)。
(defunrad(ang/tp)(setqtp(/pi180))(*angtp);(setqang((*angtp))
)
最后一個表達式的結(jié)果就是自定義函數(shù)的執(zhí)行結(jié)果。
調(diào)用:
(rad45)結(jié)果為0.785398
【例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 造價咨詢招標(biāo)文件的特點
- 高質(zhì)量印刷服務(wù)合同協(xié)議書模板
- 影視主持人兼職合同
- 補充協(xié)議與合同的關(guān)系分析
- 專業(yè)營銷服務(wù)合同
- 低碳出行和諧生活的構(gòu)建
- 園林綠化苗木購銷合同
- 硬件購買與技術(shù)支持合同模板
- 土地使用權(quán)轉(zhuǎn)讓合同履行障礙
- 模板選購合同內(nèi)容
- 2024年江蘇省高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試卷試題(答案詳解1)
- DZ∕T 0148-2014 水文水井地質(zhì)鉆探規(guī)程(正式版)
- 幼兒園班級常規(guī)檢查記錄表
- 隨班就讀語文課堂教學(xué)活動設(shè)計
- 有關(guān)大學(xué)生社會主義核心價值觀的調(diào)查報告論文
- 《火力發(fā)電建設(shè)工程機組調(diào)試技術(shù)規(guī)范》
- 白山市長白朝鮮族自治縣招聘邊境村穩(wěn)邊固邊公益性崗位人員筆試真題2023
- 特種設(shè)備使用管理新版規(guī)則
- 交響音樂賞析智慧樹知到期末考試答案2024年
- 義務(wù)教育書法課程標(biāo)準2023版
- 太平洋保險入職測評題答案
評論
0/150
提交評論