/// <summary> /// Gets the unit. /// </summary> /// <param name="current">The current.</param> /// <param name="levelFromCurrent">How much levels from the current unit? same factors are ignored</param> /// <returns></returns> public measureSystemUnitEntry GetUnit(measureSystemUnitEntry current, Int32 levelFromCurrent) { measureUnitLevelChange direction = measureUnitLevelChange.optimum; measureSystemUnitEntry candidate = current; measureSystemUnitEntry next = null; if (levelFromCurrent < 0) { direction = measureUnitLevelChange.goLower; } if (levelFromCurrent > 0) { direction = measureUnitLevelChange.goHigher; } if (direction == measureUnitLevelChange.optimum) { return(current); } levelFromCurrent = Math.Abs(levelFromCurrent); do { next = GetUnit(candidate, direction); levelFromCurrent--; if (candidate == next) { break; } candidate = next; } while (levelFromCurrent > 0); return(candidate); }
/// <summary> /// Gets next unit in specified direction <see cref="measureUnitLevelChange"/> /// </summary> /// <param name="current">The current.</param> /// <param name="direction">The direction to get next unit</param> /// <returns>Next defined unit level with different factor</returns> public measureSystemUnitEntry GetUnit(measureSystemUnitEntry current, measureUnitLevelChange direction) { var cindex = units.IndexOf(current); double cfactor = current.factor; measureSystemUnitEntry candidate = current; do { if (direction == measureUnitLevelChange.goLower) { if (cindex > 0) { cindex--; } else { break; } } else if (direction == measureUnitLevelChange.goHigher) { if (cindex < (units.Count - 1)) { cindex++; } else { break; } } else { break; } candidate = units[cindex]; if (candidate == null) { break; } } while (candidate.factor == cfactor); return(candidate); }
/// <summary> /// Gets the factor distance. /// </summary> /// <param name="current">The current.</param> /// <param name="direction">The direction.</param> /// <returns></returns> public double GetFactorDistance(measureSystemUnitEntry current, measureUnitLevelChange direction) { measureSystemUnitEntry next = GetUnit(current, direction); return(current.GetFactorDistance(next)); }