Revit:处理闭合回路中Curve方向的过程中出现的循环问题

首先看一段代码:

Autodesk.Revit.DB.XYZ temp = lines.get_Item(0).GetEndPoint(1);
         Curve temCurve = lines.get_Item(0);
         Profile.Append(temCurve);
         while (Profile.Size != lines.Size)
         {
            temCurve = GetNext(lines, temp, temCurve);
            if (Math.Abs(temp.X - temCurve.GetEndPoint(0).X) < PRECISION
                && Math.Abs(temp.Y - temCurve.GetEndPoint(0).Y) < PRECISION)
            {
               temp = temCurve.GetEndPoint(1);
            }
            else
            {
               temp = temCurve.GetEndPoint(0);
            }
            Profile.Append(temCurve);
         }

稍微解释一下,获取到的Curve集合lines,对其进行排序,使curve首尾相连,且方向一致(即下一条线的起点与上一条线的终点重合),按顺序添加到profile中。

之前碰巧做过这个功能,倒是也实现了,但是中间的逻辑相对复杂:先将随便一条线添加到一个新的newlist中,然后对其中的第一条线:newlist.last进行判断,找到与其有重合点的第二条线,然后添加到newlist中,然后再对newlist.last进行判断。。。。同时,原有的oldlist中已经筛选出来的元素,还必须得删除掉,不然循环进行不下去。过程中的逻辑毕竟繁琐,且需对list进行删除操作(倒序)。

而上面这段贴出来的代码则极大的简化了我之前的代码逻辑:首先取到第一条曲线temp,然后GETnext,就是与之相连的曲线;

然后取到以后呢,将与之相连的曲线赋值给变量temp。这样的话,每次循环,操作对象都是最新的那条曲线,免去了取最后一条。

绝妙的是这个while循环,我第一遍是没看懂,为什么没有内部变量i,i++这样的东西?这就对了,看似只有一层循环,其实执行的是两层循环的功能。全有Bool表达式来控制,一直到PROFILE全部取到。

猜你喜欢

转载自blog.csdn.net/niaxiapia/article/details/80918850
今日推荐