NX二次开发 NXOPEN 将乱序封闭曲线按照首尾相连方式重新排序

        /// <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;  //引发异常时返回原数据
            }
        }

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值