static void write_output(SafeListBuilder <string> safelist) { safelist.SafeOperation((list) => { list.Sort(); File.WriteAllLines("../../../sample_output/Thingi10K_slice_results.csv", list); }); }
static void run_multi_process() { int done_count = 0; int MAX_COUNT = 10000; bool VERBOSE = false; TimeSpan TIMEOUT = TimeSpan.FromSeconds(120); int SAVE_INCREMENT = 10; int failed_count = 0; HashSet <string> completed = File.Exists(CACHE_FILENAME) ? new HashSet <string>(File.ReadAllLines(CACHE_FILENAME)) : new HashSet <string>(); string[] files = Directory.GetFiles("E:\\Thingi10K\\closed"); //string[] files = File.ReadAllLines("..\\..\\..\\sample_output\\slice_over_30.txt"); //string[] files = File.ReadAllLines("..\\..\\..\\sample_output\\slice_over_180.txt"); //string[] files = File.ReadAllLines("..\\..\\..\\sample_output\\slice_fails.txt"); //files = new string[] { "E:\\Thingi10K\\closed\\61464.g3mesh" }; SafeListBuilder <string> result_strings = new SafeListBuilder <string>(); SafeListBuilder <string> processed_files = new SafeListBuilder <string>(); //gParallel.ForEach_Sequential(files, (filename) => { Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (filename) => { if (!File.Exists(filename)) { return; } int i = done_count; if (i > MAX_COUNT) { return; } Interlocked.Increment(ref done_count); if (i % SAVE_INCREMENT == 0) { System.Console.WriteLine("started {0} / {1}", i, files.Length); } if (completed.Contains(filename)) { return; } // save progress on this run if (i % SAVE_INCREMENT == 0) { write_output(result_strings); lock (completed) { write_completed(completed, CACHE_FILENAME); } } StringBuilder builder = new StringBuilder(); builder.Append(filename); builder.Append(','); var start = DateTime.Now; if (VERBOSE) { System.Console.WriteLine(builder.ToString()); } GCodeInfo gcinfo = GenerateGCodeForFileWithTimeoutInProcess(filename, TIMEOUT); if (gcinfo.exception != null) { System.Console.WriteLine(filename + " : " + gcinfo.exception.Message); Interlocked.Increment(ref failed_count); } builder.Append(gcinfo.triangle_count.ToString()); builder.Append(','); if (gcinfo.timed_out) { builder.Append("TIMEOUT"); } else if (gcinfo.completed) { builder.Append("OK"); } else { builder.Append("FAILED"); } builder.Append(','); var end = DateTime.Now; builder.Append(gcinfo.time_in_seconds.ToString()); builder.Append(','); builder.Append(gcinfo.SliceCount.ToString()); builder.Append(','); builder.Append(gcinfo.GCodeLines.ToString()); builder.Append(','); builder.Append(gcinfo.GCodeBytes.ToString()); builder.Append(','); builder.Append(gcinfo.TotalLength.ToString()); builder.Append(','); if (VERBOSE) { System.Console.WriteLine(builder.ToString()); } result_strings.SafeAdd(builder.ToString()); lock (completed) { completed.Add(filename); } }); write_output(result_strings); }
public static void test_read_thingi10k() { //const string THINGIROOT = "D:\\meshes\\Thingi10K\\raw_meshes\\"; const string THINGIROOT = "F:\\Thingi10K\\raw_meshes\\"; string[] files = Directory.GetFiles(THINGIROOT); SafeListBuilder <string> failures = new SafeListBuilder <string>(); SafeListBuilder <string> empty = new SafeListBuilder <string>(); SafeListBuilder <string> closed = new SafeListBuilder <string>(); SafeListBuilder <string> open = new SafeListBuilder <string>(); SafeListBuilder <string> boundaries_failed = new SafeListBuilder <string>(); int k = 0; gParallel.ForEach(files, (filename) => { int i = k; Interlocked.Increment(ref k); System.Console.WriteLine("{0} : {1}", i, filename); DMesh3Builder builder = new DMesh3Builder(); StandardMeshReader reader = new StandardMeshReader() { MeshBuilder = builder }; IOReadResult result = reader.Read(filename, ReadOptions.Defaults); if (result.code != IOCode.Ok) { System.Console.WriteLine("{0} FAILED!", filename); failures.SafeAdd(filename); return; } bool is_open = false; bool loops_failed = false; bool is_empty = true; foreach (DMesh3 mesh in builder.Meshes) { if (mesh.TriangleCount > 0) { is_empty = false; } if (mesh.IsClosed() == false) { is_open = true; try { MeshBoundaryLoops loops = new MeshBoundaryLoops(mesh, false) { SpanBehavior = MeshBoundaryLoops.SpanBehaviors.ThrowException, FailureBehavior = MeshBoundaryLoops.FailureBehaviors.ThrowException }; loops.Compute(); } catch { loops_failed = true; } } } if (is_empty) { empty.SafeAdd(filename); } else if (is_open) { open.SafeAdd(filename); if (loops_failed) { boundaries_failed.SafeAdd(filename); } } else { closed.SafeAdd(filename); } }); foreach (string failure in failures.Result) { System.Console.WriteLine("FAIL: {0}", failure); } TestUtil.WriteTestOutputStrings(empty.List.ToArray(), "thingi10k_empty.txt"); TestUtil.WriteTestOutputStrings(closed.List.ToArray(), "thingi10k_closed.txt"); TestUtil.WriteTestOutputStrings(open.List.ToArray(), "thingi10k_open.txt"); TestUtil.WriteTestOutputStrings(boundaries_failed.List.ToArray(), "thingi10k_boundaries_failed.txt"); }
static void run_single_process() { int done_count = 0; int MAX_COUNT = 10000; bool VERBOSE = false; TimeSpan TIMEOUT = TimeSpan.FromSeconds(30); int failed_count = 0; double MAX_DIM_MM = 50; int MAX_TRI_COUNT = 250000; HashSet <string> completed = File.Exists(CACHE_FILENAME) ? new HashSet <string>(File.ReadAllLines(CACHE_FILENAME)) : new HashSet <string>(); string[] files = Directory.GetFiles("E:\\Thingi10K\\closed"); SafeListBuilder <string> result_strings = new SafeListBuilder <string>(); SafeListBuilder <string> processed_files = new SafeListBuilder <string>(); gParallel.ForEach(files, (filename) => { int i = done_count; if (i > MAX_COUNT) { return; } Interlocked.Increment(ref done_count); if (i % 10 == 0) { System.Console.WriteLine("started {0} / {1}", i, files.Length); } if (completed.Contains(filename)) { return; } // save progress on this run if (i % 10 == 0) { write_output(result_strings); lock (completed) { write_completed(completed, CACHE_FILENAME); } } DMesh3 mesh = StandardMeshReader.ReadMesh(filename); AxisAlignedBox3d bounds = mesh.CachedBounds; MeshTransforms.Scale(mesh, MAX_DIM_MM / bounds.MaxDim); Vector3d basePt = mesh.CachedBounds.Point(0, 0, -1); MeshTransforms.Translate(mesh, -basePt); if (mesh.TriangleCount > MAX_TRI_COUNT) { Reducer r = new Reducer(mesh); r.ReduceToTriangleCount(MAX_TRI_COUNT); mesh = new DMesh3(mesh, true); } StringBuilder builder = new StringBuilder(); builder.Append(filename); builder.Append(','); builder.Append(mesh.TriangleCount.ToString()); builder.Append(','); var start = DateTime.Now; if (VERBOSE) { System.Console.WriteLine(builder.ToString()); } if (VERBOSE) { System.Console.WriteLine(mesh.CachedBounds.ToString()); } GCodeInfo gcinfo = GenerateGCodeForFileWithTimeout2(filename, TIMEOUT); if (gcinfo.exception != null) { System.Console.WriteLine(filename + " : " + gcinfo.exception.Message); Interlocked.Increment(ref failed_count); } if (gcinfo.completed) { builder.Append("OK"); } else if (gcinfo.completed == false && gcinfo.timed_out) { builder.Append("TIMEOUT"); } else if (gcinfo.completed == false) { builder.Append("FAILED"); } builder.Append(','); var end = DateTime.Now; builder.Append(((int)(end - start).TotalSeconds).ToString()); builder.Append(','); builder.Append(gcinfo.SliceCount.ToString()); builder.Append(','); builder.Append(gcinfo.GCodeLines.ToString()); builder.Append(','); builder.Append(gcinfo.GCodeBytes.ToString()); builder.Append(','); builder.Append(gcinfo.TotalLength.ToString()); builder.Append(','); if (VERBOSE) { System.Console.WriteLine(builder.ToString()); } result_strings.SafeAdd(builder.ToString()); lock (completed) { completed.Add(filename); } }); write_output(result_strings); }
public static void test_autorepair_thingi10k() { //const string THINGIROOT = "E:\\Thingi10K\\"; string WRITEPATH = "E:\\Thingi10K\\repair_fails\\"; //string[] files = File.ReadAllLines("E:\\Thingi10K\\current\\thingi10k_open.txt"); string[] files = File.ReadAllLines("C:\\git\\gsGeometryTests\\test_output\\thingi10k_autorepair_failures.txt"); //string[] files = new string[] { // "E:\\Thingi10K\\raw_meshes\\37011.stl" //}; SafeListBuilder <string> failures = new SafeListBuilder <string>(); int count = 0; int MAX_NUM_FILES = 10000; gParallel.ForEach(files, (filename) => { if (count > MAX_NUM_FILES) { return; } int i = count; Interlocked.Increment(ref count); if (i % 10 == 0) { System.Console.WriteLine("{0} / {1}", i, files.Length); } long start_ticks = DateTime.Now.Ticks; DMesh3Builder builder = new DMesh3Builder(); StandardMeshReader reader = new StandardMeshReader() { MeshBuilder = builder }; IOReadResult result = reader.Read(filename, ReadOptions.Defaults); if (result.code != IOCode.Ok) { System.Console.WriteLine("{0} FAILED TO READ!", filename); failures.SafeAdd(filename); return; } DMesh3 mesh = builder.Meshes[0]; for (int k = 1; k < builder.Meshes.Count; ++k) { MeshEditor.Append(mesh, builder.Meshes[k]); } DMesh3 before = new DMesh3(mesh); try { MeshAutoRepair repair = new MeshAutoRepair(mesh); repair.Apply(); } catch (Exception e) { System.Console.WriteLine("EXCEPTION {0} : {1}", filename, e.Message); failures.SafeAdd(filename); return; } if (mesh.IsClosed() == false) { failures.SafeAdd(filename); Util.WriteDebugMesh(before, WRITEPATH + Path.GetFileNameWithoutExtension(filename) + ".obj"); Util.WriteDebugMesh(mesh, WRITEPATH + Path.GetFileNameWithoutExtension(filename) + ".failed.obj"); return; } else { if (mesh.CheckValidity(false, FailMode.ReturnOnly) == false) { System.Console.WriteLine("INVALID {0}", filename); failures.SafeAdd(filename); Util.WriteDebugMesh(before, WRITEPATH + Path.GetFileNameWithoutExtension(filename) + ".obj"); Util.WriteDebugMesh(mesh, WRITEPATH + Path.GetFileNameWithoutExtension(filename) + ".invalid.obj"); return; } } }); //foreach (string failure in failures.Result) { // System.Console.WriteLine("FAIL: {0}", failure); //} System.Console.WriteLine("repaired {0} of {1}", files.Length - failures.Result.Count, files.Length); TestUtil.WriteTestOutputStrings(make_strings(failures), "thingi10k_autorepair_failures_new.txt"); }
static string[] make_strings(SafeListBuilder <string> s) { s.List.Sort(); return(s.List.ToArray()); }
public static ThrottlePolicyBuilder User(this SafeListBuilder builder, params string[] safe) { return(builder.ForResolver(UsernameResolver.Instance, safe)); }
public static void test_write_solids() { //string FORMAT = ".obj"; string FORMAT = ".g3mesh"; string WRITEPATH = "E:\\Thingi10K\\closed\\"; string[] files = File.ReadAllLines("E:\\Thingi10K\\current\\thingi10k_closed.txt"); SafeListBuilder <string> failures = new SafeListBuilder <string>(); if (!Directory.Exists(WRITEPATH)) { Directory.CreateDirectory(WRITEPATH); } int k = 0; gParallel.ForEach(files, (filename) => { int i = k; Interlocked.Increment(ref k); if (i % 500 == 0) { System.Console.WriteLine("{0} : {1}", i, files.Length); } long start_ticks = DateTime.Now.Ticks; DMesh3Builder builder = new DMesh3Builder(); StandardMeshReader reader = new StandardMeshReader() { MeshBuilder = builder }; IOReadResult result = reader.Read(filename, ReadOptions.Defaults); if (result.code != IOCode.Ok) { System.Console.WriteLine("{0} FAILED!", filename); failures.SafeAdd(filename); return; } DMesh3 combineMesh = new DMesh3(); if (builder.Meshes.Count == 1) { combineMesh = builder.Meshes[0]; } else { foreach (DMesh3 mesh in builder.Meshes) { MeshEditor.Append(combineMesh, mesh); } } if (combineMesh.IsClosed() == false) { MergeCoincidentEdges closeCracks = new MergeCoincidentEdges(combineMesh); closeCracks.Apply(); } if (combineMesh.IsClosed() == false) { System.Console.WriteLine("NOT CLOSED: {0}", filename); return; } string outPath = Path.Combine(WRITEPATH, Path.GetFileNameWithoutExtension(filename) + FORMAT); StandardMeshWriter.WriteMesh(outPath, combineMesh, WriteOptions.Defaults); }); }
public static void test_repair_all() { //const string THINGIROOT = "D:\\meshes\\Thingi10K\\raw_meshes\\"; const string THINGIROOT = "E:\\Thingi10K\\raw_meshes\\"; string[] files = Directory.GetFiles(THINGIROOT); //files = File.ReadAllLines("C:\\git\\geometry3SharpDemos\\geometry3Test\\test_output\\thingi10k_open.txt"); SafeListBuilder <string> failures = new SafeListBuilder <string>(); SafeListBuilder <string> empty = new SafeListBuilder <string>(); SafeListBuilder <string> closed = new SafeListBuilder <string>(); SafeListBuilder <string> open = new SafeListBuilder <string>(); SafeListBuilder <string> boundaries_failed = new SafeListBuilder <string>(); SafeListBuilder <string> boundaries_spans_failed = new SafeListBuilder <string>(); SafeListBuilder <string> slow = new SafeListBuilder <string>(); SafeListBuilder <string> veryslow = new SafeListBuilder <string>(); int k = 0; int MAX_NUM_FILES = 10000; gParallel.ForEach(files, (filename) => { if (k > MAX_NUM_FILES) { return; } int i = k; Interlocked.Increment(ref k); System.Console.WriteLine("{0} : {1}", i, filename); long start_ticks = DateTime.Now.Ticks; DMesh3Builder builder = new DMesh3Builder(); StandardMeshReader reader = new StandardMeshReader() { MeshBuilder = builder }; IOReadResult result = reader.Read(filename, ReadOptions.Defaults); if (result.code != IOCode.Ok) { System.Console.WriteLine("{0} FAILED!", filename); failures.SafeAdd(filename); return; } bool is_open = false; bool loops_failed = false; bool loops_spans_failed = false; bool is_empty = true; foreach (DMesh3 mesh in builder.Meshes) { if (mesh.TriangleCount > 0) { is_empty = false; } if (mesh.IsClosed() == false) { MergeCoincidentEdges closeCracks = new MergeCoincidentEdges(mesh); closeCracks.Apply(); } if (mesh.IsClosed() == false) { is_open = true; try { MeshBoundaryLoops loops = new MeshBoundaryLoops(mesh, false) { SpanBehavior = MeshBoundaryLoops.SpanBehaviors.ThrowException, FailureBehavior = MeshBoundaryLoops.FailureBehaviors.ThrowException }; loops.Compute(); } catch { loops_failed = true; } if (loops_failed) { try { MeshBoundaryLoops loops = new MeshBoundaryLoops(mesh, false) { SpanBehavior = MeshBoundaryLoops.SpanBehaviors.Compute, FailureBehavior = MeshBoundaryLoops.FailureBehaviors.ConvertToOpenSpan }; loops.Compute(); } catch { loops_spans_failed = true; } } } } TimeSpan elapsed = new TimeSpan(DateTime.Now.Ticks - start_ticks); if (elapsed.TotalSeconds > 60) { veryslow.SafeAdd(filename); } else if (elapsed.TotalSeconds > 10) { slow.SafeAdd(filename); } if (is_empty) { empty.SafeAdd(filename); } else if (is_open) { open.SafeAdd(filename); if (loops_failed) { boundaries_failed.SafeAdd(filename); } if (loops_spans_failed) { boundaries_spans_failed.SafeAdd(filename); } } else { closed.SafeAdd(filename); } }); foreach (string failure in failures.Result) { System.Console.WriteLine("FAIL: {0}", failure); } TestUtil.WriteTestOutputStrings(make_strings(failures), "thingi10k_failures.txt"); TestUtil.WriteTestOutputStrings(make_strings(empty), "thingi10k_empty.txt"); TestUtil.WriteTestOutputStrings(make_strings(closed), "thingi10k_closed.txt"); TestUtil.WriteTestOutputStrings(make_strings(open), "thingi10k_open.txt"); TestUtil.WriteTestOutputStrings(make_strings(boundaries_failed), "thingi10k_boundaries_failed.txt"); TestUtil.WriteTestOutputStrings(make_strings(boundaries_spans_failed), "thingi10k_boundaries_spans_failed.txt"); TestUtil.WriteTestOutputStrings(make_strings(slow), "thingi10k_slow.txt"); TestUtil.WriteTestOutputStrings(make_strings(veryslow), "thingi10k_veryslow.txt"); }