呂 嵐
(陜西鐵路工程職業(yè)技術(shù)學(xué)院 電氣工程系, 陜西 渭南 714099)
基于AutoCAD-VBA的對(duì)象縮放操作方法探討
呂 嵐
(陜西鐵路工程職業(yè)技術(shù)學(xué)院 電氣工程系, 陜西 渭南 714099)
VBA是一個(gè)AutoCAD應(yīng)用程序集成開(kāi)發(fā)環(huán)境,是一種面向?qū)ο蟮目梢暬Y(jié)構(gòu)編程語(yǔ)言,被廣泛應(yīng)用于各領(lǐng)域的實(shí)際工作中。AutoCAD中可以通過(guò)菜單、工具欄、命令等多種方式完成對(duì)圖形的縮放,但都不能一步完成縮放效果。通過(guò)VBA對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),設(shè)計(jì)了一個(gè)對(duì)圖形實(shí)現(xiàn)一步縮放的應(yīng)用程序,提高了工作效率,實(shí)際應(yīng)用效果良好。
AutoCAD; VBA; 圖形; 縮放
在AutoCAD中,經(jīng)常會(huì)對(duì)圖形進(jìn)行縮放操作,可以通過(guò)命令、菜單或工具欄等多種方法實(shí)現(xiàn)[1]14。ZOOM命令和Scale命令都稱作為縮放命令,但兩者也有區(qū)別。Zoom命令叫做視圖縮放命令,在CAD中用來(lái)繪圖和觀察圖形的是一個(gè)窗口,這就相當(dāng)于一個(gè)相機(jī)的鏡頭,Zoom就相當(dāng)于鏡頭的拉近和拉遠(yuǎn),雖然看到所有圖形顯示的大小變了,但圖形的實(shí)際尺寸不會(huì)發(fā)生任何變化。Scale命令叫做圖形的縮放命令,他會(huì)直接改變圖形的大小,而且只會(huì)改變被選中圖形的大小[2]450。CAD的Scale命令只提供一個(gè)比例設(shè)置,也就是各軸向只能等比例縮放。并且用scale命令對(duì)選定圖形進(jìn)行縮放時(shí),其標(biāo)注是不會(huì)同步進(jìn)行改變的。通過(guò)選擇“視圖”下的“縮放”子菜單,也可以實(shí)現(xiàn)縮放,但無(wú)論是通過(guò)命令還是菜單選項(xiàng)進(jìn)行縮放,一般都需要執(zhí)行多步操作,才能實(shí)現(xiàn)想要的效果。本文設(shè)計(jì)的程序,能夠根據(jù)用戶選擇所要查看的對(duì)象進(jìn)行縮放操作,無(wú)論選擇對(duì)象的范圍是否大于當(dāng)前的視口,都能夠一次完成縮放操作。
縮放操作的目的是為了在圖形窗口中顯示要觀察的對(duì)象,用戶選擇所要觀察的對(duì)象之后,可以獲得這些對(duì)象的限制框,根據(jù)限制框的大小確定縮放的角點(diǎn),進(jìn)行窗口縮放的操作。本程序的關(guān)鍵技術(shù)在于獲取選擇集內(nèi)所有對(duì)象的限制框角點(diǎn),這里采用的方法是遍歷選擇集內(nèi)的對(duì)象,比較所有對(duì)象的限制框角點(diǎn),獲得其中最上側(cè)、最下側(cè)、最左側(cè)、最右側(cè)的幾個(gè)角點(diǎn)。獲得這4個(gè)關(guān)鍵角點(diǎn)之后,就可以使用這4個(gè)角點(diǎn)的X、Y坐標(biāo)值,計(jì)算出選擇集的限制框角點(diǎn)。
(1)在AutoCAD 2016中,打開(kāi)【VBA管理器】對(duì)話框,創(chuàng)建一個(gè)新工程,保存在適當(dāng)?shù)奈恢?,進(jìn)入VBA集成開(kāi)發(fā)環(huán)境。
(2)選擇【插入/模塊】菜單項(xiàng),向程序中添加一個(gè)標(biāo)準(zhǔn)模塊,在其中添加宏的代碼:
Public Sub ObjZoom()
On Error Resume Next
Dim SSet As AcadSelectionSet
If Not IsNull(ThisDrawing.SelectionSets.Item(“this”)) Then
Set SSet = ThisDrawing.SelectionSets.Item(“this”)
SSet.Delete
End If
Set SSet = ThisDrawing.SelectionSets.Add(“this”)
SSet.SelectOnScreen
Dim ptArr() As Variant
Dim count As Integer
count = SSet.count
ReDimptArr(count - 1)
If count = 0 Then
MsgBox “未選擇任何對(duì)象!”, vbCritical
Exit Sub
End If
Dim objEnt As AcadEntity
Dim ptTemp As Variant
DimiAs Integer
i= 0
For Each objEnt In SSet
objEnt.GetBoundingBoxptArr(i), ptTemp
i=i+ 1
Next
Dim ptLeft, ptBottom
ptLeft = GetLimitPt(ptArr, 3)
ptBottom = GetLimitPt(ptArr, 2)
i= 0
For Each objEnt In SSet
objEnt.GetBoundingBoxptTemp, ptArr(i)
i=i+ 1
Next
Dim ptRight, ptTop
ptRight = GetLimitPt(ptArr, 4)
ptTop = GetLimitPt(ptArr, 1)
Dim ptMin(0 To 2) As Double, ptMax(0 To 2) As Double
ptMin(0) = ptLeft(0): ptMin(1) = ptBottom(1): ptMin(2) = 0
ptMax(0) = ptRight(0): ptMax(1) = ptTop(1): ptMax(2) = 0
'ThisDrawing.ModelSpace.AddLineptMin, ptMax
ptMin(0) = ptLeft(0) - (ptRight(0) - ptLeft(0)) / 8
ptMin(1) = ptBottom(1) - (ptTop(1) - ptBottom(1)) / 8
ptMax(0) = ptRight(0) + (ptRight(0) - ptLeft(0)) / 8
ptMax(1) = ptTop(1) + (ptTop(1) - ptBottom(1)) / 8
ZoomWindowptMin, ptMax
'ThisDrawing.ApplicationZoomWindowptMin, ptMax
SSet.Delete
End Sub
(3)該程序中最關(guān)鍵的代碼是計(jì)算選擇集內(nèi)所有對(duì)象的限制框角點(diǎn),GetLimitPt函數(shù)用來(lái)完成這個(gè)功能,其實(shí)現(xiàn)代碼為:
Public Function GetLimitPt(ByRefptArr() As Variant, ByValtypeCal As Integer) As Variant
Dim count As Integer
Dim dblTemp As Double
count = UBound(ptArr)
DimiAs Integer
Dim num As Integer
Fori= 0 To count
Select Case typeCal
Case 1
Ifi= 0 Then dblTemp = ptArr(i)(1)
dblTemp = MaxDouble(dblTemp, ptArr(i)(1))
If dblTemp = ptArr(i)(1) Then
num =i
End If
Case 2
Ifi= 0 Then dblTemp = ptArr(i)(1)
dblTemp = MinDouble(dblTemp, ptArr(i)(1))
If dblTemp = ptArr(i)(1) Then
num =i
End If
Case 3
Ifi= 0 Then dblTemp = ptArr(i)(0)
dblTemp = MinDouble(dblTemp, ptArr(i)(0))
If dblTemp = ptArr(i)(0) Then
num =i
End If
Case 4
Ifi= 0 Then dblTemp = ptArr(i)(0)
dblTemp = MaxDouble(dblTemp, ptArr(i)(0))
If dblTemp = ptArr(i)(0) Then
num =i
End If
End Select
Nexti
GetLimitPt = ptArr(num)
End Function
GetLimitPt這個(gè)函數(shù)的功能和數(shù)據(jù)結(jié)構(gòu)中的冒泡排序類(lèi)似,將數(shù)組中第一個(gè)元素的值與第二個(gè)比較,取出較大的值,再與下一個(gè)比較,同樣取出最大值,以此類(lèi)推[3]137。
(1)在AutoCAD 2016中,打開(kāi)一幅圖形,如圖1所示。(2)在VBA集成開(kāi)發(fā)環(huán)境中,按下F5鍵運(yùn)行程序,系統(tǒng)在命令行中給出提示“選擇對(duì)象”,如圖2所示。(3)選擇所要顯示的圖形對(duì)象,按下Enter鍵完成選擇,所得結(jié)果如圖3所示。
圖1 圖形初始狀態(tài) 圖2 程序運(yùn)行狀態(tài) 圖3 圖形縮放后結(jié)果
通過(guò)這個(gè)程序?qū)崿F(xiàn)了在CAD中對(duì)圖形的縮放功能,在實(shí)際使用過(guò)程中,程序運(yùn)行穩(wěn)定,提高了工作效率,效果良好。但是,這個(gè)批量文字替換程序也有一些不足之處,如:對(duì)多個(gè)圖形中的特定對(duì)象不能具體進(jìn)行設(shè)置和選擇,同時(shí),對(duì)不同行業(yè)中有特定需求和實(shí)際問(wèn)題的用戶,針對(duì)性不是很強(qiáng)[4]144-145。今后,可以通過(guò)一些程序軟件的嵌入和二次開(kāi)發(fā),來(lái)解決本行業(yè)個(gè)性化應(yīng)用問(wèn)題。
[1] 王進(jìn)明,安榮.Auto CAD中對(duì)象縮放命令的應(yīng)用[J].煤炭技術(shù),2011(05).
[2] 高 虎.Auto CAD200X圖形縮放和比例設(shè)置[J].科技信息,2009(33).
[3] 張 帆,鄭立楷,王華杰.AutoCAD VBA開(kāi)發(fā)精彩實(shí)例教程[M].北京:清華大學(xué)出版社,2004.
[4] 楊瑞蘭,劉藝柱.基于AutoCAD縮放命令應(yīng)用的研究[J].制造業(yè)自動(dòng)化,2009(9).
Study of Operation Method of Object Scaling Based on AutoCAD-VBA
LYU Lan
(Department of Electrical Engineering, Shanxi Railway Institute, Weinan 714000, China)
Visual Basic for applications is an integrated development environment in AutoCAD application, also is an object-oriented visual structure programming language, which is widely used in various fields of practical work. AutoCAD completes the scaling of the graphics through a variety of ways, such as through the menu, toolbar, command, etc. But none of them can be completed in one step. Using VBA application to the secondary development of Auto-CAD, designed the application of operation method of object scaling, it is proved that this application works more efficiency.
Autodesk Computer Aided Dided Design; Visual Basic for Application; graphic; scaling
2016-12-28
呂 嵐(1982-),女,陜西長(zhǎng)安人,講師,計(jì)算機(jī)科學(xué)與技術(shù)碩士,主要從事計(jì)算機(jī)科學(xué)與技術(shù)研究。
TP391.72
A
1672-2388(2017)01-0086-03