/// <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);