仿回車源碼
㈠ 怎樣自己製作QQ空間代碼
現在空間的代碼其實都是JS...什麼是JS?? 就是 java SCRIPT 一種JAVA腳本..
下面是關於QQ空間JS代碼的總結...
大家認真看完,差不多你也可以是代碼高手..
你也可以寫代碼給大家用了..呵呵...
每一款全屏皮膚都分為top和bg.
在試穿小窩和全屏2種皮膚的時候分別執行了2種javascript參數,
比如最近到處流傳的(我隨便舉個例)
javascript:window.top.space_addItem(1,1,0,0,0,0,0);
現在我來告訴大家這都代表什麼
其格式為:
javascript:window.top.space_addItem(type,itemno,posx,posy,width,height,zIndex,notPlayFlash);
type
裝扮物品分類
全部物品的序號如下
1 皮膚 2 掛件 3BANNER 4滑鼠 5漂浮 6播放器
7植物 8無 9大頭貼 10無 11大頭貼 12公告欄 13導航 14開場 15禮物盒
16 FLASH掛件 17花邊 19 頂部
itemno: 裝扮物品分類
全部物品的序號如下
1 皮膚 2 掛件 3BANNER 4滑鼠 5漂浮 6播放器
7植物 8無 9大頭貼 10無 11大頭貼 12公告欄 13導航 14開場 15禮物盒
16 FLASH掛件 17花邊 19 頂部
posx
背景水平位置,
posy
垂直位置,默認是80
width
背景寬,默認為0
height
背景高度,默認為0
zIndex
背景所在層,請設置為90 也就是我們在自定義當中來修改模塊上移或下移一層
notPlayFlash
當我們保存方案的時候,雖然表面我們看不到什麼,但是我們可以在IE緩存當中找到一個很長的地址
就是我們保存方案的運行參數,
自動發送到:http://mall.qzone.qq.com/cgi-bin/cgi_diy_save_scenario
再貢獻一個地址給大家,大家可以查看任何一個空間的布置方案, 然後可以用javascript來進行同樣的布置,
http://u12.qzone.qq.com/cgi-bin/entry_js.cgi?uin=對方QQ號碼
如我的http://u12.qzone.qq.com/cgi-bin/entry_js.cgi?uin=522282281
就是這個地址了,!很爽是不是,可以查看任何一個人的布置方案哦!
好了, 不說那麼多廢話了,
現在再兩個發部代碼
代碼如下:
顯示top部分的背景固定代碼
javascript:window.top.space_addItem(1,皮膚代碼,0,80,0,0,123);
顯示bg部分的背景固定代碼
javascript:window.top.space_addItem(1,皮膚代碼,0,80,0,0,124)
打開自己的QQ空間,然後按裝扮空間,在IE的地址欄中輸入avascript:window.top.space_addItem(7,6552,0,0,0,1,0)然後回車, 這個代碼中間 有個 7 。7 代表的是物品種類。 我們知道物品還有皮膚 導航 掛件 BANNER 滑鼠 開場 播放器......等等, 具體編號如下: 1 皮膚 2 掛件 3BANNER 4滑鼠 5漂浮 6播放器 7植物 13導航 14開場 15禮物盒 16 FLASH掛件 17花邊 而我們都知道每個物品都有個屬於自己的編號, 所以我們就把數字套進去, 不信大家可以去試試 javascript:window.top.space_addItem(16,13364,0,0,200,200,0); 200,200 表示寬和高。 16代表FLASH掛件。。 其中 :開場。 播放器, 個人形象相框。導航,都是FLASH 。 我們把它們的編號換在代碼里 在地址欄上輸入 ,按回車『 就可以按裝在空間里了。。 不知道大家懂了沒有。可能是空間對物品分類不嚴格的緣故, 才會這樣, 這也解釋了為什麼我的開場竟然是一個掛件勛章。 當然了,我還可以拿導航當開場, 拿開場當掛件。 我也可以給空間裝一大堆開場,一大堆導航。 都是可以做到的。 javascript:window.top.space_addItem(16,13364,0,0,200,200,0); 比如這個就是:使用勛章掛件 我們改成 javascript:window.top.space_addItem(14,13364,0,0,200,200,0); 再看看效果。呵呵。```就變成開場了。 大家可以去試試。 (注意。必須用自己能夠使用的物品!) 以上代碼 任何用戶都可以用。請大家快去刷。過期不候哦
㈡ 誰能幫我編一段用VB對CAD進行二次開發的程序代碼啊
第一個程序:畫一百個同心圓
第一步:復制下面的紅色代碼
第二步:在模型空間按快捷鍵Alt+F8,出現宏窗口
第三步:在宏名稱中填寫C100,點「創建」、「確定」
第四步:在Sub c100()和End Sub之間粘貼代碼
第五步:回到模型空間,再次按Alt+F8,點擊「運行」
Sub c100()
Dim cc(0 To 2) As Double '聲明坐標變數
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
For i = 1 To 1000 Step 10 '開始循環
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '畫圓
Next i
End Sub
也許您還看不懂上面的代碼,這沒有關系,只要能把同心畫出來就可以了,祝您成功。
第二課 編程基礎
本課主要任務是對上一課的常式進行詳細分析
下面是源碼:
Sub c100()
Dim cc(0 To 2) As Double '聲明坐標變數
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
For i = 1 To 1000 Step 10 '開始循環
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '畫圓
Next i
End Sub
先看第一行和最後一行:
Sub C100()
……
End Sub
C100是宏的名稱,也叫過程名稱,當用戶執行C100時程序將運行sub 和end sub之間的所有指令。
第二行:
Dim cc(0 To 2) As Double '聲明坐標變數
後半段「'聲明坐標變數」自動變為綠色字體,它是代碼語句的注釋,它不會影響程序運行,它的作用是告訴閱讀者程序員的想法。對於簡單的程序,一般不需要寫注釋,如果要編寫非常復雜的程序,最好要多加註釋,越詳細越好,對於程序員來說,這是一個好習慣。
電腦真正編譯執行的是這條語句:Dim cc(0 To 2) As Double
它的作用就是聲明變數。
Dim是一條語句,可以理解為計算機指令。
它的語法:Dim變數名 As 數據類型
本例中變數名為CC,而括弧中的0 to 2聲明這個CC是一個數組,這個數組有三個元素:CC(0)、CC(1)、CC(2),如果改為CC(1 to 3),則三個元素是CC(1)、CC(2)、CC(3),有了這個數組,就可以把坐標數值放到這個變數之中。
Double是數據類型中的一種。ACAD中一般需要定義坐標時就用這個數據類型。在ACAD中數據類型的有很多,下面兩個是比較常用的數據類型,初學者要有所理解。
Long(長整型),其范圍從 -2,147,483,648 到 2,147,483,647。
Variant 它是那些沒被顯式聲明為其他類型變數的數據類型,可以理解為一種通用的數據類型,這是最常用的。
下面三條語句
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
它們的作用是給CC變數的每一個元素賦,值其順序是X、Y、Z坐標。
For i = 1 To 1000 Step 10 '開始循環
……
Next i '結束循環
這兩條語句的作用是循環運行指令,每循環一次,i值要增加10,當i加到 1000時,結束循環。
i也是一個變數,雖然沒有聲明i變數,程序還是認可的,VB不是C語言,每用一個變數都要聲明,不聲明就會報錯。簡單是簡單了,這樣做也有壞處,如果不小心打錯了一個字母,程序不會報錯,如果程序很長,那就會出現一些意想不到的錯誤。
step後面的數值就是每次循環時增加的數值,step後也可以用負值。
例如:For i =1000 To 1 Step -10
很多情況下,後面可以不加step 10
如:For i=1 to 100,它的作用是每循環一次i值就增加1
Next i語句必須出現在需要結束循環的位置,不然程序沒法運行。
下面看畫圓命令:
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10)
Call語句的作用是調用其他過程或者方法。
ThisDrawing.ModelSpace是指當前CAD文檔的模型空間
AddCircle是畫圓方法
Addcicle方法需要兩個參數:圓心和半徑
CC就是圓心坐標,i*10就是圓的半徑,本例中,這些圓的半徑分別是10、110、210、310……
本課到此結束,下面請完成一道思考題:
1.以(4,2)為圓心,畫5個同心圓,其半徑為1-5
第三課 編程基礎二
繪制三維多段線時X、Y值在屏幕上用滑鼠選取,Z值用鍵盤輸入
本課將講解這個問題。
為了簡化程序,這里用多條直線來代替多段線。以下是源碼:
Sub myl()
Dim p1 As Variant '申明端點坐標
Dim p2 As Variant
p1 = ThisDrawing.Utility.GetPoint(, "輸入點:") '獲取點坐標
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
p1(2) = z '將Z坐標值賦予點坐標中
On Error GoTo Err_Control '出錯陷井
Do '開始循環
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:") '獲取下一個點的坐標
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
p2(2) = z '將Z坐標值賦予點坐標中
Call ThisDrawing.ModelSpace.AddLine(p1, p2) '畫直線
p1 = p2 '將第二點的端點保存為下一條直線的第一個端點坐標
Loop
Err_Control:
End Sub
先談一下本程序的設計思路:
1、獲取第一點坐標
2、輸入第一點Z坐標
3、獲取第二點坐標
4、輸入第二點Z坐標
5、以第一、二點為端點,畫直線
6、下一條線的第一點=這條線的第二點
7、回到第3步進行循環
如果用戶沒有輸入坐標或Z值,則程序結束。
首先看以下兩條語句:
p1 = ThisDrawing.Utility.GetPoint(, "輸入點:") 『獲取點坐標
……
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:") '獲取下一個點的坐標
這兩條語句的作用是由用戶輸入點用滑鼠選取點坐標,並把坐標值賦給p1、p2兩個變數。ThisDrawing.Utility.GetPoint()在ACAD中這是最常用的方法之一,它需要兩個參數,在逗號前面的參數應該是一個點坐標,它的作用是在屏幕上畫一條線,前一個端點位於點坐標位置,後一個端點跟隨滑鼠移動,逗號之前可以什麼都不填,這時沒有線條會跟隨滑鼠移動,但逗號必須保留。
逗號後面使用一串字元,程序在命令行顯示這串字元,這不難理解。
VbCr通常代表一個回車符,而在這個語句中,它的作用是在命令行不顯示「命令:」
&的作用是連接字元。舉例:
「愛我中華 」&」抵制日貨 」&」從我做起」
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
由用戶輸入一個實數
On Error GoTo Err_Control '出錯陷井
……
Err_Control:
On Error是出錯陷井語句,在程序出錯時將執行On Error 後面的語句
GoTo Err_contorl 是程序跳轉語句,它的作用是在程序中尋找Err_control:,並執行這一行後面的語句,本例中Err_Control:後就是結束宏,所以只要出現錯誤,程序中止。
Do '開始循環
……
Loop 『結束循環
這個循環就歷害了,它會無休止地進行循環,好在本例中已經有了一個出錯陷井,當用戶輸入回車時,由於程序沒有得到點或坐標,程序出錯,跳出循環,中止程序。如果要人為控制跳出循環,可以在代碼中用Exit Do語句跳出循環。在For 變數 和Next 變數之間如果要跳出循環,那麼只要在循環體內加一個Exit for 就可以跳出循環,關於這方面的常式以後會講到。
Call ThisDrawing.ModelSpace.AddLine(p1, p2) '畫直線
畫直線方法也是很常用的,它的兩個參數是點坐標變數
本課到此結束,請做思考題:
連續畫圓,每次要求用戶輸入圓心、半徑,當用戶不再輸入圓心或半徑時程序才退出
第四課 程序的調試和保存
人非聖賢,孰能無過,初學者在編寫復雜程序時往往會出現一些意想不到的錯誤,所以程序的調試顯得尤為重要,隨著學習的深入,以後我們需要經常進行程序調試。事實上,對於那些資深程序員來說,調試程序也是一項不可或缺的重要工作。
首先,在程序輸入階段,應該充分利用VBA編輯器的智能功能。當你在寫代碼時,輸入一些字母後,編輯器可以自動列出合適的語句、對象、函數供你選擇,可以用上下鍵選擇,然後按TAB鍵(它位於「Q」鍵左邊)確認。當輸入一個回車符後程序會自動對這條語句進行分析,如果出現錯誤就會提示。
我們經常碰到的麻煩是程序的運行結果和預計的不一樣,一般我會這樣做:首先要想一想可能是哪一個變數有問題,然後去監視這個變數(或表達式),在程序合適的位置設置斷點,這樣可以使程序停下來看一看這個變數有沒有按照我的設想在變化。下面我舉一個簡單的例子,先看源代碼:
sub test()
for i=2 to 4 step 0.6
next i
end sub
這是一個非常簡單的循環,每一次循環i便會增加0.6,當循環3次後i值就變為4.4,但問題是每一次循環時i值變為多少?
第一步:在菜單中選「調試」—「添加監視」,在表達試中填「i」,點擊確定,這時你會看到臨視窗口中會多一行。
第二步:把游標移到代碼窗口中的「next i」行,按一下「F9」,於是每當程序運行到這里時就會暫停了。
好,一切就緒,請按F5執行程序,在監視窗口中C值立刻變為2,再按F5繼續,C值為2.6,再按幾次F5,直到程序結束,這樣我們就成功監視了C值的變化。
第三步:在next i行再按一次F9,清除斷點。監視的表達式的右鍵菜單選擇「刪除監視」。
另外,還可以用「逐語句」、「逐過程」、「運行到游標處」等方法進行調試,這些都在調試菜單中,操作比較簡單,請讀者自行領悟。
到目前為止,我們所做的工程都是「嵌入式工程」,它只是嵌入在當前的Autocad圖形文件中, 以後打開這個文件時代碼才會載入,如果別的dwg文件也要使用,那就需要把代碼導出為.bas文件,供其他dwg文件導入。在VBA編輯器的「文件」菜單中有這兩個功能,一試便知。
ACAD VBA還有一種工程叫「通用式工程」,只要進入ACAD就可以運行,程序可以在不同用戶、不同的圖形文件中共享,但是由於VBA功能太強,有時候會出現一些意想不到的事情,所以在學習階段請暫時不要這樣做。
本課結束,請做思考題;監視下列代碼中的i和j的值,注意,此題雖然要監視2個變數,但是在代窗口中只要設置1個斷點就足夠了。
sub test()
for i=2 to 4 step 0.6
for j=-5 to 2 step 5.5
next j
next i
end sub
第五課 畫函數曲線
先畫一組下圖拋物線。
下面是源碼:
Sub myl()
Dim p(0 To 49) As Double '定義點坐標
Dim myl As Object '定義引用曲線對象變數
co = 15 '定義顏色
For a = 0.01 To 1 Step 0.02 '開始循環畫拋物線
For i = -24 To 24 Step 2 '開始畫多段線
j = i + 24 '確定數組元素
p(j) = i '橫坐標
p(j + 1) = a * p(j) * p(j) / 10 '縱坐標
Next i '至此p(0)-p(40)所有元素已定義,結束循環
Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線
myl.Color = co '設置顏色屬性
co = co + 1 '改變顏色,供下次定義曲線顏色
Next a
End sub
為了鼓勵大家積極思考,從本課開始,我不再解釋每一條語句的作用,只對以前沒有提過的語句進行一些解釋,也許你一時很難明白,建議用上一課提到的跟蹤變數、添加斷點的辦法領悟每一條語句的作用。
在跟蹤變數p時請在跟蹤窗口中單擊變數p前的+號,這樣可以看清數組p中每一個元素的變化。
ACAD沒有現成的畫拋物線命令,我們只能用程序編寫多段線畫近似拋物線。理論上,拋物線的X值可以是無限小、無限大,這里取值范圍在正負24之間。
程序第二行:Dim myl As Object '定義引用曲線對象變數
Object也是一種變數類型,它可以把變數定義為對象,本例中myl變數將引用多段線,所以要定義為Objet類型。
看畫多段線命令:
Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線
其中括弧中的p是一個數組,這個數組的元素數必須是偶數,每兩個元數作為一個點坐標。
等號前面部分「Set myl」的作用就將myl變數去引用畫好的多段線。
myl.Color = co '設置顏色屬性。在ACAD中,顏色可以用數字表示,本例中co會增值,這樣就會有五彩繽紛的效果。
本課第二張圖:正弦曲線,下面是源碼:
Sub sinl()
Dim p(0 To 719) As Double '定義點坐標
For i = 0 To 718 Step 2 '開始畫多段線
p(i) = i * 2 * 3.1415926535897 / 360 '橫坐標
p(i + 1) = 2 * Sin(p(i)) '縱坐標
Next i
ThisDrawing.ModelSpace.AddLightWeightPolyline (p) '畫多段線
ZoomExtents '顯示整個圖形
End Sub
p(i) = i * 2 * 3.1415926535897 / 360 '橫坐標
橫坐標表示角度,後面表達式的作用是把角度轉化弧度
ZoomExtents語句是縮放命令,它的作用是顯示整個圖形,消除圖形以外的區域
本課思考題:畫一條拋物線:y=0.5*x*x+3,其中X取值范圍在正負50之間
第六課 數據類型的轉換
上一節課我們用一個簡單的公式把角度轉化為弧度,這樣做便於大家理解。不過VBA中有現成的方法可以轉換數據類型。
我們舉例說明:
jd = ThisDrawing.Utility.AngleToReal(30, 0)
這個表達式把角度30度轉化為弧度,結果是.523598775598299。
AngleToReal需要兩個參數,前面是表示要轉換角度的數字,而後面一個參數可以取值為0-4之間的整數,有如下意義:
0:十進制角度;1:度分秒格式;2:梯度;3:弧度;4:測地單位
例:id= ThisDrawing.Utility.AngleToReal("62d30' 10""", 1)
這個表達式計算62度30分10秒的弧度
再看將字元串轉換為實數的方法:DistanceToReal
需要兩個參數,前一個參數是表示數值的字元串,後面可以取值1-5,表示數據格式,有如下意義:
1:科學計數;2:十進制;3:工程計數——英尺加英寸;4:建築計數——英尺加分數英寸;5:分數格式。
例:以下表達式得到一個12.5的實數
temp1 = ThisDrawing.Utility.DistanceToReal("1.25E+01", 1)
temp2 = ThisDrawing.Utility.DistanceToReal("12.5", 2)
temp3 = ThisDrawing.Utility.DistanceToReal("12 1/2", 5)
而realtostring方法正好相反,它把一個實數轉換為字元串。它需要3個參數
第一個參數是一個實數,第二個參數表示數據格式,含義同上,最後一個參數表示精確到幾位小數。
temp1= ThisDrawing.Utility.RealToString(12.5, 1, 3)
得到這個字元串:「1.250E+01」,
下面介紹一些數型轉換函數:
Cint,獲得一個整數,例:Cint(3.14159) ,得到3
Cvar,獲得一個Variant類型的數值,例:Cvar("123" & "00"),得到」12300」
Cdate,轉換為date數據類型,例:MyShortTime = CDate("11:13:14 AM")
下面的代碼可以寫出一串數字,從000-099。
Sub test()
Dim add0 As String
Dim text As String
Dim p(0 To 2) As Double
p(1) = 0 'Y坐標為0
p(2) = 0 'Z坐標為0
For i = 0 To 99 '開始循環
If i < 10 Then '如果小於10
add0 = "00" '需要加00
Else '否則
add0 = "0" '需要加0
End If
text = add0 & CStr(i) '加零,並轉換數據
p(0) = i * 100 'X坐標
Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字
Next i
End Sub
重點解釋條件判斷語句:
If 條件表達式 Then
……
Else
……
End if
如果滿足條件那麼程序往下執行,到else時不再往下執行,直接跳到End if後面
如果不滿足條件,程序跳到else後往下運行。
Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字
這是寫單行文本,需要三個參數,分別是:寫的內容、位置、字高
第七課 寫文字
客觀地說,ACAD寫字功能不夠歷害,而用VBA可以使寫字效率更高。比較正規的做法是把定義文字樣式,用樣式來控制文字的特性。我們還是用實例來學習,先看下面一段代碼,它的作用是先創建一個文字樣式,然後用這個文字樣式寫一段多行文本。
Sub txt()
Dim mytxt As AcadTextStyle '定義mytxt變數為文本樣式
Dim p(0 To 2) As Double '定義坐標變數
p(0) = 100: p(1) = 100: p(2) = 0 '坐標賦值
Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt樣式
mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '設置字體文件為仿宋體
mytxt.Height = 100 '字高
mytxt.Width = 0.8 '寬高比
mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0) '傾斜角度(需轉為弧度)
ThisDrawing.ActiveTextStyle = mytxt '將當前文字樣式設置為mytxt
Set txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, "{做到老,學到老}\P" & "此心自光明正大,過人遠矣")
txtobj.LineSpacingFactor = 2 '指定行間距
txtobj.AttachmentPoint = 3 '右對齊(1為左對齊,2為居中)
End Sub
我們看這條語句
Set mytxt = ThisDrawing.TextStyles.Add("mytxt")
添加文本樣式並賦值給mytxt變數,只需要一個參數:文本樣式名
fontfile、height、width、ObliqueAngle是文本樣式最常用的屬性
Call ThisDrawing.ModelSpace.AddMText(p, 1400, "{做到老,學到老}\P" & "此心自光明正大,過人遠矣")
這條語句是寫文本,需要三個參數。第一個參數p是坐標,1400是寬度,最後一個參數是文本內容,其中\p是一個回車符
擴大字元間距用\T數字,例:\T3abc,使文字abc的間距擴大3 部,n取值范圍是0.75-3
在論壇中有一個經常被同好提及的問題:如何使用文字疊加。舉例說明:123\S+0.12^-0.34
\S是格式字元,^是分隔符,前面的數字在上,後面的數字在下。
\C是顏色格式字元,C後面跟一個數字表示顏色
\A是對齊方式,\A0,\A1,\A2分別表示底部對齊、中間對齊和頂部對齊
夠不夠,不夠的話給個郵箱,我再發給你一個pdf文件!
㈢ 編一段程序(只有代碼段)讓顯示器上輸出26個字母「AB.....Z」. PS:可追加懸賞
第一個程序:畫一百個同心圓
第一步:復制下面的紅色代碼
第二步:在模型空間按快捷鍵Alt+F8,出現宏窗口
第三步:在宏名稱中填寫C100,點「創建」、「確定」
第四步:在Sub c100()和End Sub之間粘貼代碼
第五步:回到模型空間,再次按Alt+F8,點擊「運行」
Sub c100()
Dim cc(0 To 2) As Double '聲明坐標變數
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
For i = 1 To 1000 Step 10 '開始循環
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '畫圓
Next i
End Sub
也許您還看不懂上面的代碼,這沒有關系,只要能把同心畫出來就可以了,祝您成功。
第二課 編程基礎
本課主要任務是對上一課的常式進行詳細分析
下面是源碼:
Sub c100()
Dim cc(0 To 2) As Double '聲明坐標變數
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
For i = 1 To 1000 Step 10 '開始循環
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '畫圓
Next i
End Sub
先看第一行和最後一行:
Sub C100()
……
End Sub
C100是宏的名稱,也叫過程名稱,當用戶執行C100時程序將運行sub 和end sub之間的所有指令。
第二行:
Dim cc(0 To 2) As Double '聲明坐標變數
後半段「'聲明坐標變數」自動變為綠色字體,它是代碼語句的注釋,它不會影響程序運行,它的作用是告訴閱讀者程序員的想法。對於簡單的程序,一般不需要寫注釋,如果要編寫非常復雜的程序,最好要多加註釋,越詳細越好,對於程序員來說,這是一個好習慣。
電腦真正編譯執行的是這條語句:Dim cc(0 To 2) As Double
它的作用就是聲明變數。
Dim是一條語句,可以理解為計算機指令。
它的語法:Dim變數名 As 數據類型
本例中變數名為CC,而括弧中的0 to 2聲明這個CC是一個數組,這個數組有三個元素:CC(0)、CC(1)、CC(2),如果改為CC(1 to 3),則三個元素是CC(1)、CC(2)、CC(3),有了這個數組,就可以把坐標數值放到這個變數之中。
Double是數據類型中的一種。ACAD中一般需要定義坐標時就用這個數據類型。在ACAD中數據類型的有很多,下面兩個是比較常用的數據類型,初學者要有所理解。
Long(長整型),其范圍從 -2,147,483,648 到 2,147,483,647。
Variant 它是那些沒被顯式聲明為其他類型變數的數據類型,可以理解為一種通用的數據類型,這是最常用的。
下面三條語句
cc(0) = 1000 '定義圓心座標
cc(1) = 1000
cc(2) = 0
它們的作用是給CC變數的每一個元素賦,值其順序是X、Y、Z坐標。
For i = 1 To 1000 Step 10 '開始循環
……
Next i '結束循環
這兩條語句的作用是循環運行指令,每循環一次,i值要增加10,當i加到 1000時,結束循環。
i也是一個變數,雖然沒有聲明i變數,程序還是認可的,VB不是C語言,每用一個變數都要聲明,不聲明就會報錯。簡單是簡單了,這樣做也有壞處,如果不小心打錯了一個字母,程序不會報錯,如果程序很長,那就會出現一些意想不到的錯誤。
step後面的數值就是每次循環時增加的數值,step後也可以用負值。
例如:For i =1000 To 1 Step -10
很多情況下,後面可以不加step 10
如:For i=1 to 100,它的作用是每循環一次i值就增加1
Next i語句必須出現在需要結束循環的位置,不然程序沒法運行。
下面看畫圓命令:
Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10)
Call語句的作用是調用其他過程或者方法。
ThisDrawing.ModelSpace是指當前CAD文檔的模型空間
AddCircle是畫圓方法
Addcicle方法需要兩個參數:圓心和半徑
CC就是圓心坐標,i*10就是圓的半徑,本例中,這些圓的半徑分別是10、110、210、310……
本課到此結束,下面請完成一道思考題:
1.以(4,2)為圓心,畫5個同心圓,其半徑為1-5
第三課 編程基礎二
繪制三維多段線時X、Y值在屏幕上用滑鼠選取,Z值用鍵盤輸入
本課將講解這個問題。
為了簡化程序,這里用多條直線來代替多段線。以下是源碼:
Sub myl()
Dim p1 As Variant '申明端點坐標
Dim p2 As Variant
p1 = ThisDrawing.Utility.GetPoint(, "輸入點:") '獲取點坐標
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
p1(2) = z '將Z坐標值賦予點坐標中
On Error GoTo Err_Control '出錯陷井
Do '開始循環
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:") '獲取下一個點的坐標
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
p2(2) = z '將Z坐標值賦予點坐標中
Call ThisDrawing.ModelSpace.AddLine(p1, p2) '畫直線
p1 = p2 '將第二點的端點保存為下一條直線的第一個端點坐標
Loop
Err_Control:
End Sub
先談一下本程序的設計思路:
1、獲取第一點坐標
2、輸入第一點Z坐標
3、獲取第二點坐標
4、輸入第二點Z坐標
5、以第一、二點為端點,畫直線
6、下一條線的第一點=這條線的第二點
7、回到第3步進行循環
如果用戶沒有輸入坐標或Z值,則程序結束。
首先看以下兩條語句:
p1 = ThisDrawing.Utility.GetPoint(, "輸入點:") 『獲取點坐標
……
p2 = ThisDrawing.Utility.GetPoint(p1, vbCr & "輸入下一點:") '獲取下一個點的坐標
這兩條語句的作用是由用戶輸入點用滑鼠選取點坐標,並把坐標值賦給p1、p2兩個變數。ThisDrawing.Utility.GetPoint()在ACAD中這是最常用的方法之一,它需要兩個參數,在逗號前面的參數應該是一個點坐標,它的作用是在屏幕上畫一條線,前一個端點位於點坐標位置,後一個端點跟隨滑鼠移動,逗號之前可以什麼都不填,這時沒有線條會跟隨滑鼠移動,但逗號必須保留。
逗號後面使用一串字元,程序在命令行顯示這串字元,這不難理解。
VbCr通常代表一個回車符,而在這個語句中,它的作用是在命令行不顯示「命令:」
&的作用是連接字元。舉例:
「愛我中華 」&」抵制日貨 」&」從我做起」
z = ThisDrawing.Utility.GetReal("Z坐標:") '用戶輸入Z坐標值
由用戶輸入一個實數
On Error GoTo Err_Control '出錯陷井
……
Err_Control:
On Error是出錯陷井語句,在程序出錯時將執行On Error 後面的語句
GoTo Err_contorl 是程序跳轉語句,它的作用是在程序中尋找Err_control:,並執行這一行後面的語句,本例中Err_Control:後就是結束宏,所以只要出現錯誤,程序中止。
Do '開始循環
……
Loop 『結束循環
這個循環就歷害了,它會無休止地進行循環,好在本例中已經有了一個出錯陷井,當用戶輸入回車時,由於程序沒有得到點或坐標,程序出錯,跳出循環,中止程序。如果要人為控制跳出循環,可以在代碼中用Exit Do語句跳出循環。在For 變數 和Next 變數之間如果要跳出循環,那麼只要在循環體內加一個Exit for 就可以跳出循環,關於這方面的常式以後會講到。
Call ThisDrawing.ModelSpace.AddLine(p1, p2) '畫直線
畫直線方法也是很常用的,它的兩個參數是點坐標變數
本課到此結束,請做思考題:
連續畫圓,每次要求用戶輸入圓心、半徑,當用戶不再輸入圓心或半徑時程序才退出
第四課 程序的調試和保存
人非聖賢,孰能無過,初學者在編寫復雜程序時往往會出現一些意想不到的錯誤,所以程序的調試顯得尤為重要,隨著學習的深入,以後我們需要經常進行程序調試。事實上,對於那些資深程序員來說,調試程序也是一項不可或缺的重要工作。
首先,在程序輸入階段,應該充分利用VBA編輯器的智能功能。當你在寫代碼時,輸入一些字母後,編輯器可以自動列出合適的語句、對象、函數供你選擇,可以用上下鍵選擇,然後按TAB鍵(它位於「Q」鍵左邊)確認。當輸入一個回車符後程序會自動對這條語句進行分析,如果出現錯誤就會提示。
我們經常碰到的麻煩是程序的運行結果和預計的不一樣,一般我會這樣做:首先要想一想可能是哪一個變數有問題,然後去監視這個變數(或表達式),在程序合適的位置設置斷點,這樣可以使程序停下來看一看這個變數有沒有按照我的設想在變化。下面我舉一個簡單的例子,先看源代碼:
sub test()
for i=2 to 4 step 0.6
next i
end sub
這是一個非常簡單的循環,每一次循環i便會增加0.6,當循環3次後i值就變為4.4,但問題是每一次循環時i值變為多少?
第一步:在菜單中選「調試」—「添加監視」,在表達試中填「i」,點擊確定,這時你會看到臨視窗口中會多一行。
第二步:把游標移到代碼窗口中的「next i」行,按一下「F9」,於是每當程序運行到這里時就會暫停了。
好,一切就緒,請按F5執行程序,在監視窗口中C值立刻變為2,再按F5繼續,C值為2.6,再按幾次F5,直到程序結束,這樣我們就成功監視了C值的變化。
第三步:在next i行再按一次F9,清除斷點。監視的表達式的右鍵菜單選擇「刪除監視」。
另外,還可以用「逐語句」、「逐過程」、「運行到游標處」等方法進行調試,這些都在調試菜單中,操作比較簡單,請讀者自行領悟。
到目前為止,我們所做的工程都是「嵌入式工程」,它只是嵌入在當前的Autocad圖形文件中, 以後打開這個文件時代碼才會載入,如果別的dwg文件也要使用,那就需要把代碼導出為.bas文件,供其他dwg文件導入。在VBA編輯器的「文件」菜單中有這兩個功能,一試便知。
ACAD VBA還有一種工程叫「通用式工程」,只要進入ACAD就可以運行,程序可以在不同用戶、不同的圖形文件中共享,但是由於VBA功能太強,有時候會出現一些意想不到的事情,所以在學習階段請暫時不要這樣做。
本課結束,請做思考題;監視下列代碼中的i和j的值,注意,此題雖然要監視2個變數,但是在代窗口中只要設置1個斷點就足夠了。
sub test()
for i=2 to 4 step 0.6
for j=-5 to 2 step 5.5
next j
next i
end sub
第五課 畫函數曲線
先畫一組下圖拋物線。
下面是源碼:
Sub myl()
Dim p(0 To 49) As Double '定義點坐標
Dim myl As Object '定義引用曲線對象變數
co = 15 '定義顏色
For a = 0.01 To 1 Step 0.02 '開始循環畫拋物線
For i = -24 To 24 Step 2 '開始畫多段線
j = i + 24 '確定數組元素
p(j) = i '橫坐標
p(j + 1) = a * p(j) * p(j) / 10 '縱坐標
Next i '至此p(0)-p(40)所有元素已定義,結束循環
Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線
myl.Color = co '設置顏色屬性
co = co + 1 '改變顏色,供下次定義曲線顏色
Next a
End sub
為了鼓勵大家積極思考,從本課開始,我不再解釋每一條語句的作用,只對以前沒有提過的語句進行一些解釋,也許你一時很難明白,建議用上一課提到的跟蹤變數、添加斷點的辦法領悟每一條語句的作用。
在跟蹤變數p時請在跟蹤窗口中單擊變數p前的+號,這樣可以看清數組p中每一個元素的變化。
ACAD沒有現成的畫拋物線命令,我們只能用程序編寫多段線畫近似拋物線。理論上,拋物線的X值可以是無限小、無限大,這里取值范圍在正負24之間。
程序第二行:Dim myl As Object '定義引用曲線對象變數
Object也是一種變數類型,它可以把變數定義為對象,本例中myl變數將引用多段線,所以要定義為Objet類型。
看畫多段線命令:
Set myl = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) '畫多段線
其中括弧中的p是一個數組,這個數組的元素數必須是偶數,每兩個元數作為一個點坐標。
等號前面部分「Set myl」的作用就將myl變數去引用畫好的多段線。
myl.Color = co '設置顏色屬性。在ACAD中,顏色可以用數字表示,本例中co會增值,這樣就會有五彩繽紛的效果。
本課第二張圖:正弦曲線,下面是源碼:
Sub sinl()
Dim p(0 To 719) As Double '定義點坐標
For i = 0 To 718 Step 2 '開始畫多段線
p(i) = i * 2 * 3.1415926535897 / 360 '橫坐標
p(i + 1) = 2 * Sin(p(i)) '縱坐標
Next i
ThisDrawing.ModelSpace.AddLightWeightPolyline (p) '畫多段線
ZoomExtents '顯示整個圖形
End Sub
p(i) = i * 2 * 3.1415926535897 / 360 '橫坐標
橫坐標表示角度,後面表達式的作用是把角度轉化弧度
ZoomExtents語句是縮放命令,它的作用是顯示整個圖形,消除圖形以外的區域
本課思考題:畫一條拋物線:y=0.5*x*x+3,其中X取值范圍在正負50之間
第六課 數據類型的轉換
上一節課我們用一個簡單的公式把角度轉化為弧度,這樣做便於大家理解。不過VBA中有現成的方法可以轉換數據類型。
我們舉例說明:
jd = ThisDrawing.Utility.AngleToReal(30, 0)
這個表達式把角度30度轉化為弧度,結果是.523598775598299。
AngleToReal需要兩個參數,前面是表示要轉換角度的數字,而後面一個參數可以取值為0-4之間的整數,有如下意義:
0:十進制角度;1:度分秒格式;2:梯度;3:弧度;4:測地單位
例:id= ThisDrawing.Utility.AngleToReal("62d30' 10""", 1)
這個表達式計算62度30分10秒的弧度
再看將字元串轉換為實數的方法:DistanceToReal
需要兩個參數,前一個參數是表示數值的字元串,後面可以取值1-5,表示數據格式,有如下意義:
1:科學計數;2:十進制;3:工程計數——英尺加英寸;4:建築計數——英尺加分數英寸;5:分數格式。
例:以下表達式得到一個12.5的實數
temp1 = ThisDrawing.Utility.DistanceToReal("1.25E+01", 1)
temp2 = ThisDrawing.Utility.DistanceToReal("12.5", 2)
temp3 = ThisDrawing.Utility.DistanceToReal("12 1/2", 5)
而realtostring方法正好相反,它把一個實數轉換為字元串。它需要3個參數
第一個參數是一個實數,第二個參數表示數據格式,含義同上,最後一個參數表示精確到幾位小數。
temp1= ThisDrawing.Utility.RealToString(12.5, 1, 3)
得到這個字元串:「1.250E+01」,
下面介紹一些數型轉換函數:
Cint,獲得一個整數,例:Cint(3.14159) ,得到3
Cvar,獲得一個Variant類型的數值,例:Cvar("123" & "00"),得到」12300」
Cdate,轉換為date數據類型,例:MyShortTime = CDate("11:13:14 AM")
下面的代碼可以寫出一串數字,從000-099。
Sub test()
Dim add0 As String
Dim text As String
Dim p(0 To 2) As Double
p(1) = 0 'Y坐標為0
p(2) = 0 'Z坐標為0
For i = 0 To 99 '開始循環
If i < 10 Then '如果小於10
add0 = "00" '需要加00
Else '否則
add0 = "0" '需要加0
End If
text = add0 & CStr(i) '加零,並轉換數據
p(0) = i * 100 'X坐標
Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字
Next i
End Sub
重點解釋條件判斷語句:
If 條件表達式 Then
……
Else
……
End if
如果滿足條件那麼程序往下執行,到else時不再往下執行,直接跳到End if後面
如果不滿足條件,程序跳到else後往下運行。
Call ThisDrawing.ModelSpace.AddText(text, p, 4) '寫字
這是寫單行文本,需要三個參數,分別是:寫的內容、位置、字高
第七課 寫文字
客觀地說,ACAD寫字功能不夠歷害,而用VBA可以使寫字效率更高。比較正規的做法是把定義文字樣式,用樣式來控制文字的特性。我們還是用實例來學習,先看下面一段代碼,它的作用是先創建一個文字樣式,然後用這個文字樣式寫一段多行文本。
Sub txt()
Dim mytxt As AcadTextStyle '定義mytxt變數為文本樣式
Dim p(0 To 2) As Double '定義坐標變數
p(0) = 100: p(1) = 100: p(2) = 0 '坐標賦值
Set mytxt = ThisDrawing.TextStyles.Add("mytxt") '添加mytxt樣式
mytxt.fontFile = "c:\windows\fonts\simfang.ttf" '設置字體文件為仿宋體
mytxt.Height = 100 '字高
mytxt.Width = 0.8 '寬高比
mytxt.ObliqueAngle = ThisDrawing.Utility.AngleToReal(3, 0) '傾斜角度(需轉為弧度)
ThisDrawing.ActiveTextStyle = mytxt '將當前文字樣式設置為mytxt
Set txtobj = ThisDrawing.ModelSpace.AddMText(p, 1400, "\P" & "此心自光明正大,過人遠矣")
txtobj.LineSpacingFactor = 2 '指定行間距
txtobj.AttachmentPoint = 3 '右對齊(1為左對齊,2為居中)
End Sub
我們看這條語句
Set mytxt = ThisDrawing.TextStyles.Add("mytxt")
添加文本樣式並賦值給mytxt變數,只需要一個參數:文本樣式名
fontfile、height、width、ObliqueAngle是文本樣式最常用的屬性
Call ThisDrawing.ModelSpace.AddMText(p, 1400, "\P" & "此心自光明正大,過人遠矣")
這條語句是寫文本,需要三個參數。第一個參數p是坐標,1400是寬度,最後一個參數是文本內容,其中\p是一個回車符
擴大字元間距用\T數字,例:\T3abc,使文字abc的間距擴大3 部,n取值范圍是0.75-3
在論壇中有一個經常被同好提及的問題:如何使用文字疊加。舉例說明:123\S+0.12^-0.34
\S是格式字元,^是分隔符,前面的數字在上,後面的數字在下。
\C是顏色格式字元,C後面跟一個數字表示顏色
\A是對齊方式,\A0,\A1,\A2分別表示底部對齊、中間對齊和頂部對齊
夠不夠,不夠的話給個郵箱,我再發給你一個pdf文件!