From bf4ba7c844f0fc5ca1f00e1fd25bb665712d488b Mon Sep 17 00:00:00 2001 From: Joacim Breiler Date: Fri, 17 Jan 2025 08:02:03 +0100 Subject: [PATCH] Clear ABC axes when probing (#2680) --- .../model/PartialPosition.java | 7 +++++ .../surfacescanner/SurfaceScanner.java | 14 +++++++-- .../surfacescanner/SurfaceScannerTest.java | 31 +++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/ugs-core/src/com/willwinder/universalgcodesender/model/PartialPosition.java b/ugs-core/src/com/willwinder/universalgcodesender/model/PartialPosition.java index 690160e355..3286cc01b1 100644 --- a/ugs-core/src/com/willwinder/universalgcodesender/model/PartialPosition.java +++ b/ugs-core/src/com/willwinder/universalgcodesender/model/PartialPosition.java @@ -372,6 +372,13 @@ public Builder setC(Double c) { } return this; } + + public Builder clearABC() { + this.a = null; + this.b = null; + this.c = null; + return this; + } } public String getFormattedGCode() { diff --git a/ugs-platform/ugs-platform-surfacescanner/src/main/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScanner.java b/ugs-platform/ugs-platform-surfacescanner/src/main/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScanner.java index 406c7c7a40..b4414a624f 100644 --- a/ugs-platform/ugs-platform-surfacescanner/src/main/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScanner.java +++ b/ugs-platform/ugs-platform-surfacescanner/src/main/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScanner.java @@ -199,13 +199,17 @@ private void moveToSafeStartPoint(Position currentPosition) { } // Move to the XY start position - PartialPosition startPos = PartialPosition.builder(minXYZ).clearZ().build(); + PartialPosition startPos = PartialPosition.builder(minXYZ) + .clearZ() + .clearABC() + .build(); + String cmd = GcodeUtils.generateMoveCommand( "G90G0", getProbeScanFeedRate(), startPos); logger.log(Level.INFO, "Move to start position {0}", new Object[]{startPos}); backend.sendGcodeCommand(true, cmd); - // Move to the Y start position + // Move to the Z start position PartialPosition startHeight = PartialPosition.builder(maxXYZ.getUnits()).setZ(maxXYZ.getZ()).build(); cmd = GcodeUtils.generateMoveCommand( "G90G0", getProbeScanFeedRate(), startHeight); @@ -226,7 +230,11 @@ private void probeNextPoint(Double zBackoff) { Position p = this.pendingPositions.peek(); // Position over next probe position - PartialPosition startPos = PartialPosition.builder(p).clearZ().build(); + PartialPosition startPos = PartialPosition.builder(p) + .clearZ() + .clearABC() + .build(); + String cmd = GcodeUtils.generateMoveCommand( "G90G0", getProbeScanFeedRate(), startPos); logger.log(Level.INFO, "MoveTo {0} {1}", new Object[]{startPos, cmd}); diff --git a/ugs-platform/ugs-platform-surfacescanner/src/test/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScannerTest.java b/ugs-platform/ugs-platform-surfacescanner/src/test/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScannerTest.java index d26514358b..0deeb41b0e 100644 --- a/ugs-platform/ugs-platform-surfacescanner/src/test/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScannerTest.java +++ b/ugs-platform/ugs-platform-surfacescanner/src/test/java/com/willwinder/ugs/platform/surfacescanner/SurfaceScannerTest.java @@ -3,10 +3,14 @@ import com.willwinder.universalgcodesender.model.BackendAPI; import com.willwinder.universalgcodesender.model.Position; import com.willwinder.universalgcodesender.model.UnitUtils; +import com.willwinder.universalgcodesender.utils.AutoLevelSettings; import com.willwinder.universalgcodesender.utils.Settings; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; +import static org.mockito.ArgumentMatchers.anyBoolean; import org.mockito.Mock; +import static org.mockito.Mockito.doNothing; import org.mockito.MockitoAnnotations; import static org.junit.Assert.assertEquals; @@ -149,6 +153,33 @@ public void probeEventShouldProgressTheScanForEachProbeEventInInches() { assertEquals(25.4, surfaceScanner.getProbePositionGrid()[1][1].getZ(), 0.1); } + @Test + public void scanShouldMoveToSafe() throws Exception { + Settings settings = new Settings(); + settings.setSafetyHeight(6); + + AutoLevelSettings autoLevelSettings = settings.getAutoLevelSettings(); + autoLevelSettings.setMin(new Position(0,0,0, UnitUtils.Units.MM)); + autoLevelSettings.setMax(new Position(0,0,0, UnitUtils.Units.MM)); + autoLevelSettings.setProbeScanFeedRate(500); + + when(backendAPI.getSettings()).thenReturn(settings); + when(backendAPI.getWorkPosition()).thenReturn(new Position(0,0,0 ,UnitUtils.Units.MM)); + when(backendAPI.getMachinePosition()).thenReturn(new Position(0,0,0, UnitUtils.Units.MM)); + + ArgumentCaptor sentGcodeCommandCaptor = ArgumentCaptor.forClass(String.class); + doNothing().when(backendAPI).sendGcodeCommand(anyBoolean(), sentGcodeCommandCaptor.capture()); + + SurfaceScanner surfaceScanner = new SurfaceScanner(backendAPI); + surfaceScanner.reset(); + surfaceScanner.scan(); + + assertEquals(4, sentGcodeCommandCaptor.getAllValues().size()); + assertEquals("G21G90G0Z6F500", sentGcodeCommandCaptor.getAllValues().get(0)); + assertEquals("G21G90G0X0Y0F500", sentGcodeCommandCaptor.getAllValues().get(1)); + assertEquals("G21G90G0Z0F500", sentGcodeCommandCaptor.getAllValues().get(2)); + assertEquals("G21G90G0X0Y0F500", sentGcodeCommandCaptor.getAllValues().get(3)); + } private static Position createProbePoint(Position position, UnitUtils.Units units, double z) { Position probePoint = new Position(position.getPositionIn(units));