如何在Bricscad中正确还原多段线圆弧段为临时圆弧?
BricsCAD中还原Lwpolyline圆弧段的起止角度问题解决
问题描述
处理带圆弧段的2D Lwpolyline时,通过代码将圆弧段转为Arc实体,虽然中心、半径参数正确,但生成的圆弧起止位置与原多段线圆弧段不符,导致后续操作出错。对比数据显示:
- 程序生成圆弧的起止角度:0.00/143.11
- 手动创建的正确圆弧起止角度:356.38/139.48
原代码片段:
if (pline.GetSegmentType(i) == _AcDb.SegmentType.Arc) { _AcGe.CircularArc2d arcSeg = pline.GetArcSegment2dAt(i); _AcGe.Point3d center = new _AcGe.Point3d(arcSeg.Center.X, arcSeg.Center.Y, 0); _AcGe.Vector3d normal = _AcGe.Vector3d.ZAxis; using (_AcDb.Arc segAsArc = new _AcDb.Arc( center, normal, arcSeg.Radius, arcSeg.StartAngle, arcSeg.EndAngle)) { if (segAsArc.Length >= minCreaseLength) { DrawCounterFromArc(segAsArc, indentLength, counterWidth, btr, acTrans); segAsArc.Layer = "0"; btr.AppendEntity(segAsArc); acTrans.AddNewlyCreatedDBObject(segAsArc, true); } } // arc is automatically disposed here continue; }
问题根源
Lwpolyline的圆弧段角度基于多段线局部坐标系,而Arc实体的角度是世界坐标系下的绝对角度,直接复用CircularArc2d的StartAngle和EndAngle会导致基准不匹配。另外,原多段线的圆弧方向(顺时针/逆时针)由bulge值决定,CircularArc2d默认的角度方向可能与原多段线不一致。
修正方案
通过多段线的实际起止点和bulge值来还原Arc实体,确保角度和方向与原圆弧段完全一致:
if (pline.GetSegmentType(i) == _AcDb.SegmentType.Arc) { _AcGe.CircularArc2d arcSeg = pline.GetArcSegment2dAt(i); // 获取原多段线圆弧段的世界坐标系起止点 _AcGe.Point3d startPt = pline.GetPointAt(i); _AcGe.Point3d endPt = pline.GetPointAt(i + 1); _AcGe.Point3d center = new _AcGe.Point3d(arcSeg.Center.X, arcSeg.Center.Y, 0); _AcGe.Vector3d normal = _AcGe.Vector3d.ZAxis; using (_AcDb.Arc segAsArc = new _AcDb.Arc()) { segAsArc.Center = center; segAsArc.Radius = arcSeg.Radius; segAsArc.Normal = normal; // 设置起止点,让Arc自动匹配基础角度 segAsArc.StartPoint = startPt; segAsArc.EndPoint = endPt; // 根据bulge值修正圆弧方向:bulge负为顺时针,需调整角度顺序 double bulge = pline.GetBulgeAt(i); if (bulge < 0) { double tempAngle = segAsArc.StartAngle; segAsArc.StartAngle = segAsArc.EndAngle; segAsArc.EndAngle = tempAngle; } if (segAsArc.Length >= minCreaseLength) { DrawCounterFromArc(segAsArc, indentLength, counterWidth, btr, acTrans); segAsArc.Layer = "0"; btr.AppendEntity(segAsArc); acTrans.AddNewlyCreatedDBObject(segAsArc, true); } } continue; }
关键说明
- 直接使用
pline.GetPointAt()获取世界坐标系下的起止点,避免角度坐标系转换误差 - 利用bulge值判断圆弧方向:bulge为正代表逆时针圆弧,为负代表顺时针圆弧,需交换Arc的起止角度以匹配原方向
- 先通过起止点让Arc自动计算角度,再修正方向,确保生成的Arc与原多段线圆弧段完全重合
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

