/// <summary>
 /// Проверить верхнюю точку диапазона координат подписи
 /// </summary>
 private static bool ValidateTopRange(ILineElementMicrostation lineStamp, ILineElementMicrostation topLine,
                                      ITextElementMicrostation stampField, bool isVertical) =>
 PointMicrostation.CompareCoordinate(lineStamp.StartPoint.Y, lineStamp.EndPoint.Y) &&
 ValidateByMiddleX(lineStamp, stampField) &&
 (!isVertical
         ? stampField.Range.OriginCenter.Y <lineStamp.StartPoint.Y &&
                                            (topLine == null || topLine.StartPoint.Y > lineStamp.StartPoint.Y)
                                            : stampField.Range.OriginCenter.Y> lineStamp.StartPoint.Y &&
  (topLine == null || topLine.StartPoint.Y < lineStamp.StartPoint.Y));
 /// <summary>
 /// Проверить левую точку диапазона координат подписи
 /// </summary>
 private static bool ValidateLeftRange(ILineElementMicrostation lineStamp, ILineElementMicrostation leftLine,
                                       ITextElementMicrostation stampField, bool isVertical) =>
 PointMicrostation.CompareCoordinate(lineStamp.StartPoint.X, lineStamp.EndPoint.X) &&
 ValidateByMiddleY(lineStamp, stampField) &&
 (!isVertical
         ? stampField.Range.OriginCenter.X <lineStamp.StartPoint.X &&
                                            (leftLine == null || leftLine.StartPoint.X > lineStamp.StartPoint.X)
                                            : stampField.Range.OriginCenter.X> lineStamp.StartPoint.X &&
  (leftLine == null || leftLine.StartPoint.X < lineStamp.StartPoint.X));
        /// <summary>
        /// Получить координаты и размеры поля для вставки подписей
        /// </summary>
        public static IResultAppValue <RangeMicrostation> GetSignatureRange(IResultAppCollection <ILineElementMicrostation> linesStamp,
                                                                            ITextElementMicrostation previousField,
                                                                            ITextElementMicrostation nextField, bool isVertical)
        {
            ILineElementMicrostation leftLine   = null;
            ILineElementMicrostation rightLine  = null;
            ILineElementMicrostation topLine    = null;
            ILineElementMicrostation bottomLine = null;

            foreach (var lineStamp in linesStamp.Value)
            {
                if (ValidateLeftRange(lineStamp, leftLine, previousField, isVertical))
                {
                    leftLine = lineStamp;
                }
                if (ValidateTopRange(lineStamp, topLine, nextField, isVertical))
                {
                    topLine = lineStamp;
                }
                if (ValidateRightRange(lineStamp, rightLine, nextField, isVertical))
                {
                    rightLine = lineStamp;
                }
                if (ValidateBottomRange(lineStamp, bottomLine, previousField, isVertical))
                {
                    bottomLine = lineStamp;
                }
            }

            return((leftLine != null && rightLine != null && topLine != null && bottomLine != null)
                    ? new RangeMicrostation(new PointMicrostation(leftLine.StartPoint.X, bottomLine.StartPoint.Y),
                                            new PointMicrostation(rightLine.StartPoint.X, topLine.StartPoint.Y)).
                   Map(range => new ResultAppValue <RangeMicrostation>(range))
                    : new ResultAppValue <RangeMicrostation>(new ErrorApplication(ErrorApplicationType.RangeNotValid,
                                                                                  "Диапазон подписи не найден")));
        }
 /// <summary>
 /// Проверить на пересечение по оси Y
 /// </summary>
 private static bool ValidateByMiddleY(ILineElementMicrostation lineStamp, ITextElementMicrostation stampField) =>
 stampField.Range.OriginCenter.Y > Math.Min(lineStamp.StartPoint.Y, lineStamp.EndPoint.Y) &&
 stampField.Range.OriginCenter.Y < Math.Max(lineStamp.StartPoint.Y, lineStamp.EndPoint.Y);