public static Task Execute(ConvertVerb command, ILogger logger) { if (File.Exists(command.InputFile) == false) { logger.Fatal("Input file does not exist!"); Environment.Exit(0); } var baseOutput = string.Join(".", command.InputFile.Split(".").SkipLast(1)); var reader = FileFormatDetector.GetCloudStreamReader(command.InputFile, command.InputFormat); using var writer = FileFormatDetector.GetCloudStreamWriter( command.OutputFile ?? $"{baseOutput}.{command.OutputFormat.ToString().ToLower()}", command.OutputFormat ); var ps = reader.ReadPointSet(); while (ps != null) { writer.WritePointSet(ps); ps = reader.ReadPointSet(); } return(Task.CompletedTask); }
private static Task <IList <Tree> > ExecuteFromRaw(DetectTreesCommand command, ILogger logger) { using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input); if (streamReader == null) { logger.Fatal("Not supported data format."); Environment.Exit(0); } var cloud = new Cloud(streamReader); var terrain = new Terrain(cloud, command.Resolution); foreach (var point in cloud) { point.Z -= terrain.GetHeight(point); } var slices = cloud .Slice(command.SliceHeight.GetValueOrDefault(0.1)) .Where(slice => slice != null).OrderBy(slice => slice.Height) .ToList(); var pointSetGroups = FilteringFlow.GetFilteredPointSetGroups(command.FiltersConfigurationFile, logger, slices); var pointSetGroup = new PointSetGroup(pointSetGroups.SelectMany(p => p.PointSets).ToList()); var trees = Detect(pointSetGroup); return(Task.FromResult(trees)); }
public void TestDetectStreamNotAt0() { using (var stream = new MemoryStream()) { var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; stream.Write(data, 0, data.Length); stream.Position = 4; var matcher = new SimpleLogFileFormatMatcher(null); var detector = new FileFormatDetector(matcher); detector.TryDetermineFormat("", stream, Encoding.Default); matcher.Header.Should().NotBeNull("because the matcher should have been called"); matcher.Header.Length.Should().Be(data.Length, "because the detector should have first repositioned the stream to 0 and forwarded all first 512 bytes to the matcher"); } }
public static Task Execute(SliceCommand command, ILogger logger) { if (File.Exists(command.Input) == false) { logger.Fatal("Provided cloud point data file does not exist!"); Environment.Exit(0); } using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input); if (streamReader == null) { logger.Fatal("Not supported data format."); Environment.Exit(0); } if (File.Exists(command.TerrainPath) == false) { logger.Fatal("Terrain file does not exist!"); Environment.Exit(0); } var cloud = new Cloud(streamReader); var terrain = Terrain.Import(command.TerrainPath); var slices = cloud.Slice(command.SliceHeight).Where(slice => slice != null).OrderBy(slice => slice.Height).ToList(); foreach (var pointSlice in slices) { foreach (var pointSet in pointSlice.PointSets) { foreach (var point in pointSet) { point.Z -= terrain.GetHeight(point); } } } using var writer = new GpdWriter(command.Output, null, (float)command.SliceHeight); writer.WriteSlices(slices); return(Task.CompletedTask); }
public static Task Execute(TerrainCommand command, ILogger logger) { if (File.Exists(command.Input) == false) { logger.Fatal("Provided cloud point data file does not exist!"); Environment.Exit(0); } using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input); if (streamReader == null) { logger.Fatal("Not supported data format."); Environment.Exit(0); } var cloud = new Cloud(streamReader); var terrain = new Terrain(cloud, command.Resolution, command.MaxHeight); terrain.Export(command.Output); return(Task.CompletedTask); }
public void TestSkipDetectionAfterCertaintySure() { using (var stream = new MemoryStream()) { var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; stream.Write(data, 0, data.Length); stream.Position = 4; var matcher = new SimpleLogFileFormatMatcher(null, Certainty.None); var detector = new FileFormatDetector(matcher); detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.GenericText, "because our detector couldn't find a format so the fallback should be generic text"); matcher.NumInvocations.Should().Be(1, "because the detector should try at least once"); matcher.Format = LogFileFormats.Csv; matcher.Certainty = Certainty.Sure; detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.Csv, "because now our detector could find a match and this should have been forward instead of generic text"); matcher.NumInvocations.Should().Be(2, "because the last invocation our matcher was uncertain and thus the detector should have asked again"); detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.Csv); matcher.NumInvocations.Should().Be(2, "because our matcher was certain it is a CSV file so the detector shouldn't have bothered to ask the matcher again"); } }