예제 #1
0
        /// <summary>
        /// Установить внешнюю сторону связанных объектов
        /// </summary>
        /// <param name="firstCurve">Начальный объект</param>
        /// <param name="point">Точка связки с цепочкой</param>
        /// <returns>Признак замкнутой цепочки</returns>
        private static bool SetOutsideConnectObjects(ProcessCurve firstCurve, Point3d point)
        {
            var curve = firstCurve;

            while (true)
            {
                var connectCurve = ProcessCurves.FirstOrDefault(p => p.ObjectId != curve.ObjectId && (p.StartPoint == point || p.EndPoint == point));
                if (connectCurve == null || connectCurve == firstCurve)
                {
                    return(connectCurve == firstCurve); // если тру значит замкнута
                }
                var direct = (curve.EndPoint == connectCurve.StartPoint || curve.StartPoint == connectCurve.EndPoint)
                    ? 1 // направление не меняется
                    : -1;
                //if (obj.ProcessCurve is Line ^ connectObject.ProcessCurve is Line) // если разные типы кривой
                //    k = -k;
                connectCurve.OutsideSign = direct * curve.OutsideSign;

                curve = connectCurve;
                point = point == curve.StartPoint ? curve.EndPoint : curve.StartPoint;
            }
        }
예제 #2
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); // то проставляем с другого конца
            }
        }