Emit variable definitions before G-code in program text entries and use \$varName syntax for coordinate fields that have VariableRefs, so programs round-trip through NestWriter → NestReader without losing variable information. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
92 lines
2.6 KiB
C#
92 lines
2.6 KiB
C#
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using OpenNest.CNC;
|
|
using OpenNest.Geometry;
|
|
using OpenNest.IO;
|
|
|
|
namespace OpenNest.Tests.IO;
|
|
|
|
public class NestWriterVariableTests
|
|
{
|
|
[Fact]
|
|
public void RoundTrip_VariableDefinitions_Preserved()
|
|
{
|
|
var nest = CreateNestWithVariableProgram(
|
|
"width = 48.0 global\ndiameter = 0.3\nG90\nG01X$widthY$diameter");
|
|
|
|
var loaded = RoundTrip(nest);
|
|
var pgm = loaded.Drawings.First().Program;
|
|
|
|
Assert.Equal(2, pgm.Variables.Count);
|
|
Assert.Equal(48.0, pgm.Variables["width"].Value);
|
|
Assert.True(pgm.Variables["width"].Global);
|
|
Assert.Equal(0.3, pgm.Variables["diameter"].Value);
|
|
Assert.False(pgm.Variables["diameter"].Global);
|
|
}
|
|
|
|
[Fact]
|
|
public void RoundTrip_VariableRefs_Preserved()
|
|
{
|
|
var nest = CreateNestWithVariableProgram(
|
|
"width = 48.0\nG90\nG01X$widthY0");
|
|
|
|
var loaded = RoundTrip(nest);
|
|
var pgm = loaded.Drawings.First().Program;
|
|
|
|
var linear = (LinearMove)pgm.Codes[0];
|
|
Assert.Equal(48.0, linear.EndPoint.X);
|
|
Assert.NotNull(linear.VariableRefs);
|
|
Assert.Equal("width", linear.VariableRefs["X"]);
|
|
}
|
|
|
|
[Fact]
|
|
public void RoundTrip_InlineFlag_Preserved()
|
|
{
|
|
var nest = CreateNestWithVariableProgram(
|
|
"kerf = 0.06 inline\nG90\nG01X1Y0");
|
|
|
|
var loaded = RoundTrip(nest);
|
|
var pgm = loaded.Drawings.First().Program;
|
|
|
|
Assert.True(pgm.Variables["kerf"].Inline);
|
|
}
|
|
|
|
[Fact]
|
|
public void RoundTrip_NoVariables_WorksAsNormal()
|
|
{
|
|
var nest = CreateNestWithVariableProgram("G90\nG01X1Y2");
|
|
|
|
var loaded = RoundTrip(nest);
|
|
var pgm = loaded.Drawings.First().Program;
|
|
|
|
Assert.Empty(pgm.Variables);
|
|
var linear = (LinearMove)pgm.Codes[0];
|
|
Assert.Equal(1.0, linear.EndPoint.X);
|
|
}
|
|
|
|
private static Nest CreateNestWithVariableProgram(string gcode)
|
|
{
|
|
var stream = new MemoryStream(Encoding.UTF8.GetBytes(gcode));
|
|
var reader = new ProgramReader(stream);
|
|
var program = reader.Read();
|
|
reader.Close();
|
|
|
|
var drawing = new Drawing("TestPart", program);
|
|
var nest = new Nest { Name = "Test" };
|
|
nest.Drawings.Add(drawing);
|
|
var plate = new Plate(new Size(100, 100));
|
|
plate.Parts.Add(new Part(drawing, new Vector(0, 0)));
|
|
nest.Plates.Add(plate);
|
|
return nest;
|
|
}
|
|
|
|
private static Nest RoundTrip(Nest nest)
|
|
{
|
|
var ms = new MemoryStream();
|
|
new NestWriter(nest).Write(ms);
|
|
ms.Position = 0;
|
|
return new NestReader(ms).Read();
|
|
}
|
|
}
|