AutoCAD_VBA二次開(kāi)發(fā)初級(jí)教程(選做)_第1頁(yè)
AutoCAD_VBA二次開(kāi)發(fā)初級(jí)教程(選做)_第2頁(yè)
AutoCAD_VBA二次開(kāi)發(fā)初級(jí)教程(選做)_第3頁(yè)
AutoCAD_VBA二次開(kāi)發(fā)初級(jí)教程(選做)_第4頁(yè)
AutoCAD_VBA二次開(kāi)發(fā)初級(jí)教程(選做)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、AutoCADVBA二次開(kāi)發(fā)初級(jí)教程第一課:入門1、什么是AutocadVBA?VBA是VisualBasicforApplications的英文縮寫,它是一個(gè)功能強(qiáng)大的開(kāi)發(fā)工具,學(xué)好VBA可以成倍甚至成百、成萬(wàn)倍提高工作效率,在工作中,有很多任務(wù)僅用ACAD命令不可能完成的,只要學(xué)好VBA就可以做到,相信到時(shí)候您一定會(huì)得到同事的佩服、老板的器重。2、VBA有多難?相信大家都知道Basic是的含義。應(yīng)該承認(rèn),我的水平還不高,錯(cuò)誤之處在所難免,如果大家發(fā)現(xiàn)錯(cuò)誤一定要提出批評(píng),以便及時(shí)更正。3、怎樣學(xué)習(xí)VBA?介紹大家一個(gè)學(xué)習(xí)公式:信心+恒心=開(kāi)心。仔細(xì)閱讀本教程,完成例題,在學(xué)習(xí)的過(guò)程中一定要多

2、思考,多想一些是什么、為什么。本教程將陸續(xù)發(fā)布在CAD世界論壇上,您不需要付費(fèi)就可以學(xué)習(xí)。本作者在此鄭重承諾:關(guān)于本教程中有任何疑問(wèn),可以跟貼提問(wèn),只要有時(shí)間,本人一定會(huì)耐心解答。我不會(huì)發(fā)到任何人的郵箱中,您自己在論壇上找就可以了,請(qǐng)不要再向我索要這份教程。4、現(xiàn)在我們開(kāi)始編寫第一個(gè)程序:畫(huà)一百個(gè)同心圓第一步:復(fù)制下面的紅色代碼第二步:在模型空間按快捷鍵Alt+F8,出現(xiàn)宏窗口第三步:在宏名稱中填寫C100,點(diǎn)“創(chuàng)建”、“確定”第四步:在Subc100()和EndSub之間粘貼代碼第五步:回到模型空間,再次按Alt+F8,點(diǎn)擊“運(yùn)行”Subc100()Dimcc(0To2)AsDouble聲明

3、坐標(biāo)變量cc(0)=1000定義圓心座標(biāo)cc(1)=1000cc(2)=0Fori=1To1000Step10開(kāi)始循環(huán)CallThisDrawing.ModelSpace.AddCircle(cc,i*10)畫(huà)圓NextiEndSub也許您還看不懂上面的代碼,這沒(méi)有關(guān)系,只要能把同心畫(huà)出來(lái)就可以了,祝您成功。第二課編程基礎(chǔ)本課主要任務(wù)是對(duì)上一課的例程進(jìn)行詳細(xì)分析下面是源碼:Subc100()Dimcc(0To2)AsDouble聲明坐標(biāo)變量cc(0)=1000定義圓心座標(biāo)cc(1)=1000cc(2)=0Fori=1To1000Step10開(kāi)始循環(huán)CallThisDrawing.ModelSp

4、ace.AddCircle(cc,i*10)畫(huà)圓NextiEndSub先看第一行和最后一行:SubC100()EndSubC100是宏的名稱,也叫過(guò)程名稱,當(dāng)用戶執(zhí)行C100時(shí)程序?qū)⑦\(yùn)行sub和endsub之間的所有指令。第二行:Dimcc(0To2)AsDouble聲明坐標(biāo)變量后半段“聲明坐標(biāo)變量”自動(dòng)變?yōu)榫G色字體,它是代碼語(yǔ)句的注釋,它不會(huì)影響程序運(yùn)行,它的作用是告訴閱讀者程序員的想法。對(duì)于簡(jiǎn)單的程序,一般不需要寫注釋,如果要編寫非常復(fù)雜的程序,最好要多加注釋,越詳細(xì)越好,對(duì)于程序員來(lái)說(shuō),這是一個(gè)好習(xí)慣。電腦真正編譯執(zhí)行的是這條語(yǔ)句:Dimcc(0To2)AsDouble它的作用就是聲明變

