劉虎
(蚌埠市勘測設計研究院,安徽 蚌埠 233000)
?
AutoCAD中圓弧折線化方法與實現
劉虎*
(蚌埠市勘測設計研究院,安徽 蚌埠 233000)
AutoCAD作為一種重要的地形圖制圖軟件,圖中存在大量的圓弧圖元。由于圓弧只有端點或圓心坐標,弧線本身缺乏精確的坐標信息,因此導致一些數據檢查時出錯。AutoCAD軟件本身不提供圓弧轉折線的功能。本文嘗試采用等角切分方法,利用VBA二次開發技術,在保持圖形原有特征及精度要求的前提下,將圓弧、圓及多段線中的圓弧分別轉換為純折線的多段線,從而去除圓弧部分。滿足基礎地理信息數據庫建庫等特殊的數據需求。
AutoCAD;圓弧;等角切分;折線
AutoCAD以其友好的界面設計,命令與鼠標相結合的操作模式,尤其是強大的制圖與設計功能,豐富的二次開發環境,在工程制圖、地形圖測繪等領域應用廣泛,成為矢量制圖生產的首要軟件之一[1]。軟件提供了包括各種圖形對象繪制、圖形編輯、三維模型構建及相關標注等豐富的制圖功能,能夠滿足大多數生產需要。但AutoCAD是一種面向各行業的通用軟件平臺,在一些特定領域略顯不足,如數據庫管理等[2]。國內測繪行業多用AutoCAD作為地形圖繪制工具,而將現有AutoCAD格式地形圖轉為地理信息系統(GIS)數據時,不可避免的涉及精度與屬性問題[3]。在AutoCAD繪制地形圖中,在采集類似道路路口、花壇等有一定弧度的地物要素時,經常采用圓弧或圓來繪制。采用圓弧,達到了方便、美觀的制圖目的,但其缺陷也是明顯的,弧線缺少精確的點位坐標。弧線是通過一定參數模擬繪制出來的,缺乏坐標明確標示,在GIS數據拓撲處理中,很容易出現重疊、縫隙等錯誤。如何將圓弧(包括圓弧、圓及多段線中的弧段)轉為具有明確坐標的折線,就很有必要[4]。
AutoCAD本身不提供將圖形中圓弧轉為折線的命令或工具,一般采用第三方軟件來進行圓弧轉折線。本文嘗試采用AutoCAD自帶的VBA二次開發技術,制作一個數據處理工具,用于圖中圓弧向折線轉換,以期滿足GIS入庫需求,提高工作效率。
2.1 AutoCAD VBA二次開發
AutoCAD VBA二次開發環境是軟件自身攜帶的一種強大的軟件二次開發技術,具有VB的基本語法特征,且能與AutoCAD運行于同一處理空間,并通過ActiveX Automation接口實現對AutoCAD的編程控制,直接利用AutoCAD的圖形處理資源。可以通過AutoCAD命令VBAIDE啟動軟件開發環境,進行程序編寫[5]。2.2 凸度
凸度在AutoCAD多段線中指一個頂點與下一個頂點之間形成的弧之間角度的1/4的正切值,用于設置一段多段線的彎曲程度。凸度為0代表一個直線段,凸度為1代表一個半圓段,介于0~1之間為劣弧,大于1為優弧[6]。如圖1所示,圓弧AB對應圓心角為a,拱高h,弦長2s,則圓弧AB的凸度n為:
n=tan(a÷4)=h÷s

圖1 凸度
3.1 技術流程
本文中處理的圓弧包括AutoCAD圖形文件中單獨繪制的圓弧(Arc)、圓(Circle)及多段線中弧段。圓弧折線化方法有兩種方式:等角和等距,這里采用等角方法。對于圓形,直接采用等角切分進行折線化。單獨的圓弧,則先轉換為多段線,然后采用多段線圓弧轉折線的方法進行轉換。總的技術流程如圖2所示。

