Example #1
0
        public static void OpenFromString(string data, FileType fileType, out VoxelizedSolid solid)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);

            writer.Write(data);
            writer.Flush();
            stream.Position = 0;
            Open(stream, "", out solid);
        }
Example #2
0
        public static void ShowAndHang(VoxelizedSolid solid)
        {
            var      window = new Window3DPlot();
            var      models = new List <Visual3D>();
            Visual3D model  = MakeModelVisual3D(solid);

            models.Add(model);
            window.view1.Children.Add(model);
            window.view1.FitView(window.view1.Camera.LookDirection, window.view1.Camera.UpDirection);
            window.ShowDialog();
        }
Example #3
0
        public static void OpenFromString(string data, out VoxelizedSolid solid)
        {
            var stream = new MemoryStream();

            using (var writer = new StreamWriter(stream))
            {
                writer.Write(data);
                writer.Flush();
            }
            stream.Position = 0;
            Open(stream, out solid);
        }
Example #4
0
 public static void Open(string filename, out VoxelizedSolid solid)
 {
     if (File.Exists(filename))
     {
         using (var fileStream = File.OpenRead(filename))
             Open(fileStream, out solid);
     }
     else
     {
         throw new FileNotFoundException("The file was not found at: " + filename);
     }
 }
Example #5
0
        private static void TestVoxelization()
        {
            var dir = new DirectoryInfo(".");

            while (!Directory.Exists(dir.FullName + Path.DirectorySeparatorChar + "TestFiles"))
            {
                dir = dir.Parent;
            }
            dir = new DirectoryInfo(dir.FullName + Path.DirectorySeparatorChar + "TestFiles");

            //var fileName = dir.FullName + Path.DirectorySeparatorChar + "test.json";
            var fileNames = dir.GetFiles("*atht*").OrderBy(x => r.NextDouble()).ToArray();

            for (var i = 0; i < fileNames.Length; i++)
            {
                var filename = fileNames[i].FullName;
                var name     = fileNames[i].Name;
                Console.WriteLine("Attempting: " + filename);
                var solid = (TessellatedSolid)IO.Open(filename);
                Presenter.ShowAndHang(solid);
                if (solid.Errors != null)
                {
                    Console.WriteLine("    ===>" + filename + " has errors: " + solid.Errors.ToString());
                    continue;
                }
                Console.WriteLine("voxelizing...");
                var voxsol = new VoxelizedSolid(solid, 1000);
                Console.WriteLine("now presenting " + name);
                Presenter.ShowAndHang(voxsol.ConvertToTessellatedSolidMarchingCubes(5));
                Console.WriteLine("draft in pos y");
                var yposVoxSol = voxsol.DraftToNewSolid(CartesianDirections.YPositive);
                Console.WriteLine("presenting");
                Presenter.ShowAndHang(yposVoxSol.ConvertToTessellatedSolidMarchingCubes(5));

                Console.WriteLine("draft in neg y");
                var ynegVoxSol = voxsol.DraftToNewSolid(CartesianDirections.YNegative);
                Console.WriteLine("presenting");
                Presenter.ShowAndHang(ynegVoxSol.ConvertToTessellatedSolidMarchingCubes(5));

                Console.WriteLine("union of y solids");
                var yUnion = yposVoxSol.UnionToNewSolid(ynegVoxSol);
                Console.WriteLine("presenting");
                Presenter.ShowAndHang(yUnion.ConvertToTessellatedSolidMarchingCubes(5));

                Console.WriteLine("draft in neg z");
                var znegVoxSol = voxsol.DraftToNewSolid(CartesianDirections.ZNegative);
                Console.WriteLine("intersecting");
                var intersect = znegVoxSol.IntersectToNewSolid(yUnion);
                Console.WriteLine("presenting");
                Presenter.ShowAndHang(intersect.ConvertToTessellatedSolidMarchingCubes(5));
            }
        }