5、量。Dim是一條語(yǔ)句,可以理解為計(jì)算機(jī)指令。它的語(yǔ)法:Dim變量名As數(shù)據(jù)類型本例中變量名為CC,而括號(hào)中的0to2聲明這個(gè)CC是一個(gè)數(shù)組,這個(gè)數(shù)組有三個(gè)元素:CC(0)、CC(1)、CC(2),如果改為CC(1to3),則三個(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(長(zhǎng)整型),其范圍從-2,147,483,648到2,147,483,647。Variant它是那些沒(méi)被顯式聲明為其他

6、類型變量的數(shù)據(jù)類型,可以理解為一種通用的數(shù)據(jù)類型,這是最常用的。下面三條語(yǔ)句cc(0)=1000定義圓心座標(biāo)cc(1)=1000cc(2)=0它們的作用是給CC變量的每一個(gè)元素賦,值其順序是X、Y、Z坐標(biāo)。Fori=1To1000Step10開(kāi)始循環(huán)Nexti結(jié)束循環(huán)這兩條語(yǔ)句的作用是循環(huán)運(yùn)行指令,每循環(huán)一次,i值要增加10,當(dāng)i加到1000時(shí),結(jié)束循環(huán)。i也是一個(gè)變量,雖然沒(méi)有聲明i變量,程序還是認(rèn)可的,VB不是C語(yǔ)言,每用一個(gè)變量都要聲明,不聲明就會(huì)報(bào)錯(cuò)。簡(jiǎn)單是簡(jiǎn)單了,這樣做也有壞處,如果不小心打錯(cuò)了一個(gè)字母,程序不會(huì)報(bào)錯(cuò),如果程序很長(zhǎng),那就會(huì)出現(xiàn)一些意想不到的錯(cuò)誤。step后面的數(shù)值就是

7、每次循環(huán)時(shí)增加的數(shù)值,step后也可以用負(fù)值。例如:Fori=1000To1Step-10很多情況下,后面可以不加step10如:Fori=1to100,它的作用是每循環(huán)一次i值就增加1Nexti再句必須出現(xiàn)在需要結(jié)束循環(huán)的位置,不然程序沒(méi)法運(yùn)行。下面看畫(huà)圓命令:CallThisDrawing.ModelSpace.AddCircle(cc,i*10)Call語(yǔ)句的作用是調(diào)用其他過(guò)程或者方法。ThisDrawing.ModelSpace是指當(dāng)前CAD文檔的模型空間AddCircle是畫(huà)圓方法Addcicle方法需要兩個(gè)參數(shù):圓心和半徑CC就是圓心坐標(biāo),i*10就是圓的半徑,本例中,這些圓的半徑

8、分別是10、110、210.310本課到此結(jié)束,下面請(qǐng)完成一道思考題:以(4,2)為圓心,畫(huà)5個(gè)同心圓,其半徑為1-5第三課編程基礎(chǔ)二有一位叫自然9172的網(wǎng)友提出了下面的問(wèn)題:繪制三維多段線時(shí)X、Y值在屏幕上用鼠標(biāo)選取,Z值用鍵盤輸入本課將講解這個(gè)問(wèn)題。為了簡(jiǎn)化程序,這里用多條直線來(lái)代替多段線。以下是源碼:Submyl()Dimp1AsVariant申明端點(diǎn)坐標(biāo)Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,輸入點(diǎn):)獲取點(diǎn)坐標(biāo)z=ThisDrawing.Utility.GetReal(Z坐標(biāo):)用戶輸入Z坐標(biāo)值p1(2)=z將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)

