/// <summary> /// Возвращает все допустимые варианты /// </summary> /// <param name="request"></param> /// <returns></returns> private IEnumerable <BrickVariant> GetAllVariants(BrickRequest request) { if (request.MinimalScaleBehavior == MiniamlScaleBehavior.KeepZero) { if (request.SourceMinValue > 0) { request.SourceMinValue = 0; } } if (request.MaxDelimit <= 0) { request.MaxDelimit = DecideBestMaxDelimit(request.Size); } if (request.MinDelimit <= 0) { request.MinDelimit = DecideBestMinDelimit(request.Size); } foreach (var i in Bricks) { var variant = new BrickVariant { BrickSize = i, Request = request, Catalog = this }; if (variant.BrickCount <= request.MaxDelimit && variant.BrickCount >= request.MinDelimit) { yield return(variant); } } }
/// <summary> /// Подбирает лучший вариант "кладки" /// </summary> /// <param name="request"></param> /// <returns></returns> public BrickVariant GetBestVariant(BrickRequest request) { if (request.SourceMinValue == request.SourceMaxValue) { if (request.SourceMinValue != 0 && request.MinimalScaleBehavior == MiniamlScaleBehavior.KeepZero) { if (request.SourceMinValue > 0) { request.SourceMinValue = 0; } else { request.SourceMaxValue = 0; } } else { return(GetSafeVariant(request)); } } var result = GetAllVariants(request).Select(_ => _.Optimize()).OrderBy(_ => _, new BrickVariantComparer()).FirstOrDefault(); if (null == result) { return(GetSafeVariant(request)); } if (!WellFormedScale(result)) { result = NormalizeOnlyMaxValue(request); } return(result); }
private static BrickVariant GetSafeVariant(BrickRequest request) { var variant = new BrickVariant(); variant.BuildForEqual(request); return(variant); }
private void CalculateFirstScale() { if (0 == Preferences.YFixMin && 0 == Preferences.YFixMin && 0 == Preferences.YFixDiv) { if (FirstScale == null) { var realMin = GetMin(); var realMax = GetMax(); var req = new BrickRequest { SourceMinValue = realMin, SourceMaxValue = realMax }; req.Setup(Preferences.Y, Preferences.YMin, Preferences.YMax, Preferences.YTop.ToString(), Preferences.YSignDelta.ToString()); var cat = new BrickCatalog(); var result = cat.GetBestVariant(req); FirstScale = new Scale { Prepared = true, Min = result.ResultMinValue, Max = result.ResultMaxValue, DivLines = result.ResultDivCount }; } FirstScale.ValueInPixel = BrickDataSetHelper.GetValuesInPixel(FirstScale.Min, FirstScale.Max, Preferences.Height); } else { FirstScale = new Scale(); } }
private void CalculateSecondScale() { if (0 == Preferences.SYFixMin && 0 == Preferences.SYFixMin && 0 == Preferences.SYFixDiv) { var realMin = GetMin(ScaleType.Second); var realMax = GetMax(ScaleType.Second); var req = new BrickRequest { SourceMinValue = realMin, SourceMaxValue = realMax }; req.Setup(Preferences.SY, Preferences.SYMin, Preferences.SYMax, Preferences.SYTop.ToString(), Preferences.SYSignDelta.ToString()); var cat = new BrickCatalog(); var result = cat.GetBestVariant(req); SecondScale = new Scale { Prepared = true, Min = result.ResultMinValue, Max = result.ResultMaxValue, DivLines = result.ResultDivCount, }; SecondScale.ValueInPixel = (SecondScale.Max - SecondScale.Min) / Preferences.Height; } else { SecondScale = new Scale(); } }
private BrickVariant NormalizeOnlyMaxValue(BrickRequest request) { var initialsize = request.Size; request.MaxDelimit = 0; request.MinDelimit = 0; request.Size = 800; var result = GetAllVariants(request).Select(_ => _.Optimize()).OrderBy(_ => _, new BrickVariantComparer()).FirstOrDefault(); result.BrickSize = result.BrickMaxValue; result.BrickCount = 1; request.Size = initialsize; return(result); }
/// <summary> /// /// </summary> /// <param name="request"></param> public void BuildForEqual(BrickRequest request) { var r = request.Copy(); if (request.SourceMinValue == 0) { r.SourceMaxValue = 100; } else if (request.SourceMinValue < 0) { r.SourceMaxValue = 0; } else { r.SourceMaxValue = r.SourceMinValue; r.SourceMinValue = 0; } this.Request = r; }