feat(core): add TShape

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-17 08:06:08 -04:00
parent dfd5a15274
commit 33377291a6
2 changed files with 76 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
using System.Collections.Generic;
using OpenNest.Geometry;
namespace OpenNest.Shapes
{
public class TShape : ShapeDefinition
{
public double Width { get; set; }
public double Height { get; set; }
public double StemWidth { get; set; }
public double BarHeight { get; set; }
public override Drawing GetDrawing()
{
var sw = StemWidth > 0 ? StemWidth : Width / 3.0;
var bh = BarHeight > 0 ? BarHeight : Height / 3.0;
var stemLeft = (Width - sw) / 2.0;
var stemRight = stemLeft + sw;
var stemTop = Height - bh;
var entities = new List<Entity>
{
new Line(stemLeft, 0, stemRight, 0),
new Line(stemRight, 0, stemRight, stemTop),
new Line(stemRight, stemTop, Width, stemTop),
new Line(Width, stemTop, Width, Height),
new Line(Width, Height, 0, Height),
new Line(0, Height, 0, stemTop),
new Line(0, stemTop, stemLeft, stemTop),
new Line(stemLeft, stemTop, stemLeft, 0)
};
return CreateDrawing(entities);
}
}
}

View File

@@ -0,0 +1,40 @@
using OpenNest.Shapes;
namespace OpenNest.Tests.Shapes;
public class TShapeTests
{
[Fact]
public void GetDrawing_BoundingBoxMatchesDimensions()
{
var shape = new TShape { Width = 12, Height = 18 };
var drawing = shape.GetDrawing();
var bbox = drawing.Program.BoundingBox();
Assert.Equal(12, bbox.Width, 0.01);
Assert.Equal(18, bbox.Length, 0.01);
}
[Fact]
public void GetDrawing_DefaultStemAndBarDimensions()
{
var shape = new TShape { Width = 12, Height = 18 };
var drawing = shape.GetDrawing();
// Default: StemWidth = Width/3 = 4, BarHeight = Height/3 = 6
// Area = Width * BarHeight + StemWidth * (Height - BarHeight)
// Area = 12 * 6 + 4 * 12 = 72 + 48 = 120
Assert.Equal(120, drawing.Area, 0.5);
}
[Fact]
public void GetDrawing_CustomStemAndBarDimensions()
{
var shape = new TShape { Width = 12, Height = 18, StemWidth = 6, BarHeight = 4 };
var drawing = shape.GetDrawing();
// Area = Width * BarHeight + StemWidth * (Height - BarHeight)
// Area = 12 * 4 + 6 * 14 = 48 + 84 = 132
Assert.Equal(132, drawing.Area, 0.5);
}
}