Example #6
0
        private static void Run()
        {
            #region TessellatedSolid
            var ts = new TessellatedSolid();
            ts = new TessellatedSolid(new[] { new List <Vector3>() }, true, new TVGL.Color[0]);
            ts = new TessellatedSolid(new Vector3[0], new[] { new[] { 1, 2, 3 } }, true, new TVGL.Color[0]);
            ts.AddPrimitive(new Plane());
            ts.CheckModelIntegrity();
            ts.Complexify();
            ts.Copy();
            ts.OrientedBoundingBox();
            ts.CreateSilhouette(Vector3.UnitX);
            ts.Repair();
            ts.SetToOriginAndSquare(out var backTransform);
            ts.SetToOriginAndSquareToNewSolid(out backTransform);
            ts.Simplify();
            ts.SimplifyFlatPatches();
            ts.Transform(new Matrix4x4());
            ts.TransformToNewSolid(new Matrix4x4());
            ts.SliceOnInfiniteFlat(new Plane(), out List <TessellatedSolid> solids, out ContactData contactData);
            ts.SliceOnFlatAsSingleSolids(new Plane(), out TessellatedSolid positiveSideSolids, out TessellatedSolid negativeSideSolid);
            ts.GetSliceContactData(new Plane(), out contactData, false);
            ts.ConvexHull.Vertices.MinimumBoundingCylinder();
            ts.ConvexHull.Vertices.OrientedBoundingBox();
            var length = ts.ConvexHull.Vertices.GetLengthAndExtremeVertices(Vector3.UnitX, out List <IVertex3D> bottomVertices,
                                                                            out List <IVertex3D> topVertices);
            length = ts.ConvexHull.Vertices.GetLengthAndExtremeVertex(Vector3.UnitX, out Vertex bottomVertex,
                                                                      out Vertex topVertex);

            #endregion

            #region CrossSectionSolid
            var cs = new CrossSectionSolid(new Dictionary <int, double>());
            //cs.Add(new List<Vertex>)
            #endregion

            #region VoxelizedSolid
            var vs1 = new VoxelizedSolid(ts, 0.1);
            vs1.ConvertToTessellatedSolidMarchingCubes(5);
            vs1.ConvertToTessellatedSolidRectilinear();
            var vs2 = (VoxelizedSolid)vs1.Copy();
            vs1.DirectionalErodeToConstraintToNewSolid(in vs2, CartesianDirections.XNegative);
            vs1.Draft(CartesianDirections.XNegative);
            var vs3 = vs1.DraftToNewSolid(CartesianDirections.XNegative);

            #endregion
        }
Example #7
0
        public static void InitialTest()
        {
            DirectoryInfo dir;

            if (Directory.Exists("../../../../TestFiles"))
            {
                //x64
                dir = new DirectoryInfo("../../../../TestFiles");
            }
            else
            {
                //x86
                dir = new DirectoryInfo("../../../TestFiles");
            }
            var random    = new Random();
            var fileNames = dir.GetFiles("*ananas*").OrderBy(x => random.Next()).ToArray();

            //var fileNames = dir.GetFiles("*");
            for (var i = 0; i < fileNames.Length - 0; i++)
            {
                //var filename = FileNames[i];
                var filename = fileNames[i].FullName;
                var name     = fileNames[i].Name;
                Console.WriteLine("Attempting: " + filename);
                var ts = (TessellatedSolid)IO.Open(filename);
                if (ts.Errors != null)
                {
                    Console.WriteLine("    ===>" + filename + " has errors: " + ts.Errors.ToString());
                    continue;
                }
                IO.Save(ts, dir + "/3_bananas");
                ts.SolidColor = new Color(100, 200, 100, 50);
                //Presenter.ShowAndHang(ts);
                var vs = new VoxelizedSolid(ts, 10000);
                //Presenter.ShowAndHang(vs);
                var extrudeSolid = vs.DraftToNewSolid(CartesianDirections.XNegative);
                //Presenter.ShowAndHang(extrudeSolid);
                extrudeSolid.Subtract(vs);
                Presenter.ShowAndHang(extrudeSolid.ConvertToTessellatedSolidMarchingCubes(50));

                //Snapshot.Match(vs, SnapshotNameExtension.Create(name));
            }
        }
Example #8
0
        private static Visual3D MakeModelVisual3D(VoxelizedSolid vs)
        {
            var positions = new Point3DCollection();
            var normals   = new Vector3DCollection();
            var s         = vs.VoxelSideLength;

            for (var i = 0; i < vs.VoxelsPerSide[0]; i++)
            {
                for (var j = 0; j < vs.VoxelsPerSide[1]; j++)
                {
                    for (var k = 0; k < vs.VoxelsPerSide[2]; k++)
                    {
                        if (vs[i, j, k] == 0)
                        {
                            continue;
                        }
                        if (!vs.GetNeighbors(i, j, k, out var neighbors))
                        {
                            continue;
                        }

                        var x = i * s + vs.Offset[0];
                        var y = j * s + vs.Offset[1];
                        var z = k * s + vs.Offset[2];
                        for (var m = 0; m < 12; m++)
                        {
                            if (neighbors[m / 2] != null)
                            {
                                continue;
                            }
                            for (var n = 0; n < 3; n++)
                            {
                                positions.Add(new Point3D(x + coordOffsets[m][n][0] * s, y + coordOffsets[m][n][1] * s,
                                                          z + coordOffsets[m][n][2] * s));
                                normals.Add(new Vector3D(normalsTemplate[m][0], normalsTemplate[m][1],
                                                         normalsTemplate[m][2]));
                            }
                        }
                    }
                }
            }

            return(new ModelVisual3D
            {
                Content =
                    new GeometryModel3D
                {
                    Geometry = new MeshGeometry3D
                    {
                        Positions = positions,
                        Normals = normals
                    },
                    Material = MaterialHelper.CreateMaterial(
                        new System.Windows.Media.Color
                    {
                        A = vs.SolidColor.A,
                        B = vs.SolidColor.B,
                        G = vs.SolidColor.G,
                        R = vs.SolidColor.R
                    })
                }
            });
        }
