Exemple #1
0
        /// <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); // то проставляем с другого конца
            }
        }