feat: add VariableRefs tracking on Motion and Feedrate
Adds Dictionary<string,string> VariableRefs to Motion (cleared on Rotate/Offset) and string VariableRef to Feedrate, with deep-copy Clone() support, so post processors can emit variable references instead of literal coordinate values. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using OpenNest.Geometry;
|
using System.Collections.Generic;
|
||||||
|
using OpenNest.Geometry;
|
||||||
|
|
||||||
namespace OpenNest.CNC
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
@@ -66,7 +67,8 @@ namespace OpenNest.CNC
|
|||||||
return new ArcMove(EndPoint, CenterPoint, Rotation)
|
return new ArcMove(EndPoint, CenterPoint, Rotation)
|
||||||
{
|
{
|
||||||
Layer = Layer,
|
Layer = Layer,
|
||||||
Suppressed = Suppressed
|
Suppressed = Suppressed,
|
||||||
|
VariableRefs = VariableRefs != null ? new Dictionary<string, string>(VariableRefs) : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
public double Value { get; set; }
|
public double Value { get; set; }
|
||||||
|
|
||||||
|
public string VariableRef { get; set; }
|
||||||
|
|
||||||
public CodeType Type
|
public CodeType Type
|
||||||
{
|
{
|
||||||
get { return CodeType.SetFeedrate; }
|
get { return CodeType.SetFeedrate; }
|
||||||
@@ -24,7 +26,7 @@
|
|||||||
|
|
||||||
public ICode Clone()
|
public ICode Clone()
|
||||||
{
|
{
|
||||||
return new Feedrate(Value);
|
return new Feedrate(Value) { VariableRef = VariableRef };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using OpenNest.Geometry;
|
using System.Collections.Generic;
|
||||||
|
using OpenNest.Geometry;
|
||||||
|
|
||||||
namespace OpenNest.CNC
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
@@ -32,7 +33,8 @@ namespace OpenNest.CNC
|
|||||||
return new LinearMove(EndPoint)
|
return new LinearMove(EndPoint)
|
||||||
{
|
{
|
||||||
Layer = Layer,
|
Layer = Layer,
|
||||||
Suppressed = Suppressed
|
Suppressed = Suppressed,
|
||||||
|
VariableRefs = VariableRefs != null ? new Dictionary<string, string>(VariableRefs) : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using OpenNest.Geometry;
|
using System.Collections.Generic;
|
||||||
|
using OpenNest.Geometry;
|
||||||
|
|
||||||
namespace OpenNest.CNC
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
@@ -14,6 +15,8 @@ namespace OpenNest.CNC
|
|||||||
|
|
||||||
public bool Suppressed { get; set; }
|
public bool Suppressed { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, string> VariableRefs { get; set; }
|
||||||
|
|
||||||
protected Motion()
|
protected Motion()
|
||||||
{
|
{
|
||||||
Feedrate = CNC.Feedrate.UseDefault;
|
Feedrate = CNC.Feedrate.UseDefault;
|
||||||
@@ -22,21 +25,25 @@ namespace OpenNest.CNC
|
|||||||
public virtual void Rotate(double angle)
|
public virtual void Rotate(double angle)
|
||||||
{
|
{
|
||||||
EndPoint = EndPoint.Rotate(angle);
|
EndPoint = EndPoint.Rotate(angle);
|
||||||
|
VariableRefs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Rotate(double angle, Vector origin)
|
public virtual void Rotate(double angle, Vector origin)
|
||||||
{
|
{
|
||||||
EndPoint = EndPoint.Rotate(angle, origin);
|
EndPoint = EndPoint.Rotate(angle, origin);
|
||||||
|
VariableRefs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Offset(double x, double y)
|
public virtual void Offset(double x, double y)
|
||||||
{
|
{
|
||||||
EndPoint = new Vector(EndPoint.X + x, EndPoint.Y + y);
|
EndPoint = new Vector(EndPoint.X + x, EndPoint.Y + y);
|
||||||
|
VariableRefs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Offset(Vector voffset)
|
public virtual void Offset(Vector voffset)
|
||||||
{
|
{
|
||||||
EndPoint += voffset;
|
EndPoint += voffset;
|
||||||
|
VariableRefs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract CodeType Type { get; }
|
public abstract CodeType Type { get; }
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using OpenNest.Geometry;
|
using System.Collections.Generic;
|
||||||
|
using OpenNest.Geometry;
|
||||||
|
|
||||||
namespace OpenNest.CNC
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
@@ -28,7 +29,8 @@ namespace OpenNest.CNC
|
|||||||
{
|
{
|
||||||
return new RapidMove(EndPoint)
|
return new RapidMove(EndPoint)
|
||||||
{
|
{
|
||||||
Suppressed = Suppressed
|
Suppressed = Suppressed,
|
||||||
|
VariableRefs = VariableRefs != null ? new Dictionary<string, string>(VariableRefs) : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenNest.CNC;
|
||||||
|
using OpenNest.Geometry;
|
||||||
|
|
||||||
|
namespace OpenNest.Tests.CNC;
|
||||||
|
|
||||||
|
public class ProgramVariableTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void LinearMove_VariableRefs_NullByDefault()
|
||||||
|
{
|
||||||
|
var move = new LinearMove(1.0, 2.0);
|
||||||
|
Assert.Null(move.VariableRefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void LinearMove_Clone_CopiesVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new LinearMove(1.0, 2.0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "X", "width" } };
|
||||||
|
var clone = (LinearMove)move.Clone();
|
||||||
|
Assert.NotSame(move.VariableRefs, clone.VariableRefs);
|
||||||
|
Assert.Equal("width", clone.VariableRefs["X"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void LinearMove_Clone_NullRefs_StaysNull()
|
||||||
|
{
|
||||||
|
var move = new LinearMove(1.0, 2.0);
|
||||||
|
var clone = (LinearMove)move.Clone();
|
||||||
|
Assert.Null(clone.VariableRefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ArcMove_Clone_CopiesVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new ArcMove(1, 0, 0.5, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "I", "radius" } };
|
||||||
|
var clone = (ArcMove)move.Clone();
|
||||||
|
Assert.NotSame(move.VariableRefs, clone.VariableRefs);
|
||||||
|
Assert.Equal("radius", clone.VariableRefs["I"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RapidMove_Clone_CopiesVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new RapidMove(5.0, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "X", "start_x" } };
|
||||||
|
var clone = (RapidMove)move.Clone();
|
||||||
|
Assert.NotSame(move.VariableRefs, clone.VariableRefs);
|
||||||
|
Assert.Equal("start_x", clone.VariableRefs["X"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Feedrate_VariableRef_NullByDefault()
|
||||||
|
{
|
||||||
|
var f = new Feedrate(100.0);
|
||||||
|
Assert.Null(f.VariableRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Feedrate_Clone_CopiesVariableRef()
|
||||||
|
{
|
||||||
|
var f = new Feedrate(100.0) { VariableRef = "cut_speed" };
|
||||||
|
var clone = (Feedrate)f.Clone();
|
||||||
|
Assert.Equal("cut_speed", clone.VariableRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Motion_Rotate_ClearsVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new LinearMove(1.0, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "X", "width" } };
|
||||||
|
move.Rotate(System.Math.PI / 2);
|
||||||
|
Assert.Null(move.VariableRefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Motion_Offset_ClearsVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new LinearMove(1.0, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "X", "width" } };
|
||||||
|
move.Offset(5.0, 0);
|
||||||
|
Assert.Null(move.VariableRefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ArcMove_Rotate_ClearsVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new ArcMove(1, 0, 0.5, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "I", "radius" } };
|
||||||
|
move.Rotate(System.Math.PI / 2);
|
||||||
|
Assert.Null(move.VariableRefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ArcMove_Offset_ClearsVariableRefs()
|
||||||
|
{
|
||||||
|
var move = new ArcMove(1, 0, 0.5, 0);
|
||||||
|
move.VariableRefs = new Dictionary<string, string> { { "I", "radius" } };
|
||||||
|
move.Offset(5.0, 0);
|
||||||
|
Assert.Null(move.VariableRefs);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user