style: apply CSharpier formatting to files merged from arc-tangency branch
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user