//过滤出所有面积
FilteredElementCollector areaCollector = new FilteredElementCollector(doc);
var areaCollectorlist = areaCollector.OfCategory(BuiltInCategory.OST_Areas).ToList();
//收集正确方向的ModelLine
List<Curve> continuousCurve = new List<Curve>();
//迭代每一个面积
for (int r = 0; r < areaCollectorlist.Count; r++)
{
Area area = areaCollectorlist.ElementAt(r) as Area;
area.GetBoundarySegments(options);
//迭代当前area的BoundarySegments
foreach (var segmentList in area.GetBoundarySegments(options))
{
//迭代出ModelLine
foreach (var segment in segmentList)
{
ModelLine modelLine = doc.GetElement(segment.ElementId) as ModelLine;
var modellocationcurve = modelLine.Location as LocationCurve;
curvelist.Add(modellocationcurve.Curve);
}
//重新对ModelLine排序,组成闭合的线路
//ElementAt(i)表示被比较的对象,ElementAt(a)为比较对象
//逻辑是对比较对象的终点GetEndPoint(1)要等于比较对象的起点GetEndPoint(0)
continuousCurve.Add(curvelist.First());
for (int i = 0; i < curvelist.Count; i++)
{
for (int a = 0; a < curvelist.Count; a++)
{
if (curvelist.ElementAt(i).GetEndPoint(1).IsAlmostEqualTo(curvelist.ElementAt(a).GetEndPoint(0)))
{
continuousCurve.Add(curvelist.ElementAt(a));
i = a - 1;
break;
}
}
if (continuousCurve.Count == curvelist.Count)
{
break;
}
}
for (int i = 0; i < continuousCurve.Count; i++)
{
profileCurve.Append(continuousCurve.ElementAt(i));
}
}
}