Example #9
0
        private MeshGeometryModel3D ConvertVoxelizedSolidtoObject3D(VoxelizedSolid vs)
        {
            if (false)
            {
                var ts = vs.ConvertToTessellatedSolid(
                    new Color(KnownColors.MediumSeaGreen)
                {
                    Af = 0.80f
                });
                return(ConvertTessellatedSolidtoObject3D(ts));
            }

            var normalsTemplate = new[]
            {
                new float[] { -1, 0, 0 }, new float[] { -1, 0, 0 },
                new float[] { 1, 0, 0 }, new float[] { 1, 0, 0 },
                new float[] { 0, -1, 0 }, new float[] { 0, -1, 0 },
                new float[] { 0, 1, 0 }, new float[] { 0, 1, 0 },
                new float[] { 0, 0, -1 }, new float[] { 0, 0, -1 },
                new float[] { 0, 0, 1 }, new float[] { 0, 0, 1 }
            };

            var coordOffsets = new[]
            {
                new[] { new float[] { 0, 0, 0 }, new float[] { 0, 0, 1 }, new float[] { 0, 1, 0 } },
                new[] { new float[] { 0, 1, 0 }, new float[] { 0, 0, 1 }, new float[] { 0, 1, 1 } }, //x-neg
                new[] { new float[] { 1, 0, 0 }, new float[] { 1, 1, 0 }, new float[] { 1, 0, 1 } },
                new[] { new float[] { 1, 1, 0 }, new float[] { 1, 1, 1 }, new float[] { 1, 0, 1 } }, //x-pos
                new[] { new float[] { 0, 0, 0 }, new float[] { 1, 0, 0 }, new float[] { 0, 0, 1 } },
                new[] { new float[] { 1, 0, 0 }, new float[] { 1, 0, 1 }, new float[] { 0, 0, 1 } }, //y-neg
                new[] { new float[] { 0, 1, 0 }, new float[] { 0, 1, 1 }, new float[] { 1, 1, 0 } },
                new[] { new float[] { 1, 1, 0 }, new float[] { 0, 1, 1 }, new float[] { 1, 1, 1 } }, //y-pos
                new[] { new float[] { 0, 0, 0 }, new float[] { 0, 1, 0 }, new float[] { 1, 0, 0 } },
                new[] { new float[] { 1, 0, 0 }, new float[] { 0, 1, 0 }, new float[] { 1, 1, 0 } }, //z-neg
                new[] { new float[] { 0, 0, 1 }, new float[] { 1, 0, 1 }, new float[] { 0, 1, 1 } },
                new[] { new float[] { 1, 0, 1 }, new float[] { 1, 1, 1 }, new float[] { 0, 1, 1 } }, //z-pos
            };
            var positions   = new Vector3Collection();
            var normals     = new Vector3Collection();
            var lowestLevel = (int)vs.VoxelSideLengths.Length - 1;

            foreach (var v in vs.Voxels()) //VoxelDiscretization.ExtraCoarse))
                                           // var v = vs.Voxels(VoxelDiscretization.ExtraCoarse).First(); //VoxelDiscretization.ExtraCoarse))
            {
                if (v.Role == VoxelRoleTypes.Partial && v.Level < lowestLevel)
                {
                    continue;
                }
                var neighbors = vs.GetNeighbors(v).ToList();
                if (neighbors.All(n => n != null && (n.Role == VoxelRoleTypes.Full || (n.Role == VoxelRoleTypes.Partial &&
                                                                                       v.Level == lowestLevel))))
                {
                    continue;
                }

                var x = (float)v.BottomCoordinate[0];
                var y = (float)v.BottomCoordinate[1];
                var z = (float)v.BottomCoordinate[2];
                var s = (float)v.SideLength;
                for (int i = 0; i < 12; i++)
                {
                    //  if (neighbors[i / 2] != null && neighbors[i / 2].Role == VoxelRoleTypes.Full) continue;
                    if (neighbors[i / 2] != null && (neighbors[i / 2].Role == VoxelRoleTypes.Full ||
                                                     (neighbors[i / 2].Role == VoxelRoleTypes.Partial && v.Level == lowestLevel)))
                    {
                        continue;
                    }
                    for (int j = 0; j < 3; j++)
                    {
                        positions.Add(new Vector3(x + coordOffsets[i][j][0] * s,
                                                  y + coordOffsets[i][j][1] * s, z + coordOffsets[i][j][2] * s));
                        normals.Add(new Vector3(normalsTemplate[i][0], normalsTemplate[i][1], normalsTemplate[i][2]));
                    }
                }
            }

            return(new MeshGeometryModel3D
            {
                Material = new PhongMaterial()
                {
                    DiffuseColor = new SharpDX.Color4(vs.SolidColor.Rf, vs.SolidColor.Gf, vs.SolidColor.Bf,
                                                      vs.SolidColor.Af)
                                   //(float)0.75 * vs.SolidColor.Af)
                },
                Geometry = new HelixToolkit.Wpf.SharpDX.MeshGeometry3D
                {
                    Positions = positions,
                    Indices = new IntCollection(Enumerable.Range(0, positions.Count)),
                    Normals = normals
                }
            });
        }
