Files
BoxPacker3D/Models.cs
T
2026-06-05 22:02:32 +02:00

97 lines
2.9 KiB
C#

using System;
using System.Drawing;
namespace BoxPacker3D
{
public class Box
{
public double W { get; set; }
public double H { get; set; }
public double D { get; set; }
/// <summary>Thickness of the cardboard/material wall in the same units (mm).</summary>
public double WallThickness { get; set; }
public Box(double w, double h, double d, double wallThickness = 0)
{
W = w; H = h; D = d; WallThickness = wallThickness;
}
/// <summary>Outer volume.</summary>
public double Volume => W * H * D;
/// <summary>Usable interior volume (after subtracting wall thickness on all 6 sides).</summary>
public double InnerVolume
{
get
{
double iw = Math.Max(0, W - 2 * WallThickness);
double ih = Math.Max(0, H - 2 * WallThickness);
double id = Math.Max(0, D - 2 * WallThickness);
return iw * ih * id;
}
}
}
public class Item
{
public string Name { get; set; }
public double W { get; set; }
public double H { get; set; }
public double D { get; set; }
public Color Color { get; set; }
public Item(string name, double w, double h, double d, Color color)
{
Name = name; W = w; H = h; D = d; Color = color;
}
public double Volume => W * H * D;
public bool FitsInBox(Box box)
{
// Check allowed rotations (horizontal only - height preserved)
double[] dims = { W, H, D };
var rotations = GetRotations();
foreach (var r in rotations)
if (r[0] <= box.W && r[1] <= box.H && r[2] <= box.D)
return true;
return false;
}
public double[][] GetRotations(bool preferRotated = false)
{
var orig = new[] { W, H, D };
var rot = new[] { D, H, W };
return preferRotated
? new double[][] { rot, orig }
: new double[][] { orig, rot };
}
}
public class ItemType
{
public string Name { get; set; }
public double W { get; set; }
public double H { get; set; }
public double D { get; set; }
public int Count { get; set; }
public Color Color { get; set; }
}
public class PackedItem
{
public Item Item { get; set; }
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
// Actual dimensions used (after rotation)
public double RW { get; set; }
public double RH { get; set; }
public double RD { get; set; }
public PackedItem(Item item, double x, double y, double z, double rw, double rh, double rd)
{
Item = item; X = x; Y = y; Z = z; RW = rw; RH = rh; RD = rd;
}
}
}