|
发表于 2021-1-29 14:30:00
|
显示全部楼层
///
/// 将Line Arc LWPolyline 编辑成LWPolyline,能连接在一起的连接起来
/// 要求端点相接
/// Version : 2007.09.19 Sieben
/// 2007.11.01有改动,未做详细测试
/// 2008.02.14 修改封闭曲线时导致出现零节点的问题
///
/// 第一曲线,若两条曲线连接成一条,则新曲线使用第一曲线一般属性(有例外),不应该为null
/// 第二曲线,可以为null,这时是编辑单个实体
/// 一个距离数值,用于作为判断两点重合的标准
/// 成功返回aPolyline,否则返回null
public static aPolyline JoinPolyline(Curve cur1, Curve cur2, double dTol)
{
try
{
//ae.WriteMessage("\nadb.JoinPolyline start ");
aPolyline pline = null;
if (cur1 == null || cur1.Closed) return null;
if (!cur1.GetType().Equals(typeof(aPolyline)))
{
#region !aPolylineine Arc aPolyline
if (cur2 != null && cur2.GetType().Equals(typeof(aPolyline)))
{//第一曲线为非aPolyline,而第二曲线为aPolyline,这时以第二曲线作为第一曲线重新调用函数,此举只为减少代码
return aCur.JoinPolyline(cur2, cur1, dTol);
}
pline = new aPolyline();
if (cur1.GetType().Equals(typeof(Line)))//Line:?
{//曲线为 Line,使用其数据生成一个aPolyline
Line line = (Line)cur1;
pline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
pline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
pline.SetPropertiesFrom(line);//使用原来实体属性
if (cur2 != null)//若第二曲线不为空,则试图连接两者
pline = aCur.JoinPolyline(pline, cur2, dTol);
return pline;//将新生成的多段线提交到数据库
}
else if (cur1.GetType().Equals(typeof(Arc)))//Arc:?
{//曲线为 Line,使用其数据生成一个aPolyline
Arc arc = (Arc)cur1;
Point3d p1 = arc.GetPointAtParameter(arc.EndParam * 0.5 + arc.StartParam * 0.5);
double dltAng = arc.EndAngle - arc.StartAngle;
if (dltAng = 0; i--)
{
pline.AddVertexAt(pline.NumberOfVertices, pline2.GetPoint2dAt(i), 0, 0, 0);
pline.SetBulgeAt(pline.NumberOfVertices - 2, -pline2.GetBulgeAt(i));
}
}
else if (pline.StartPoint.DistanceTo(pline2.StartPoint) = 0; i--)
{
pline.AddVertexAt(0, pline2.GetPoint2dAt(i), 0, 0, 0);
pline.SetBulgeAt(0, pline2.GetBulgeAt(i));
}
}
#endregion aPolyline:aPolyline
}
else
{
return null;
}
if (pline.StartPoint.DistanceTo(pline.EndPoint) < dTol) //如果曲线起点和终点重合,将Closed = true
{
pline.Closed = true;
//2008.02.14注意:即使起点和终点已重合,pline.Closed = true还是会增加一个节点,导致多段线出现零节点
pline.RemoveVertexAt(pline.NumberOfVertices - 1);
}
return pline;
#endregion aPolylineine Arc aPolyline
}
return pline;
}
catch (System.Exception ex)
{
ae.WriteMessage(ex);
return null;
}
}
非不想分享全部,但涉及的代码太多了,没有时间。 |
|