From 454e61d7115b9920cce887260601e1091ab96581 Mon Sep 17 00:00:00 2001 From: jasondaming Date: Mon, 15 Feb 2021 22:18:09 -0600 Subject: [PATCH 1/3] Moving pathutil to allwpilib --- .../pathweaver/FieldDisplayController.java | 2 +- .../wpi/first/pathweaver/MainController.java | 11 ++- .../edu/wpi/first/pathweaver/PathIOUtil.java | 98 ------------------- .../edu/wpi/first/pathweaver/SaveManager.java | 2 +- .../wpi/first/pathweaver/spline/Spline.java | 7 ++ .../spline/wpilib/WpilibSpline.java | 30 ++++++ .../wpi/first/pathweaver/SaveManagerTest.java | 6 +- 7 files changed, 51 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java diff --git a/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java b/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java index 92bcae0c..d7c3b89f 100644 --- a/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java +++ b/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java @@ -111,7 +111,7 @@ public Path addPath(String fileLocations, TreeItem newValue) { return path; } } - Path newPath = PathIOUtil.importPath(fileLocations, fileName); + Path newPath = WaypointUtil.importWaypoints(fileLocations, fileName); if (newPath == null) { newPath = new WpilibPath(fileName); SaveManager.getInstance().saveChange(newPath); diff --git a/src/main/java/edu/wpi/first/pathweaver/MainController.java b/src/main/java/edu/wpi/first/pathweaver/MainController.java index 3a38cd53..c1ed0230 100644 --- a/src/main/java/edu/wpi/first/pathweaver/MainController.java +++ b/src/main/java/edu/wpi/first/pathweaver/MainController.java @@ -339,16 +339,23 @@ private void buildPaths() { LOGGER.log(Level.WARNING, "Could not export to " + output, e); } for (TreeItem pathName : pathRoot.getChildren()) { - Path path = PathIOUtil.importPath(pathDirectory, pathName.getValue()); + Path path = WaypointUtil.importWaypoints(pathDirectory, pathName.getValue()); java.nio.file.Path pathNameFile = output.resolve(path.getPathNameNoExtension()); - if(!path.getSpline().writeToFile(pathNameFile)) { + if(!path.getSpline().writePathToFile(pathNameFile)) { Alert alert = new Alert(Alert.AlertType.WARNING); alert.setTitle("Path export failure!"); alert.setContentText("Could not export to: " + output.toAbsolutePath()); } + + if(!path.getSpline().writeToFile(pathNameFile)) { + Alert alert = new Alert(Alert.AlertType.WARNING); + alert.setTitle("Trajectory export failure!"); + alert.setContentText("Could not export to: " + output.toAbsolutePath()); + } } + Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Paths exported!"); alert.setContentText("Paths exported to: " + output.toAbsolutePath()); diff --git a/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java b/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java deleted file mode 100644 index b89e0c67..00000000 --- a/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java +++ /dev/null @@ -1,98 +0,0 @@ -package edu.wpi.first.pathweaver; - -import edu.wpi.first.pathweaver.path.Path; -import edu.wpi.first.pathweaver.path.wpilib.WpilibPath; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVPrinter; -import org.apache.commons.csv.CSVRecord; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javafx.geometry.Point2D; - -public final class PathIOUtil { - private static final Logger LOGGER = Logger.getLogger(PathIOUtil.class.getName()); - - private PathIOUtil() { - } - - - /** - * Exports path object to csv file. - * - * @param fileLocation the directory and filename to write to - * @param path Path object to save - * - * @return true if successful file write was preformed - */ - public static boolean export(String fileLocation, Path path) { - try ( - BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileLocation + path.getPathName())); - - CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT - .withHeader("X", "Y", "Tangent X", "Tangent Y", "Fixed Theta", "Reversed", "Name")) - ) { - for (Waypoint wp : path.getWaypoints()) { - double xPos = wp.getX(); - double yPos = wp.getY(); - double tangentX = wp.getTangentX(); - double tangentY = wp.getTangentY(); - String name = wp.getName(); - csvPrinter.printRecord(xPos, yPos, tangentX, tangentY, wp.isLockTangent(), wp.isReversed(), name); - } - csvPrinter.flush(); - } catch (IOException except) { - LOGGER.log(Level.WARNING, "Could not save Path file", except); - return false; - } - return true; - } - - /** - * Imports Path object from disk. - * - * @param fileLocation Folder with path file - * @param fileName Name of path file - * - * @return Path object saved in Path file - */ - public static Path importPath(String fileLocation, String fileName) { - try(Reader reader = Files.newBufferedReader(java.nio.file.Path.of(fileLocation, fileName)); - CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT - .withFirstRecordAsHeader() - .withIgnoreHeaderCase() - .withTrim())) { - ArrayList waypoints = new ArrayList<>(); - for (CSVRecord csvRecord : csvParser) { - Point2D position = new Point2D( - Double.parseDouble(csvRecord.get("X")), - Double.parseDouble(csvRecord.get("Y")) - ); - Point2D tangent = new Point2D( - Double.parseDouble(csvRecord.get("Tangent X")), - Double.parseDouble(csvRecord.get("Tangent Y")) - ); - boolean locked = Boolean.parseBoolean(csvRecord.get("Fixed Theta")); - boolean reversed = Boolean.parseBoolean(csvRecord.get("Reversed")); - Waypoint point = new Waypoint(position, tangent, locked, reversed); - if (csvRecord.isMapped("Name")) { - String name = csvRecord.get("Name"); - point.setName(name); - } - waypoints.add(point); - } - return new WpilibPath(waypoints, fileName); - } catch (IOException except) { - LOGGER.log(Level.WARNING, "Could not read Path file", except); - return null; - } - } -} diff --git a/src/main/java/edu/wpi/first/pathweaver/SaveManager.java b/src/main/java/edu/wpi/first/pathweaver/SaveManager.java index e4e30ccf..7323a4cc 100644 --- a/src/main/java/edu/wpi/first/pathweaver/SaveManager.java +++ b/src/main/java/edu/wpi/first/pathweaver/SaveManager.java @@ -86,7 +86,7 @@ public void saveChange(Path path) { */ private void saveChange(Path path, boolean remove) { String pathDirectory = ProjectPreferences.getInstance().getDirectory() + "/Paths/"; - PathIOUtil.export(pathDirectory, path); + WaypointUtil.exportWaypoints(pathDirectory, path, 0d); if (remove) { paths.remove(path); } diff --git a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java index d587d4ea..be2b522a 100644 --- a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java +++ b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java @@ -63,4 +63,11 @@ public interface Spline { * @return whether the write succeeded */ boolean writeToFile(Path path); + + /** + * Export this path to a file for use in the robot. + * @param path the path of the file to write to + * @return whether the write succeeded + */ + boolean writePathToFile(Path path); } diff --git a/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java b/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java index a1e1f248..0c9ad829 100644 --- a/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java +++ b/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java @@ -1,6 +1,7 @@ package edu.wpi.first.pathweaver.spline.wpilib; import edu.wpi.first.pathweaver.FxUtils; +import edu.wpi.first.pathweaver.PathIOUtil; import edu.wpi.first.pathweaver.PathUnits; import edu.wpi.first.pathweaver.ProjectPreferences; import edu.wpi.first.pathweaver.Waypoint; @@ -147,6 +148,35 @@ public boolean writeToFile(java.nio.file.Path path) { } } + @Override + public boolean writePathToFile(java.nio.file.Path path) { + final AtomicBoolean okay = new AtomicBoolean(true); + TrajectoryGenerator.setErrorHandler((error, stacktrace) -> { + LOGGER.log(Level.WARNING, "Could not write Spline to file: " + error, stacktrace); + okay.set(false); + }); + try { + var prefs = ProjectPreferences.getInstance(); + var lengthUnit = prefs.getField().getUnit(); + + // This value has units of the length type. + double height = prefs.getField().getRealLength().getValue().doubleValue(); + + // If the export type is different (i.e. meters), then we have to convert it. Otherwise we are good. + if (prefs.getValues().getExportUnit() == ProjectPreferences.ExportUnit.METER) { + UnitConverter converter = lengthUnit.getConverterTo(PathUnits.METER); + height = converter.convert(height); + } + + WaypointUtil.exportWaypoints(path.getParent().toString(), path, height); + + return okay.get(); + } catch (IOException except) { + LOGGER.log(Level.WARNING, "Could not write Spline to file", except); + return false; + } + } + private static QuinticHermiteSpline[] getQuinticSplinesFromWaypoints(Waypoint[] waypoints) { QuinticHermiteSpline[] splines = new QuinticHermiteSpline[waypoints.length - 1]; for (int i = 0; i < waypoints.length - 1; i++) { diff --git a/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java b/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java index 9ee619b9..772f9271 100644 --- a/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java +++ b/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java @@ -30,7 +30,7 @@ public void initialize(@TempDir java.nio.file.Path temp) throws IOException { public void saveAndLoadDefaultPath() { Path path = new WpilibPath("default"); SaveManager.getInstance().saveChange(path); - Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); + Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk doesn't match original"); } @@ -39,7 +39,7 @@ public void saveAndLoadWithAddedWaypoint() { Path path = new WpilibPath("default"); path.addWaypoint(new Point2D(5.0, 5.0), path.getStart(), path.getEnd()); SaveManager.getInstance().saveChange(path); - Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); + Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk with an added waypoint doesn't match original"); } @@ -49,7 +49,7 @@ public void addMultipleChangesAndSave() { paths.forEach(path -> SaveManager.getInstance().addChange(path)); SaveManager.getInstance().saveAll(); for (Path path : paths) { - Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); + Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk doesn't match original"); } } From d3cfcd2d34792d467f27151ca3c0a1c21900ca6d Mon Sep 17 00:00:00 2001 From: jasondaming Date: Tue, 16 Feb 2021 20:54:29 -0600 Subject: [PATCH 2/3] kept IO in PathWeaver --- .../pathweaver/FieldDisplayController.java | 2 +- .../wpi/first/pathweaver/MainController.java | 4 +- .../edu/wpi/first/pathweaver/PathIOUtil.java | 97 +++++++++++++++++++ .../edu/wpi/first/pathweaver/SaveManager.java | 2 +- .../wpi/first/pathweaver/spline/Spline.java | 5 +- .../spline/wpilib/WpilibSpline.java | 30 +++--- .../wpi/first/pathweaver/SaveManagerTest.java | 6 +- 7 files changed, 119 insertions(+), 27 deletions(-) create mode 100644 src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java diff --git a/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java b/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java index d7c3b89f..92bcae0c 100644 --- a/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java +++ b/src/main/java/edu/wpi/first/pathweaver/FieldDisplayController.java @@ -111,7 +111,7 @@ public Path addPath(String fileLocations, TreeItem newValue) { return path; } } - Path newPath = WaypointUtil.importWaypoints(fileLocations, fileName); + Path newPath = PathIOUtil.importPath(fileLocations, fileName); if (newPath == null) { newPath = new WpilibPath(fileName); SaveManager.getInstance().saveChange(newPath); diff --git a/src/main/java/edu/wpi/first/pathweaver/MainController.java b/src/main/java/edu/wpi/first/pathweaver/MainController.java index c1ed0230..363109f1 100644 --- a/src/main/java/edu/wpi/first/pathweaver/MainController.java +++ b/src/main/java/edu/wpi/first/pathweaver/MainController.java @@ -339,11 +339,11 @@ private void buildPaths() { LOGGER.log(Level.WARNING, "Could not export to " + output, e); } for (TreeItem pathName : pathRoot.getChildren()) { - Path path = WaypointUtil.importWaypoints(pathDirectory, pathName.getValue()); + Path path = PathIOUtil.importPath(pathDirectory, pathName.getValue()); java.nio.file.Path pathNameFile = output.resolve(path.getPathNameNoExtension()); - if(!path.getSpline().writePathToFile(pathNameFile)) { + if(!path.getSpline().writePathToFile(path)) { Alert alert = new Alert(Alert.AlertType.WARNING); alert.setTitle("Path export failure!"); alert.setContentText("Could not export to: " + output.toAbsolutePath()); diff --git a/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java b/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java new file mode 100644 index 00000000..72c8d5d2 --- /dev/null +++ b/src/main/java/edu/wpi/first/pathweaver/PathIOUtil.java @@ -0,0 +1,97 @@ +package edu.wpi.first.pathweaver; + +import edu.wpi.first.pathweaver.path.Path; +import edu.wpi.first.pathweaver.path.wpilib.WpilibPath; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVPrinter; +import org.apache.commons.csv.CSVRecord; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javafx.geometry.Point2D; + +public final class PathIOUtil { + private static final Logger LOGGER = Logger.getLogger(PathIOUtil.class.getName()); + + private PathIOUtil() { + } + + /** + * Exports path object to csv file. + * + * @param fileLocation the directory and filename to write to + * @param path Path object to save + * + * @return true if successful file write was preformed + */ + public static boolean export(String fileLocation, Path path, double yoffset) { + try ( + BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileLocation + path.getPathName())); + + CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT + .withHeader("X", "Y", "Tangent X", "Tangent Y", "Fixed Theta", "Reversed", "Name")) + ) { + for (Waypoint wp : path.getWaypoints()) { + double xPos = wp.getX(); + double yPos = wp.getY() + yoffset; + double tangentX = wp.getTangentX(); + double tangentY = wp.getTangentY(); + String name = wp.getName(); + csvPrinter.printRecord(xPos, yPos, tangentX, tangentY, wp.isLockTangent(), wp.isReversed(), name); + } + csvPrinter.flush(); + } catch (IOException except) { + LOGGER.log(Level.WARNING, "Could not save Path file", except); + return false; + } + return true; + } + + /** + * Imports Path object from disk. + * + * @param fileLocation Folder with path file + * @param fileName Name of path file + * + * @return Path object saved in Path file + */ + public static Path importPath(String fileLocation, String fileName) { + try(Reader reader = Files.newBufferedReader(java.nio.file.Path.of(fileLocation, fileName)); + CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT + .withFirstRecordAsHeader() + .withIgnoreHeaderCase() + .withTrim())) { + ArrayList waypoints = new ArrayList<>(); + for (CSVRecord csvRecord : csvParser) { + Point2D position = new Point2D( + Double.parseDouble(csvRecord.get("X")), + Double.parseDouble(csvRecord.get("Y")) + ); + Point2D tangent = new Point2D( + Double.parseDouble(csvRecord.get("Tangent X")), + Double.parseDouble(csvRecord.get("Tangent Y")) + ); + boolean locked = Boolean.parseBoolean(csvRecord.get("Fixed Theta")); + boolean reversed = Boolean.parseBoolean(csvRecord.get("Reversed")); + Waypoint point = new Waypoint(position, tangent, locked, reversed); + if (csvRecord.isMapped("Name")) { + String name = csvRecord.get("Name"); + point.setName(name); + } + waypoints.add(point); + } + return new WpilibPath(waypoints, fileName); + } catch (IOException except) { + LOGGER.log(Level.WARNING, "Could not read Path file", except); + return null; + } + } +} diff --git a/src/main/java/edu/wpi/first/pathweaver/SaveManager.java b/src/main/java/edu/wpi/first/pathweaver/SaveManager.java index 7323a4cc..30f5b077 100644 --- a/src/main/java/edu/wpi/first/pathweaver/SaveManager.java +++ b/src/main/java/edu/wpi/first/pathweaver/SaveManager.java @@ -86,7 +86,7 @@ public void saveChange(Path path) { */ private void saveChange(Path path, boolean remove) { String pathDirectory = ProjectPreferences.getInstance().getDirectory() + "/Paths/"; - WaypointUtil.exportWaypoints(pathDirectory, path, 0d); + PathIOUtil.export(pathDirectory, path, 0d); if (remove) { paths.remove(path); } diff --git a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java index be2b522a..02617b54 100644 --- a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java +++ b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java @@ -1,10 +1,9 @@ package edu.wpi.first.pathweaver.spline; +import edu.wpi.first.pathweaver.path.Path; import edu.wpi.first.pathweaver.global.CurrentSelections; import javafx.scene.Group; -import java.nio.file.Path; - /** * This interface represents a Spline - the function that describes the path * the robot will take when travelling across the field. This class is designed for use with @@ -62,7 +61,7 @@ public interface Spline { * @param path the path of the file to write to * @return whether the write succeeded */ - boolean writeToFile(Path path); + boolean writeToFile(java.nio.file.Path path); /** * Export this path to a file for use in the robot. diff --git a/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java b/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java index 0c9ad829..9a00c57d 100644 --- a/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java +++ b/src/main/java/edu/wpi/first/pathweaver/spline/wpilib/WpilibSpline.java @@ -149,32 +149,28 @@ public boolean writeToFile(java.nio.file.Path path) { } @Override - public boolean writePathToFile(java.nio.file.Path path) { + public boolean writePathToFile(Path path) { final AtomicBoolean okay = new AtomicBoolean(true); TrajectoryGenerator.setErrorHandler((error, stacktrace) -> { LOGGER.log(Level.WARNING, "Could not write Spline to file: " + error, stacktrace); okay.set(false); }); - try { - var prefs = ProjectPreferences.getInstance(); - var lengthUnit = prefs.getField().getUnit(); - // This value has units of the length type. - double height = prefs.getField().getRealLength().getValue().doubleValue(); + var prefs = ProjectPreferences.getInstance(); + var lengthUnit = prefs.getField().getUnit(); - // If the export type is different (i.e. meters), then we have to convert it. Otherwise we are good. - if (prefs.getValues().getExportUnit() == ProjectPreferences.ExportUnit.METER) { - UnitConverter converter = lengthUnit.getConverterTo(PathUnits.METER); - height = converter.convert(height); - } - - WaypointUtil.exportWaypoints(path.getParent().toString(), path, height); + // This value has units of the length type. + double height = prefs.getField().getRealLength().getValue().doubleValue(); - return okay.get(); - } catch (IOException except) { - LOGGER.log(Level.WARNING, "Could not write Spline to file", except); - return false; + // If the export type is different (i.e. meters), then we have to convert it. Otherwise we are good. + if (prefs.getValues().getExportUnit() == ProjectPreferences.ExportUnit.METER) { + UnitConverter converter = lengthUnit.getConverterTo(PathUnits.METER); + height = converter.convert(height); } + + PathIOUtil.export(ProjectPreferences.getInstance().getValues().getOutputDir() + "/Waypoints/", path, height); + + return okay.get(); } private static QuinticHermiteSpline[] getQuinticSplinesFromWaypoints(Waypoint[] waypoints) { diff --git a/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java b/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java index 772f9271..9ee619b9 100644 --- a/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java +++ b/src/test/java/edu/wpi/first/pathweaver/SaveManagerTest.java @@ -30,7 +30,7 @@ public void initialize(@TempDir java.nio.file.Path temp) throws IOException { public void saveAndLoadDefaultPath() { Path path = new WpilibPath("default"); SaveManager.getInstance().saveChange(path); - Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); + Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk doesn't match original"); } @@ -39,7 +39,7 @@ public void saveAndLoadWithAddedWaypoint() { Path path = new WpilibPath("default"); path.addWaypoint(new Point2D(5.0, 5.0), path.getStart(), path.getEnd()); SaveManager.getInstance().saveChange(path); - Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); + Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk with an added waypoint doesn't match original"); } @@ -49,7 +49,7 @@ public void addMultipleChangesAndSave() { paths.forEach(path -> SaveManager.getInstance().addChange(path)); SaveManager.getInstance().saveAll(); for (Path path : paths) { - Path loadPath = WaypointUtil.importWaypoints(pathDirectory, path.getPathName()); + Path loadPath = PathIOUtil.importPath(pathDirectory, path.getPathName()); assertEquals(path, loadPath, "Path loaded from disk doesn't match original"); } } From c3f15d4fdd2a55accfc56b295fbd333efce4385a Mon Sep 17 00:00:00 2001 From: jasondaming Date: Thu, 8 Apr 2021 21:36:56 -0500 Subject: [PATCH 3/3] Import newline --- src/main/java/edu/wpi/first/pathweaver/spline/Spline.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java index 02617b54..a5a50ced 100644 --- a/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java +++ b/src/main/java/edu/wpi/first/pathweaver/spline/Spline.java @@ -1,4 +1,5 @@ package edu.wpi.first.pathweaver.spline; + import edu.wpi.first.pathweaver.path.Path; import edu.wpi.first.pathweaver.global.CurrentSelections;