Example #10
0
        public static void TestVoxelization(TessellatedSolid ts, string _fileName)
        {
            var vs1 = new VoxelizedSolid(ts, 10);

            Console.WriteLine("done constructing, now ...");
            PresenterShowAndHang(vs1);
            //var vs1ts = vs1.ConvertToTessellatedSolid(color);
            //var savename = "voxelized_" + _fileName;
            //IO.Save(vs1ts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in X Positive...");
            var vs1xpos = vs1.DraftToNewSolid(CartesianDirections.XPositive);

            //Presenter.ShowAndHang(vs1xpos);
            //var vs1xposts = vs1xpos.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1xpos_" + _fileName;
            //IO.Save(vs1xposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in X Negative...");
            var vs1xneg = vs1.DraftToNewSolid(CartesianDirections.XNegative);

            //Presenter.ShowAndHang(vs1xneg);
            //var vs1xnegts = vs1xneg.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1xneg_" + _fileName;
            //IO.Save(vs1xnegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Y Positive...");
            var vs1ypos = vs1.DraftToNewSolid(CartesianDirections.YPositive);

            //Presenter.ShowAndHang(vs1ypos);
            //var vs1yposts = vs1ypos.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1ypos_" + _fileName;
            //IO.Save(vs1yposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Y Negative...");
            var vs1yneg = vs1.DraftToNewSolid(CartesianDirections.YNegative);

            //Presenter.ShowAndHang(vs1yneg);
            ////var vs1ynegts = vs1yneg.ConvertToTessellatedSolid(color);
            ////Console.WriteLine("Saving Solid...");
            ////savename = "vs1yneg_" + _fileName;
            ////IO.Save(vs1ynegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Z Positive...");
            var vs1zpos = vs1.DraftToNewSolid(CartesianDirections.ZPositive);

            //Presenter.ShowAndHang(vs1zpos);
            ////var vs1zposts = vs1zpos.ConvertToTessellatedSolid(color);
            ////Console.WriteLine("Saving Solid...");
            ////savename = "vs1zpos_" + _fileName;
            ////IO.Save(vs1zposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Z Negative...");
            var vs1zneg = vs1.DraftToNewSolid(CartesianDirections.ZNegative);

            //Presenter.ShowAndHang(vs1zneg);
            //var vs1znegts = vs1zneg.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1zneg_" + _fileName;
            //IO.Save(vs1znegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Intersecting Drafted Solids...");
            var intersect = vs1xpos.IntersectToNewSolid(vs1xneg, vs1ypos, vs1zneg, vs1yneg, vs1zpos);

            //Presenter.ShowAndHang(intersect);
            //return;
            //var intersectts = intersect.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "intersect_" + _fileName;
            //IO.Save(intersectts, savename, FileType.STL_ASCII);

            Console.WriteLine("Subtracting Original Voxelized Shape From Intersect...");
            var unmachinableVoxels = intersect.SubtractToNewSolid(vs1);

            //Presenter.ShowAndHang(unmachinableVoxels);
            //var uvts = unmachinableVoxels.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "unmachinable_" + _fileName;
            //IO.Save(uvts, savename, FileType.STL_ASCII);

            //Console.WriteLine("Totals for Original Voxel Shape: " + vs1.GetTotals[0] + "; " + vs1.GetTotals[1] + "; " + vs1.GetTotals[2] + "; " + vs1.GetTotals[3]);
            //Console.WriteLine("Totals for X Positive Draft: " + vs1xpos.GetTotals[0] + "; " + vs1xpos.GetTotals[1] + "; " + vs1xpos.GetTotals[2] + "; " + vs1xpos.GetTotals[3]);
            //Console.WriteLine("Totals for X Negative Draft: " + vs1xneg.GetTotals[0] + "; " + vs1xneg.GetTotals[1] + "; " + vs1xneg.GetTotals[2] + "; " + vs1xneg.GetTotals[3]);
            //Console.WriteLine("Totals for Y Positive Draft: " + vs1ypos.GetTotals[0] + "; " + vs1ypos.GetTotals[1] + "; " + vs1ypos.GetTotals[2] + "; " + vs1ypos.GetTotals[3]);
            //Console.WriteLine("Totals for Y Negative Draft: " + vs1yneg.GetTotals[0] + "; " + vs1yneg.GetTotals[1] + "; " + vs1yneg.GetTotals[2] + "; " + vs1yneg.GetTotals[3]);
            //Console.WriteLine("Totals for Z Positive Draft: " + vs1zpos.GetTotals[0] + "; " + vs1zpos.GetTotals[1] + "; " + vs1zpos.GetTotals[2] + "; " + vs1zpos.GetTotals[3]);
            //Console.WriteLine("Totals for Z Negative Draft: " + vs1zneg.GetTotals[0] + "; " + vs1zneg.GetTotals[1] + "; " + vs1zneg.GetTotals[2] + "; " + vs1zneg.GetTotals[3]);
            //Console.WriteLine("Totals for Intersected Voxel Shape: " + intersect.GetTotals[0] + "; " + intersect.GetTotals[1] + "; " + intersect.GetTotals[2] + "; " + intersect.GetTotals[3]);
            //Console.WriteLine("Totals for Unmachinable Voxels: " + unmachinableVoxels.GetTotals[0] + "; " + unmachinableVoxels.GetTotals[1] + "; " + unmachinableVoxels.GetTotals[2] + "; " + unmachinableVoxels.GetTotals[3]);
            Console.WriteLine("orig volume = {0}, intersect vol = {1}, and subtract vol = {2}", vs1.Volume, intersect.Volume, unmachinableVoxels.Volume);
            //PresenterShowAndHang(vs1);
            //PresenterShowAndHang(vs1xpos);
            //PresenterShowAndHang(vs1xneg);
            //PresenterShowAndHang(vs1ypos);
            //PresenterShowAndHang(vs1yneg);
            //PresenterShowAndHang(vs1zpos);
            //PresenterShowAndHang(vs1zneg);
            //PresenterShowAndHang(intersect);
            //PresenterShowAndHang(unmachinableVoxels);
            //unmachinableVoxels.SolidColor = new Color(KnownColors.DeepPink);
            //unmachinableVoxels.SolidColor.A = 200;
            if (unmachinableVoxels.Volume == 0)
            {
                Console.WriteLine("no unmachineable sections!!\n\n");
            }
            else
            {
                PresenterShowAndHang(unmachinableVoxels, ts);
                PresenterShowAndHang(unmachinableVoxels);
            }

            //PresenterShowAndHang(new Solid[] { intersect });
            //var unmachinableVoxelsSolid = new Solid[] { unmachinableVoxels };
            //PresenterShowAndHang(unmachinableVoxelsSolid);

            //var originalTS = new Solid[] { ts };
        }
