namespace QWERTYkez.ExcelProcessor
{
///
/// Представляет ширину столбца в Excel. Поддерживает задание в символах, пунктах, сантиметрах и миллиметрах.
/// Для методов FromCM/FromMM/FromPoints требуется калибровка через , иначе точность не гарантирована.
///
public readonly struct ColumnWidth
{
private readonly double _rawValue;
private readonly UnitType _unit;
private enum UnitType { Characters, Points, Centimeters, Millimeters }
/// Коэффициент перевода символов в пункты по умолчанию (используется, если нет калибровочной таблицы).
public static double DefaultPointsPerChar { get; set; } = 5.65;
private ColumnWidth(double value, UnitType unit)
{
_rawValue = value;
_unit = unit;
}
/// Задаёт ширину в character units (символах стандартного шрифта).
public static ColumnWidth FromCharacters(double characters) => new(characters, UnitType.Characters);
/// Задаёт ширину в пунктах.
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
public static ColumnWidth FromPoints(double points) => new(points, UnitType.Points);
/// Задаёт ширину в сантиметрах.
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
public static ColumnWidth FromCM(double cm) => new(cm, UnitType.Centimeters);
/// Задаёт ширину в миллиметрах.
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
public static ColumnWidth FromMM(double mm) => new(mm, UnitType.Millimeters);
/// Возвращает целевую ширину в пунктах (если ширина задана в пунктах, см или мм).
internal double GetTargetPoints()
{
return _unit switch
{
UnitType.Points => _rawValue,
UnitType.Centimeters => _rawValue * 28.3464566929,
UnitType.Millimeters => (_rawValue / 10.0) * 28.3464566929,
_ => double.NaN
};
}
internal double GetTargetCentimeters()
{
return _unit switch
{
UnitType.Centimeters => _rawValue,
UnitType.Millimeters => _rawValue / 10.0,
UnitType.Points => _rawValue / 28.3464566929,
_ => double.NaN
};
}
internal bool IsCharacterUnit => _unit == UnitType.Characters;
internal double CharacterValue => IsCharacterUnit ? _rawValue : double.NaN;
}
}