Autocad-VBA二次開發(fā)簡易教程_第1頁
Autocad-VBA二次開發(fā)簡易教程_第2頁
Autocad-VBA二次開發(fā)簡易教程_第3頁
Autocad-VBA二次開發(fā)簡易教程_第4頁
Autocad-VBA二次開發(fā)簡易教程_第5頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一課:入門1.為什么要寫這個教程市面上ACAD VBA的書不多,它的幫助是英文版的,很多人看不懂。其實我轉(zhuǎn)行已經(jīng)好幾年了,而且手藝也慢慢生疏了,寫個教程對自己來說也是一次復(fù)習(xí)。2.什么是Autocad VBA?VBA是Visual Basic for Applications的英文縮寫,它是一個功能強大的開發(fā)工具,學(xué)好VBA可以成倍甚至成百、成萬倍提高工作效率,在工作中,有很多任務(wù)僅用ACAD命令不可能完成的,只要學(xué)好VBA就可以做到,相信到時候您一定會得到同事的佩服、老板的器重。3、VBA有多難?相信大家都知道Basic是的含義。應(yīng)該承認(rèn),我的水平還不高,錯誤之處在所難免,如果大家發(fā)現(xiàn)錯誤

2、一定要提出批評,以便及時更正。4、怎樣學(xué)習(xí)VBA?介紹大家一個學(xué)習(xí)公式:信心+恒心=開心。仔細(xì)閱讀本教程,完成例題,在學(xué)習(xí)的過程中一定要多思考,多想一些是什么、為什么。本教程將陸續(xù)發(fā)布在CAD世界論壇上,您不需要付費就可以學(xué)習(xí)。本作者在此鄭重承諾:關(guān)于本教程中有任何疑問,可以跟貼提問,只要有時間,本人一定會耐心解答。我不會發(fā)到任何人的郵箱中,您自己在論壇上找就可以了,請不要再向我索要這份教程。5、現(xiàn)在我們開始編寫第一個程序:畫一百個同心圓第一步:復(fù)制下面的紅色代碼第二步:在模型空間按快捷鍵Alt+F8,出現(xiàn)宏窗口第三步:在宏名稱中填寫C100,點“創(chuàng)建”、“確定”第四步:在Sub c100(和

3、End Sub之間粘貼代碼第五步:回到模型空間,再次按Alt+F8,點擊“運行”Sub c100(Dim cc(0 To 2 As Double '聲明坐標(biāo)變量cc(0 = 1000 '定義圓心座標(biāo)cc(1 = 1000cc(2 = 0For i = 1 To 1000 Step 10 '開始循環(huán)Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10 '畫圓Next iEnd Sub也許您還看不懂上面的代碼,這沒有關(guān)系,只要能把同心畫出來就可以了,祝您成功。第二課編程基礎(chǔ)本課主要任務(wù)是對上一課的例程進行詳細(xì)分析下面是源碼

4、:Sub c100(Dim cc(0 To 2 As Double '聲明坐標(biāo)變量cc(0 = 1000 '定義圓心座標(biāo)cc(1 = 1000cc(2 = 0For i = 1 To 1000 Step 10 '開始循環(huán)Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10 '畫圓Next iEnd Sub先看第一行和最后一行:Sub C100(End SubC100是宏的名稱,也叫過程名稱,當(dāng)用戶執(zhí)行C100時程序?qū)⑦\行sub和end sub之間的所有指令。第二行:Dim cc(0 To 2 As Double 

5、9;聲明坐標(biāo)變量后半段“'聲明坐標(biāo)變量”自動變?yōu)榫G色字體,它是代碼語句的注釋,它不會影響程序運行,它的作用是告訴閱讀者程序員的想法。對于簡單的程序,一般不需要寫注釋,如果要編寫非常復(fù)雜的程序,最好要多加注釋,越詳細(xì)越好,對于程序員來說,這是一個好習(xí)慣。電腦真正編譯執(zhí)行的是這條語句:Dim cc(0 To 2 As Double它的作用就是聲明變量。Dim是一條語句,可以理解為計算機指令。它的語法:Dim變量名As 數(shù)據(jù)類型本例中變量名為CC,而括號中的0 to 2聲明這個CC是一個數(shù)組,這個數(shù)組有三個元素:CC(0、CC(1、CC(2,如果改為CC(1 to 3,則三個元素是CC(1、

6、CC(2、CC(3,有了這個數(shù)組,就可以把坐標(biāo)數(shù)值放到這個變量之中。Double是數(shù)據(jù)類型中的一種。ACAD中一般需要定義坐標(biāo)時就用這個數(shù)據(jù)類型。在ACAD中數(shù)據(jù)類型的有很多,下面兩個是比較常用的數(shù)據(jù)類型,初學(xué)者要有所理解。Long(長整型,其范圍從-2,147,483,648 到2,147,483,647。Variant 它是那些沒被顯式聲明為其他類型變量的數(shù)據(jù)類型,可以理解為一種通用的數(shù)據(jù)類型,這是最常用的。下面三條語句cc(0 = 1000 '定義圓心座標(biāo)cc(1 = 1000cc(2 = 0它們的作用是給CC變量的每一個元素賦,值其順序是X、Y、Z坐標(biāo)。For i = 1 To

7、 1000 Step 10 '開始循環(huán)Next i '結(jié)束循環(huán)這兩條語句的作用是循環(huán)運行指令,每循環(huán)一次,i值要增加10,當(dāng)i加到1000時,結(jié)束循環(huán)。i也是一個變量,雖然沒有聲明i變量,程序還是認(rèn)可的,VB不是C語言,每用一個變量都要聲明,不聲明就會報錯。簡單是簡單了,這樣做也有壞處,如果不小心打錯了一個字母,程序不會報錯,如果程序很長,那就會出現(xiàn)一些意想不到的錯誤。step后面的數(shù)值就是每次循環(huán)時增加的數(shù)值,step后也可以用負(fù)值。例如:For i =1000 To 1 Step -10很多情況下,后面可以不加step 10如:For i=1 to 100,它的作用是每循環(huán)

8、一次i值就增加1Next i語句必須出現(xiàn)在需要結(jié)束循環(huán)的位置,不然程序沒法運行。下面看畫圓命令:Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10Call語句的作用是調(diào)用其他過程或者方法。ThisDrawing.ModelSpace是指當(dāng)前CAD文檔的模型空間AddCircle是畫圓方法Addcicle方法需要兩個參數(shù):圓心和半徑CC就是圓心坐標(biāo),i*10就是圓的半徑,本例中,這些圓的半徑分別是10、110、210、310本課到此結(jié)束,下面請完成一道思考題:1.以(4,2為圓心,畫5個同心圓,其半徑為1-5 回復(fù)| 推薦給朋友舉報2樓2006-10

9、-21 10:21回復(fù)2樓flapsesame 老馬next-第三課編程基礎(chǔ)二有一位叫自然9172的網(wǎng)友提出了下面的問題:繪制三維多段線時X、Y值在屏幕上用鼠標(biāo)選取,Z值用鍵盤輸入本課將講解這個問題。為了簡化程序,這里用多條直線來代替多段線。以下是源碼:Sub myl(Dim p1 As Variant '申明端點坐標(biāo)Dim p2 As Variantp1 = ThisDrawing.Utility.GetPoint(, "輸入點:" '獲取點坐標(biāo)z = ThisDrawing.Utility.GetReal("Z坐標(biāo):" '用戶

10、輸入Z坐標(biāo)值p1(2 = z '將Z坐標(biāo)值賦予點坐標(biāo)中On Error GoTo Err_Control '出錯陷井Do '開始循環(huán)p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:" '獲取下一個點的坐標(biāo)z = ThisDrawing.Utility.GetReal("Z坐標(biāo):" '用戶輸入Z坐標(biāo)值p2(2 = z '將Z坐標(biāo)值賦予點坐標(biāo)中Call ThisDrawing.ModelSpace.AddLine(p1, p2 '畫直線p1

11、 = p2 '將第二點的端點保存為下一條直線的第一個端點坐標(biāo)LoopErr_Control:End Sub先談一下本程序的設(shè)計思路:1、獲取第一點坐標(biāo)2、輸入第一點Z坐標(biāo)3、獲取第二點坐標(biāo)4、輸入第二點Z坐標(biāo)5、以第一、二點為端點,畫直線6、下一條線的第一點=這條線的第二點7、回到第3步進行循環(huán)如果用戶沒有輸入坐標(biāo)或Z值,則程序結(jié)束。首先看以下兩條語句:p1 = ThisDrawing.Utility.GetPoint(, "輸入點:" 獲取點坐標(biāo)p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點

12、:" '獲取下一個點的坐標(biāo)這兩條語句的作用是由用戶輸入點用鼠標(biāo)選取點坐標(biāo),并把坐標(biāo)值賦給p1、p2兩個變量。ThisDrawing.Utility.GetPoint(在ACAD中這是最常用的方法之一,它需要兩個參數(shù),在逗號前面的參數(shù)應(yīng)該是一個點坐標(biāo),它的作用是在屏幕上畫一條線,前一個端點位于點坐標(biāo)位置,后一個端點跟隨鼠標(biāo)移動,逗號之前可以什么都不填,這時沒有線條會跟隨鼠標(biāo)移動,但逗號必須保留。逗號后面使用一串字符,程序在命令行顯示這串字符,這不難理解。VbCr通常代表一個回車符,而在這個語句中,它的作用是在命令行不顯示“命令:”&的作用是連接字符。舉例:“愛我中華”&

13、amp;”抵制日貨”&”從我做起”z = ThisDrawing.Utility.GetReal("Z坐標(biāo):" '用戶輸入Z坐標(biāo)值由用戶輸入一個實數(shù)On Error GoTo Err_Control '出錯陷井Err_Control:On Error是出錯陷井語句,在程序出錯時將執(zhí)行On Error 后面的語句GoTo Err_contorl 是程序跳轉(zhuǎn)語句,它的作用是在程序中尋找Err_control:,并執(zhí)行這一行后面的語句,本例中Err_Control:后就是結(jié)束宏,所以只要出現(xiàn)錯誤,程序中止。Do '開始循環(huán)Loop 結(jié)束循環(huán)這個循環(huán)

14、就歷害了,它會無休止地進行循環(huán),好在本例中已經(jīng)有了一個出錯陷井,當(dāng)用戶輸入回車時,由于程序沒有得到點或坐標(biāo),程序出錯,跳出循環(huán),中止程序。如果要人為控制跳出循環(huán),可以在代碼中用Exit Do語句跳出循環(huán)。在For 變量和Next 變量之間如果要跳出循環(huán),那么只要在循環(huán)體內(nèi)加一個Exit for 就可以跳出循環(huán),關(guān)于這方面的例程以后會講到。Call ThisDrawing.ModelSpace.AddLine(p1, p2 '畫直線畫直線方法也是很常用的,它的兩個參數(shù)是點坐標(biāo)變量本課到此結(jié)束,請做思考題:連續(xù)畫圓,每次要求用戶輸入圓心、半徑,當(dāng)用戶不再輸入圓心或半徑時程序才退出回復(fù)3樓2

15、006-10-21 10:22回復(fù)3樓flapsesame 老馬next-第四課程序的調(diào)試和保存人非圣賢,孰能無過,初學(xué)者在編寫復(fù)雜程序時往往會出現(xiàn)一些意想不到的錯誤,所以程序的調(diào)試顯得尤為重要,隨著學(xué)習(xí)的深入,以后我們需要經(jīng)常進行程序調(diào)試。事實上,對于那些資深程序員來說,調(diào)試程序也是一項不可或缺的重要工作。首先,在程序輸入階段,應(yīng)該充分利用VBA編輯器的智能功能。當(dāng)你在寫代碼時,輸入一些字母后,編輯器可以自動列出合適的語句、對象、函數(shù)供你選擇,可以用上下鍵選擇,然后按TAB鍵(它位于“Q”鍵左邊確認(rèn)。當(dāng)輸入一個回車符后程序會自動對這條語句進行分析,如果出現(xiàn)錯誤就會提示。我們經(jīng)常碰到的麻煩是程

16、序的運行結(jié)果和預(yù)計的不一樣,一般我會這樣做:首先要想一想可能是哪一個變量有問題,然后去監(jiān)視這個變量(或表達(dá)式,在程序合適的位置設(shè)置斷點,這樣可以使程序停下來看一看這個變量有沒有按照我的設(shè)想在變化。下面我舉一個簡單的例子,先看源代碼:sub test(for i=2 to 4 step 0.6next iend sub這是一個非常簡單的循環(huán),每一次循環(huán)i便會增加0.6,當(dāng)循環(huán)3次后i值就變?yōu)?.4,但問題是每一次循環(huán)時i值變?yōu)槎嗌?第一步:在菜單中選“調(diào)試”“添加監(jiān)視”,在表達(dá)試中填“i”,點擊確定,這時你會看到臨視窗口中會多一行。第二步:把光標(biāo)移到代碼窗口中的“next i”行,按一下“F9”

17、,于是每當(dāng)程序運行到這里時就會暫停了。好,一切就緒,請按F5執(zhí)行程序,在監(jiān)視窗口中C值立刻變?yōu)?,再按F5繼續(xù),C值為2.6,再按幾次F5,直到程序結(jié)束,這樣我們就成功監(jiān)視了C值的變化。第三步:在next i行再按一次F9,清除斷點。監(jiān)視的表達(dá)式的右鍵菜單選擇“刪除監(jiān)視”。另外,還可以用“逐語句”、“逐過程”、“運行到光標(biāo)處”等方法進行調(diào)試,這些都在調(diào)試菜單中,操作比較簡單,請讀者自行領(lǐng)悟。到目前為止,我們所做的工程都是“嵌入式工程”,它只是嵌入在當(dāng)前的Autocad圖形文件中,以后打開這個文件時代碼才會加載,如果別的dwg文件也要使用,那就需要把代碼導(dǎo)出為.bas文件,供其他dwg 文件導(dǎo)入

18、。在VBA編輯器的“文件”菜單中有這兩個功能,一試便知。ACAD VBA還有一種工程叫“通用式工程”,只要進入ACAD就可以運行,程序可以在不同用戶、不同的圖形文件*享,但是由于VBA功能太強,有時候會出現(xiàn)一些意想不到的事情,所以在學(xué)習(xí)階段請暫時不要這樣做。本課結(jié)束,請做思考題;監(jiān)視下列代碼中的i和j的值,注意,此題雖然要監(jiān)視2個變量,但是在代窗口中只要設(shè)置1個斷點就足夠了。sub test(for i=2 to 4 step 0.6for j=-5 to 2 step 5.5next jnext iend sub回復(fù)4樓2006-10-21 10:23回復(fù)4樓flapsesame 老馬nex

19、t-第五課畫函數(shù)曲線下面是源碼:Sub myl(Dim p(0 To 49 As Double '定義點坐標(biāo)Dim myl As Object '定義引用曲線對象變量co = 15 '定義顏色For a = 0.01 To 1 Step 0.02 '開始循環(huán)畫拋物線For i = -24 To 24 Step 2 '開始畫多段線j = i + 24 '確定數(shù)組元素p(j = i '橫坐標(biāo)p(j + 1 = a * p(j * p(j / 10 '縱坐標(biāo)Next i '至此p(0-p(40所有元素已定義,結(jié)束循環(huán)Set my

20、l = ThisDrawing.ModelSpace.AddLightWeightPolyline(p '畫多段線myl.Color = co '設(shè)置顏色屬性co = co + 1 '改變顏色,供下次定義曲線顏色Next aEnd sub為了鼓勵大家積極思考,從本課開始,我不再解釋每一條語句的作用,只對以前沒有提過的語句進行一些解釋,也許你一時很難明白,建議用上一課提到的跟蹤變量、添加斷點的辦法領(lǐng)悟每一條語句的作用,如果有問題不懂請跟貼提問。在跟蹤變量p時請在跟蹤窗口中單擊變量p前的+號,這樣可以看清數(shù)組p中每一個元素的變化。ACAD沒有現(xiàn)成的畫拋物線命令,我們只能用程

21、序編寫多段線畫近似拋物線。理論上,拋物線的X值可以是無限小、無限大,這里取值范圍在正負(fù)24之間。程序第二行:Dim myl As Object '定義引用曲線對象變量Object也是一種變量類型,它可以把變量定義為對象,本例中myl變量將引用多段線,所以要定義為Objet 類型。看畫多段線命令:Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p '畫多段線其中括號中的p是一個數(shù)組,這個數(shù)組的元素數(shù)必須是偶數(shù),每兩個元數(shù)作為一個點坐標(biāo)。等號前面部分“Set myl”的作用就將myl變量去引用畫好的多段線。myl.Co

22、lor = co '設(shè)置顏色屬性。在ACAD中,顏色可以用數(shù)字表示,本例中co會增值,這樣就會有五彩繽紛的效果。本課第二張圖:正弦曲線,下面是源碼:Sub sinl(Dim p(0 To 719 As Double '定義點坐標(biāo)For i = 0 To 718 Step 2 '開始畫多段線p(i = i * 2 * 3.1415926535897 / 360 '橫坐標(biāo)p(i + 1 = 2 * Sin(p(i '縱坐標(biāo)Next iThisDrawing.ModelSpace.AddLightWeightPolyline (p '畫多段線ZoomE

23、xtents '顯示整個圖形End Subp(i = i * 2 * 3.1415926535897 / 360 '橫坐標(biāo)橫坐標(biāo)表示角度,后面表達(dá)式的作用是把角度轉(zhuǎn)化弧度ZoomExtents語句是縮放命令,它的作用是顯示整個圖形,消除圖形以外的區(qū)域本課思考題:畫一條拋物線:y=0.5*x*x+3,其中X取值范圍在正負(fù)50之間站長致:感謝CAD世界網(wǎng)-論壇網(wǎng)友普天同慶老師提供教程!希望更多CAD愛好者發(fā)表這類文章,CAD世界網(wǎng)給您提供一個展現(xiàn)自我的平臺。回復(fù)5樓2006-10-21 10:25回復(fù)5樓flapsesame 老馬next-第六課數(shù)據(jù)類型的轉(zhuǎn)換上一節(jié)課我們用一個簡單

24、的公式把角度轉(zhuǎn)化為弧度,這樣做便于大家理解。不過VBA中有現(xiàn)成的方法可以轉(zhuǎn)換數(shù)據(jù)類型。我們舉例說明:jd = ThisDrawing.Utility.AngleToReal(30, 0這個表達(dá)式把角度30度轉(zhuǎn)化為弧度,結(jié)果是.523598775598299。AngleToReal需要兩個參數(shù),前面是表示要轉(zhuǎn)換角度的數(shù)字,而后面一個參數(shù)可以取值為0-4之間的整數(shù),有如下意義:0:十進制角度;1:度分秒格式;2:梯度;3:弧度;4:測地單位例:id= ThisDrawing.Utility.AngleToReal("62d30' 10""", 1這個

25、表達(dá)式計算62度30分10秒的弧度再看將字符串轉(zhuǎn)換為實數(shù)的方法:DistanceToReal需要兩個參數(shù),前一個參數(shù)是表示數(shù)值的字符串,后面可以取值1-5,表示數(shù)據(jù)格式,有如下意義:1:科學(xué)計數(shù);2:十進制;3:工程計數(shù)英尺加英寸;4:建筑計數(shù)英尺加分?jǐn)?shù)英寸;5:分?jǐn)?shù)格式。例:以下表達(dá)式得到一個12.5的實數(shù)temp1 = ThisDrawing.Utility.DistanceToReal("1.25E+01", 1temp2 = ThisDrawing.Utility.DistanceToReal("12.5", 2temp3 = ThisDrawi

26、ng.Utility.DistanceToReal("12 1/2", 5而realtostring方法正好相反,它把一個實數(shù)轉(zhuǎn)換為字符串。它需要3個參數(shù)第一個參數(shù)是一個實數(shù),第二個參數(shù)表示數(shù)據(jù)格式,含義同上,最后一個參數(shù)表示精確到幾位小數(shù)。temp1= ThisDrawing.Utility.RealToString(12.5, 1, 3得到這個字符串:“1.250E+01”,下面介紹一些數(shù)型轉(zhuǎn)換函數(shù):Cint,獲得一個整數(shù),例:Cint(3.14159 ,得到3Cvar,獲得一個Variant類型的數(shù)值,例:Cvar("123" & &quo

27、t;00",得到”12300”Cdate,轉(zhuǎn)換為date數(shù)據(jù)類型,例:MyShortTime = CDate("11:13:14 AM"下面的代碼可以寫出一串?dāng)?shù)字,從000-099。Sub test(Dim add0 As StringDim text As StringDim p(0 To 2 As Doublep(1 = 0 'Y坐標(biāo)為0p(2 = 0 'Z坐標(biāo)為0For i = 0 To 99 '開始循環(huán)If i < 10 Then '如果小于10add0 = "00" '需要加00Else

28、'否則add0 = "0" '需要加0End Iftext = add0 & CStr(i '加零,并轉(zhuǎn)換數(shù)據(jù)p(0 = i * 100 'X坐標(biāo)Call ThisDrawing.ModelSpace.AddText(text, p, 4 '寫字Next iEnd Sub重點解釋條件判斷語句:If 條件表達(dá)式ThenElseEnd if如果滿足條件那么程序往下執(zhí)行,到else時不再往下執(zhí)行,直接跳到End if后面如果不滿足條件,程序跳到else后往下運行。Call ThisDrawing.ModelSpace.AddText

29、(text, p, 4 '寫字這是寫單行文本,需要三個參數(shù),分別是:寫的內(nèi)容、位置、字高回復(fù)6樓2006-10-21 10:26回復(fù)6樓flapsesame 老馬next-第七課寫文字客觀地說,ACAD寫字功能不夠歷害,而用VBA可以使寫字效率更高。比較正規(guī)的做法是把定義文字樣式,用樣式來控制文字的特性。我們還是用實例來學(xué)習(xí),先看下面一段代碼,它的作用是先創(chuàng)建一個文字樣式,然后用這個文字樣式寫一段多行文本。Sub txt(Dim mytxt As AcadTextStyle '定義mytxt變量為文本樣式Dim p(0 To 2 As Double '定義坐標(biāo)變量p(0

30、 = 100: p(1 = 100: p(2 = 0 '坐標(biāo)賦值Set mytxt = ThisDrawing.TextStyles.Add("mytxt" '添加mytxt樣式mytxt.fontFile = "c:windowsfontssimfang.ttf" '設(shè)置字體文件為仿宋體mytxt.Height = 100 '字高mytxt.Width = 0.8 '寬高比mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0 '傾斜角度(需轉(zhuǎn)為

31、弧度ThisDrawing.ActiveTextStyle = mytxt '將當(dāng)前文字樣式設(shè)置為mytxtSet txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, "做到老,學(xué)到老P" & "此心自光明正大,過人遠(yuǎn)矣"txtobj.LineSpacingFactor = 2 '指定行間距txtobj.AttachmentPoint = 3 '右對齊(1為左對齊,2為居中End Sub我們看這條語句Set mytxt = ThisDrawing.TextStyles.Add

32、("mytxt"添加文本樣式并賦值給mytxt變量,只需要一個參數(shù):文本樣式名fontfile、height、width、ObliqueAngle是文本樣式最常用的屬性Call ThisDrawing.ModelSpace.AddMText(p, 1400, "做到老,學(xué)到老P" & "此心自光明正大,過人遠(yuǎn)矣"這條語句是寫文本,需要三個參數(shù)。第一個參數(shù)p是坐標(biāo),1400是寬度,最后一個參數(shù)是文本內(nèi)容,其中p是一個回車符擴大字符間距用T數(shù)字,例:T3abc,使文字abc的間距擴大3 部,n取值范圍是0.75-3在論壇中有一個經(jīng)

33、常被同好提及的問題:如何使用文字疊加。舉例說明:123S+0.12-0.34S是格式字符,是分隔符,前面的數(shù)字在上,后面的數(shù)字在下。C是顏色格式字符,C后面跟一個數(shù)字表示顏色A是對齊方式,A0,A1,A2分別表示底部對齊、中間對齊和頂部對齊回復(fù)7樓2006-10-21 10:28回復(fù)7樓flapsesame 老馬next-第八課:圖層操作先簡單介紹兩條命令:1、這條語句可以建立圖層:ThisDrawing.Layers.Add("新建圖層"在括號中填寫圖層的名稱。2、設(shè)置為當(dāng)前的圖層ThisDrawing.ActiveLayer=圖層對象注意,等號右邊的變量不能用圖層名稱,

34、必須使用一個有效的圖層變量以下一些屬性在圖層比較常用:LayerOn 打開關(guān)閉Freeze 凍結(jié)Lock鎖定Color 顏色Linetype 線型看一個例題:1、先在已有的圖層中尋找一個名為“新建圖層”的圖層2、如果找到這個圖層,顯示該圖層的信息,并提示用戶是否需要設(shè)置為當(dāng)前圖層,如果用戶確認(rèn),則設(shè)置為當(dāng)前圖層。3、如果圖層沒有找到,新建一個名為“新建圖層”的圖層,設(shè)置為黃色,HIDDEN線型,并把這個圖層設(shè)置為當(dāng)前圖層Sub mylay(Dim lay0 As AcadLayer '定義作為圖層的變量Dim lay1 As AcadLayerfindlay = 0 '尋找圖層

35、的結(jié)果的變量,0沒有找到,1找到For Each lay0 In ThisDrawing.Layers '在所有的圖層中進行循環(huán)If lay0.Name = "新建圖層" Then '如果找到圖層名findlay = 1 '把變量改為1標(biāo)志著圖層已經(jīng)找到msgstr = lay0.Name + "已經(jīng)存在" + vbCrLfmsgstr = msgstr + "圖層狀態(tài):" + IIf(lay0.LayerOn = True, "打開", "關(guān)閉" + vbCrLfmsg

36、str = msgstr + "圖層" + IIf(lay0.Freeze = True, "已經(jīng)", "沒有" + "凍結(jié)" + vbCrLfmsgstr = msgstr + "圖層" + IIf(lay0.Lock = True, "已經(jīng)", "沒有" + "鎖定" + vbCrLfmsgstr = msgstr + "圖層顏色號:" + CStr(lay0.Color + vbCrLfmsgstr = msg

37、str + "圖層線型:" + lay0.Linetype + vbCrLfmsgstr = msgstr + "圖層線寬:" + CStr(lay0.Lineweight + vbCrLfmsgstr = msgstr + "打印開關(guān)" + IIf(lay0.Plottable = False, "關(guān)閉", "打開" + vbCrLf + vbCrLf msgstr = msgstr + "是否設(shè)置為當(dāng)前圖層?"If MsgBox(msgstr, 1 = 1 Then &#

38、39;如果用戶點擊確定If Not lay0.LayerOn Then lay0.LayerOn = True '打開ThisDrawing.ActiveLayer = lay0 '把當(dāng)前圖層設(shè)為已經(jīng)存在的圖層End IfExit For '結(jié)束尋找End IfNext lay0If findlay = 0 Then '沒有找到圖層Set lay1 = ThisDrawing.Layers.Add("新建圖層" '增加一個名為“臨時圖層”的圖層lay1.Color = 2 '圖層設(shè)置為黃色ltfind = 0 '找到線

39、型的標(biāo)志,0沒有找到,1找到For Each entry In ThisDrawing.Linetypes '在現(xiàn)有的線型中進行循環(huán)If StrComp(entry.Name, "HIDDEN" = 0 Then '如果線型名為"HIDDEN"ltfind = 1 '標(biāo)志為已找到線型Exit For '退出循環(huán)End IfNext entry '結(jié)束循環(huán)If ltfind = 0 Then '沒有找到線型ThisDrawing.Linetypes.Load "HIDDEN", "

40、;acadiso.lin" '加載線型End Iflay1.Linetype = "HIDDEN" '設(shè)置線型ThisDrawing.ActiveLayer = lay1 '將當(dāng)前圖層設(shè)置為新建圖層End IfEnd Sub在尋找圖時時我們用到for eachnex t 語句它的語法是這樣的:For Each 變量In 數(shù)組或集合對象exit fornext 變量它的作用是在數(shù)組或集合對象中進行循環(huán),每循環(huán)一次,變量就成為數(shù)組或集合對象中的一個元素。本例在所有的圖層對象中進行循環(huán),每循環(huán)一次layo變量就代表一個圖層在循環(huán)體中遇到exit

41、for 語句則退出循環(huán),如果沒有exit for,循環(huán)將在所有的元素都操作一遍后結(jié)束。If lay0.Name = "新建圖層" T代表這處圖層的圖層名IIf(lay0.LayerOn = True, "打開", "關(guān)閉"這是一個簡單判斷語句,語法如下:iif(判斷表達(dá)式,返回值1,返回值2當(dāng)判斷表達(dá)式成立,函數(shù)值=返回值1,如果表達(dá)式不成立,函數(shù)值=2MsgBox(msgstr, 1Mgbox顯示一個對話框,第一個參數(shù)是對話框顯示的內(nèi)容第二個參數(shù)可以控制對話框上的按鈕。0 只有確認(rèn)按鈕1 確認(rèn)、取消2 終止、

42、重試、忽略3 是、否、取消4 是、否MsgBox獲得值如下:確認(rèn):1取消:2終止:3重試:4忽略:5是:6否7初學(xué)者不需要死記硬背,能有所了解就行了ACAD圖層中最麻煩的就是線型問題了,本例先尋找一個HIDDEN線型,如果找不到就加載這個線型,用這條語句:ThisDrawing.Linetypes.Load "HIDDEN", "acadiso.lin"ThisDrawing.Linetypes.Load后需要兩個參數(shù),一個是線型的名稱,另外一個是線型文件的名稱?;貜?fù)8樓2006-10-21 10:29回復(fù)8樓flapsesame 老馬next-第九課:

43、創(chuàng)建選擇集1.在創(chuàng)建對象的同時可以直接引用.以前的例程中已經(jīng)做過多次了,現(xiàn)在復(fù)習(xí)一下,看例程:先隨機畫300個圓,在畫圓時直接引用,然后再把這些圓根本大小修改顏色.Sub c300(Dim myselect(0 To 300 As AcadEntity '定義選擇集數(shù)組Dim pp(0 To 2 As Double '圓心坐標(biāo)For i = 0 To 300 '循環(huán)300次pp(0 = 3000 * Rnd: pp(1 = 3000 * Rnd: pp(2 = 0 '設(shè)置圓心坐標(biāo)Set myselect(i = ThisDrawing.ModelSpace.Ad

44、dCircle(pp, Rnd * 30 + 1 '畫不同大小的圓Next iFor i = 1 To 300If myselect(i.Radius > 10 Then '判斷圓的直徑是否大于10myselect(i.color = Int(255 * Rnd + 1 '大圓顏色改為隨機數(shù)Elsemyselect(i.color = 0 '小圓改為白色End IfNext iZoomExtents '縮放到顯示全部對象End Subpp(0 = 3000 * Rnd: pp(1 = 3000 * Rnd: pp(2 = 0這一行實際上應(yīng)該是三條語

45、句,用三行合并為一行,用冒號分開rnd是隨機數(shù)函數(shù),它的數(shù)值為0-1之間的小數(shù),3000*rnd得到的數(shù)值就是在0-3000之間的隨機數(shù)Set myselect(i = ThisDrawing.ModelSpace.AddCircle(pp, Rnd * 30 + 1這條語句的作用是以pp點坐標(biāo)為圓心,畫一個圓,半徑是1-30之間的隨機數(shù),賦值給myselect選擇集. 2.提標(biāo)用戶在屏幕中選取選擇語句這樣寫:Set sset = ThisDrawing.SelectionSets.Add("ss1",其中”ss1”是一個選擇集名稱,這個參數(shù)可以隨意寫一個,注意不要重復(fù)就可

46、以了.下面的例程是讓用戶選擇對象,然后把選中的對象改為綠色,最后把選擇集刪除Sub mysel(Dim sset As AcadSelectionSet '定義選擇集對象Dim element As AcadEntity '定義選擇集中的元素對象Set sset = ThisDrawing.SelectionSets.Add("ss1" '新建一個選擇集sset.SelectOnScreen '提示用戶選擇For Each element In sset '在選擇集中進行循環(huán)element.color = acGreen '改

47、為綠色Nextsset.Delete '刪除選擇集End Sub3.選擇全部對象用select方法,參數(shù)為acSelectionSetAll ,看例程,這個程序選擇全部對象,顯示選中的對象,并計算對象數(shù). Sub allsel(Dim sel1 As AcadSelectionSet '定義選擇集對象Set sel1 = ThisDrawing.SelectionSets.Add("s" '新建一個選擇集Call sel1.Select(acSelectionSetAll '全部選中sel1.Highlight (True '顯示選擇

48、的對象sco= sel1.Count '計算選擇集中的對象數(shù)MsgBox "選中對象數(shù):" & CStr(sco '顯示對話框End Sub3.運用select方法上面的例題已經(jīng)運用了select方法,下面講一下select的5種選擇方式:1:擇全部對象(acselectionsetall2.選擇上次創(chuàng)建的對象(acselectionsetlast3.選擇上次選擇的對象(acselectionsetprevious4.選擇矩形窗口內(nèi)對象(acselectionsetwindow5.選擇矩形窗口內(nèi)以及與邊界相交的對象(acselectionsetcro

49、ssing還是看代碼來學(xué)習(xí).其中選擇語句是:Call sel1.Select(Mode, p1, p2Mode已經(jīng)定義為5,也就是選擇矩形窗口內(nèi)以及與邊界相交的對象,p1和p2是兩個點坐標(biāo),Sub selnew(Dim sel1 As AcadSelectionSet '定義選擇集對象Dim p1(0 To 2 As Double '坐標(biāo)1Dim p2(0 To 2 As Double '坐標(biāo)2p1(0 = 0: p1(1 = 0: p1(2 = 0 '設(shè)置坐標(biāo)1p2(0 = 300: p2(1 = 300: p2(2 = 0 '設(shè)置坐標(biāo)1Mode =

50、5 '把選擇模式存入mode變量中Set sel1 = ThisDrawing.SelectionSets.Add("sel3" '新建一個選擇集Call sel1.Select(Mode, p1, p2 '選擇對象sel1.Highlight (ture '顯示已選中的對象End Sub回復(fù)9樓2006-10-21 10:30回復(fù)9樓flapsesame 老馬next-第十課:畫多段線和樣條線畫二維多段線語句這樣寫:set lobj= ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoin

51、tAddLightweightPolyline后面需一個參數(shù),存放頂點坐標(biāo)的數(shù)組畫三維多段線語句這樣寫:Set lobj = ThisDrawing.ModelSpace.Add3DPoly(fitpointAdd3dpoly后面需一個參數(shù),就是頂點坐標(biāo)數(shù)組畫二維樣條線語句這樣寫:Set lobj = ThisDrawing.ModelSpace.AddSpline(fitPoints,startT, endTAddspline后需要三個參數(shù),第一個是擬合點數(shù)組,后面兩個分別是起點切向和終點切向。下面看例題。這個程序是第三課例程的改進版。原題是這樣的:繪制三維多段線時X、Y值在屏幕上用鼠標(biāo)選取

52、,Z值用鍵盤輸入。細(xì)心的讀者是否還記得這個小程序已經(jīng)在第三課的回貼中發(fā)布了。先分析一下編程細(xì)路:用動態(tài)數(shù)組存放多段線的所有頂點坐標(biāo),獲得新坐標(biāo)后就把前一次畫的多段線刪除,畫出多段線,并將線段第二點的端點保存為下一條線段的第一個端點坐標(biāo),以下是源碼:Sub myl(Dim p1 As Variant '申明端點坐標(biāo)Dim p2 As VariantDim l( As Double '聲明一個動態(tài)數(shù)組Dim templ As Objectp1 = ThisDrawing.Utility.GetPoint(, "輸入點:" '獲取點坐標(biāo)z = ThisDr

53、awing.Utility.GetReal("Z坐標(biāo):" '用戶輸入Z坐標(biāo)值p1(2 = z '將Z坐標(biāo)值賦予點坐標(biāo)中ReDim l(0 To 2 '定義動態(tài)數(shù)組l(0 = p1(0l(1 = p1(1l(2 = zOn Error GoTo Err_Control '出錯陷井Do '開始循環(huán)p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:" '獲取下一個點的坐標(biāo)z = ThisDrawing.Utility.GetReal("Z坐標(biāo)

54、:" '用戶輸入Z坐標(biāo)值p2(2 = z '將Z坐標(biāo)值賦予點坐標(biāo)中l(wèi)ub = UBound(l '獲取當(dāng)前l(fā)數(shù)組中元的元素個數(shù)ReDim Preserve l(lub + 3For i = 1 To 3l(lub + i = p2(i - 1Next iIf lub > 3 Thentempl.Delete '刪除前一次畫的多段線End IfSet templ = ThisDrawing.ModelSpace.Add3DPoly(l '畫多段線p1 = p2 '將第二點的端點保存為下一條直線的第一個端點坐標(biāo)LoopErr_Cont

55、rol:End Sub我們學(xué)一學(xué)動態(tài)數(shù)組,這是非常有用的。所謂動態(tài)數(shù)組,簡單講就是數(shù)組元素可以改變的特殊數(shù)組。這樣定義數(shù)組:Dim l( As Double賦值語句:ReDim l(0 To 2l(0 = p1(0l(1 = p1(1l(2 = z重新定義數(shù)組元素語句:lub = UBound(l '先要獲取當(dāng)前l(fā)數(shù)組中元的元素個數(shù),用ubount函數(shù)計算。ReDim Preserve l(lub + 3重定義時數(shù)組中要加三個元素,用以存放坐標(biāo)值,所以定義元素為lub+3。給數(shù)值賦值的語句是一樣的。再看畫多段線語句:Set templ = ThisDrawing.ModelSpace.

56、Add3DPoly(l '畫多段線在最后面括號中的l就是存放點坐標(biāo)的動態(tài)數(shù)組,這條語句在畫多段線的同時把多段線作為對象賦值給templ 變量,這樣下面的刪除語句就可以直接引用這個變量了。刪除語句:templ.Delete因為已經(jīng)知道對象是templ,所以只要在對象后面用delete方法就可以了。下面的例程更加實用些,它的功能是把樣條線轉(zhuǎn)化為多段線。編程思路:用戶選擇一根樣條線,計算樣條線的擬合點,然后把所有的擬合點存放到數(shù)組中,最后用這個數(shù)組畫多段線。Sub sp2pl(Dim getsp As Object 獲取樣條線的變量Dim newl( As Double 多段線數(shù)組Dim p

57、1 As Variant 獲得擬合點點坐標(biāo)ThisDrawing.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請選擇樣條曲線"sumctrl = getsp.NumberOfControlPoints 計算樣條線中一共有多少擬合點ReDim newl(0 To sumctrl * 3 - 1 重定義數(shù)組For i = 0 To sumctrl - 1 開始循環(huán),p1 = getsp.GetControlPoint(i 把擬合點坐標(biāo)存到p1變量中For j = 0 To 2newl(i * 3 + j = p1(jNext jNex

58、t iSet templ = ThisDrawing.ModelSpace.Add3DPoly(newl 畫樣條線End Sub下面的語句是讓用戶選擇樣條線:ThisDrawing.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請選擇樣條曲線" ThisDrawing.Utility.GetEntity 后面需要三個參數(shù):第一個getsp用于存放獲得用戶選擇的對象變量,第二個po是用戶鼠標(biāo)點下時的位置,第三個是一段字符串,顯示在提示欄?;貜?fù)10樓2006-10-21 10:31回復(fù)10樓flapsesame 老馬next-第十一課:

59、動畫基礎(chǔ)說實話,用ACAD玩動畫絕對比不上專業(yè)的三維動畫軟件,不過這年頭自稱精通CAD的工程師太多了,而學(xué)會用ACAD玩動畫一定能提高您的競爭實力,想象一下您用ACAD動畫向老板演示零件的裝配方法下面的例題是一個最簡單的動畫,由用戶選擇一個要移動的對象,然后定位起點和終點,程序會慢慢地把對象移動。移動方法:object.move 起點坐標(biāo),端點坐標(biāo)Sub testmove(Dim p0 As Variant '起點坐標(biāo)Dim p1 As Variant '終點坐標(biāo)Dim pc As Variant '移動時起點坐標(biāo)Dim pe As Variant '移動時終點

60、坐標(biāo)Dim movx As Variant 'x軸增量Dim movy As Variant 'y軸增量Dim getobj As Object '移動對象Dim movtimes As Integer '移動次數(shù)ThisDrawing.Utility.GetEntity getobj, po, "請選擇移動對象"p0 = ThisDrawing.Utility.GetPoint(, "起點:"p1 = ThisDrawing.Utility.GetPoint(p0, "終點:"pe = p0pc = p0motimes = 3000movx = (p1(0 - p0(0 / motimesmovy = (p1(1 - p0(1 / motimesFor i = 1 To motimespe(0 = pc(0 + movxpe(1 = pc(1 + movygetobj.Move pc, pe '移動一段getobj.Update '更新對象NextEnd Sub先讓用戶選擇移動的對象、起點、終點,

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論