Example #11
0
        private MeshGeometryModel3D ConvertVoxelizedSolidtoObject3D(VoxelizedSolid vs)
        {
            if (false)
            {
                var ts = vs.ConvertToTessellatedSolid(
                    new Color(KnownColors.MediumSeaGreen)
                {
                    Af = 0.80f
                });
                return(ConvertTessellatedSolidtoObject3D(ts));
            }

            var normalsTemplate = new[]
            {
                new float[] { -1, 0, 0 }, new float[] { -1, 0, 0 },
                new float[] { 1, 0, 0 }, new float[] { 1, 0, 0 },
                new float[] { 0, -1, 0 }, new float[] { 0, -1, 0 },
                new float[] { 0, 1, 0 }, new float[] { 0, 1, 0 },
                new float[] { 0, 0, -1 }, new float[] { 0, 0, -1 },
                new float[] { 0, 0, 1 }, new float[] { 0, 0, 1 }
            };

            var coordOffsets = new[]
            {
                new[] { new float[] { 0, 0, 0 }, new float[] { 0, 0, 1 }, new float[] { 0, 1, 0 } },
                new[] { new float[] { 0, 1, 0 }, new float[] { 0, 0, 1 }, new float[] { 0, 1, 1 } }, //x-neg
                new[] { new float[] { 1, 0, 0 }, new float[] { 1, 1, 0 }, new float[] { 1, 0, 1 } },
                new[] { new float[] { 1, 1, 0 }, new float[] { 1, 1, 1 }, new float[] { 1, 0, 1 } }, //x-pos
                new[] { new float[] { 0, 0, 0 }, new float[] { 1, 0, 0 }, new float[] { 0, 0, 1 } },
                new[] { new float[] { 1, 0, 0 }, new float[] { 1, 0, 1 }, new float[] { 0, 0, 1 } }, //y-neg
                new[] { new float[] { 0, 1, 0 }, new float[] { 0, 1, 1 }, new float[] { 1, 1, 0 } },
                new[] { new float[] { 1, 1, 0 }, new float[] { 0, 1, 1 }, new float[] { 1, 1, 1 } }, //y-pos
                new[] { new float[] { 0, 0, 0 }, new float[] { 0, 1, 0 }, new float[] { 1, 0, 0 } },
                new[] { new float[] { 1, 0, 0 }, new float[] { 0, 1, 0 }, new float[] { 1, 1, 0 } }, //z-neg
                new[] { new float[] { 0, 0, 1 }, new float[] { 1, 0, 1 }, new float[] { 0, 1, 1 } },
                new[] { new float[] { 1, 0, 1 }, new float[] { 1, 1, 1 }, new float[] { 0, 1, 1 } }, //z-pos
            };
            var positions = new Vector3Collection();
            var normals   = new Vector3Collection();

            var s = (float)vs.VoxelSideLength;

            for (var i = 0; i < vs.VoxelsPerSide[0]; i++)
            {
                for (var j = 0; j < vs.VoxelsPerSide[1]; j++)
                {
                    for (var k = 0; k < vs.VoxelsPerSide[2]; k++)
                    {
                        if (vs[i, j, k] == 0)
                        {
                            continue;
                        }
                        if (!vs.GetNeighbors(i, j, k, out var neighbors))
                        {
                            continue;
                        }

                        var x = i * s + (float)vs.Offset[0];
                        var y = j * s + (float)vs.Offset[1];
                        var z = k * s + (float)vs.Offset[2];
                        for (var m = 0; m < 12; m++)
                        {
                            if (neighbors[m / 2] != null)
                            {
                                continue;
                            }
                            for (var n = 0; n < 3; n++)
                            {
                                positions.Add(new Vector3(x + (coordOffsets[m][n][0] * s), y + coordOffsets[m][n][1] * s,
                                                          z + coordOffsets[m][n][2] * s));
                                normals.Add(new Vector3(normalsTemplate[m][0], normalsTemplate[m][1],
                                                        normalsTemplate[m][2]));
                            }
                        }
                    }
                }
            }
            return(new MeshGeometryModel3D
            {
                Material = new PhongMaterial()
                {
                    DiffuseColor = new SharpDX.Color4(vs.SolidColor.Rf, vs.SolidColor.Gf, vs.SolidColor.Bf,
                                                      vs.SolidColor.Af)
                                   //(float)0.75 * vs.SolidColor.Af)
                },
                Geometry = new HelixToolkit.Wpf.SharpDX.MeshGeometry3D
                {
                    Positions = positions,
                    Indices = new IntCollection(Enumerable.Range(0, positions.Count)),
                    Normals = normals
                }
            });
        }
