namespace CutList.Web.Data.Entities;
///
/// Base class for material dimensions. Each shape has its own derived class with specific properties.
///
public abstract class MaterialDimensions
{
public int Id { get; set; }
public int MaterialId { get; set; }
public Material Material { get; set; } = null!;
///
/// Generates a display string for the size based on the dimensions.
///
public abstract string GenerateSizeString();
///
/// Gets the primary dimension value for sorting (in thousandths of an inch).
///
public abstract int GetSortOrder();
}
///
/// Dimensions for Round Bar: solid round stock.
///
public class RoundBarDimensions : MaterialDimensions
{
public decimal Diameter { get; set; }
public override string GenerateSizeString() =>
FormatDimension(Diameter);
public override int GetSortOrder() => (int)(Diameter * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Round Tube: hollow round stock.
///
public class RoundTubeDimensions : MaterialDimensions
{
public decimal OuterDiameter { get; set; }
public decimal Wall { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(OuterDiameter)} OD x {FormatDimension(Wall)} wall";
public override int GetSortOrder() => (int)(OuterDiameter * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Flat Bar: rectangular solid stock.
///
public class FlatBarDimensions : MaterialDimensions
{
public decimal Width { get; set; }
public decimal Thickness { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(Width)} x {FormatDimension(Thickness)}";
public override int GetSortOrder() => (int)(Width * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Square Bar: solid square stock.
///
public class SquareBarDimensions : MaterialDimensions
{
public decimal Size { get; set; }
public override string GenerateSizeString() =>
FormatDimension(Size);
public override int GetSortOrder() => (int)(Size * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Square Tube: hollow square stock.
///
public class SquareTubeDimensions : MaterialDimensions
{
public decimal Size { get; set; }
public decimal Wall { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(Size)} x {FormatDimension(Wall)} wall";
public override int GetSortOrder() => (int)(Size * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Rectangular Tube: hollow rectangular stock.
///
public class RectangularTubeDimensions : MaterialDimensions
{
public decimal Width { get; set; }
public decimal Height { get; set; }
public decimal Wall { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(Width)} x {FormatDimension(Height)} x {FormatDimension(Wall)} wall";
public override int GetSortOrder() => (int)(Width * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Angle: L-shaped stock.
///
public class AngleDimensions : MaterialDimensions
{
public decimal Leg1 { get; set; }
public decimal Leg2 { get; set; }
public decimal Thickness { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(Leg1)} x {FormatDimension(Leg2)} x {FormatDimension(Thickness)}";
public override int GetSortOrder() => (int)(Leg1 * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for Channel: C-shaped stock.
///
public class ChannelDimensions : MaterialDimensions
{
public decimal Height { get; set; }
public decimal Flange { get; set; }
public decimal Web { get; set; }
public override string GenerateSizeString() =>
$"{FormatDimension(Height)} x {FormatDimension(Flange)} x {FormatDimension(Web)}";
public override int GetSortOrder() => (int)(Height * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}
///
/// Dimensions for I-Beam: wide flange beam.
///
public class IBeamDimensions : MaterialDimensions
{
public decimal Height { get; set; }
public decimal WeightPerFoot { get; set; }
public override string GenerateSizeString() =>
$"W{Height:0.##} x {WeightPerFoot:0.##}";
public override int GetSortOrder() => (int)(Height * 1000);
}
///
/// Dimensions for Pipe: nominal pipe size.
///
public class PipeDimensions : MaterialDimensions
{
public decimal NominalSize { get; set; }
public decimal? Wall { get; set; }
public string? Schedule { get; set; }
public override string GenerateSizeString() =>
!string.IsNullOrEmpty(Schedule)
? $"{FormatDimension(NominalSize)} NPS Sch {Schedule}"
: $"{FormatDimension(NominalSize)} NPS x {FormatDimension(Wall ?? 0)} wall";
public override int GetSortOrder() => (int)(NominalSize * 1000);
private static string FormatDimension(decimal value) =>
CutList.Core.Formatting.ArchUnits.FormatFromInches((double)value);
}