9、中OnErrorGoToErr_Control出錯(cuò)陷井Do開(kāi)始循環(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)中CallThisDrawing.ModelSpace.AddLine(p1,p2)畫(huà)直線p1=p2將第二點(diǎn)的端點(diǎn)保存為下一條直線的第一個(gè)端點(diǎn)坐標(biāo)LoopErr_Control:EndSub先談一下本程序的設(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、以第一

10、、二點(diǎn)為端點(diǎn),畫(huà)直線6、下一條線的第一點(diǎn)=這條線的第二點(diǎn)7、回到第3步進(jìn)行循環(huán)如果用戶沒(méi)有輸入坐標(biāo)或Z值,則程序結(jié)束。首先看以下兩條語(yǔ)句:p1=ThisDrawing.Utility.GetPoint(,輸入點(diǎn):)獲取點(diǎn)坐標(biāo)p2=ThisDrawing.Utility.GetPoint(p1,vbCr&輸入下一點(diǎn):)獲取下一個(gè)點(diǎn)的坐標(biāo)這兩條語(yǔ)句的作用是由用戶輸入點(diǎn)用鼠標(biāo)選取點(diǎn)坐標(biāo),并把坐標(biāo)值賦給pl、p2兩個(gè)變量。ThisDrawing.Utility.GetPoint()在ACAD中這是最常用的方法之一,它需要兩個(gè)參數(shù),在逗號(hào)前面的參數(shù)應(yīng)該是一個(gè)點(diǎn)坐標(biāo),它的作用是在屏幕上畫(huà)一條線,前一個(gè)端點(diǎn)

11、位于點(diǎn)坐標(biāo)位置,后一個(gè)端點(diǎn)跟隨鼠標(biāo)移動(dòng),逗號(hào)之前可以什么都不填,這時(shí)沒(méi)有線條會(huì)跟隨鼠標(biāo)移動(dòng),但逗號(hào)必須保留。逗號(hào)后面使用一串字符,程序在命令行顯示這串字符,這不難理解。VbCr通常代表一個(gè)回車符,而在這個(gè)語(yǔ)句中,它的作用是在命令行不顯示“命令:”&的作用是連接字符。舉例:“愛(ài)我中華”&”抵制日貨”&”從我做起”z=ThisDrawing.Utility.GetReal(Z坐標(biāo):)用戶輸入Z坐標(biāo)值由用戶輸入一個(gè)實(shí)數(shù)OnErrorGoToErr_Control出錯(cuò)陷井Err_Control:OnError是出錯(cuò)陷井語(yǔ)句,在程序出錯(cuò)時(shí)將執(zhí)行OnError后面的語(yǔ)句GoToErr_contorl是程序

12、跳轉(zhuǎn)語(yǔ)句,它的作用是在程序中尋找Err_control:,并執(zhí)行這一行后面的語(yǔ)句,本例中Err_Control:后就是結(jié)束宏,所以只要出現(xiàn)錯(cuò)誤,程序中止。Do開(kāi)始循環(huán)Loop結(jié)束循環(huán)這個(gè)循環(huán)就歷害了,它會(huì)無(wú)休止地進(jìn)行循環(huán),好在本例中已經(jīng)有了一個(gè)出錯(cuò)陷井,當(dāng)用戶輸入回車時(shí),由于程序沒(méi)有得到點(diǎn)或坐標(biāo),程序出錯(cuò),跳出循環(huán),中止程序。如果要人為控制跳出循環(huán),可以在代碼中用ExitDo語(yǔ)句跳出循環(huán)。在For變量和Next變量之間如果要跳出循環(huán),那么只要在循環(huán)體內(nèi)加一個(gè)Exitfor就可以跳出循環(huán),關(guān)于這方面的例程以后會(huì)講到。CallThisDrawing.ModelSpace.AddLine(p1,p2

13、)畫(huà)直線畫(huà)直線方法也是很常用的,它的兩個(gè)參數(shù)是點(diǎn)坐標(biāo)變量本課到此結(jié)束,請(qǐng)做思考題:連續(xù)畫(huà)圓,每次要求用戶輸入圓心、半徑,當(dāng)用戶不再輸入圓心或半徑時(shí)程序才退出第四課程序的調(diào)試和保存人非圣賢,孰能無(wú)過(guò),初學(xué)者在編寫復(fù)雜程序時(shí)往往會(huì)出現(xiàn)一些意想不到的錯(cuò)誤,所以程序的調(diào)試顯得尤為重要,隨著學(xué)習(xí)的深入,以后我們需要經(jīng)常進(jìn)行程序調(diào)試。事實(shí)上,對(duì)于那些資深程序員來(lái)說(shuō),調(diào)試程序也是一項(xiàng)不可或缺的重要工作。首先,在程序輸入階段,應(yīng)該充分利用VBA編輯器的智能功能。當(dāng)你在寫代碼時(shí),輸入一些字母后,編輯器可以自動(dòng)列出合適的語(yǔ)句、對(duì)象、函數(shù)供你選擇,可以用上下鍵選擇,然后按TAB鍵(它位于“Q”鍵左邊)確認(rèn)。當(dāng)輸入一

14、個(gè)回車符后程序會(huì)自動(dòng)對(duì)這條語(yǔ)句進(jìn)行分析,如果出現(xiàn)錯(cuò)誤就會(huì)提示。我們經(jīng)常碰到的麻煩是程序的運(yùn)行結(jié)果和預(yù)計(jì)的不一樣,一般我會(huì)這樣做:首先要想一想可能是哪一個(gè)變量有問(wèn)題,然后去監(jiān)視這個(gè)變量(或表達(dá)式),在程序合適的位置設(shè)置斷點(diǎn),這樣可以使程序停下來(lái)看一看這個(gè)變量有沒(méi)有按照我的設(shè)想在變化。下面我舉一個(gè)簡(jiǎn)單的例子,先看源代碼:subtest()fori=2to4step0.6nextiendsub這是一個(gè)非常簡(jiǎn)單的循環(huán),每一次循環(huán)i便會(huì)增加0.6,當(dāng)循環(huán)3次后i值就變?yōu)?.4,但問(wèn)題是每一次循環(huán)時(shí)i值變?yōu)槎嗌??第一步:在菜單中選“調(diào)試”一“添加監(jiān)視”,在表達(dá)試中填“i”,點(diǎn)擊確定,這時(shí)你會(huì)看到臨視窗口中

