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