style: apply CSharpier formatting to files merged from arc-tangency branch

This commit is contained in:
aj
2026-09-20 16:54:16 -04:00
parent 54694f9b17
commit 27684c3782
12 changed files with 790 additions and 260 deletions
@@ -37,7 +37,10 @@ public class ConvertGeometryLayerTests
[Fact]
public void AddArc_EngraveLayer_TagsScribe()
{
var arc = new Arc(new Vector(0, 0), 1, 0, System.Math.PI / 2) { Layer = new Layer("ENGRAVE") };
var arc = new Arc(new Vector(0, 0), 1, 0, System.Math.PI / 2)
{
Layer = new Layer("ENGRAVE"),
};
var pgm = ProgramFor(arc);
@@ -166,8 +166,14 @@ public class GeometrySimplifierTests
// Arc must be tangent to the adjacent straight edges at its endpoints
var startDelta = AngleBetweenDeg(ArcTangentAt(arc, arc.StartPoint()), new Vector(1, 0));
var endDelta = AngleBetweenDeg(ArcTangentAt(arc, arc.EndPoint()), new Vector(0, 1));
Assert.True(startDelta < 0.3, $"Arc start not tangent to incoming line: off by {startDelta:F3} deg");
Assert.True(endDelta < 0.3, $"Arc end not tangent to outgoing line: off by {endDelta:F3} deg");
Assert.True(
startDelta < 0.3,
$"Arc start not tangent to incoming line: off by {startDelta:F3} deg"
);
Assert.True(
endDelta < 0.3,
$"Arc end not tangent to outgoing line: off by {endDelta:F3} deg"
);
}
[Fact]
@@ -184,7 +190,12 @@ public class GeometrySimplifierTests
{
var ang = OpenNest.Math.Angle.ToRadians(10 * i);
var radius = r1 + deltas1[i];
pts.Add(new Vector(c1.X + radius * System.Math.Cos(ang), c1.Y + radius * System.Math.Sin(ang)));
pts.Add(
new Vector(
c1.X + radius * System.Math.Cos(ang),
c1.Y + radius * System.Math.Sin(ang)
)
);
}
// Second arc center along the junction radius so tangents match at the junction
@@ -197,7 +208,12 @@ public class GeometrySimplifierTests
{
var ang = OpenNest.Math.Angle.ToRadians(60 + 8 * i);
var radius = r2 + deltas2[i];
pts.Add(new Vector(c2.X + radius * System.Math.Cos(ang), c2.Y + radius * System.Math.Sin(ang)));
pts.Add(
new Vector(
c2.X + radius * System.Math.Cos(ang),
c2.Y + radius * System.Math.Sin(ang)
)
);
}
var shape = new Shape();
@@ -215,8 +231,14 @@ public class GeometrySimplifierTests
Assert.True(arcA.EndPoint().DistanceTo(arcB.StartPoint()) < 1e-6);
// Tangent continuity across the junction
var junctionDelta = AngleBetweenDeg(ArcTangentAt(arcA, arcA.EndPoint()), ArcTangentAt(arcB, arcB.StartPoint()));
Assert.True(junctionDelta < 0.3, $"Tangent break of {junctionDelta:F3} deg at arc-arc junction");
var junctionDelta = AngleBetweenDeg(
ArcTangentAt(arcA, arcA.EndPoint()),
ArcTangentAt(arcB, arcB.StartPoint())
);
Assert.True(
junctionDelta < 0.3,
$"Tangent break of {junctionDelta:F3} deg at arc-arc junction"
);
}
private static Vector ArcTangentAt(Arc arc, Vector pt)
@@ -7,19 +7,21 @@ namespace OpenNest.Tests.GravographIS;
public class GravographISPostProcessorTests
{
private static LayeredPolyline Poly(LayerType layer, params Vector[] pts)
=> new LayeredPolyline(new List<Vector>(pts), layer);
private static LayeredPolyline Poly(LayerType layer, params Vector[] pts) =>
new LayeredPolyline(new List<Vector>(pts), layer);
[Fact]
public void BuildPasses_EngraveAndCut_OrdersEngraveFirstThenCutWithPause()
{
var post = new GravographISPostProcessor();
var passes = post.BuildPasses(new[]
{
Poly(LayerType.Cut, new Vector(0, 0), new Vector(1, 0)),
Poly(LayerType.Scribe, new Vector(0, 0), new Vector(0, 1)),
});
var passes = post.BuildPasses(
new[]
{
Poly(LayerType.Cut, new Vector(0, 0), new Vector(1, 0)),
Poly(LayerType.Scribe, new Vector(0, 0), new Vector(0, 1)),
}
);
Assert.Equal(2, passes.Count);
@@ -36,10 +38,9 @@ public class GravographISPostProcessorTests
{
var post = new GravographISPostProcessor();
var passes = post.BuildPasses(new[]
{
Poly(LayerType.Cut, new Vector(0, 0), new Vector(1, 0)),
});
var passes = post.BuildPasses(
new[] { Poly(LayerType.Cut, new Vector(0, 0), new Vector(1, 0)) }
);
Assert.Single(passes);
Assert.Equal(post.Config.Cut.FeedMmPerSec, passes[0].FeedMmPerSec);
@@ -50,11 +51,13 @@ public class GravographISPostProcessorTests
{
var post = new GravographISPostProcessor();
var passes = post.BuildPasses(new[]
{
Poly(LayerType.Display, new Vector(0, 0), new Vector(1, 0)),
Poly(LayerType.Cut, new Vector(0, 0), new Vector(0, 1)),
});
var passes = post.BuildPasses(
new[]
{
Poly(LayerType.Display, new Vector(0, 0), new Vector(1, 0)),
Poly(LayerType.Cut, new Vector(0, 0), new Vector(0, 1)),
}
);
Assert.Single(passes);
Assert.Equal(post.Config.Cut.FeedMmPerSec, passes[0].FeedMmPerSec);
@@ -191,20 +191,37 @@ public class GravographISWriterTests
[Fact]
public void Passes_PauseBeforeCut_EmitsPauseSequenceBetweenGroups()
{
var engrave = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(1, 0) } };
var engrave = new List<IReadOnlyList<Vector>>
{
new[] { new Vector(0, 0), new Vector(1, 0) },
};
var cut = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(0, -1) } };
var passes = new List<GravographPass>
{
new GravographPass { Polylines = engrave, FeedMmPerSec = 10, DepthInches = 0.25 },
new GravographPass { Polylines = cut, FeedMmPerSec = 3, DepthInches = 0.25, PauseBefore = true, PauseMessage = "Hi" },
new GravographPass
{
Polylines = engrave,
FeedMmPerSec = 10,
DepthInches = 0.25,
},
new GravographPass
{
Polylines = cut,
FeedMmPerSec = 3,
DepthInches = 0.25,
PauseBefore = true,
PauseMessage = "Hi",
},
};
using var ms = new MemoryStream();
new GravographISWriter(new GravographISWriterOptions
{
EnvelopeGuardEnabled = false,
ReturnToOriginAtEnd = false,
}).Write(passes, ms);
new GravographISWriter(
new GravographISWriterOptions
{
EnvelopeGuardEnabled = false,
ReturnToOriginAtEnd = false,
}
).Write(passes, ms);
var bytes = ms.ToArray();
var mcOff = IndexOf(bytes, 0, (byte)'M', (byte)'C', 0x00, 0x00);
@@ -217,9 +234,16 @@ public class GravographISWriterTests
var mcOn = IndexOf(bytes, lbEnd, (byte)'M', (byte)'C', 0x00, 0x01);
Assert.True(mcOff >= 0, "motor-off (MC 0000) not found");
Assert.True(mcOff < ouFb && ouFb < ouFa && ouFa < lbBegin && lbBegin < lbMsg
&& lbMsg < nr && nr < lbEnd && lbEnd < mcOn,
"pause commands out of order");
Assert.True(
mcOff < ouFb
&& ouFb < ouFa
&& ouFa < lbBegin
&& lbBegin < lbMsg
&& lbMsg < nr
&& nr < lbEnd
&& lbEnd < mcOn,
"pause commands out of order"
);
// Resume sets the cut feed inline (VS 0x0003) after the motor restarts.
var vsCut = IndexOf(bytes, mcOn, (byte)'V', (byte)'S', 0x00, 0x03);
@@ -231,12 +255,34 @@ public class GravographISWriterTests
{
var passes = new List<GravographPass>
{
new GravographPass { Polylines = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(1, 0) } }, FeedMmPerSec = 10 },
new GravographPass { Polylines = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(0, -1) } }, FeedMmPerSec = 3, PauseBefore = true, PauseMessage = "abc" },
new GravographPass
{
Polylines = new List<IReadOnlyList<Vector>>
{
new[] { new Vector(0, 0), new Vector(1, 0) },
},
FeedMmPerSec = 10,
},
new GravographPass
{
Polylines = new List<IReadOnlyList<Vector>>
{
new[] { new Vector(0, 0), new Vector(0, -1) },
},
FeedMmPerSec = 3,
PauseBefore = true,
PauseMessage = "abc",
},
};
using var ms = new MemoryStream();
new GravographISWriter(new GravographISWriterOptions { EnvelopeGuardEnabled = false, ReturnToOriginAtEnd = false }).Write(passes, ms);
new GravographISWriter(
new GravographISWriterOptions
{
EnvelopeGuardEnabled = false,
ReturnToOriginAtEnd = false,
}
).Write(passes, ms);
var bytes = ms.ToArray();
var lbAb = IndexOf(bytes, 0, (byte)'L', (byte)'B', (byte)'a', (byte)'b');
@@ -250,24 +296,57 @@ public class GravographISWriterTests
{
var passes = new List<GravographPass>
{
new GravographPass { Polylines = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(1, 0) } }, FeedMmPerSec = 10 },
new GravographPass { Polylines = new List<IReadOnlyList<Vector>> { new[] { new Vector(0, 0), new Vector(0, -1) } }, FeedMmPerSec = 3, PauseBefore = false },
new GravographPass
{
Polylines = new List<IReadOnlyList<Vector>>
{
new[] { new Vector(0, 0), new Vector(1, 0) },
},
FeedMmPerSec = 10,
},
new GravographPass
{
Polylines = new List<IReadOnlyList<Vector>>
{
new[] { new Vector(0, 0), new Vector(0, -1) },
},
FeedMmPerSec = 3,
PauseBefore = false,
},
};
using var ms = new MemoryStream();
new GravographISWriter(new GravographISWriterOptions { EnvelopeGuardEnabled = false, ReturnToOriginAtEnd = false }).Write(passes, ms);
new GravographISWriter(
new GravographISWriterOptions
{
EnvelopeGuardEnabled = false,
ReturnToOriginAtEnd = false,
}
).Write(passes, ms);
var bytes = ms.ToArray();
Assert.True(IndexOf(bytes, 0, (byte)'V', (byte)'S', 0x00, 0x03) >= 0, "inline cut feed change missing");
Assert.True(IndexOfCmd(bytes, (byte)'L', (byte)'B') < 0, "no LB message expected without a pause");
Assert.True(
IndexOf(bytes, 0, (byte)'V', (byte)'S', 0x00, 0x03) >= 0,
"inline cut feed change missing"
);
Assert.True(
IndexOfCmd(bytes, (byte)'L', (byte)'B') < 0,
"no LB message expected without a pause"
);
}
private static int IndexOf(byte[] bytes, int from, byte c0, byte c1, byte hi, byte lo)
{
for (var i = System.Math.Max(0, from); i <= bytes.Length - 6; i++)
{
if (bytes[i] == 0xFF && bytes[i + 1] == 0xFD && bytes[i + 2] == c0 &&
bytes[i + 3] == c1 && bytes[i + 4] == hi && bytes[i + 5] == lo)
if (
bytes[i] == 0xFF
&& bytes[i + 1] == 0xFD
&& bytes[i + 2] == c0
&& bytes[i + 3] == c1
&& bytes[i + 4] == hi
&& bytes[i + 5] == lo
)
return i;
}
return -1;
@@ -277,7 +356,12 @@ public class GravographISWriterTests
{
for (var i = 0; i <= bytes.Length - 4; i++)
{
if (bytes[i] == 0xFF && bytes[i + 1] == 0xFD && bytes[i + 2] == c0 && bytes[i + 3] == c1)
if (
bytes[i] == 0xFF
&& bytes[i + 1] == 0xFD
&& bytes[i + 2] == c0
&& bytes[i + 3] == c1
)
return i;
}
return -1;
@@ -55,10 +55,16 @@ public class NestPolylineExtractorTests
Assert.Equal(2, polylines.Count);
Assert.Equal(LayerType.Scribe, polylines[0].Layer);
Assert.Equal(new[] { new Vector(0, 0), new Vector(1, 0), new Vector(2, 0) }, polylines[0].Points);
Assert.Equal(
new[] { new Vector(0, 0), new Vector(1, 0), new Vector(2, 0) },
polylines[0].Points
);
Assert.Equal(LayerType.Cut, polylines[1].Layer);
Assert.Equal(new[] { new Vector(2, 0), new Vector(2, 1), new Vector(3, 1) }, polylines[1].Points);
Assert.Equal(
new[] { new Vector(2, 0), new Vector(2, 1), new Vector(3, 1) },
polylines[1].Points
);
}
[Fact]