15、會(huì)多一行。第二步:把光標(biāo)移到代碼窗口中的“nexti”行,按一下“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值的變化。第三步:在nexti行再按一次F9,清除斷點(diǎn)。監(jiān)視的表達(dá)式的右鍵菜單選擇“刪除監(jiān)視”。另外,還可以用“逐語(yǔ)句”、“逐過(guò)程”、“運(yùn)行到光標(biāo)處”等方法進(jìn)行調(diào)試,這些都在調(diào)試菜單中,操作比較簡(jiǎn)單,請(qǐng)讀者自行領(lǐng)悟。到目前為止,我們所做的工程都是“嵌入式工程”,它只是嵌入在當(dāng)前的Autocad圖形文件中,以后打開(kāi)這個(gè)文件時(shí)代碼才會(huì)加載,如果別的dwg

16、文件也要使用,那就需要把代碼導(dǎo)出為.bas文件,供其他dwg文件導(dǎo)入。在VBA編輯器的“文件”菜單中有這兩個(gè)功能,一試便知。ACADVBA還有一種工程叫“通用式工程”,只要進(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)就足夠了。subtest()fori=2to4step0.6forj=-5to2step5.5nextjnextiendsub第五課畫(huà)函數(shù)曲線先畫(huà)一組下圖拋物線。下

17、面是源碼:Submyl()Dimp(0To49)AsDouble定義點(diǎn)坐標(biāo)DimmylAsObject定義引用曲線對(duì)象變量co=15定義顏色Fora=0.01To1Step0.02開(kāi)始循環(huán)畫(huà)拋物線Fori=-24To24Step2開(kāi)始畫(huà)多段線j=i+24確定數(shù)組元素p(j)=i橫坐標(biāo)p(j+1)=a*p(j)*p(j)/10縱坐標(biāo)Nexti至此p(0)-p(40)所有元素已定義,結(jié)束循環(huán)Setmyl=ThisDrawing.ModelSpace.AddLightWeightPolyline(p)畫(huà)多段線myl.Color=co設(shè)置顏色屬性co=co+1改變顏色,供下次定義曲線顏色NextaEn

18、dsub為了鼓勵(lì)大家積極思考,從本課開(kāi)始,我不再解釋每一條語(yǔ)句的作用,只對(duì)以前沒(méi)有提過(guò)的語(yǔ)句進(jìn)行一些解釋,也許你一時(shí)很難明白,建議用上一課提到的跟蹤變量、添加斷點(diǎn)的辦法領(lǐng)悟每一條語(yǔ)句的作用,如果有問(wèn)題不懂請(qǐng)跟貼提問(wèn)。在跟蹤變量P時(shí)請(qǐng)?jiān)诟櫞翱谥袉螕糇兞縋前的+號(hào),這樣可以看清數(shù)組p中每一個(gè)元素的變化。ACAD沒(méi)有現(xiàn)成的畫(huà)拋物線命令,我們只能用程序編寫多段線畫(huà)近似拋物線。理論上,拋物線的X值可以是無(wú)限小、無(wú)限大,這里取值范圍在正負(fù)24之間。程序第二行:DimmylAsObject定義引用曲線對(duì)象變量Object也是一種變量類型,它可以把變量定義為對(duì)象,本例中myl變量將引用多段線,所以要定義為O