Example #12
0
 public static void Open(Stream s, string filename, out VoxelizedSolid solid)
 {
     solid = (VoxelizedSolid)TVGLFileData.OpenSolids(s, filename)[0];
 }
Example #13
0
        private static TVGLFileData MakeFileData(VoxelizedSolid vs)
        {
            double[] ConvexHullCenter;
            double   ConvexHullArea;
            double   ConvexHullVolume;

            if (vs.ConvexHull is null)
            {
                ConvexHullCenter = null;
                ConvexHullArea   = 0;
                ConvexHullVolume = 0;
            }
            else
            {
                ConvexHullCenter = vs.ConvexHull.Center;
                ConvexHullArea   = vs.ConvexHull.SurfaceArea;
                ConvexHullVolume = vs.ConvexHull.Volume;
            }

            var result = new TVGLFileData
            {
                Center               = vs.Center,
                ConvexHullCenter     = ConvexHullCenter,
                ConvexHullArea       = ConvexHullArea,
                ConvexHullVolume     = ConvexHullVolume,
                HasUniformColor      = true,
                Language             = vs.Language,
                Mass                 = vs.Mass,
                Name                 = vs.Name,
                Primitives           = vs.Primitives,
                SurfaceArea          = vs.SurfaceArea,
                Units                = vs.Units,
                Volume               = vs.Volume,
                XMax                 = vs.XMax,
                XMin                 = vs.XMin,
                YMax                 = vs.YMax,
                YMin                 = vs.YMin,
                ZMax                 = vs.ZMax,
                ZMin                 = vs.ZMin,
                BitLevelDistribution = (int[])vs.bitLevelDistribution.Clone()
            };

            result.Voxels = new string[vs.bitLevelDistribution.Length];

            for (int i = 0; i < vs.NumberOfLevels; i++)
            {
                var byteArray = (vs.Voxels(i, true)
                                 .SelectMany(v => BitConverter.GetBytes(v.ID))).ToArray();
                result.Voxels[i] = BitConverter.ToString(byteArray).Replace("-", "");
            }

            result.Colors = vs.SolidColor.ToString();
            result.Comments.AddRange(vs.Comments);
            if (vs._inertiaTensor != null)
            {
                var tensorAsArray = new double[9];
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        tensorAsArray[3 * i + j] = vs._inertiaTensor[i, j];
                    }
                }
                result.InertiaTensor = string.Join(",", tensorAsArray);
            }
            return(result);
        }
