using Autodesk.Revit.DB; namespace ShrlAlgoToolkit.Revit.Assists; internal static class SpatialAssist { private static List _curvesSorted; /// /// 连成线串 /// /// /// private static void SortOpenedContinuousCurves(Curve initCurve, List sourceCurves) { if (sourceCurves == null) { return; } //if (sourceCurves.Count <= 2) //{ // return; //} var start = initCurve.GetEndPoint(0); var end = initCurve.GetEndPoint(1); //curvesSorted.Add(initCurve); sourceCurves.Remove(initCurve); for (var i = sourceCurves.Count - 1; i >= 0; i--) { if (sourceCurves.Count == 0) { break; } if (i >= sourceCurves.Count) { i = sourceCurves.Count - 1; } //var anotherCurve = sourceCurves[i]; var comparisonR = initCurve.Intersect(sourceCurves[i], out var _); //圆 if (comparisonR == SetComparisonResult.Disjoint && initCurve is Arc && sourceCurves[i] is Arc) { var curves = new List() { initCurve, sourceCurves[i] }; try { var loop = CurveLoop.Create(curves);//如果报错,说明两个半圆没形成圆,是不连续的; _curvesSorted = curves; //移除当前的线段 sourceCurves.Remove(sourceCurves[i]); return; } catch (Exception) { } } if (SetComparisonResult.Overlap == comparisonR) { //XYZ point = null; //if (intersectionR != null && !intersectionR.IsEmpty) //{ // point = intersectionR.get_Item(0).XYZPoint; //} var start1 = sourceCurves[i].GetEndPoint(0); var end1 = sourceCurves[i].GetEndPoint(1); if (end.IsAlmostEqualTo(start1))//顺序连接 { _curvesSorted.Add(sourceCurves[i]); } if (end.IsAlmostEqualTo(end1))//终点一样,反向加到后面 { sourceCurves[i] = sourceCurves[i].CreateReversed();//替换掉,才能保证移除的对象是同一个 _curvesSorted.Add(sourceCurves[i]); } if (start.IsAlmostEqualTo(start1))//起点一样,反向插到前面 { sourceCurves[i] = sourceCurves[i].CreateReversed(); _curvesSorted.Insert(_curvesSorted.IndexOf(initCurve), sourceCurves[i]); } if (start.IsAlmostEqualTo(end1))//顺序连接,但是在前面 { _curvesSorted.Insert(_curvesSorted.IndexOf(initCurve), sourceCurves[i]); } SortOpenedContinuousCurves(sourceCurves[i], sourceCurves); } } } /// /// 转线串 /// /// /// public static List> ToCurveLoops(List curves) { List> list = []; while (curves.Any()) { _curvesSorted = [ curves[0] ]; if (!curves[0].IsBound) { curves.Remove(curves[0]); list.Add(_curvesSorted); continue; } SortOpenedContinuousCurves(curves[0], curves); list.Add(_curvesSorted); } //for (var i = 0; i < 100; i++) //{ // try // { // if (!curves.Any()) // { // break; // } // _curvesSorted = new() // { // curves[0] // }; // if (!curves[0].IsBound) // { // curves.Remove(curves[0]); // list.Add(_curvesSorted); // continue; // } // SortOpenedContinuousCurves(curves[0], curves); // } // catch (Exception ex) // { // Debug.Write(ex.StackTrace); // } // list.Add(_curvesSorted); // if (!curves.Any()) // { // break; // } //} return list; } }