19、bjet類型??串?huà)多段線命令:Setmyl=ThisDrawing.ModelSpace.AddLightWeightPolyline(p)畫(huà)多段線其中括號(hào)中的P是一個(gè)數(shù)組,這個(gè)數(shù)組的元素?cái)?shù)必須是偶數(shù),每?jī)蓚€(gè)元數(shù)作為一個(gè)點(diǎn)坐標(biāo)。等號(hào)前面部分“Setmyl”的作用就將myl變量去引用畫(huà)好的多段線。myl.Color=co設(shè)置顏色屬性。在ACAD中,顏色可以用數(shù)字表示,本例中co會(huì)增值,這樣就會(huì)有五彩繽紛的效果。本課第二張圖:正弦曲線,下面是源碼:Subsinl()Dimp(0To719)AsDouble定義點(diǎn)坐標(biāo)Fori=0To718Step2開(kāi)始畫(huà)多段線p(i)=i*2*3.141592653

20、5897/360橫坐標(biāo)p(i+1)=2*Sin(p(i)縱坐標(biāo)NextiThisDrawing.ModelSpace.AddLightWeightPolyline(p)畫(huà)多段線ZoomExtents顯示整個(gè)圖形EndSubp(i)=i*2*3.1415926535897/360橫坐標(biāo)橫坐標(biāo)表示角度,后面表達(dá)式的作用是把角度轉(zhuǎn)化弧度ZoomExtents語(yǔ)句是縮放命令,它的作用是顯示整個(gè)圖形,消除圖形以外的區(qū)域本課思考題:畫(huà)一條拋物線:y=0.5*x*x+3,其中X取值范圍在正負(fù)50之間第六課數(shù)據(jù)類型的轉(zhuǎn)換上一節(jié)課我們用一個(gè)簡(jiǎn)單的公式把角度轉(zhuǎn)化為弧度,這樣做便于大家理解。不過(guò)VBA中有現(xiàn)成的方法

21、可以轉(zhuǎn)換數(shù)據(jù)類型。我們舉例說(shuō)明:jd=ThisDrawing.Utility.AngleToReal(30,0)這個(gè)表達(dá)式把角度30度轉(zhuǎn)化為弧度,結(jié)果是.523598775598299。AngleToReal需要兩個(gè)參數(shù),前面是表示要轉(zhuǎn)換角度的數(shù)字,而后面一個(gè)參數(shù)可以取值為0-4之間的整數(shù),有如下意義:0:十進(jìn)制角度;1:度分秒格式;2:梯度;3:弧度;4:測(cè)地單位例:id二ThisDrawing.Utility.AngleToReal(62d3010,1)這個(gè)表達(dá)式計(jì)算62度30分10秒的弧度再看將字符串轉(zhuǎn)換為實(shí)數(shù)的方法:DistanceToReal需要兩個(gè)參數(shù),前一個(gè)參數(shù)是表示數(shù)值的字符串

22、,后面可以取值1-5,表示數(shù)據(jù)格式,有如下意義:1:科學(xué)計(jì)數(shù);2:十進(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(121/2,5)而realtostring方法正好相反,它把一個(gè)實(shí)數(shù)轉(zhuǎn)換為字符串。它需要3個(gè)參數(shù)第一個(gè)參數(shù)是一個(gè)實(shí)數(shù),第二個(gè)參數(shù)表示數(shù)據(jù)格式,

23、含義同上,最后一個(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:14AM)下面的代碼可以寫出一串?dāng)?shù)字,從000-099。Subtest()Dimadd0AsStringDimtextAsStringDimp(0To2)