圖2 圓弧折線化技術流程圖
3.2 圓弧折線化算法
在采用等角切分方法將圓弧轉折線的過程中,將用到AutoCAD自帶的一個方法:PolarPoint。其有三個參數,分別為:起點(StartPoint)、角度(Angle)和距離(Distance)。可以通過起點,按照一定角度,按照設定距離,獲取目標點的坐標(TargetPoint)。
TargetPoint =PolarPoint(StartPoint,Angle,Distance)
圓弧的凸度n,可以通過AutoCAD自帶方法GetBulge(i)獲取,其參數i為當前弧段起始節點的點號。
圓弧端點A、B的坐標分別為(x1,y1)、(x2,y2),則圓弧弦長2s為:
圓弧拱高h為:
h=|(s÷2)×n|
圓弧的半徑r為:
r=(h2+s2)÷(h×2)
獲取圓弧AB的弦的方向角AngleAB可以采用AutoCAD自帶函數AngleFromXAxis,參數為A、B兩點坐標:
AngleAB=AngleFromXAxis(A,B)
求取圓弧頂點朝向圓心的方位角AngleMidPtVector,其中PI=3.1415926:
AngleMidPtVector=Sgn(n)×PI÷2+AngleAB
求取圓弧AB弦中點坐標PtMid(x,y):
x=(x1+x2)÷2
y=(y1+y2)÷2
采用AutoCAD自帶方法PolarPoint獲取圓弧AB對應的圓心坐標PtCircle:
PtCircle=PolarPoint(PtMid,AngleMidPtVector,r-h)
求取圓弧對應圓心坐標后,可以按照圓心到圓弧端點A、B的方位角,按照等角切分的原則,逐個角度算出對應圓弧上的坐標值,并添加到多段線中,從而實現圓弧向多段線的轉換。
3.3 程序實現
在AutuoCAD VBA二次開發環境編寫處理程序,將圓弧、圓及含有圓弧的多段線,轉換為全部為折線的多段線。以一段弧線轉折線為例,主要代碼如下:
dblChord=GetDist2D(dblP1(0),dblP1(1),dblP2(0),dblP2(1)) '求出弦長
dblSagitta=Abs(dblChord / 2 * objPL.GetBulge(i)) '求出拱高
dbl_Bugle_Radius=(dblSagitta ^ 2 + (dblChord / 2) ^ 2) / dblSagitta / 2 '求出半徑
dblAngle_tmp=objDoc.Utility.AngleFromXAxis(dblP1,dblP2) '弦的方向角
dblMidPt_NormalVector=Sgn(objPL.GetBulge(i)) * PI / 2 + dblAngle_tmp '圓弧頂點朝向圓心的方位角,始終在圓弧內側,通過dblAngle_tmp加減PI/2實現
dblMidPt_tmp2(0)=(dblP1(0) + dblP2(0)) / 2
dblMidPt_tmp2(1)=(dblP1(1) + dblP2(1)) / 2
dblMidPt_tmp=objDoc.Utility.PolarPoint(dblMidPt_tmp2,dblMidPt_NormalVector,dbl_Bugle_Radius - dblSagitta)
vCenterPoint=dblMidPt_tmp '圓心坐標
dblAngle1=objDoc.Utility.AngleFromXAxis(dblMidPt_tmp,dblP1)
dblAngle2=objDoc.Utility.AngleFromXAxis(dblMidPt_tmp,dblP2)
If objPL.GetBulge(i) < 0 Then '獲取當前i節點起始的凸度值,且為順時針方向
np=i
objPL.SetBulge i,0 '將第一段圓弧設為直線
dblAngle=dblAngle1
If dblAngle1>dblAngle2 Then '圓弧未跨過X正軸,angle1到angle2沿順時針遞減
For dbl=dblAngle1 To dblAngle2 Step-dblAngleValue’按照切分角度,切分圓弧
dblAngle=dblAngle-dblAngleValue
dblMidPt_tmp=objDoc.Utility.PolarPoint(vCenterPoint,dblAngle,dbl_Bugle_Radius)
newVertex(0)=dblMidPt_tmp(0)
newVertex(1)=dblMidPt_tmp(1)
objPL.AddVertex np+1,newVertex’增加多段線節點
np=np+1
Next dbl
End If
圓弧轉為折線,轉換后所得折線與圓弧不可避免存在一定誤差。折線點越多,越密集,與圓弧的誤差越小,折線也更加圓滑,反之,則誤差越大。在程序中,可以通過設置切分的角度值,調整轉折線后的節點數,從而調整轉換精度。角度值越小,折線節點越多,精度越高。圖3中,a為原圖,包含1個圓,2個圓弧及1個全部為圓弧組成的多段線,b、c、d分別為采用切分角度為1度角、4度角、8度角轉換后的折線,轉換后的點密度和折線平滑度區別明顯。

圖3 圓弧轉折線
使用本文的轉換方法,編寫數據處理程序,通過選擇集過濾選擇圓弧、圓及多段線,并分別予以折線化處理,達到了設計目的,解決了生產中的實際需求,提高了工作效率。但方法本身尚有不足之處,首先缺少對橢圓、樣條等特殊曲線的折線化處理;其次欠缺對塊參照中的圓弧處理過程。這些將是后續改進與完善的方向。
[1] 崔先國,張明波. AutoCAD中擴展圖元數據的應用[J]. 礦山測量,1999(8).
[2] 周蓉,杜曉榮,張麗華等. 圖形系統二次開發環境的研究與實現[J]. 合肥工業大學學報,2004.
[3] 黃杏元,馬勁松,湯勤. 地理信息系統概論[M]. 北京:高等教育出版社,2001.
[4] 錢業宏,花向紅. AutoCAD擴展數據在地形圖建庫中的應用[J]. 城市勘測,2008(1).
[5] 王建設,時東玉,禇喆等. AutoCAD二次開發解決二調數據采集中的問題[J]. 現代測繪,2008(6).
[6] 張帆. AutoCAD+VBA二次開發教程[M]. 北京:清華大學出版社,2006(6).
The Method of Converting the Arc Into Broken Lines and its Implementation in AutoCAD
Liu Hu
(Bengbu Design and Research Institute of Geotechnical Investigation and Surveying,Bengbu 233000,China)
As an important topographic map mapping software,AutoCAD contains a lot of arc graphic elements in the graph. Due to the arc only include endpoint or the coordinates of the center of circle,and the arc itself do not has accurate coordinate information which leading to some error when checking data. But AutoCAD software itself does not provide the function of change arc into broken lines. In this paper,we try to propose a new method for dividing the arc into broken lines. In the proposed method,equiangular segmentation algorithm is used and VBA language is adopted for algorithm developing;it can maintains the original feature and the accuracy of the figure,and convert the arc of the circle and the arc of the multi-lines into the multi section lines of the pure line,respectively,thereby the arc part is removed. The proposed method can meet the special needs of basic geographic information database construction.
AutoCAD;the arc;equiangular segmentation;broken line
1672-8262(2016)05-129-03
P209
B
2016—04—22
劉虎(1983—),男,碩士,工程師,主要從事GIS數據處理、地理信息工程開發、航空攝影測量等工作。