Beispiel #1
0
 static void write_output(SafeListBuilder <string> safelist)
 {
     safelist.SafeOperation((list) => {
         list.Sort();
         File.WriteAllLines("../../../sample_output/Thingi10K_slice_results.csv", list);
     });
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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");
        }
Beispiel #4
0
        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());
 }
Beispiel #7
0
 public static ThrottlePolicyBuilder User(this SafeListBuilder builder, params string[] safe)
 {
     return(builder.ForResolver(UsernameResolver.Instance, safe));
 }
Beispiel #8
0
        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);
            });
        }
Beispiel #9
0
        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");
        }