24、AsDoublep(1)=0Y坐標(biāo)為0p(2)=0Z坐標(biāo)為0Fori=0To99開(kāi)始循環(huán)Ifi10Then判斷圓的直徑是否大于10myselect(i).color=Int(255*Rnd+1)大圓顏色改為隨機(jī)數(shù)Elsemyselect(i).color=0小圓改為白色EndIfNextiZoomExtents縮放到顯示全部對(duì)象EndSubpp(0)=3000*Rnd:pp(1)=3000*Rnd:pp(2)=0這一行實(shí)際上應(yīng)該是三條語(yǔ)句,用三行合并為一行,用冒號(hào)分開(kāi)rnd是隨機(jī)數(shù)函數(shù),它的數(shù)值為0-1之間的小數(shù),3000*rnd得到的數(shù)值就是在0-3000之間的隨機(jī)數(shù)Setmyselect(

25、i)=ThisDrawing.ModelSpace.AddCircle(pp,Rnd*30+1)這條語(yǔ)句的作用是以pp點(diǎn)坐標(biāo)為圓心,畫(huà)一個(gè)圓,半徑是1-30之間的隨機(jī)數(shù),賦值給myselect選擇集.提標(biāo)用戶在屏幕中選取選擇語(yǔ)句這樣寫:Setsset二ThisDrawing.SelectionSets.Add(ssl),其中”ssl”是一個(gè)選擇集名稱,這個(gè)參數(shù)可以隨意寫一個(gè),注意不要重復(fù)就可以了.下面的例程是讓用戶選擇對(duì)象,然后把選中的對(duì)象改為綠色,最后把選擇集刪除Submysel()DimssetAsAcadSelectionSet定義選擇集對(duì)象DimelementAsAcadEntity定

26、義選擇集中的元素對(duì)象Setsset=ThisDrawing.SelectionSets.Add(ss1)新建一個(gè)選擇集sset.SelectOnScreen提示用戶選擇ForEachelementInsset在選擇集中進(jìn)行循環(huán)element.color=acGreen改為綠色Nextsset.Delete刪除選擇集EndSub選擇全部對(duì)象用select方法,參數(shù)為acSelectionSetAll,看例程,這個(gè)程序選擇全部對(duì)象,顯示選中的對(duì)象,并計(jì)算對(duì)象數(shù).Suballsel()Dimsel1AsAcadSelectionSet定義選擇集對(duì)象Setsel1=ThisDrawing.Select

27、ionSets.Add(s)新建一個(gè)選擇集Callsel1.Select(acSelectionSetAll)全部選中sel1.Highlight(True)顯示選擇的對(duì)象sco=sel1.Count計(jì)算選擇集中的對(duì)象數(shù)MsgBox選中對(duì)象數(shù):&CStr(sco)顯示對(duì)話框EndSub運(yùn)用select方法上面的例題已經(jīng)運(yùn)用了select方法,下面講一下select的5種選擇方式:1:擇全部對(duì)象(acselectionsetall)選擇上次創(chuàng)建的對(duì)象(acselectionsetlast)選擇上次選擇的對(duì)象(acselectionsetprevious)選擇矩形窗口內(nèi)對(duì)象(acselection

28、setwindow)選擇矩形窗口內(nèi)以及與邊界相交的對(duì)象(acselectionsetcrossing)還是看代碼來(lái)學(xué)習(xí).其中選擇語(yǔ)句是:Callsel1.Select(Mode,p1,p2)Mode已經(jīng)定義為5,也就是選擇矩形窗口內(nèi)以及與邊界相交的對(duì)象,pl和p2是兩個(gè)點(diǎn)坐標(biāo),Subselnew()Dimsel1AsAcadSelectionSet定義選擇集對(duì)象Dimp1(0To2)AsDouble坐標(biāo)1Dimp2(0To2)AsDouble坐標(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把選擇模式存入m

29、ode變量中Setsel1=ThisDrawing.SelectionSets.Add(sel3)新建一個(gè)選擇集Callsel1.Select(Mode,p1,p2)選擇對(duì)象sel1.Highlight(ture)顯示已選中的對(duì)象EndSub第十課:畫(huà)多段線和樣條線畫(huà)二維多段線語(yǔ)句這樣寫:setlobj=ThisDrawing.ModelSpace.AddLightweightPolyline(fitpoint)AddLightweightPolyline后面需一個(gè)參數(shù),存放頂點(diǎn)坐標(biāo)的數(shù)組畫(huà)三維多段線語(yǔ)句這樣寫:Setlobj=ThisDrawing.ModelSpace.Add3DPoly(

30、fitpoint)Add3dpoly后面需一個(gè)參數(shù),就是頂點(diǎn)坐標(biāo)數(shù)組畫(huà)二維樣條線語(yǔ)句這樣寫:Setlobj=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),獲得新坐標(biāo)后就把前一次畫(huà)的多段線刪除,畫(huà)出多段線,并將線段第二點(diǎn)

