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); }
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(); }
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); }
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); } }
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)); } }
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 }
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)); } }
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 }) } }); }
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 } }); }
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 }; }
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 } }); }
public static void Open(Stream s, string filename, out VoxelizedSolid solid) { solid = (VoxelizedSolid)TVGLFileData.OpenSolids(s, filename)[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); }
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 }; }