《計算機圖形學(xué)基礎(chǔ)與CAD開發(fā)》課件-第4章 AutoCAD的參數(shù)化繪圖技術(shù)_第1頁
《計算機圖形學(xué)基礎(chǔ)與CAD開發(fā)》課件-第4章 AutoCAD的參數(shù)化繪圖技術(shù)_第2頁
《計算機圖形學(xué)基礎(chǔ)與CAD開發(fā)》課件-第4章 AutoCAD的參數(shù)化繪圖技術(shù)_第3頁
《計算機圖形學(xué)基礎(chǔ)與CAD開發(fā)》課件-第4章 AutoCAD的參數(shù)化繪圖技術(shù)_第4頁
《計算機圖形學(xué)基礎(chǔ)與CAD開發(fā)》課件-第4章 AutoCAD的參數(shù)化繪圖技術(shù)_第5頁
已閱讀5頁,還剩175頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論