internal static void TestE57() { var sw = new Stopwatch(); CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; var filename = @"T:\Vgm\Data\E57\Innenscan_FARO.e57"; var fileSizeInBytes = new FileInfo(filename).Length; var info = E57.E57Info(filename, ParseConfig.Default); Report.Line($"total bounds: {info.Bounds}"); Report.Line($"total count : {info.PointCount:N0}"); var config = ImportConfig.Default .WithInMemoryStore() .WithRandomKey() .WithVerbose(true) .WithMaxDegreeOfParallelism(0) .WithMinDist(0.01) ; Report.BeginTimed("total"); var chunks = E57 .Chunks(filename, config.ParseConfig) //.Take(10) //.AsParallel() //.Select(x => x.ImmutableFilterMinDistByCell(new Cell(x.BoundingBox), config)) //.Select(x => x.ImmutableFilterSequentialMinDistL1(0.01)) //.ToArray() ; var pc = PointCloud.Chunks(chunks, config); Report.EndTimed(); //var memstore = new SimpleMemoryStore().ToPointCloudStore(); // classic //var foo = chunks.AsParallel().Select(x => InMemoryPointSet.Build(x, 8192).ToPointSetCell(memstore)); //var r = foo.MapReduceParallel((first, second, ct2) => //{ // var merged = first.Merge(second, 8192, null, default); // memstore.Add(Guid.NewGuid().ToString(), merged, default); // Report.Line($"{first.PointCountTree,12:N0} + {second.PointCountTree,12:N0} -> {merged.PointCountTree,12:N0}"); // return merged; //}, 0); //// test 1 //Report.BeginTimed("merging all chunks"); //var chunk = Chunk.Empty; //foreach (var x in chunks) chunk = Chunk.ImmutableMerge(chunk, x); //Report.Line($"points : {chunk.Count:N0}"); //Report.EndTimed(); //Report.BeginTimed("filter mindist"); //chunk = chunk.ImmutableFilterMinDistByCell(0.01, new Cell(chunk.BoundingBox)); //Report.Line($"points : {chunk.Count:N0}"); //Report.EndTimed(); //Report.BeginTimed("slots"); //var slots = chunk.Positions.GroupBy(p => (V3i)p).ToArray(); //Report.Line($"[slots] {slots.Length}"); //var slotsCountAvg = slots.Sum(x => x.Count() / (double)slots.Length); //var slotsCountMin = slots.Min(x => x.Count()); //var slotsCountMax = slots.Max(x => x.Count()); //var slotsCountSd = (slots.Sum(x => (x.Count() - slotsCountAvg).Square()) / slots.Length).Sqrt(); //Report.Line($"[slots] count avg = {slotsCountAvg}"); //Report.Line($"[slots] count min = {slotsCountMin}"); //Report.Line($"[slots] count max = {slotsCountMax}"); //Report.Line($"[slots] count sd = {slotsCountSd}"); //Report.EndTimed(); //Report.BeginTimed("build octree"); //var octree = InMemoryPointSet.Build(chunk, 8192); //Report.EndTimed(); //Report.BeginTimed("toPointSetCell"); //var psc = octree.ToPointSetCell(memstore); //var ps = new PointSet(memstore, "foo", psc.Id, 8192); //Report.EndTimed(); //Report.BeginTimed("generate lod"); //var psWithNormals = ps.GenerateLod(config); //Report.EndTimed(); //Report.Line($"chunks: {foo.Count}"); //return; //var lastProgress = 0.0; //config = ImportConfig.Default // .WithInMemoryStore() // .WithRandomKey() // .WithVerbose(false) // .WithMaxDegreeOfParallelism(0) // .WithMinDist(0.01) // .WithProgressCallback(x => // { // if (x < lastProgress) Console.WriteLine("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH"); else lastProgress = x; // Console.WriteLine($"[PROGRESS]; {x,8:0.00000}; {sw.Elapsed.TotalSeconds:0.00}"); // }) // ; //chunks = E57.Chunks(filename, config.ParseConfig); //var pointcloud = PointCloud.Chunks(chunks, config); //Console.WriteLine($"pointcloud.PointCount : {pointcloud.PointCount}"); //Console.WriteLine($"pointcloud.Bounds : {pointcloud.Bounds}"); //Console.WriteLine($"pointcloud.BoundingBox : {pointcloud.BoundingBox}"); //var chunks = E57.Chunks(filename, config); //var pointcloud = PointCloud.Chunks(chunks, config); //Console.WriteLine($"pointcloud.PointCount : {pointcloud.PointCount}"); //Console.WriteLine($"pointcloud.Bounds : {pointcloud.Bounds}"); //Console.WriteLine($"pointcloud.BoundingBox : {pointcloud.BoundingBox}"); //var leafLodPointCount = 0L; //pointcloud.Root.Value.ForEachNode(true, n => { if (n.IsLeaf) leafLodPointCount += n.LodPositionsAbsolute.Length; }); //Console.WriteLine($"leaf lod point count :{leafLodPointCount}"); //foreach (var chunk in chunks) //{ // for (var i = 0; i < chunk.Count; i++) // { // Console.WriteLine($"{chunk.Positions[i]:0.000} {chunk.Colors?[i]}"); // } //} //Console.WriteLine($"chunks point count: {chunks.Sum(x => x.Positions.Count)}"); //Console.WriteLine($"chunks bounds : {new Box3d(chunks.SelectMany(x => x.Positions))}"); //using (var w = File.CreateText("test.txt")) //{ // foreach (var chunk in chunks) // { // for (var i = 0; i < chunk.Count; i++) // { // var p = chunk.Positions[i]; // var c = chunk.Colors[i]; // w.WriteLine($"{p.X} {p.Y} {p.Z} {c.R} {c.G} {c.B}"); // } // } //} //return; /* * var stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); * ASTM_E57.VerifyChecksums(stream, fileSizeInBytes); * var header = ASTM_E57.E57FileHeader.Parse(stream); * * //Report.BeginTimed("parsing E57 file"); * //var take = int.MaxValue; * //var data = header.E57Root.Data3D.SelectMany(x => x.StreamCartesianCoordinates(false)).Take(take).Chunk(1000000).ToList(); * //Report.EndTimed(); * //Report.Line($"#points: {data.Sum(xs => xs.Length)}"); * * foreach (var p in header.E57Root.Data3D.SelectMany(x => x.StreamPoints(false))) Console.WriteLine(p.Item1); * * //var ps = PointCloud.Parse(filename, ImportConfig.Default) * // .SelectMany(x => x.Positions) * // .ToArray() * // ; */ }
internal static void TestE57() { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; var filename = @"test.e57"; var fileSizeInBytes = new FileInfo(filename).Length; var config = ImportConfig.Default .WithInMemoryStore() .WithRandomKey() .WithVerbose(true) .WithMaxDegreeOfParallelism(0) .WithMinDist(0.005) ; var chunks = E57.Chunks(filename, config).ToList(); var pointcloud = PointCloud.Chunks(chunks, config); Console.WriteLine($"pointcloud.PointCount : {pointcloud.PointCount}"); Console.WriteLine($"pointcloud.Bounds :{pointcloud.Bounds}"); Console.WriteLine($"pointcloud.BoundingBox :{pointcloud.BoundingBox}"); var leafLodPointCount = 0L; pointcloud.Root.Value.ForEachNode(true, n => { if (n.IsLeaf) { leafLodPointCount += n.LodPositionsAbsolute.Length; } }); Console.WriteLine($"leaf lod point count :{leafLodPointCount}"); //foreach (var chunk in chunks) //{ // for (var i = 0; i < chunk.Count; i++) // { // Console.WriteLine($"{chunk.Positions[i]:0.000} {chunk.Colors?[i]}"); // } //} Console.WriteLine($"chunks point count: {chunks.Sum(x => x.Positions.Count)}"); Console.WriteLine($"chunks bounds : {new Box3d(chunks.SelectMany(x => x.Positions))}"); //using (var w = File.CreateText("test.txt")) //{ // foreach (var chunk in chunks) // { // for (var i = 0; i < chunk.Count; i++) // { // var p = chunk.Positions[i]; // var c = chunk.Colors[i]; // w.WriteLine($"{p.X} {p.Y} {p.Z} {c.R} {c.G} {c.B}"); // } // } //} //return; /* * var stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); * ASTM_E57.VerifyChecksums(stream, fileSizeInBytes); * var header = ASTM_E57.E57FileHeader.Parse(stream); * * //Report.BeginTimed("parsing E57 file"); * //var take = int.MaxValue; * //var data = header.E57Root.Data3D.SelectMany(x => x.StreamCartesianCoordinates(false)).Take(take).Chunk(1000000).ToList(); * //Report.EndTimed(); * //Report.Line($"#points: {data.Sum(xs => xs.Length)}"); * * foreach (var p in header.E57Root.Data3D.SelectMany(x => x.StreamPoints(false))) Console.WriteLine(p.Item1); * * //var ps = PointCloud.Parse(filename, ImportConfig.Default) * // .SelectMany(x => x.Positions) * // .ToArray() * // ; */ }