




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第一課:入門1.為什么要寫這個(gè)教程市面上ACAD VBA 的書不多,它的幫助是英文版的,很多人看不懂。其實(shí)我轉(zhuǎn)行已經(jīng)好幾年了,而且手藝也慢慢生疏了,寫個(gè)教程對(duì)自己來說也是一次復(fù)習(xí)。2.什么是Autocad VBA?VBA 是Visual Basic for Applications 的英文縮寫,它是一個(gè)功能強(qiáng)大的開發(fā)工具,學(xué)好VBA 可以成倍甚至成百、成萬倍提高工作效率,在工作中,有很多任務(wù)僅用ACAD 命令不可能完成的,只要學(xué)好VBA 就可以做到,相信到時(shí)候您一定會(huì)得到同事的佩服、老板的器重。3、VBA 有多難?相信大家都知道Basic 是的含義。應(yīng)該承認(rèn),我的水平還不高,錯(cuò)誤之處在所難免,
2、如果大家發(fā)現(xiàn)錯(cuò)誤一定要提出批評(píng),以便及時(shí)更正。4、怎樣學(xué)習(xí)VBA?介紹大家一個(gè)學(xué)習(xí)公式:信心+恒心=開心。仔細(xì)閱讀本教程,完成例題,在學(xué)習(xí)的過程中一定要多思考,多想一些是什么、為什么。本教程將陸續(xù)發(fā)布在CAD 世界論壇上,您不需要付費(fèi)就可以學(xué)習(xí)。本作者在此鄭重承諾:關(guān)于本教程中有任何疑問,可以跟貼提問,只要有時(shí)間,本人一定會(huì)耐心解答。我不會(huì)發(fā)到任何人的郵箱中,您自己在論壇上找就可以了,請(qǐng)不要再向我索要這份教程。5、現(xiàn)在我們開始編寫第一個(gè)程序:畫一百個(gè)同心圓第一步:復(fù)制下面的紅色代碼第二步:在模型空間按快捷鍵Alt+F8,出現(xiàn)宏窗口第三步:在宏名稱中填寫C100,點(diǎn)“創(chuàng)建”、“確定”第四步:在S
3、ub c100()和End Sub 之間粘貼代碼第五步:回到模型空間,再次按Alt+F8,點(diǎn)擊“運(yùn)行”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ù)是對(duì)
4、上一課的例程進(jìn)行詳細(xì)分析下面是源碼: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 時(shí)程序?qū)⑦\(yùn)行sub 和end sub 之間的所有指令。第二行
5、:Dim cc(0 To 2) As Double '聲明坐標(biāo)變量后半段“'聲明坐標(biāo)變量”自動(dòng)變?yōu)榫G色字體,它是代碼語句的注釋,它不會(huì)影響程序運(yùn)行,它的作用是告訴閱讀者程序員的想法。對(duì)于簡單的程序,一般不需要寫注釋,如果要編寫非常復(fù)雜的程序,最好要多加注釋,越詳細(xì)越好,對(duì)于程序員來說,這是一個(gè)好習(xí)慣。電腦真正編譯執(zhí)行的是這條語句:Dim cc(0 To 2) As Double它的作用就是聲明變量。Dim 是一條語句,可以理解為計(jì)算機(jī)指令。它的語法:Dim 變量名As 數(shù)據(jù)類型本例中變量名為CC,而括號(hào)中的0 to 2 聲明這個(gè)CC 是一個(gè)數(shù)組,這個(gè)數(shù)組有三個(gè)元素:CC(0)、
6、CC(1)、CC(2),如果改為CC(1 to 3),則三個(gè)元素是CC(1)、CC(2)、CC(3),有了這個(gè)數(shù)組,就可以把坐標(biāo)數(shù)值放到這個(gè)變量之中。Double 是數(shù)據(jù)類型中的一種。ACAD 中一般需要定義坐標(biāo)時(shí)就用這個(gè)數(shù)據(jù)類型。在ACAD 中數(shù)據(jù)類型的有很多,下面兩個(gè)是比較常用的數(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)
7、 = 0它們的作用是給CC 變量的每一個(gè)元素賦,值其順序是X、Y、Z 坐標(biāo)。For i = 1 To 1000 Step 10 '開始循環(huán)Next i '結(jié)束循環(huán)這兩條語句的作用是循環(huán)運(yùn)行指令,每循環(huán)一次,i 值要增加10,當(dāng)i 加到1000 時(shí),結(jié)束循環(huán)。i 也是一個(gè)變量,雖然沒有聲明i 變量,程序還是認(rèn)可的,VB 不是C 語言,每用一個(gè)變量都要聲明,不聲明就會(huì)報(bào)錯(cuò)。簡單是簡單了,這樣做也有壞處,如果不小心打錯(cuò)了一個(gè)字母,程序不會(huì)報(bào)錯(cuò),如果程序很長,那就會(huì)出現(xiàn)一些意想不到的錯(cuò)誤。step 后面的數(shù)值就是每次循環(huán)時(shí)增加的數(shù)值,step 后也可以用負(fù)值。例如:For i =100
8、0 To 1 Step -10很多情況下,后面可以不加step 10如:For i=1 to 100,它的作用是每循環(huán)一次i 值就增加1Next i 語句必須出現(xiàn)在需要結(jié)束循環(huán)的位置,不然程序沒法運(yùn)行。下面看畫圓命令:Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10)Call 語句的作用是調(diào)用其他過程或者方法。ThisDrawing.ModelSpace 是指當(dāng)前CAD 文檔的模型空間AddCircle 是畫圓方法Addcicle 方法需要兩個(gè)參數(shù):圓心和半徑CC 就是圓心坐標(biāo),i*10 就是圓的半徑,本例中,這些圓的半徑分別是10、110、21
9、0、310本課到此結(jié)束,下面請(qǐng)完成一道思考題:1. 以(4,2)為圓心,畫5 個(gè)Autocad VBA 初級(jí)教程(第三課編程基礎(chǔ)二)有一位叫自然9172 的網(wǎng)友提出了下面的問題:繪制三維多段線時(shí)X、Y 值在屏幕上用鼠標(biāo)選取,Z 值用鍵盤輸入本課將講解這個(gè)問題。為了簡化程序,這里用多條直線來代替多段線。以下是源碼:Sub myl()Dim p1 As Variant '申明端點(diǎn)坐標(biāo)Dim p2 As Variantp1 = ThisDrawing.Utility.GetPoint(, "輸入點(diǎn):") '獲取點(diǎn)坐標(biāo)z = ThisDrawing.Utility.
10、GetReal("Z 坐標(biāo):") '用戶輸入Z 坐標(biāo)值p1(2) = z '將Z 坐標(biāo)值賦予點(diǎn)坐標(biāo)中On Error GoTo Err_Control '出錯(cuò)陷井Do '開始循環(huán)p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點(diǎn):") '獲取下一個(gè)點(diǎn)的坐標(biāo)z = ThisDrawing.Utility.GetReal("Z 坐標(biāo):") '用戶輸入Z 坐標(biāo)值p2(2) = z '將Z 坐標(biāo)值賦予點(diǎn)坐標(biāo)中Call ThisD
11、rawing.ModelSpace.AddLine(p1, p2) '畫直線p1 = p2 '將第二點(diǎn)的端點(diǎn)保存為下一條直線的第一個(gè)端點(diǎn)坐標(biāo)LoopErr_Control:End Sub先談一下本程序的設(shè)計(jì)思路:1、獲取第一點(diǎn)坐標(biāo)2、輸入第一點(diǎn)Z 坐標(biāo)3、獲取第二點(diǎn)坐標(biāo)4、輸入第二點(diǎn)Z 坐標(biāo)5、以第一、二點(diǎn)為端點(diǎn),畫直線6、下一條線的第一點(diǎn)=這條線的第二點(diǎn)7、回到第3 步進(jìn)行循環(huán)如果用戶沒有輸入坐標(biāo)或Z 值,則程序結(jié)束。首先看以下兩條語句:p1 = ThisDrawing.Utility.GetPoint(, "輸入點(diǎn):") 獲取點(diǎn)坐標(biāo)p2 = ThisDr
12、awing.Utility.GetPoint(p1, vbCr & "輸入下一點(diǎn):") '獲取下一個(gè)點(diǎn)的坐標(biāo)這兩條語句的作用是由用戶輸入點(diǎn)用鼠標(biāo)選取點(diǎn)坐標(biāo),并把坐標(biāo)值賦給p1、p2 兩個(gè)變量。()在ACAD 中這是最常用的方法之一,它需要兩個(gè)參數(shù),在逗號(hào)前面的參數(shù)應(yīng)該是一個(gè)點(diǎn)坐標(biāo),它的作用是在屏幕上畫一條線,前一個(gè)端點(diǎn)位于點(diǎn)坐標(biāo)位置,后一個(gè)端點(diǎn)跟隨鼠標(biāo)移動(dòng),逗號(hào)之前可以什么都不填,這時(shí)沒有線條會(huì)跟隨鼠標(biāo)移動(dòng),但逗號(hào)必須保留。逗號(hào)后面使用一串字符,程序在命令行顯示這串字符,這不難理解。VbCr 通常代表一個(gè)回車符,而在這個(gè)語句中,它的作用是在命令行不顯示“命令
13、:”&的作用是連接字符。舉例:“愛我中華”&”抵制日貨”&”從我做起”z = ThisDrawing.Utility.GetReal("Z 坐標(biāo):") '用戶輸入Z 坐標(biāo)值由用戶輸入一個(gè)實(shí)數(shù)On Error GoTo Err_Control '出錯(cuò)陷井Err_Control:On Error 是出錯(cuò)陷井語句,在程序出錯(cuò)時(shí)將執(zhí)行On Error 后面的語句GoTo Err_contorl 是程序跳轉(zhuǎn)語句,它的作用是在程序中尋找Err_control:,并執(zhí)行這一行后面的語句,本例中Err_Control:后就是結(jié)束宏,所以只要出現(xiàn)錯(cuò)誤,
14、程序中止。Do '開始循環(huán)Loop 結(jié)束循環(huán)這個(gè)循環(huán)就歷害了,它會(huì)無休止地進(jìn)行循環(huán),好在本例中已經(jīng)有了一個(gè)出錯(cuò)陷井,當(dāng)用戶輸入回車時(shí),由于程序沒有得到點(diǎn)或坐標(biāo),程序出錯(cuò),跳出循環(huán),中止程序。如果要人為控制跳出循環(huán),可以在代碼中用Exit Do 語句跳出循環(huán)。在For 變量和Next 變量之間如果要跳出循環(huán),那么只要在循環(huán)體內(nèi)加一個(gè)Exitfor 就可以跳出循環(huán),關(guān)于這方面的例程以后會(huì)講到。Call ThisDrawing.ModelSpace.AddLine(p1, p2) '畫直線畫直線方法也是很常用的,它的兩個(gè)參數(shù)是點(diǎn)坐標(biāo)變量本課到此結(jié)束,請(qǐng)做思考題:連續(xù)畫圓,每次要求用戶
15、輸入圓心、半徑,當(dāng)用戶不再輸入圓心或半徑時(shí)程序才退出同心圓,其半徑為1-5Autocad VBA 初級(jí)教程(第四課程序的調(diào)試和保存)人非圣賢,孰能無過,初學(xué)者在編寫復(fù)雜程序時(shí)往往會(huì)出現(xiàn)一些意想不到的錯(cuò)誤,所以程序的調(diào)試顯得尤為重要,隨著學(xué)習(xí)的深入,以后我們需要經(jīng)常進(jìn)行程序調(diào)試。事實(shí)上,對(duì)于那些資深程序員來說,調(diào)試程序也是一項(xiàng)不可或缺的重要工作。首先,在程序輸入階段,應(yīng)該充分利用VBA 編輯器的智能功能。當(dāng)你在寫代碼時(shí),輸入一些字母后,編輯器可以自動(dòng)列出合適的語句、對(duì)象、函數(shù)供你選擇,可以用上下鍵選擇,然后按TAB 鍵(它位于“Q”鍵左邊)確認(rèn)。當(dāng)輸入一個(gè)回車符后程序會(huì)自動(dòng)對(duì)這條語句進(jìn)行分析,如
16、果出現(xiàn)錯(cuò)誤就會(huì)提示。我們經(jīng)常碰到的麻煩是程序的運(yùn)行結(jié)果和預(yù)計(jì)的不一樣,一般我會(huì)這樣做:首先要想一想可能是哪一個(gè)變量有問題,然后去監(jiān)視這個(gè)變量(或表達(dá)式),在程序合適的位置設(shè)置斷點(diǎn),這樣可以使程序停下來看一看這個(gè)變量有沒有按照我的設(shè)想在變化。下面我舉一個(gè)簡單的例子,先看源代碼:sub test()for i=2 to 4 step 0.6next iend sub這是一個(gè)非常簡單的循環(huán),每一次循環(huán)i 便會(huì)增加0.6,當(dāng)循環(huán)3 次后i 值就變?yōu)?.4,但問題是每一次循環(huán)時(shí)i 值變?yōu)槎嗌??第一步:在菜單中選“調(diào)試”“添加監(jiān)視”,在表達(dá)試中填“i”,點(diǎn)擊確定,這時(shí)你會(huì)看到臨視窗口中會(huì)多一行。第二步:把
17、光標(biāo)移到代碼窗口中的“next i”行,按一下“F9”,于是每當(dāng)程序運(yùn)行到這里時(shí)就會(huì)暫停了。好,一切就緒,請(qǐng)按F5 執(zhí)行程序,在監(jiān)視窗口中C 值立刻變?yōu)?,再按F5 繼續(xù),C 值為2.6,再按幾次F5,直到程序結(jié)束,這樣我們就成功監(jiān)視了C 值的變化。第三步:在next i 行再按一次F9,清除斷點(diǎn)。監(jiān)視的表達(dá)式的右鍵菜單選擇“刪除監(jiān)視”。另外,還可以用“逐語句”、“逐過程”、“運(yùn)行到光標(biāo)處”等方法進(jìn)行調(diào)試,這些都在調(diào)試菜單中,操作比較簡單,請(qǐng)讀者自行領(lǐng)悟。到目前為止,我們所做的工程都是“嵌入式工程”,它只是嵌入在當(dāng)前的Autocad 圖形文件中, 以后打開這個(gè)文件時(shí)代碼才會(huì)加載,如果別的dwg
18、 文件也要使用,那就需要把代碼導(dǎo)出為.bas 文件,供其他dwg 文件導(dǎo)入。在VBA 編輯器的“文件”菜單中有這兩個(gè)功能,一試便知。ACAD VBA 還有一種工程叫“通用式工程”,只要進(jìn)入ACAD 就可以運(yùn)行,程序可以在不同用戶、不同的圖形文件中共享,但是由于VBA 功能太強(qiáng),有時(shí)候會(huì)出現(xiàn)一些意想不到的事情,所以在學(xué)習(xí)階段請(qǐng)暫時(shí)不要這樣做。本課結(jié)束,請(qǐng)做思考題;監(jiān)視下列代碼中的i 和j 的值,注意,此題雖然要監(jiān)視2 個(gè)變量,但是在代窗口中只要設(shè)置1 個(gè)斷點(diǎn)就足夠了。sub test()for i=2 to 4 step 0.6for j=-5 to 2 step 5.5next jnext i
19、end subAutocad VBA 初級(jí)教程(第五課畫函數(shù)曲線)先畫一組下圖拋物線。下面是源碼:Sub myl()Dim p(0 To 49) As Double '定義點(diǎn)坐標(biāo)Dim myl As Object '定義引用曲線對(duì)象變量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)N
20、ext i '至此p(0)-p(40)所有元素已定義,結(jié)束循環(huán)Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線myl.Color = co '設(shè)置顏色屬性co = co + 1 '改變顏色,供下次定義曲線顏色Next aEnd sub為了鼓勵(lì)大家積極思考,從本課開始,我不再解釋每一條語句的作用,只對(duì)以前沒有提過的語句進(jìn)行一些解釋,也許你一時(shí)很難明白,建議用上一課提到的跟蹤變量、添加斷點(diǎn)的辦法領(lǐng)悟每一條語句的作用,如果有問題不懂請(qǐng)跟貼提問。在跟蹤變量p 時(shí)請(qǐng)?jiān)诟櫞翱谥袉螕糇兞縫 前的
21、+號(hào),這樣可以看清數(shù)組p 中每一個(gè)元素的變化。ACAD 沒有現(xiàn)成的畫拋物線命令,我們只能用程序編寫多段線畫近似拋物線。理論上,拋物線的X 值可以是無限小、無限大,這里取值范圍在正負(fù)24 之間。程序第二行:Dim myl As Object '定義引用曲線對(duì)象變量Object 也是一種變量類型,它可以把變量定義為對(duì)象,本例中myl 變量將引用多段線,所以要定義為Objet類型??串嫸喽尉€命令:Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線其中括號(hào)中的p 是一個(gè)數(shù)組,這個(gè)數(shù)組的元素?cái)?shù)必須是偶數(shù),每兩個(gè)
22、元數(shù)作為一個(gè)點(diǎn)坐標(biāo)。等號(hào)前面部分“Set myl”的作用就將myl 變量去引用畫好的多段線。myl.Color = co '設(shè)置顏色屬性。在ACAD 中,顏色可以用數(shù)字表示,本例中co 會(huì)增值,這樣就會(huì)有五彩繽紛的效果。本課第二張圖:正弦曲線,下面是源碼:Sub sinl()Dim p(0 To 719) As Double '定義點(diǎn)坐標(biāo)For i = 0 To 718 Step 2 '開始畫多段線橫坐標(biāo)p(i + 1) = 2 * Sin(p(i) '縱坐標(biāo)Next iThisDrawing.ModelSpace.AddLightWeightPolyline
23、(p) '畫多段線ZoomExtents '顯示整個(gè)圖形End Sub橫坐標(biāo)橫坐標(biāo)表示角度,后面表達(dá)式的作用是把角度轉(zhuǎn)化弧度ZoomExtents 語句是縮放命令,它的作用是顯示整個(gè)圖形,消除圖形以外的區(qū)域本課思考題:畫一條拋物線:y=0.5*x*x+3,其中X 取值范圍在正負(fù)50 之間Autocad VBA 初級(jí)教程(第六課數(shù)據(jù)類型的轉(zhuǎn)換)上一節(jié)課我們用一個(gè)簡單的公式把角度轉(zhuǎn)化為弧度,這樣做便于大家理解。不過VBA 中有現(xiàn)成的方法可以轉(zhuǎn)換數(shù)據(jù)類型。我們舉例說明:jd = ThisDrawing.Utility.AngleToReal(30, 0)這個(gè)表達(dá)式把角度30 度轉(zhuǎn)化為
24、弧度,結(jié)果是.523598775598299。AngleToReal 需要兩個(gè)參數(shù),前面是表示要轉(zhuǎn)換角度的數(shù)字,而后面一個(gè)參數(shù)可以取值為0-4 之間的整數(shù),有如下意義:0:十進(jìn)制角度;1:度分秒格式;2:梯度;3:弧度;4:測地單位例:id= ThisDrawing.Utility.AngleToReal("62d30' 10""", 1)這個(gè)表達(dá)式計(jì)算62 度30 分10 秒的弧度再看將字符串轉(zhuǎn)換為實(shí)數(shù)的方法:DistanceToReal需要兩個(gè)參數(shù),前一個(gè)參數(shù)是表示數(shù)值的字符串,后面可以取值1-5,表示數(shù)據(jù)格式,有如下意義:1:科學(xué)計(jì)數(shù);2:
25、十進(jìn)制;3:工程計(jì)數(shù)英尺加英寸;4:建筑計(jì)數(shù)英尺加分?jǐn)?shù)英寸;5:分?jǐn)?shù)格式。例:以下表達(dá)式得到一個(gè)12.5 的實(shí)數(shù)temp1 = ThisDrawing.Utility.DistanceToReal("1.25E+01", 1)temp2 = ThisDrawing.Utility.DistanceToReal("12.5", 2)temp3 = ThisDrawing.Utility.DistanceToReal("12 1/2", 5)而realtostring 方法正好相反,它把一個(gè)實(shí)數(shù)轉(zhuǎn)換為字符串。它需要3 個(gè)參數(shù)第一個(gè)參數(shù)是一
26、個(gè)實(shí)數(shù),第二個(gè)參數(shù)表示數(shù)據(jù)格式,含義同上,最后一個(gè)參數(shù)表示精確到幾位小數(shù)。temp1= ThisDrawing.Utility.RealToString(12.5, 1, 3)得到這個(gè)字符串:“1.250E+01”,下面介紹一些數(shù)型轉(zhuǎn)換函數(shù):Cint,獲得一個(gè)整數(shù),例:Cint(3.14159) ,得到3Cvar,獲得一個(gè)Variant 類型的數(shù)值,例:Cvar("123" & "00"),得到”12300”Cdate,轉(zhuǎn)換為date 數(shù)據(jù)類型,例:MyShortTime = CDate("11:13:14 AM")下面的代碼
27、可以寫出一串?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 '否則add0 = "0" '需要加0End Iftext = add0 & CStr(i) '加零,并轉(zhuǎn)換數(shù)據(jù)
28、p(0) = i * 100 'X 坐標(biāo)Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字Next iEnd Sub重點(diǎn)解釋條件判斷語句:If 條件表達(dá)式ThenElseEnd if如果滿足條件那么程序往下執(zhí)行,到else 時(shí)不再往下執(zhí)行,直接跳到End if 后面如果不滿足條件,程序跳到else 后往下運(yùn)行。Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字這是寫單行文本,需要三個(gè)參數(shù),分別是:寫的內(nèi)容、位置、字高Autocad VBA 初級(jí)教程(第七課寫文字)客觀
29、地說,ACAD 寫字功能不夠歷害,而用VBA 可以使寫字效率更高。比較正規(guī)的做法是把定義文字樣式,用樣式來控制文字的特性。我們還是用實(shí)例來學(xué)習(xí),先看下面一段代碼,它的作用是先創(chuàng)建一個(gè)文字樣式,然后用這個(gè)文字樣式寫一段多行文本。Sub txt()Dim mytxt As AcadTextStyle '定義mytxt 變量為文本樣式Dim p(0 To 2) As Double '定義坐標(biāo)變量p(0) = 100: p(1) = 100: p(2) = 0 '坐標(biāo)賦值Set mytxt = ThisDrawing.TextStyles.Add("mytxt&quo
30、t;) '添加mytxt 樣式mytxt.fontFile = "c:windowsfontssimfang.ttf" '設(shè)置字體文件為仿宋體mytxt.Height = 100 '字高mytxt.Width = 0.8 '寬高比mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0) '傾斜角度(需轉(zhuǎn)為弧度)ThisDrawing.ActiveTextStyle = mytxt '將當(dāng)前文字樣式設(shè)置為mytxtSet txtobj = ThisDrawing.Mod
31、elSpace.AddMText(p, 1400, "做到老,學(xué)到老P" & "此心自光明正大,過人遠(yuǎn)矣")txtobj.LineSpacingFactor = 2 '指定行間距txtobj.AttachmentPoint = 3 '右對(duì)齊(1 為左對(duì)齊,2 為居中)End Sub我們看這條語句Set mytxt = ThisDrawing.TextStyles.Add("mytxt")添加文本樣式并賦值給mytxt 變量,只需要一個(gè)參數(shù):文本樣式名fontfile、height、width、ObliqueAn
32、gle 是文本樣式最常用的屬性Call ThisDrawing.ModelSpace.AddMText(p, 1400, "做到老,學(xué)到老P" & "此心自光明正大,過人遠(yuǎn)矣")這條語句是寫文本,需要三個(gè)參數(shù)。第一個(gè)參數(shù)p 是坐標(biāo),1400 是寬度,最后一個(gè)參數(shù)是文本內(nèi)容,其中p 是一個(gè)回車符擴(kuò)大字符間距用T 數(shù)字,例:T3abc,使文字abc 的間距擴(kuò)大3 部,n 取值范圍是0.75-3在論壇中有一個(gè)經(jīng)常被同好提及的問題:如何使用文字疊加。舉例說明:123S+0.12-0.34S 是格式字符,是分隔符,前面的數(shù)字在上,后面的數(shù)字在下。C 是顏色
33、格式字符,C 后面跟一個(gè)數(shù)字表示顏色A 是對(duì)齊方式,A0,A1,A2 分別表示底部對(duì)齊、中間對(duì)齊和頂部對(duì)齊Autocad VBA 初級(jí)教程(第八課:圖層操作)先簡單介紹兩條命令:1、這條語句可以建立圖層:ThisDrawing.Layers.Add("新建圖層")在括號(hào)中填寫圖層的名稱。2、設(shè)置為當(dāng)前的圖層ThisDrawing.ActiveLayer=圖層對(duì)象注意,等號(hào)右邊的變量不能用圖層名稱,必須使用一個(gè)有效的圖層變量以下一些屬性在圖層比較常用:LayerOn 打開關(guān)閉Freeze 凍結(jié)Lock 鎖定Color 顏色Linetype 線型看一個(gè)例題:1、先在已有的圖層中
34、尋找一個(gè)名為“新建圖層”的圖層2、如果找到這個(gè)圖層,顯示該圖層的信息,并提示用戶是否需要設(shè)置為當(dāng)前圖層,如果用戶確認(rèn),則設(shè)置為當(dāng)前圖層。3、如果圖層沒有找到,新建一個(gè)名為“新建圖層”的圖層,設(shè)置為黃色,HIDDEN 線型,并把這個(gè)圖層設(shè)置為當(dāng)前圖層Sub mylay()Dim lay0 As AcadLayer '定義作為圖層的變量Dim lay1 As AcadLayerfindlay = 0 '尋找圖層的結(jié)果的變量,0 沒有找到,1 找到For Each lay0 In ThisDrawing.Layers '在所有的圖層中進(jìn)行循環(huán)If lay0.Name = &q
35、uot;新建圖層" Then '如果找到圖層名findlay = 1 '把變量改為1 標(biāo)志著圖層已經(jīng)找到msgstr = lay0.Name + "已經(jīng)存在" + vbCrLfmsgstr = msgstr + "圖層狀態(tài):" + IIf(lay0.LayerOn = True, "打開", "關(guān)閉") + vbCrLfmsgstr = msgstr + "圖層" + IIf(lay0.Freeze = True, "已經(jīng)", "沒有&qu
36、ot;) + "凍結(jié)" + vbCrLfmsgstr = msgstr + "圖層" + IIf(lay0.Lock = True, "已經(jīng)", "沒有") + "鎖定" + vbCrLfmsgstr = msgstr + "圖層顏色號(hào):" + CStr(lay0.Color) + vbCrLfmsgstr = msgstr + "圖層線型:" + lay0.Linetype + vbCrLfmsgstr = msgstr + "圖層線寬:&qu
37、ot; + CStr(lay0.Lineweight) + vbCrLfmsgstr = msgstr + "打印開關(guān)" + IIf(lay0.Plottable = False, "關(guān)閉", "打開") + vbCrLf + vbCrLfmsgstr = msgstr + "是否設(shè)置為當(dāng)前圖層?"If MsgBox(msgstr, 1) = 1 Then '如果用戶點(diǎn)擊確定If Not lay0.LayerOn Then lay0.LayerOn = True '打開ThisDrawing.Act
38、iveLayer = lay0 '把當(dāng)前圖層設(shè)為已經(jīng)存在的圖層End IfExit For '結(jié)束尋找End IfNext lay0If findlay = 0 Then '沒有找到圖層Set lay1 = ThisDrawing.Layers.Add("新建圖層") '增加一個(gè)名為“臨時(shí)圖層”的圖層lay1.Color = 2 '圖層設(shè)置為黃色ltfind = 0 '找到線型的標(biāo)志,0 沒有找到,1 找到For Each entry In ThisDrawing.Linetypes '在現(xiàn)有的線型中進(jìn)行循環(huán)If St
39、rComp(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", "acadiso.lin" '加載線型End Iflay1.Linetype = "HIDDEN" '
40、設(shè)置線型ThisDrawing.ActiveLayer = lay1 '將當(dāng)前圖層設(shè)置為新建圖層End IfEnd Sub在尋找圖時(shí)時(shí)我們用到for eachnext 語句它的語法是這樣的:For Each 變量In 數(shù)組或集合對(duì)象exit fornext 變量它的作用是在數(shù)組或集合對(duì)象中進(jìn)行循環(huán),每循環(huán)一次,變量就成為數(shù)組或集合對(duì)象中的一個(gè)元素。本例在所有的圖層對(duì)象中進(jìn)行循環(huán),每循環(huán)一次layo 變量就代表一個(gè)圖層在循環(huán)體中遇到exit for 語句則退出循環(huán),如果沒有exit for,循環(huán)將在所有的元素都操作一遍后結(jié)束。If lay0.Name = "新建圖層"
41、 T 代表這處圖層的圖層名IIf(lay0.LayerOn = True, "打開", "關(guān)閉")這是一個(gè)簡單判斷語句,語法如下:iif(判斷表達(dá)式,返回值1,返回值2)當(dāng)判斷表達(dá)式成立,函數(shù)值=返回值1,如果表達(dá)式不成立,函數(shù)值=2MsgBox(msgstr, 1)Mgbox 顯示一個(gè)對(duì)話框,第一個(gè)參數(shù)是對(duì)話框顯示的內(nèi)容第二個(gè)參數(shù)可以控制對(duì)話框上的按鈕。0 只有確認(rèn)按鈕1 確認(rèn)、取消2 終止、重試、忽略3 是、否、取消4 是、否MsgBox 獲得值如下:確認(rèn):1取消:2終止:3重試:4忽略:5是:6否7初學(xué)者不需要死記硬背,能有
42、所了解就行了ACAD 圖層中最麻煩的就是線型問題了,本例先尋找一個(gè)HIDDEN 線型,如果找不到就加載這個(gè)線型,用這條語句:ThisDrawing.Linetypes.Load "HIDDEN", "acadiso.lin"ThisDrawing.Linetypes.Load 后需要兩個(gè)參數(shù),一個(gè)是線型的名稱,另外一個(gè)是線型文件的名稱。Autocad VBA初級(jí)教程 (第九課:創(chuàng)建選擇集) 1.在創(chuàng)建對(duì)象的同時(shí)可以直接引用.以前的例程中已經(jīng)做過多次了,現(xiàn)在復(fù)習(xí)一下,看例程:先隨機(jī)畫300個(gè)圓,在畫圓時(shí)直接引用,然后再把這些圓根本大小修改顏色.Sub c3
43、00()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.AddCircle(pp, Rnd * 30 + 1) '畫不同大小的圓Next iFor i = 1 To 300If myselect(i).Radius
44、 > 10 Then '判斷圓的直徑是否大于10myselect(i).color = Int(255 * Rnd + 1) '大圓顏色改為隨機(jī)數(shù)Elsemyselect(i).color = 0 '小圓改為白色End IfNext iZoomExtents '縮放到顯示全部對(duì)象End Subpp(0) = 3000 * Rnd: pp(1) = 3000 * Rnd: pp(2) = 0這一行實(shí)際上應(yīng)該是三條語句,用三行合并為一行,用冒號(hào)分開rnd是隨機(jī)數(shù)函數(shù),它的數(shù)值為0-1之間的小數(shù),3000*rnd得到的數(shù)值就是在0-3000之間的隨機(jī)數(shù)Set m
45、yselect(i) = ThisDrawing.ModelSpace.AddCircle(pp, Rnd * 30 + 1)這條語句的作用是以pp點(diǎn)坐標(biāo)為圓心,畫一個(gè)圓,半徑是1-30之間的隨機(jī)數(shù),賦值給myselect選擇集.2.提標(biāo)用戶在屏幕中選取選擇語句這樣寫:Set sset = ThisDrawing.SelectionSets.Add("ss1"),其中”ss1”是一個(gè)選擇集名稱,這個(gè)參數(shù)可以隨意寫一個(gè),注意不要重復(fù)就可以了.下面的例程是讓用戶選擇對(duì)象,然后把選中的對(duì)象改為綠色,最后把選擇集刪除Sub mysel()Dim sset As AcadSelect
46、ionSet '定義選擇集對(duì)象Dim element As AcadEntity '定義選擇集中的元素對(duì)象Set sset = ThisDrawing.SelectionSets.Add("ss1") '新建一個(gè)選擇集sset.SelectOnScreen '提示用戶選擇For Each element In sset '在選擇集中進(jìn)行循環(huán)element.color = acGreen '改為綠色Nextsset.Delete '刪除選擇集End Sub3.選擇全部對(duì)象用select方法,參數(shù)為acSelectionS
47、etAll ,看例程,這個(gè)程序選擇全部對(duì)象,顯示選中的對(duì)象,并計(jì)算對(duì)象數(shù).Sub allsel()Dim sel1 As AcadSelectionSet '定義選擇集對(duì)象Set sel1 = ThisDrawing.SelectionSets.Add("s") '新建一個(gè)選擇集Call sel1.Select(acSelectionSetAll) '全部選中sel1.Highlight (True) '顯示選擇的對(duì)象sco= sel1.Count '計(jì)算選擇集中的對(duì)象數(shù)MsgBox "選中對(duì)象數(shù):" &
48、CStr(sco) '顯示對(duì)話框End Sub3.運(yùn)用select方法上面的例題已經(jīng)運(yùn)用了select方法,下面講一下select的5種選擇方式:1:擇全部對(duì)象(acselectionsetall)2.選擇上次創(chuàng)建的對(duì)象(acselectionsetlast)3.選擇上次選擇的對(duì)象(acselectionsetprevious)4.選擇矩形窗口內(nèi)對(duì)象(acselectionsetwindow)5.選擇矩形窗口內(nèi)以及與邊界相交的對(duì)象(acselectionsetcrossing)還是看代碼來學(xué)習(xí).其中選擇語句是:Call sel1.Select(Mode, p1, p2)Mode已經(jīng)定義
49、為5,也就是選擇矩形窗口內(nèi)以及與邊界相交的對(duì)象,p1和p2是兩個(gè)點(diǎn)坐標(biāo),Sub selnew()Dim sel1 As AcadSelectionSet '定義選擇集對(duì)象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 = 5 '把選擇模式存入mode變量中Set sel1 = ThisDrawing.Select
50、ionSets.Add("sel3") '新建一個(gè)選擇集Call sel1.Select(Mode, p1, p2) '選擇對(duì)象sel1.Highlight (ture) '顯示已選中的對(duì)象End SubAutocad VBA初級(jí)教程 (第十課:畫多段線和樣條線) 畫二維多段線語句這樣寫:set lobj= ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoint)AddLightweightPolyline后面需一個(gè)參數(shù),存放頂點(diǎn)坐標(biāo)的數(shù)組畫三維多段線語句這樣寫:Set lobj = ThisDr
51、awing.ModelSpace.Add3DPoly(fitpoint)Add3dpoly后面需一個(gè)參數(shù),就是頂點(diǎn)坐標(biāo)數(shù)組畫二維樣條線語句這樣寫:Set lobj = ThisDrawing.ModelSpace.AddSpline(fitPoints,startT, endT)Addspline后需要三個(gè)參數(shù),第一個(gè)是擬合點(diǎn)數(shù)組,后面兩個(gè)分別是起點(diǎn)切向和終點(diǎn)切向。下面看例題。這個(gè)程序是第三課例程的改進(jìn)版。原題是這樣的:繪制三維多段線時(shí)X、Y值在屏幕上用鼠標(biāo)選取,Z值用鍵盤輸入。細(xì)心的讀者是否還記得這個(gè)小程序已經(jīng)在第三課的回貼中發(fā)布了。先分析一下編程細(xì)路:用動(dòng)態(tài)數(shù)組存放多段線的所有頂點(diǎn)坐標(biāo),獲
52、得新坐標(biāo)后就把前一次畫的多段線刪除,畫出多段線,并將線段第二點(diǎn)的端點(diǎn)保存為下一條線段的第一個(gè)端點(diǎn)坐標(biāo),以下是源碼:Sub myl()Dim p1 As Variant '申明端點(diǎn)坐標(biāo)Dim p2 As VariantDim l() As Double '聲明一個(gè)動(dòng)態(tài)數(shù)組Dim templ As Objectp1 = ThisDrawing.Utility.GetPoint(, "輸入點(diǎn):") '獲取點(diǎn)坐標(biāo)z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值p1(2) = z &
53、#39;將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)中ReDim l(0 To 2) '定義動(dòng)態(tài)數(shù)組l(0) = p1(0)l(1) = p1(1)l(2) = zOn Error GoTo Err_Control '出錯(cuò)陷井Do '開始循環(huán)p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點(diǎn):") '獲取下一個(gè)點(diǎn)的坐標(biāo)z = ThisDrawing.Utility.GetReal("Z坐標(biāo):") '用戶輸入Z坐標(biāo)值p2(2) = z '將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)中 lub =
54、UBound(l) '獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù)ReDim Preserve l(lub + 3)For i = 1 To 3l(lub + i) = p2(i - 1)Next iIf lub > 3 Thentempl.Delete '刪除前一次畫的多段線End IfSet templ = ThisDrawing.ModelSpace.Add3DPoly(l) '畫多段線p1 = p2 '將第二點(diǎn)的端點(diǎn)保存為下一條直線的第一個(gè)端點(diǎn)坐標(biāo)LoopErr_Control:End Sub我們學(xué)一學(xué)動(dòng)態(tài)數(shù)組,這是非常有用的。所謂動(dòng)態(tài)數(shù)組,簡單講就是數(shù)組元素可以
55、改變的特殊數(shù)組。這樣定義數(shù)組:Dim l( ) As Double 賦值語句:ReDim l(0 To 2) l(0) = p1(0)l(1) = p1(1)l(2) = z重新定義數(shù)組元素語句:lub = UBound(l) '先要獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù),用ubount函數(shù)計(jì)算。ReDim Preserve l(lub + 3)重定義時(shí)數(shù)組中要加三個(gè)元素,用以存放坐標(biāo)值,所以定義元素為lub+3。給數(shù)值賦值的語句是一樣的。再看畫多段線語句:Set templ = ThisDrawing.ModelSpace.Add3DPoly(l) '畫多段線在最后面括號(hào)中的l就是存放
56、點(diǎn)坐標(biāo)的動(dòng)態(tài)數(shù)組,這條語句在畫多段線的同時(shí)把多段線作為對(duì)象賦值給templ 變量,這樣下面的刪除語句就可以直接引用這個(gè)變量了。刪除語句:templ.Delete因?yàn)橐呀?jīng)知道對(duì)象是templ,所以只要在對(duì)象后面用delete方法就可以了。下面的例程更加實(shí)用些,它的功能是把樣條線轉(zhuǎn)化為多段線。編程思路:用戶選擇一根樣條線,計(jì)算樣條線的擬合點(diǎn),然后把所有的擬合點(diǎn)存放到數(shù)組中,最后用這個(gè)數(shù)組畫多段線。Sub sp2pl()Dim getsp As Object 獲取樣條線的變量Dim newl() As Double 多段線數(shù)組Dim p1 As Variant 獲得擬合點(diǎn)點(diǎn)坐標(biāo)ThisDrawing
57、.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線"sumctrl = getsp.NumberOfControlPoints 計(jì)算樣條線中一共有多少擬合點(diǎn)ReDim newl(0 To sumctrl * 3 - 1) 重定義數(shù)組 For i = 0 To sumctrl - 1 開始循環(huán),p1 = getsp.GetControlPoint(i) 把擬合點(diǎn)坐標(biāo)存到p1變量中For j = 0 To 2newl(i * 3 + j) = p1(j)Next jNext iSet templ = ThisDrawing.
58、ModelSpace.Add3DPoly(newl) 畫樣條線End Sub下面的語句是讓用戶選擇樣條線:ThisDrawing.Utility.GetEntity getsp, po, "本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線"ThisDrawing.Utility.GetEntity 后面需要三個(gè)參數(shù):第一個(gè)getsp用于存放獲得用戶選擇的對(duì)象變量,第二個(gè)po是用戶鼠標(biāo)點(diǎn)下時(shí)的位置,第三個(gè)是一段字符串,顯示在提示欄。利用vba 編程實(shí)現(xiàn)從excel 表到autocad 表轉(zhuǎn)換.txt- 一、前言- Microsoft Excel軟件具有十分強(qiáng)大的制表、表格計(jì)算等功能
59、,是普通人員常用的制表工具。可以通過其內(nèi)嵌的VBA 語言可以控制Microsoft Excel 的整個(gè)操作過程。-AutoCAD 是由AutoDesk 公司的工程繪圖軟件,是CAD 市場的主流產(chǎn)品,功能十分強(qiáng)大,是工程制圖人員常用的軟件之一。AutoDesk 公司從R14 版以后,為其提供了VBA 語言接口。- 在工程制圖中,常常需要在圖中插入繪制表格,一般有兩種方法。其一,是利用剪貼板,將MicrosoftExcel 表格拷貝至剪貼板中,然后打開AutoCAD 文件,再將剪貼板中的文件粘貼至所需位置。這種方法十分簡單,但有其固有的缺點(diǎn)。在保存文件必須將.xls 和.dwg 文件保存在一起,一旦缺少excel 環(huán)境,則再對(duì)表格繼續(xù)修改。同時(shí)打開多個(gè)表格操作,需要占據(jù)較大的內(nèi)存空間。文件體積變得很大,表格有時(shí)在.dwg 文件中以圖標(biāo)形式顯示,不便于觀察
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 皮影文化課題申報(bào)書
- 智能農(nóng)場研究課題申報(bào)書
- 課題項(xiàng)目申報(bào)書研究內(nèi)容
- 教師課題申報(bào)書講座視頻
- 課題立項(xiàng)申報(bào)書如何上傳
- 怎么寫科研課題申報(bào)書
- 教育學(xué) 課題申報(bào)書
- 怎樣查課題申報(bào)書
- 課題申報(bào)評(píng)審書注意事項(xiàng)
- 課題申報(bào)書選題
- (正式版)JBT 14660-2024 額定電壓6kV到30kV地下掘進(jìn)設(shè)備用橡皮絕緣軟電纜
- 本科院校-基礎(chǔ)醫(yī)學(xué)-醫(yī)學(xué)細(xì)胞生物學(xué)-第二章 細(xì)胞的概念與分子基礎(chǔ)
- iso37001-2016反賄賂管理手冊(cè)程序文件表單一整套
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 火災(zāi)自動(dòng)報(bào)警系統(tǒng)檢查表
- 高速公路橋頭跳車判別和處治
- 骨髓細(xì)胞圖譜
- 建筑工程分部分項(xiàng)工程劃分表(新版)
- 勃利縣大四站鎮(zhèn)侵蝕溝治理工程施工組織設(shè)計(jì)
- 公路瀝青路面設(shè)計(jì)標(biāo)準(zhǔn)規(guī)范
- 普通高中歷史課程標(biāo)準(zhǔn)(2022年版2023年修訂)解讀
評(píng)論
0/150
提交評(píng)論