AutoCAD中圆弧折线化方法与实现

2016-11-28 07:14刘虎
城市勘测 2016年5期
关键词:凸度折线二次开发

刘虎

(蚌埠市勘测设计研究院,安徽 蚌埠 233000)



AutoCAD中圆弧折线化方法与实现

刘虎*

(蚌埠市勘测设计研究院,安徽 蚌埠 233000)

AutoCAD作为一种重要的地形图制图软件,图中存在大量的圆弧图元。由于圆弧只有端点或圆心坐标,弧线本身缺乏精确的坐标信息,因此导致一些数据检查时出错。AutoCAD软件本身不提供圆弧转折线的功能。本文尝试采用等角切分方法,利用VBA二次开发技术,在保持图形原有特征及精度要求的前提下,将圆弧、圆及多段线中的圆弧分别转换为纯折线的多段线,从而去除圆弧部分。满足基础地理信息数据库建库等特殊的数据需求。

AutoCAD;圆弧;等角切分;折线

1 前 言

AutoCAD以其友好的界面设计,命令与鼠标相结合的操作模式,尤其是强大的制图与设计功能,丰富的二次开发环境,在工程制图、地形图测绘等领域应用广泛,成为矢量制图生产的首要软件之一[1]。软件提供了包括各种图形对象绘制、图形编辑、三维模型构建及相关标注等丰富的制图功能,能够满足大多数生产需要。但AutoCAD是一种面向各行业的通用软件平台,在一些特定领域略显不足,如数据库管理等[2]。国内测绘行业多用AutoCAD作为地形图绘制工具,而将现有AutoCAD格式地形图转为地理信息系统(GIS)数据时,不可避免的涉及精度与属性问题[3]。在AutoCAD绘制地形图中,在采集类似道路路口、花坛等有一定弧度的地物要素时,经常采用圆弧或圆来绘制。采用圆弧,达到了方便、美观的制图目的,但其缺陷也是明显的,弧线缺少精确的点位坐标。弧线是通过一定参数模拟绘制出来的,缺乏坐标明确标示,在GIS数据拓扑处理中,很容易出现重叠、缝隙等错误。如何将圆弧(包括圆弧、圆及多段线中的弧段)转为具有明确坐标的折线,就很有必要[4]。

AutoCAD本身不提供将图形中圆弧转为折线的命令或工具,一般采用第三方软件来进行圆弧转折线。本文尝试采用AutoCAD自带的VBA二次开发技术,制作一个数据处理工具,用于图中圆弧向折线转换,以期满足GIS入库需求,提高工作效率。

2 AutoCAD VBA开发与凸度

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 技术流程

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 圆弧转折线

4 结 论

使用本文的转换方法,编写数据处理程序,通过选择集过滤选择圆弧、圆及多段线,并分别予以折线化处理,达到了设计目的,解决了生产中的实际需求,提高了工作效率。但方法本身尚有不足之处,首先缺少对椭圆、样条等特殊曲线的折线化处理;其次欠缺对块参照中的圆弧处理过程。这些将是后续改进与完善的方向。

[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数据处理、地理信息工程开发、航空摄影测量等工作。

猜你喜欢
凸度折线二次开发
利用轴线交错修整砂轮凸度曲线的方法探讨
平面分割问题的探究之旅
3800mm中板轧机变凸度工作辊辊形研究①
基于精轧平坦度优先的凸度分配策略
异步凸度轧制对AZ31镁合金板坯损伤抑制分析
浅谈基于Revit平台的二次开发
浅谈Mastercam后处理器的二次开发
折线的舞台——谈含绝对值的一次函数的图象
西门子Easy Screen对倒棱机床界面二次开发
折线