From 33377291a6562e7f44387d172f8078cf9922e56d Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 17 Mar 2026 08:06:08 -0400 Subject: [PATCH] feat(core): add TShape Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Shapes/TShape.cs | 36 +++++++++++++++++++++++++ OpenNest.Tests/Shapes/TShapeTests.cs | 40 ++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 OpenNest.Core/Shapes/TShape.cs create mode 100644 OpenNest.Tests/Shapes/TShapeTests.cs diff --git a/OpenNest.Core/Shapes/TShape.cs b/OpenNest.Core/Shapes/TShape.cs new file mode 100644 index 0000000..15a0c95 --- /dev/null +++ b/OpenNest.Core/Shapes/TShape.cs @@ -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 + { + 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); + } + } +} diff --git a/OpenNest.Tests/Shapes/TShapeTests.cs b/OpenNest.Tests/Shapes/TShapeTests.cs new file mode 100644 index 0000000..c7dd40c --- /dev/null +++ b/OpenNest.Tests/Shapes/TShapeTests.cs @@ -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); + } +}