劉虎
(蚌埠市勘測設(shè)計研究院,安徽 蚌埠 233000)
?
AutoCAD中圓弧折線化方法與實(shí)現(xiàn)
劉虎*
(蚌埠市勘測設(shè)計研究院,安徽 蚌埠 233000)
AutoCAD作為一種重要的地形圖制圖軟件,圖中存在大量的圓弧圖元。由于圓弧只有端點(diǎn)或圓心坐標(biāo),弧線本身缺乏精確的坐標(biāo)信息,因此導(dǎo)致一些數(shù)據(jù)檢查時出錯。AutoCAD軟件本身不提供圓弧轉(zhuǎn)折線的功能。本文嘗試采用等角切分方法,利用VBA二次開發(fā)技術(shù),在保持圖形原有特征及精度要求的前提下,將圓弧、圓及多段線中的圓弧分別轉(zhuǎn)換為純折線的多段線,從而去除圓弧部分。滿足基礎(chǔ)地理信息數(shù)據(jù)庫建庫等特殊的數(shù)據(jù)需求。
AutoCAD;圓??;等角切分;折線
AutoCAD以其友好的界面設(shè)計,命令與鼠標(biāo)相結(jié)合的操作模式,尤其是強(qiáng)大的制圖與設(shè)計功能,豐富的二次開發(fā)環(huán)境,在工程制圖、地形圖測繪等領(lǐng)域應(yīng)用廣泛,成為矢量制圖生產(chǎn)的首要軟件之一[1]。軟件提供了包括各種圖形對象繪制、圖形編輯、三維模型構(gòu)建及相關(guān)標(biāo)注等豐富的制圖功能,能夠滿足大多數(shù)生產(chǎn)需要。但AutoCAD是一種面向各行業(yè)的通用軟件平臺,在一些特定領(lǐng)域略顯不足,如數(shù)據(jù)庫管理等[2]。國內(nèi)測繪行業(yè)多用AutoCAD作為地形圖繪制工具,而將現(xiàn)有AutoCAD格式地形圖轉(zhuǎn)為地理信息系統(tǒng)(GIS)數(shù)據(jù)時,不可避免的涉及精度與屬性問題[3]。在AutoCAD繪制地形圖中,在采集類似道路路口、花壇等有一定弧度的地物要素時,經(jīng)常采用圓弧或圓來繪制。采用圓弧,達(dá)到了方便、美觀的制圖目的,但其缺陷也是明顯的,弧線缺少精確的點(diǎn)位坐標(biāo)?;【€是通過一定參數(shù)模擬繪制出來的,缺乏坐標(biāo)明確標(biāo)示,在GIS數(shù)據(jù)拓?fù)涮幚碇校苋菀壮霈F(xiàn)重疊、縫隙等錯誤。如何將圓弧(包括圓弧、圓及多段線中的弧段)轉(zhuǎn)為具有明確坐標(biāo)的折線,就很有必要[4]。
AutoCAD本身不提供將圖形中圓弧轉(zhuǎn)為折線的命令或工具,一般采用第三方軟件來進(jìn)行圓弧轉(zhuǎn)折線。本文嘗試采用AutoCAD自帶的VBA二次開發(fā)技術(shù),制作一個數(shù)據(jù)處理工具,用于圖中圓弧向折線轉(zhuǎn)換,以期滿足GIS入庫需求,提高工作效率。
2.1 AutoCAD VBA二次開發(fā)
AutoCAD VBA二次開發(fā)環(huán)境是軟件自身攜帶的一種強(qiáng)大的軟件二次開發(fā)技術(shù),具有VB的基本語法特征,且能與AutoCAD運(yùn)行于同一處理空間,并通過ActiveX Automation接口實(shí)現(xiàn)對AutoCAD的編程控制,直接利用AutoCAD的圖形處理資源。可以通過AutoCAD命令VBAIDE啟動軟件開發(fā)環(huán)境,進(jìn)行程序編寫[5]。2.2 凸度
凸度在AutoCAD多段線中指一個頂點(diǎn)與下一個頂點(diǎn)之間形成的弧之間角度的1/4的正切值,用于設(shè)置一段多段線的彎曲程度。凸度為0代表一個直線段,凸度為1代表一個半圓段,介于0~1之間為劣弧,大于1為優(yōu)弧[6]。如圖1所示,圓弧AB對應(yīng)圓心角為a,拱高h(yuǎn),弦長2s,則圓弧AB的凸度n為:
n=tan(a÷4)=h÷s
圖1 凸度
3.1 技術(shù)流程
本文中處理的圓弧包括AutoCAD圖形文件中單獨(dú)繪制的圓弧(Arc)、圓(Circle)及多段線中弧段。圓弧折線化方法有兩種方式:等角和等距,這里采用等角方法。對于圓形,直接采用等角切分進(jìn)行折線化。單獨(dú)的圓弧,則先轉(zhuǎn)換為多段線,然后采用多段線圓弧轉(zhuǎn)折線的方法進(jìn)行轉(zhuǎn)換。總的技術(shù)流程如圖2所示。
圖2 圓弧折線化技術(shù)流程圖
3.2 圓弧折線化算法
在采用等角切分方法將圓弧轉(zhuǎn)折線的過程中,將用到AutoCAD自帶的一個方法:PolarPoint。其有三個參數(shù),分別為:起點(diǎn)(StartPoint)、角度(Angle)和距離(Distance)??梢酝ㄟ^起點(diǎn),按照一定角度,按照設(shè)定距離,獲取目標(biāo)點(diǎn)的坐標(biāo)(TargetPoint)。
TargetPoint =PolarPoint(StartPoint,Angle,Distance)
圓弧的凸度n,可以通過AutoCAD自帶方法GetBulge(i)獲取,其參數(shù)i為當(dāng)前弧段起始節(jié)點(diǎn)的點(diǎn)號。
圓弧端點(diǎn)A、B的坐標(biāo)分別為(x1,y1)、(x2,y2),則圓弧弦長2s為:
圓弧拱高h(yuǎn)為:
h=|(s÷2)×n|
圓弧的半徑r為:
r=(h2+s2)÷(h×2)
獲取圓弧AB的弦的方向角AngleAB可以采用AutoCAD自帶函數(shù)AngleFromXAxis,參數(shù)為A、B兩點(diǎn)坐標(biāo):
AngleAB=AngleFromXAxis(A,B)
求取圓弧頂點(diǎn)朝向圓心的方位角AngleMidPtVector,其中PI=3.1415926:
AngleMidPtVector=Sgn(n)×PI÷2+AngleAB
求取圓弧AB弦中點(diǎn)坐標(biāo)PtMid(x,y):
x=(x1+x2)÷2
y=(y1+y2)÷2
采用AutoCAD自帶方法PolarPoint獲取圓弧AB對應(yīng)的圓心坐標(biāo)PtCircle:
PtCircle=PolarPoint(PtMid,AngleMidPtVector,r-h)
求取圓弧對應(yīng)圓心坐標(biāo)后,可以按照圓心到圓弧端點(diǎn)A、B的方位角,按照等角切分的原則,逐個角度算出對應(yīng)圓弧上的坐標(biāo)值,并添加到多段線中,從而實(shí)現(xiàn)圓弧向多段線的轉(zhuǎn)換。
3.3 程序?qū)崿F(xiàn)
在AutuoCAD VBA二次開發(fā)環(huán)境編寫處理程序,將圓弧、圓及含有圓弧的多段線,轉(zhuǎn)換為全部為折線的多段線。以一段弧線轉(zhuǎn)折線為例,主要代碼如下:
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 '圓弧頂點(diǎn)朝向圓心的方位角,始終在圓弧內(nèi)側(cè),通過dblAngle_tmp加減PI/2實(shí)現(xiàn)
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 '圓心坐標(biāo)
dblAngle1=objDoc.Utility.AngleFromXAxis(dblMidPt_tmp,dblP1)
dblAngle2=objDoc.Utility.AngleFromXAxis(dblMidPt_tmp,dblP2)
If objPL.GetBulge(i) < 0 Then '獲取當(dāng)前i節(jié)點(diǎn)起始的凸度值,且為順時針方向
np=i
objPL.SetBulge i,0 '將第一段圓弧設(shè)為直線
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’增加多段線節(jié)點(diǎn)
np=np+1
Next dbl
End If
圓弧轉(zhuǎn)為折線,轉(zhuǎn)換后所得折線與圓弧不可避免存在一定誤差。折線點(diǎn)越多,越密集,與圓弧的誤差越小,折線也更加圓滑,反之,則誤差越大。在程序中,可以通過設(shè)置切分的角度值,調(diào)整轉(zhuǎn)折線后的節(jié)點(diǎn)數(shù),從而調(diào)整轉(zhuǎn)換精度。角度值越小,折線節(jié)點(diǎn)越多,精度越高。圖3中,a為原圖,包含1個圓,2個圓弧及1個全部為圓弧組成的多段線,b、c、d分別為采用切分角度為1度角、4度角、8度角轉(zhuǎn)換后的折線,轉(zhuǎn)換后的點(diǎn)密度和折線平滑度區(qū)別明顯。
圖3 圓弧轉(zhuǎn)折線
使用本文的轉(zhuǎn)換方法,編寫數(shù)據(jù)處理程序,通過選擇集過濾選擇圓弧、圓及多段線,并分別予以折線化處理,達(dá)到了設(shè)計目的,解決了生產(chǎn)中的實(shí)際需求,提高了工作效率。但方法本身尚有不足之處,首先缺少對橢圓、樣條等特殊曲線的折線化處理;其次欠缺對塊參照中的圓弧處理過程。這些將是后續(xù)改進(jìn)與完善的方向。
[1] 崔先國,張明波. AutoCAD中擴(kuò)展圖元數(shù)據(jù)的應(yīng)用[J]. 礦山測量,1999(8).
[2] 周蓉,杜曉榮,張麗華等. 圖形系統(tǒng)二次開發(fā)環(huán)境的研究與實(shí)現(xiàn)[J]. 合肥工業(yè)大學(xué)學(xué)報,2004.
[3] 黃杏元,馬勁松,湯勤. 地理信息系統(tǒng)概論[M]. 北京:高等教育出版社,2001.
[4] 錢業(yè)宏,花向紅. AutoCAD擴(kuò)展數(shù)據(jù)在地形圖建庫中的應(yīng)用[J]. 城市勘測,2008(1).
[5] 王建設(shè),時東玉,禇喆等. AutoCAD二次開發(fā)解決二調(diào)數(shù)據(jù)采集中的問題[J]. 現(xiàn)代測繪,2008(6).
[6] 張帆. AutoCAD+VBA二次開發(fā)教程[M]. 北京:清華大學(xué)出版社,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數(shù)據(jù)處理、地理信息工程開發(fā)、航空攝影測量等工作。