Files
OpenNest/OpenNest.Mcp/Tools/SetupTools.cs
AJ Isaacs f29f086080 feat: add pierce point visualization and rename shape dimensions to Length/Width
Add toggleable pierce point drawing to PlateView that shows small red
filled circles at each rapid move endpoint (where cutting begins). Wire
through View menu, EditNestForm toggle, and MainForm handler.

Also rename RectangleShape/RoundedRectangleShape Width/Height to
Length/Width for consistency with CNC conventions, update MCP tools and
tests accordingly. Fix SplitDrawingForm designer layout ordering and
EntityView bend line selection styling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:26:49 -04:00

70 lines
2.6 KiB
C#

using ModelContextProtocol.Server;
using OpenNest.Geometry;
using System.ComponentModel;
using System.Text;
namespace OpenNest.Mcp.Tools
{
[McpServerToolType]
public class SetupTools
{
private readonly NestSession _session;
public SetupTools(NestSession session)
{
_session = session;
}
[McpServerTool(Name = "create_plate")]
[Description("Create a new plate with the given dimensions and spacing. Returns plate index and work area.")]
public string CreatePlate(
[Description("Plate width")] double width,
[Description("Plate length")] double length,
[Description("Spacing between parts (default 0)")] double partSpacing = 0,
[Description("Edge spacing on all sides (default 0)")] double edgeSpacing = 0,
[Description("Quadrant 1-4 (default 1). 1=TopRight, 2=TopLeft, 3=BottomLeft, 4=BottomRight")] int quadrant = 1,
[Description("Material name (optional)")] string material = null)
{
var plate = new Plate(width, length);
plate.PartSpacing = partSpacing;
plate.EdgeSpacing = new Spacing(edgeSpacing, edgeSpacing);
plate.Quadrant = quadrant;
plate.Quantity = 1;
if (!string.IsNullOrEmpty(material))
plate.Material.Name = material;
_session.Plates.Add(plate);
var allPlates = _session.AllPlates();
var index = allPlates.Count - 1;
var work = plate.WorkArea();
var sb = new StringBuilder();
sb.AppendLine($"Created plate {index}: {plate.Size.Width:F1} x {plate.Size.Length:F1}");
sb.AppendLine($" Quadrant: {plate.Quadrant}");
sb.AppendLine($" Part spacing: {plate.PartSpacing:F2}");
sb.AppendLine($" Edge spacing: L={plate.EdgeSpacing.Left:F2} B={plate.EdgeSpacing.Bottom:F2} R={plate.EdgeSpacing.Right:F2} T={plate.EdgeSpacing.Top:F2}");
sb.AppendLine($" Work area: {work.Width:F1} x {work.Length:F1}");
return sb.ToString();
}
[McpServerTool(Name = "clear_plate")]
[Description("Remove all parts from a plate. Returns how many parts were removed.")]
public string ClearPlate(
[Description("Index of the plate to clear")] int plateIndex)
{
var plate = _session.GetPlate(plateIndex);
if (plate == null)
return $"Error: plate {plateIndex} not found";
var count = plate.Parts.Count;
plate.Parts.Clear();
return $"Cleared plate {plateIndex}: removed {count} parts";
}
}
}