31、的端點(diǎn)保存為下一條線段的第一個(gè)端點(diǎn)坐標(biāo),以下是源碼:Submyl()Dimp1AsVariant申明端點(diǎn)坐標(biāo)Dimp2AsVariantDiml()AsDouble聲明一個(gè)動(dòng)態(tài)數(shù)組DimtemplAsObjectp1=ThisDrawing.Utility.GetPoint(,輸入點(diǎn):)獲取點(diǎn)坐標(biāo)z=ThisDrawing.Utility.GetReal(Z坐標(biāo):)用戶輸入Z坐標(biāo)值pl(2)=z將Z坐標(biāo)值賦予點(diǎn)坐標(biāo)中ReDiml(0To2)定義動(dòng)態(tài)數(shù)組l(0)=p1(0)l(1)=p1(1)l(2)=zOnErrorGoToErr_Control出錯(cuò)陷井Do開(kāi)始循環(huán)p2=ThisDrawing

32、.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)中l(wèi)ub=UBound(l)獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù)ReDimPreservel(lub+3)Fori=1To3l(lub+i)=p2(i-1)NextiIflub3Thentempl.Delete刪除前一次畫(huà)的多段線EndIfSettempl=ThisDrawing.ModelSpace.Add3DPoly(l)畫(huà)多段線p1=p2將第二點(diǎn)的端點(diǎn)保存為下一條直線的第一個(gè)端點(diǎn)坐標(biāo)LoopEr

33、r_Control:EndSub我們學(xué)一學(xué)動(dòng)態(tài)數(shù)組,這是非常有用的。所謂動(dòng)態(tài)數(shù)組,簡(jiǎn)單講就是數(shù)組元素可以改變的特殊數(shù)組。這樣定義數(shù)組:Diml()AsDouble賦值語(yǔ)句:ReDiml(0To2)l(0)=p1(0)l(1)=p1(1)l(2)=z重新定義數(shù)組元素語(yǔ)句:lub=UBound(l)先要獲取當(dāng)前l(fā)數(shù)組中元的元素個(gè)數(shù),用ubount函數(shù)計(jì)算。ReDimPreservel(lub+3)重定義時(shí)數(shù)組中要加三個(gè)元素,用以存放坐標(biāo)值,所以定義元素為lub+3。給數(shù)值賦值的語(yǔ)句是一樣的。再看畫(huà)多段線語(yǔ)句:Settempl=ThisDrawing.ModelSpace.Add3DPoly(l)畫(huà)

34、多段線在最后面括號(hào)中的l就是存放點(diǎn)坐標(biāo)的動(dòng)態(tài)數(shù)組,這條語(yǔ)句在畫(huà)多段線的同時(shí)把多段線作為對(duì)象賦值給templ變量,這樣下面的刪除語(yǔ)句就可以直接引用這個(gè)變量了。刪除語(yǔ)句:templ.Delete因?yàn)橐呀?jīng)知道對(duì)象是templ,所以只要在對(duì)象后面用delete方法就可以了。下面的例程更加實(shí)用些,它的功能是把樣條線轉(zhuǎn)化為多段線。編程思路:用戶選擇一根樣條線,計(jì)算樣條線的擬合點(diǎn),然后把所有的擬合點(diǎn)存放到數(shù)組中,最后用這個(gè)數(shù)組畫(huà)多段線。Subsp2pl()DimgetspAsObject獲取樣條線的變量Dimnewl()AsDouble多段線數(shù)組Dimp1AsVariant獲得擬合點(diǎn)點(diǎn)坐標(biāo)ThisDrawi

35、ng.Utility.GetEntitygetsp,po,本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線sumctrl=getsp.NumberOfControlPoints計(jì)算樣條線中一共有多少擬合點(diǎn)ReDimnewl(0Tosumctrl*3-1)重定義數(shù)組Fori=0Tosumctrl-1開(kāi)始循環(huán),pl=getsp.GetControlPoint(i)把擬合點(diǎn)坐標(biāo)存到pl變量中Forj=0To2newl(i*3+j)=pl(j)NextjNextiSettempl=ThisDrawing.ModelSpace.Add3DPoly(newl)畫(huà)樣條線EndSub下面的語(yǔ)句是讓用戶選擇樣條線:T

