/// <summary> /// Расчет внешней стороны для цепочки объектов /// </summary> /// <param name="curve">Начальный объект</param> public static void CalcOutside(ProcessCurve curve) { if (curve.Type == CurveType.Circle) { curve.OutsideSign = -1; return; } var vector = AutocadUtils.GetFirstDerivative(curve.ObjectId, curve.StartPoint); // набор вершин var vertexSet = new HashSet <Point3d>(ProcessCurves.SelectMany(p => p.Type == CurveType.Polyline ? AutocadUtils.GetPoints(p.ObjectId) : new List <Point3d> { p.StartPoint, p.EndPoint })); var sign = -Math.Sign(vertexSet.Sum(p => Math.Sign(vector.CrossProduct(p - curve.StartPoint).Z))); curve.OutsideSign = sign != 0 ? sign : 1; //если не определили то берем 1 if (!SetOutsideConnectObjects(curve, curve.EndPoint)) // если не замкнута { SetOutsideConnectObjects(curve, curve.StartPoint); // то проставляем с другого конца } }