using System; using System.Collections; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using LASFormat; using LASRead; using LASRead.LASFormat; using Microsoft.CSharp.RuntimeBinder; namespace LasInteractor { class Program { static void Main(string[] args) { Console.WriteLine("LAS Interactor. Provides methods to interact with .las files."); Console.WriteLine("(c) 2020 Brychan Dempsey.\n.las Format (c) 2002-2019 American Society for Photogrammetry and Remote Sensing (ASPRS)\n"); Console.WriteLine("This software is intended for testing purposes only."); Console.WriteLine("Currently, it is only compatible with processors that work in Little-Endian byte orders. Your system is {0} LE.\n", BitConverter.IsLittleEndian ? "" : "not"); Console.WriteLine("Enter a mode:"); Console.WriteLine("r - read a .las file"); Console.WriteLine("g - generate a .las file"); Console.WriteLine("c - collects the points into xyz format"); Console.WriteLine("z - compress via 7zip (experimental)"); ConsoleKeyInfo c = Console.ReadKey(); while(c.Key != ConsoleKey.Q) { if (c.Key == ConsoleKey.R) { Console.WriteLine("Read a file mode selected.\nPrint full data to console? (Y/n)"); c = Console.ReadKey(); while (c.Key != ConsoleKey.Y && c.Key != ConsoleKey.N) { Console.WriteLine("Please enter Y/n"); c = Console.ReadKey(); } Console.WriteLine("Enter the full file path:"); string path = Console.ReadLine(); ReadFile(path, c.Key == ConsoleKey.Y); } c = Console.ReadKey(); } } private static void ReadFile(string source, bool printAll) { Console.WriteLine("Reading {0}", source); FileStream fs = File.OpenRead(source.Trim('\"')); Console.WriteLine("File is {0} bytes", fs.Length); LASFile lasFile = new LASFile(fs); /*FileStream os = File.OpenWrite("tdata.dat"); RawPoints rp = new RawPoints(lasFile, os); rp.Run(); */ Console.WriteLine(new string('/', 20)); Console.Write(new string('/', 6)); Console.Write(" Header "); Console.WriteLine(new string('/', 6)); Console.WriteLine(new string('/', 20)); Console.Write(lasFile.Header.ToString()); Console.WriteLine(new string('/', 20)); if (printAll) { Console.WriteLine("VLRs:"); Console.WriteLine("press enter to continue (q breaks the loop)"); Console.ReadLine(); foreach (Record record in lasFile.vlrCollection) { Console.WriteLine(record.ToString()); string s = Console.ReadLine(); if (s.Equals("q")) break; } Console.WriteLine("PDRs:"); Console.WriteLine("press enter to continue (q breaks the loop)"); Console.ReadLine(); byte lastClass = 0; foreach (IPointDataRecord pdr in lasFile.points) { if (pdr.Classification == lastClass) { continue; } else { Console.WriteLine(pdr.ToString()); lastClass = pdr.Classification; // Generics abuse // Searches points for the method GetEnumerator() (of PDRCollection), then searches the returned PDREnumerator for EstimateRemainder() dynamic underlyingeEnumerator = lasFile.points.GetType().GetMethod("GetEnumerator").Invoke(lasFile.points, null); string estimation = ((int)underlyingeEnumerator.GetType().GetMethod("EstimateRemainder").Invoke(underlyingeEnumerator, null)).ToString(); Console.WriteLine(estimation); //.GetEnumerator().EstimateRemainder()); string s = Console.ReadLine(); if (s.Equals("q")) break; } } Console.WriteLine("EVLRs:"); Console.WriteLine("press enter to continue (q breaks the loop)"); Console.ReadLine(); foreach (Record record in lasFile.evlrCollection) { Console.WriteLine(record.ToString()); string s = Console.ReadLine(); if (s.Equals("q")) break; } } else { Console.WriteLine("Number of VLRs:"); Console.WriteLine(lasFile.Header.NumberVLRs); Console.WriteLine("Number of PDRs:"); Console.WriteLine(Math.Max(lasFile.Header.LegacyNumberOfPointRecords, lasFile.Header.NumberPointRecords)); if (lasFile.Header.VersionMajor >= 1 && lasFile.Header.VersionMinor >= 4) { Console.WriteLine("Number of Extended VLRs:"); Console.WriteLine(lasFile.Header.NumberOfExtendedVLRs); } else { Console.WriteLine("File Version is < v1.4. No additional data"); } } } void GenerateLAS() { Stream s = new MemoryStream(); // Use a memory stream to save the enumerables. Copy the stream if needed // Create a 163.84 * 163.84 * 163.84 grid LASFile lasFile = new LASFile(s); } } }