36、hisDrawing.Utility.GetEntitygetsp,po,本程序?qū)訔l曲線轉(zhuǎn)為多段線。請(qǐng)選擇樣條曲線ThisDrawing.Utility.GetEntity后面需要三個(gè)參數(shù):第一個(gè)getsp用于存放獲得用戶選擇的對(duì)象變量,第二個(gè)po是用戶鼠標(biāo)點(diǎn)下時(shí)的位置,第三個(gè)是一段字符串,顯示在提示欄。第十一課:動(dòng)畫(huà)基礎(chǔ)說(shuō)實(shí)話,用ACAD玩動(dòng)畫(huà)絕對(duì)比不上專業(yè)的三維動(dòng)畫(huà)軟件,不過(guò)這年頭自稱精通CAD的工程師太多了,而學(xué)會(huì)用ACAD玩動(dòng)畫(huà)一定能提高您的競(jìng)爭(zhēng)實(shí)力,想象一下您用ACAD動(dòng)畫(huà)向老板演示零件的裝配方法下面的例題是一個(gè)最簡(jiǎn)單的動(dòng)畫(huà),由用戶選擇一個(gè)要移動(dòng)的對(duì)象,然后定位起點(diǎn)和終點(diǎn),程序會(huì)慢

37、慢地把對(duì)象移動(dòng)。移動(dòng)方法:object.move起點(diǎn)坐標(biāo),端點(diǎn)坐標(biāo)Subtestmove()Dimp0AsVariant起點(diǎn)坐標(biāo)Dimp1AsVariant終點(diǎn)坐標(biāo)DimpcAsVariant移動(dòng)時(shí)起點(diǎn)坐標(biāo)DimpeAsVariant移動(dòng)時(shí)終點(diǎn)坐標(biāo)DimmovxAsVariantx軸增量DimmovyAsVarianty軸增量DimgetobjAsObject移動(dòng)對(duì)象DimmovtimesAsInteger移動(dòng)次數(shù)ThisDrawing.Utility.GetEntitygetobj,po,請(qǐng)選擇移動(dòng)對(duì)象p0=ThisDrawing.Utility.GetPoint(,起點(diǎn):)p1=ThisD

38、rawing.Utility.GetPoint(p0,終點(diǎn):)pe=p0pc=p0motimes=3000movx=(p1(0)-p0(0)/motimesmovy=(p1(1)-p0(1)/motimesFori=1Tomotimespe(0)=pc(0)+movxpe(1)=pc(1)+movygetobj.Movepc,pe移動(dòng)一段getobj.Update更新對(duì)象NextEndSub先讓用戶選擇移動(dòng)的對(duì)象、起點(diǎn)、終點(diǎn),motimes動(dòng)畫(huà)是設(shè)置動(dòng)畫(huà)幀數(shù),這個(gè)例程是讓對(duì)象移動(dòng)3000小段,movx和movy是每一段移動(dòng)的距離,然后進(jìn)行一個(gè)3000次的循環(huán),每一次循環(huán)移動(dòng)一小段距離??吹诙€(gè)

39、例題:做一個(gè)小輪子在一條山坡上運(yùn)動(dòng)的動(dòng)畫(huà),山坡為正弦曲線。請(qǐng)注意,應(yīng)該用偏移法獲得輪圓心的軌跡才是正確的。編程思路:先畫(huà)好圓和橫軸,然后畫(huà)山坡,偏移獲得移動(dòng)軌跡線,放到隱藏圖層中,然后根據(jù)軌跡線移動(dòng)圓和軸,在移動(dòng)之前先旋轉(zhuǎn)軸線。旋轉(zhuǎn)方法:object.rotate基點(diǎn),角度偏移方法:object.offset(偏移量)Submoveball()DimccballAsVariant圓DimcclineAsVariant圓軸Dimcclinep1(0To2)AsDouble圓軸端點(diǎn)1Dimcclinep2(0To2)AsDouble圓軸端點(diǎn)2Dimcc(0To2)AsDouble圓心DimhillAsVariant山坡線DimmovelineAsVariant移動(dòng)軌跡線Dimlay1AsAcadLayer放軌跡線的隱藏圖層DimvpointsAsVariant軌跡點(diǎn)Dimmovep(0To2)AsDouble移動(dòng)目標(biāo)點(diǎn)坐標(biāo)cclinep1(0)=-0.1:cclinep2(0)=0.1定義圓軸坐標(biāo)Setccline=ThisDrawing.ModelSpace.AddLine(cclinep1,cclinep2)畫(huà)直線Setccball=Thi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論