Example #14
0
        public static void TestVoxelization(TessellatedSolid ts, string _fileName)
        {
            var vs1 = new VoxelizedSolid(ts, 8);
            //var dir = new [] { 1.0, 1.0, 1.0 };
            var dir = new[] { -1.0, -2.0, -3.0 };
            //var dir = new[] { -1.0, -.2, .0 };
            //var dir = new [] { 0.0, 0.4706, -0.8824 }; //Direction of holes in ObliqueHoles
            var neg = vs1.InvertToNewSolid();

            //neg.SolidColor = new Color(KnownColors.LawnGreen);
            //Presenter.ShowAndHang(vs1, neg);
            //var erd = neg.ErodeToNewSolid(vs1, dir);
            stopwatch.Start();
            var erd = neg.ErodeToNewSolid(vs1, dir, toolDia: 30, toolOptions: new[] { "ball", "118" });

            //erd.SolidColor = new Color(KnownColors.Magenta);
            //Presenter.ShowAndHang(vs1, erd);
            stopwatch.Stop();
            Console.WriteLine("{0}", stopwatch.Elapsed);
            return;

            Console.WriteLine("done constructing, now ...");
            //Presenter.ShowAndHang(vs1,2);
            //var vs1ts = vs1.ConvertToTessellatedSolid(color);
            //var savename = "voxelized_" + _fileName;
            //IO.Save(vs1ts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in X Positive...");
            var vs1xpos = vs1.ExtrudeToNewSolid(VoxelDirections.XPositive);

            //Presenter.ShowAndHang(vs1xpos);
            //var vs1xposts = vs1xpos.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1xpos_" + _fileName;
            //IO.Save(vs1xposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in X Negative...");
            var vs1xneg = vs1.ExtrudeToNewSolid(VoxelDirections.XNegative);

            //Presenter.ShowAndHang(vs1xneg);
            //var vs1xnegts = vs1xneg.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1xneg_" + _fileName;
            //IO.Save(vs1xnegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Y Positive...");
            var vs1ypos = vs1.ExtrudeToNewSolid(VoxelDirections.YPositive);

            //Presenter.ShowAndHang(vs1ypos);
            //var vs1yposts = vs1ypos.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1ypos_" + _fileName;
            //IO.Save(vs1yposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Y Negative...");
            var vs1yneg = vs1.ExtrudeToNewSolid(VoxelDirections.YNegative);

            //Presenter.ShowAndHang(vs1yneg);
            ////var vs1ynegts = vs1yneg.ConvertToTessellatedSolid(color);
            ////Console.WriteLine("Saving Solid...");
            ////savename = "vs1yneg_" + _fileName;
            ////IO.Save(vs1ynegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Z Positive...");
            var vs1zpos = vs1.ExtrudeToNewSolid(VoxelDirections.ZPositive);

            //Presenter.ShowAndHang(vs1zpos);
            ////var vs1zposts = vs1zpos.ConvertToTessellatedSolid(color);
            ////Console.WriteLine("Saving Solid...");
            ////savename = "vs1zpos_" + _fileName;
            ////IO.Save(vs1zposts, savename, FileType.STL_ASCII);

            Console.WriteLine("Drafting Solid in Z Negative...");
            var vs1zneg = vs1.ExtrudeToNewSolid(VoxelDirections.ZNegative);

            //Presenter.ShowAndHang(vs1zneg);
            //var vs1znegts = vs1zneg.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "vs1zneg_" + _fileName;
            //IO.Save(vs1znegts, savename, FileType.STL_ASCII);

            Console.WriteLine("Intersecting Drafted Solids...");
            var intersect = vs1xpos.IntersectToNewSolid(vs1xneg, vs1ypos, vs1zneg, vs1yneg, vs1zpos);

            Presenter.ShowAndHang(intersect);
            //return;
            //var intersectts = intersect.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "intersect_" + _fileName;
            //IO.Save(intersectts, savename, FileType.STL_ASCII);

            Console.WriteLine("Subtracting Original Voxelized Shape From Intersect...");
            var unmachinableVoxels = intersect.SubtractToNewSolid(vs1);

            // Presenter.ShowAndHang(unmachinableVoxels);
            //var uvts = unmachinableVoxels.ConvertToTessellatedSolid(color);
            //Console.WriteLine("Saving Solid...");
            //savename = "unmachinable_" + _fileName;
            //IO.Save(uvts, savename, FileType.STL_ASCII);

            //Console.WriteLine("Totals for Original Voxel Shape: " + vs1.GetTotals[0] + "; " + vs1.GetTotals[1] + "; " + vs1.GetTotals[2] + "; " + vs1.GetTotals[3]);
            //Console.WriteLine("Totals for X Positive Draft: " + vs1xpos.GetTotals[0] + "; " + vs1xpos.GetTotals[1] + "; " + vs1xpos.GetTotals[2] + "; " + vs1xpos.GetTotals[3]);
            //Console.WriteLine("Totals for X Negative Draft: " + vs1xneg.GetTotals[0] + "; " + vs1xneg.GetTotals[1] + "; " + vs1xneg.GetTotals[2] + "; " + vs1xneg.GetTotals[3]);
            //Console.WriteLine("Totals for Y Positive Draft: " + vs1ypos.GetTotals[0] + "; " + vs1ypos.GetTotals[1] + "; " + vs1ypos.GetTotals[2] + "; " + vs1ypos.GetTotals[3]);
            //Console.WriteLine("Totals for Y Negative Draft: " + vs1yneg.GetTotals[0] + "; " + vs1yneg.GetTotals[1] + "; " + vs1yneg.GetTotals[2] + "; " + vs1yneg.GetTotals[3]);
            //Console.WriteLine("Totals for Z Positive Draft: " + vs1zpos.GetTotals[0] + "; " + vs1zpos.GetTotals[1] + "; " + vs1zpos.GetTotals[2] + "; " + vs1zpos.GetTotals[3]);
            //Console.WriteLine("Totals for Z Negative Draft: " + vs1zneg.GetTotals[0] + "; " + vs1zneg.GetTotals[1] + "; " + vs1zneg.GetTotals[2] + "; " + vs1zneg.GetTotals[3]);
            //Console.WriteLine("Totals for Intersected Voxel Shape: " + intersect.GetTotals[0] + "; " + intersect.GetTotals[1] + "; " + intersect.GetTotals[2] + "; " + intersect.GetTotals[3]);
            //Console.WriteLine("Totals for Unmachinable Voxels: " + unmachinableVoxels.GetTotals[0] + "; " + unmachinableVoxels.GetTotals[1] + "; " + unmachinableVoxels.GetTotals[2] + "; " + unmachinableVoxels.GetTotals[3]);
            Console.WriteLine("orig volume = {0}, intersect vol = {1}, and subtract vol = {2}", vs1.Volume, intersect.Volume, unmachinableVoxels.Volume);
            //PresenterShowAndHang(vs1);
            //PresenterShowAndHang(vs1xpos);
            //PresenterShowAndHang(vs1xneg);
            //PresenterShowAndHang(vs1ypos);
            //PresenterShowAndHang(vs1yneg);
            //PresenterShowAndHang(vs1zpos);
            //PresenterShowAndHang(vs1zneg);
            //PresenterShowAndHang(intersect);
            //PresenterShowAndHang(unmachinableVoxels);
            //unmachinableVoxels.SolidColor = new Color(KnownColors.DeepPink);
            //unmachinableVoxels.SolidColor.A = 200;
            stopwatch.Stop();
            Console.WriteLine(stopwatch.Elapsed);
            if (unmachinableVoxels.Volume == 0)
            {
                Console.WriteLine("no unmachineable sections!!\n\n");
            }
            else
            {
                Presenter.ShowAndHang(unmachinableVoxels, ts);
                Presenter.ShowAndHang(unmachinableVoxels);
            }

            //PresenterShowAndHang(new Solid[] { intersect });
            //var unmachinableVoxelsSolid = new Solid[] { unmachinableVoxels };
            //PresenterShowAndHang(unmachinableVoxelsSolid);

            //var originalTS = new Solid[] { ts };
        }