付少波,王 超
(廣東省水利水電科學(xué)研究院,廣東省水動(dòng)力學(xué)應(yīng)用研究重點(diǎn)實(shí)驗(yàn)室,廣東 廣州 510635)
?
VBA在AutoCAD渠道橫斷面繪圖中的應(yīng)用
付少波,王 超
(廣東省水利水電科學(xué)研究院,廣東省水動(dòng)力學(xué)應(yīng)用研究重點(diǎn)實(shí)驗(yàn)室,廣東 廣州 510635)
通過VBA編程,建立AutoCAD的模型空間和Excel表格中特征參數(shù)聯(lián)系,批量繪制渠道橫斷面。通過實(shí)例證明該方法可有效減少工作量,提高工作效率。
AutoCAD;VBA;Excel;橫斷面
渠道設(shè)計(jì)是農(nóng)田水利設(shè)計(jì)的重要組成部分。在渠道設(shè)計(jì)中,設(shè)計(jì)人員常以Excel為工具來進(jìn)行渠道各項(xiàng)水利特征數(shù)據(jù)計(jì)算與試算,并根據(jù)有關(guān)計(jì)算結(jié)果利用AutoCAD繪制圖紙。渠道橫斷面繪圖過程存在操作步驟重復(fù)率高、準(zhǔn)確度差且批量修改困難等問題,給繪圖人員帶來很大困擾。
經(jīng)過筆者探索與實(shí)踐,通過AutoCAD 內(nèi)嵌的VBA(Visual Basic For Applications)進(jìn)行二次開發(fā),可以實(shí)現(xiàn)Excel中有關(guān)特征參數(shù)直接批量導(dǎo)入AutoCAD中[1-2],并以此為依據(jù)繪制渠道橫斷面圖。這種方法提高了繪圖效率,形成了統(tǒng)一格式,提高了繪圖準(zhǔn)確度,便于批量修改。
1.1 渠道橫斷面繪圖中遇到的問題
渠道橫斷面設(shè)計(jì)的過程中,為滿足各設(shè)計(jì)階段橫斷面間距的要求,常常存在斷面形式變化不大的情況下,繪制許多尺寸不同,形式類似圖形的問題。渠道橫斷面繪圖過程中要反復(fù)參照Excel表格計(jì)算出的數(shù)據(jù),再根據(jù)相關(guān)特征參數(shù)進(jìn)行繪圖。例如設(shè)計(jì)渠底高程、設(shè)計(jì)水位、渠道幾何尺寸等。
以廣東省仁化縣農(nóng)田水利重點(diǎn)縣(2013年度)灌區(qū)明渠改造為例,項(xiàng)目區(qū)有1條總長12.886 km干渠需要進(jìn)行改造,施工圖方案為在原有矩形渠道基礎(chǔ)上,襯砌擋墻并將渠道加高至設(shè)計(jì)值,部分渠段根據(jù)需要加設(shè)蓋板。根據(jù)施工圖出圖要求每隔50 m繪制1張渠道橫斷面圖,該干渠全段需繪制258個(gè)橫斷面,繪圖任務(wù)工作量很大[3]。
1.2 程序編制思路
以AutoCAD中內(nèi)嵌的VBA為工具,建立Excel表格中相關(guān)數(shù)據(jù)與AutoCAD的模型空間連接,通過參數(shù)(見圖1)的調(diào)用與循環(huán),依次分圖層完成繪圖、標(biāo)注、位移等操作,設(shè)計(jì)思路見圖2。
圖1 基礎(chǔ)數(shù)據(jù)表
圖2 關(guān)鍵方法實(shí)現(xiàn)的流程示意
2.1 數(shù)據(jù)提取
利用循環(huán)嵌套語句將Excel數(shù)據(jù)表中與繪圖有關(guān)的數(shù)據(jù)讀取到二維數(shù)組內(nèi)。主要代碼如下:
Setxlapp=CreateObject(“excel.application”)
Setxlbook=xlapp.workbooks.Open(“C:Desktop1.xlsx”)′打開Excel工作簿的路徑
xlapp.Visible=False
Set xlsheet=xlbook.worksheets(“渠道改造特性表”) ′打開Excel中的工作表
Dim w(1 To 259, 10) As String′建立二維數(shù)組讀取數(shù)據(jù)
For j=1 To 10
For i=2 To 259 Step 1
w(i, j)=xlsheet.cells(i, j)
Val (w(i, j)) ′將讀取的數(shù)據(jù)轉(zhuǎn)化為數(shù)值型
i=i+1
Next i
j=j+1
Next j
2.2 圖形繪制
通過讀取變量定出繪制圖形坐標(biāo),用劃線命令[4]完成繪圖。以渠道底邊為例,主要代碼部分如下:
Dim mospace As AcadModelSpace
Set mospace=ThisDrawing.ModelSpace
Dim lineobj As AcadLine
DimiAs Integer
For i=2 To 259 Step 1
j=5
startpoint(0)=0+a
startpoint(1)=0+c
startpoint(2)=0
endpoint(0)=startpoint(0)+w(i, j)
endpoint(1)=0+c
endpoint(2)=0
′ThisDrawing.ActiveLayer=ThisDrawing.Layers.Item(“原有渠道斷面”)′將當(dāng)前圖層設(shè)置為原有渠道斷面圖層
Set lineobj=mospace.AddLine(startpoint, endpoint) ′底邊
i=i+1
Next i
其他線位置以此為基準(zhǔn)點(diǎn),依次引用相關(guān)變量繪出,代碼不重復(fù)列出。
2.3 尺寸標(biāo)注繪制
定義標(biāo)注樣式,尺寸界限位置,偏移值等屬性,通過標(biāo)注命令完成標(biāo)注。以底邊標(biāo)注[5]為例,主要代碼部分如下:
ThisDrawing.ActiveLayer=ThisDrawing.Layers.Item(“標(biāo)注”)′將當(dāng)前圖層設(shè)置為標(biāo)注圖層
ThisDrawing.ActiveDimStyle=ThisDrawing.DimStyles.Item(“TestDimStyle”)’將TestDimStyle視為當(dāng)前標(biāo)樣式
Dim retval As AcadDimAligned
Dim ExtLinelPoint(0 To 2) As Double
Dim ExtLine2Point(0 To 2) As Double
Dim textposition(0 To 2) As Double
ExtLinelPoint(0)=startpoint(0)
ExtLinelPoint(1)=startpoint(1)-0.6 ′尺寸界限偏移值
ExtLinelPoint(2)=0
ExtLine2Point(0)=endpoint(0)
ExtLine2Point(1)=endpoint(1)-0.6 ′尺寸界限偏移值
ExtLine2Point(2)=0
textposition(0)=1
textposition(1)=startpoint(1)-0.8 ′尺寸標(biāo)注文字位置
textposition(2)=1
Set retval=ThisDrawing.ModelSpace.AddDimAligned(ExtLinelPoint, ExtLine2Point, textposition)’添加尺寸標(biāo)注
2.4 塊類型標(biāo)注添加
在模型空間添加塊,定義塊名稱,通過相關(guān)參數(shù)調(diào)用確定位置,執(zhí)行插入塊命令。以添加水位標(biāo)識(shí)為例,主要代碼部分如下:
ThisDrawing.ActiveLayer= ThisDrawing.Layers.Item(“水位”) ′將當(dāng)前圖層設(shè)置為水位標(biāo)志圖層
Dim blockObj As AcadBlockReference
Dim insertblock1(0 To 2) As Double
insertblock1(0)=startpoint(0)+kd(i) / 2′確定水位標(biāo)識(shí)位置
insertblock1(1)=startpoint(1)+sw(i)+0.1
insertblock1(2)=startpoint(2)
Set blockObj=ThisDrawing.ModelSpace.InsertBlock(insertblock1, “water level”, 1, 1, 1, 0) ′ 插入塊
根據(jù)需要可完成添加打斷線、漿砌石等塊類型符號(hào)的插入,代碼不重復(fù)列出。
2.5 文字類標(biāo)注添加
調(diào)用樁號(hào)變量并加上指定字符串,組成要求的格式,確定插入位置,通過添加文字命令,添加樁號(hào)文字。以添加樁號(hào)為例,主要代碼部分如下:
ThisDrawing.ActiveLayer=ThisDrawing.Layers.Item(“樁號(hào)”) ′將當(dāng)前圖層設(shè)置為樁號(hào)圖層
Dim textObj As AcadText ′增加樁號(hào)
Dim textString As String
Dim insertionPoint(0 To 2) As Double
Dim height As Double
textString=zh(i) & “改造斷面圖”
insertionPoint(0)=startpoint(0)
insertionPoint(1)=startpoint(1)-1.03
insertionPoint(2)=0
height=0.15’文字高度
Set textObj=ThisDrawing.ModelSpace.AddText(textString, insertionPoint, height)’插入樁號(hào)文字
根據(jù)需要可添加其它文字類標(biāo)注信息,代碼不重復(fù)列出。
2.6 圖形位置的判定
在循環(huán)外定義a、b、c、d,初始值均為0。進(jìn)入循環(huán)則進(jìn)行累加和計(jì)數(shù),用來判斷是否換行,是否執(zhí)行完畢。主要代碼如下:
在繪圖循環(huán)內(nèi)
a=a+9.1 ′x軸間距
b=b+1
d=d+1
If b=3 Then ′換行
a=0 ′x的值
b=0 ′計(jì)數(shù)歸零
c=c-6.36 ′y軸間距
End If
If d=8 Then ′計(jì)數(shù)除圖簽位置的圖形
a=0 ′x的值
c=c-8.28 ′y軸間距
b=0
d=0 ′計(jì)數(shù)歸零
End If
圖3 執(zhí)行結(jié)果示意
通過基于AutoCAD的VBA二次開發(fā),建立Excel數(shù)據(jù)表與AutoCAD模型空間連接,實(shí)現(xiàn)了批量化、標(biāo)準(zhǔn)化、快速化、屬性化作圖。本例如按普通方法繪圖,1人需要10 d左右完成繪制。采用上述方法程序開發(fā)時(shí)間1 d,執(zhí)行時(shí)間約2 min,節(jié)約了時(shí)間,提高了效率,程序執(zhí)行結(jié)果見圖3。
圖形各部分間采用分圖層繪圖,各圖層屬性易修改。如遇方案調(diào)整可根據(jù)修改后的參數(shù)直接執(zhí)行程序,進(jìn)行重新繪圖,提高了繪圖的效率和準(zhǔn)確性。但此方法對(duì)于一些比較短的渠道,編程部分略顯瑣碎,效率提升并不明顯。此方法在較長的渠道繪圖的處理中,有明顯優(yōu)勢(shì)。對(duì)河堤、公路等其它線性工程橫斷面繪制有參考意義。
[1] 李長勛.AutoCAD VBA 程序開發(fā)技術(shù)[M].北京:國防工業(yè)出版社,2004.
[2] 張帆.AutoCAD 二次開發(fā)教程[ M] .北京:清華大學(xué)出版社,2006.
[3] 廣東省水利廳.廣東省中型灌區(qū)續(xù)建配套與節(jié)水改造工程初步設(shè)計(jì)報(bào)告編制指南[R].廣州: 廣東省水利廳,2011.
[4] 符裕紅,張代杰. AutoCAD VBA 在渠道縱斷面設(shè)計(jì)中的應(yīng)用[J].中國農(nóng)村水利水電,2009,9(1):133-136.
[5] 黎富忠, 顏景順. 在AutoCAD 中實(shí)現(xiàn)斷面數(shù)據(jù)的自動(dòng)生成與繪圖[J].廣西水利水電,2011(1):32-34.
(本文責(zé)任編輯 王瑞蘭)
Application of VBA to AutoCAD Channel Cross Section Drawing
FU Shaobo, WANG Chao
(Guangdong Research Institute of Water Resources and Hydropower, Key Laboratory of Hydrodynamics Research, Guangzhou 510635, China)
This paper carries on procedural programming by using VBA. It connects the model space of AutoCAD with the characteristic data in the Excel that the programming draws the batch construction of ditches at one shot. It is proved that this method can both reduce workload and improve work efficiency.
AutoCAD, VBA, Excel, cross-section
2016-07-18;
2016-07-30
付少波(1990),男,本科,助理工程師,從事水利水電工程設(shè)計(jì)工作。
TV391.72
A
1008-0112(2016)08-0061-04