首先看一段代码:
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全部取到。