/// <summary>
/// 将输入边曲线按照首尾相连的方式进行重新排序
/// </summary>
/// <param name="allEdges">输入边曲线(需要调用方保证输入曲线为闭环曲线)</param>
/// <returns></returns>
public static List<Edge> CurveEdgeSort(this List<Edge> allEdges)
{
try
{
List<Edge> sortedEdges = new List<Edge>(); //存放排序后的线段
Point3d tmpPoint3d = new Point3d(); //记录上一条线段的终点
for (int i = 0; i < allEdges.Count; i++)
{
if (i == 0) //如果是第一次循环,则直接将第一条线段加入到集合中
{
sortedEdges.Add(allEdges[i]);
continue;
}
for (int j = 0; j < allEdges.Count; j++)
{
if (sortedEdges.Contains(allEdges[j])) //如果当前遍历的线段 在集合中已存在,则跳过本次循环
continue;
allEdges[j].GetVertices(out Point3d p1, out Point3d p2); //获取当前线段的两个端点
sortedEdges[sortedEdges.Count - 1].GetVertices(out Point3d q1, out Point3d q2);//获取集合中最后一条线段的两个端点
if (sortedEdges.Count == 1) //如果集合中只有一条线段,则在当前线段中任选一个端点(p1)与集合中的两个端点比较
{
//如果p1与q1或者q2相等,则添加这条线段到集合中,并将p2赋值给tmpPoint3d用于下次比较。
if (ComperTwoPoint3dIsEquals(q1, p1) || ComperTwoPoint3dIsEquals(q2, p1))
{
sortedEdges.Add(allEdges[j]);
tmpPoint3d = p2;
continue;
}
}
else
{
if (ComperTwoPoint3dIsEquals(tmpPoint3d, p1)) //如果p1与上次记录的终点相等,则添加线段,并将p2作为下次比较的对象
{
sortedEdges.Add(allEdges[j]);
tmpPoint3d = p2;
continue;
}
if (ComperTwoPoint3dIsEquals(tmpPoint3d, p2)) //如果p2与上次记录的终点相等,则添加线段,并将p1作为下次比较的对象
{
sortedEdges.Add(allEdges[j]);
tmpPoint3d = p1;
continue;
}
}
}
}
bool ComperTwoPoint3dIsEquals(Point3d pA, Point3d pB)
{
return pA.X.Eq(pB.X) && pA.Y.Eq(pB.Y) && pA.Z.Eq(pB.Z);
}
return sortedEdges;
}
catch (Exception ex)
{
theUI.NXMessageBox.Show("提醒", NXMessageBox.DialogType.Error, $"闭环边曲线排序函数引发异常,异常原因:{ex.Message}");
return allEdges; //引发异常时返回原数据
}
}
NX二次开发 NXOPEN 将乱序封闭曲线按照首尾相连方式重新排序
最新推荐文章于 2024-07-14 12:25:25 发布