diff --git a/ConfigurationPage/PrintLeveling/LevelWizard7PointRadial.cs b/ConfigurationPage/PrintLeveling/LevelWizard7PointRadial.cs
index 15d1d09a4..5e5d01ac7 100644
--- a/ConfigurationPage/PrintLeveling/LevelWizard7PointRadial.cs
+++ b/ConfigurationPage/PrintLeveling/LevelWizard7PointRadial.cs
@@ -115,9 +115,8 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
}
}
- internal static string ApplyLeveling(string lineBeingSent, Vector3 currentDestination, PrinterMachineInstruction.MovementTypes movementMode)
+ public static string ApplyLeveling(string lineBeingSent, Vector3 currentDestination, PrinterMachineInstruction.MovementTypes movementMode)
{
- // old ref code
if (PrinterConnectionAndCommunication.Instance.ActivePrinter != null
&& PrinterConnectionAndCommunication.Instance.ActivePrinter.DoPrintLeveling
&& (lineBeingSent.StartsWith("G0 ") || lineBeingSent.StartsWith("G1 "))
@@ -139,6 +138,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
if (movementMode == PrinterMachineInstruction.MovementTypes.Relative)
{
+ // TODO: this is not correct for 7 point leveling
Vector3 relativeMove = Vector3.Zero;
GCodeFile.GetFirstNumberAfter("X", lineBeingSent, ref relativeMove.x);
GCodeFile.GetFirstNumberAfter("Y", lineBeingSent, ref relativeMove.y);
@@ -167,7 +167,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling
return lineBeingSent;
}
- private static Vector3 GetPositionWithZOffset(Vector3 currentDestination, PrintLevelingData levelingData)
+ public static Vector3 GetPositionWithZOffset(Vector3 currentDestination, PrintLevelingData levelingData)
{
double angleToPoint = Math.Atan2(currentDestination.y, currentDestination.x);
diff --git a/Tests/MatterControl.Tests/MatterControl.Tests.csproj b/Tests/MatterControl.Tests/MatterControl.Tests.csproj
index f898c96ae..c9a149a35 100644
--- a/Tests/MatterControl.Tests/MatterControl.Tests.csproj
+++ b/Tests/MatterControl.Tests/MatterControl.Tests.csproj
@@ -62,6 +62,7 @@
+
diff --git a/Tests/MatterControl.Tests/MatterControl/LevelingTests.cs b/Tests/MatterControl.Tests/MatterControl/LevelingTests.cs
new file mode 100644
index 000000000..ff7fd8b01
--- /dev/null
+++ b/Tests/MatterControl.Tests/MatterControl/LevelingTests.cs
@@ -0,0 +1,62 @@
+using MatterHackers.MatterControl;
+using NUnit.Framework;
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Linq;
+using MatterHackers.MatterControl.ConfigurationPage.PrintLeveling;
+using MatterHackers.VectorMath;
+
+namespace MatterControl.Tests.MatterControl
+{
+
+ [TestFixture]
+ public class LevelingTests
+ {
+ [Test, Category("Leveling")]
+ public void Leveling7PointsCorectInterpolation()
+ {
+ PrintLevelingData levelingData = new PrintLevelingData();
+
+ double radius = 100;
+ levelingData.SampledPositions = new List();
+ Vector2 currentEdgePoint = new Vector2(radius, 0);
+ for (int i = 0; i < 6; i++)
+ {
+ levelingData.SampledPositions.Add(new Vector3(currentEdgePoint, i));
+ currentEdgePoint.Rotate(MathHelper.Tau / 6);
+ }
+
+ levelingData.SampledPositions.Add(new Vector3(0, 0, 6));
+
+ for (int i = 0; i < 6; i++)
+ {
+ // test actual sample position
+ Vector2 currentTestPoint = new Vector2(radius, 0);
+ currentTestPoint.Rotate(MathHelper.Tau / 6 * i);
+ Vector3 outPosition = LevelWizard7PointRadial.GetPositionWithZOffset(new Vector3(currentTestPoint, 0), levelingData);
+ Assert.AreEqual(outPosition.z, levelingData.SampledPositions[i].z, .001);
+
+ // test 1/2 angles (mid way between samples
+ int nextPoint = i < 5 ? i + 1 : 0;
+ currentTestPoint = new Vector2(radius, 0);
+ currentTestPoint.Rotate(MathHelper.Tau / 6 * (i + .5));
+ outPosition = LevelWizard7PointRadial.GetPositionWithZOffset(new Vector3(currentTestPoint, 0), levelingData);
+ Assert.AreEqual(outPosition.z, (levelingData.SampledPositions[i].z + levelingData.SampledPositions[nextPoint].z)/2, .001);
+
+ // test 1/2 to center
+ currentTestPoint = new Vector2(radius / 2, 0);
+ currentTestPoint.Rotate(MathHelper.Tau / 6 * i));
+ outPosition = LevelWizard7PointRadial.GetPositionWithZOffset(new Vector3(currentTestPoint, 0), levelingData);
+ Assert.AreEqual(outPosition.z, (levelingData.SampledPositions[i].z + levelingData.SampledPositions[6].z) / 2, .001);
+ }
+
+ Vector3 outPosition2 = LevelWizard7PointRadial.GetPositionWithZOffset(Vector3.Zero, levelingData);
+ Assert.AreEqual(outPosition2.z, levelingData.SampledPositions[6].z, .001);
+ }
+ }
+}