//Convert one quad into two triangles public static Triangles QuadToTwoTriangles(Quad quad) { var triangleList = new List <Triangle>(); Triangles triangles = new Triangles(); var x1 = (float)quad.Pt1.X; var x2 = (float)quad.Pt2.X; var y1 = (float)quad.Pt1.Y; var y2 = (float)quad.Pt2.Y; var z1 = (float)quad.Pt1.Z; var z2 = (float)quad.Pt2.Z; QuadAxis qa = quad.FindAxis(); if (qa == QuadAxis.X) { float sameX = x1; Triangle triangle1 = new Triangle(); triangle1.SetTriangle( sameX, y1, z1, sameX, y2, z1, sameX, y2, z2 ); /* * sameX, y1, z1, * sameX, y2, z1, * sameX, y2, z2 * ); */ triangle1.Properties = quad.Properties.Clone(); triangleList.Add(triangle1); Triangle triangle2 = new Triangle(); triangle2.SetTriangle( sameX, y1, z1, sameX, y1, z2, sameX, y2, z2); triangle2.Properties = quad.Properties.Clone(); triangleList.Add(triangle2); } if (qa == QuadAxis.Y) { float sameY = y1; Triangle triangle1 = new Triangle(); triangle1.SetTriangle( x1, sameY, z1, x2, sameY, z2, x1, sameY, z2); triangle1.Properties = quad.Properties.Clone(); triangleList.Add(triangle1); Triangle triangle2 = new Triangle(); triangle2.SetTriangle( x1, sameY, z1, x2, sameY, z1, x2, sameY, z2); triangle2.Properties = quad.Properties.Clone(); triangleList.Add(triangle2); } if (qa == QuadAxis.Z) { float sameZ = z1; Triangle triangle1 = new Triangle(); triangle1.SetTriangle( x1, y1, sameZ, x2, y2, sameZ, x1, y2, sameZ); triangle1.Properties = quad.Properties.Clone(); triangleList.Add(triangle1); Triangle triangle2 = new Triangle(); triangle2.SetTriangle( x1, y1, sameZ, x2, y1, sameZ, x2, y2, sameZ); triangle2.Properties = quad.Properties.Clone(); triangleList.Add(triangle2); } triangles.SetTriangles(triangleList.ToArray()); return(triangles); }
//Read a binary STL file, or call the ascii reader public static Triangles ReadFile(string filename) { var trianglesList = new List <Triangle>(); bool isAscii = false; using (var reader = new BinaryReader(File.Open(filename, FileMode.Open))) { if (reader.PeekChar() == 's') { //If it's ascii, note so isAscii = true; } } if (isAscii) { //This is an ascii not binary file return(ReadFileAscii(filename)); } try { using (var reader = new BinaryReader(File.Open(filename, FileMode.Open))) { //Header (80 bytes)read and discard reader.ReadBytes(80); //Facets (4 bytes) UInt32 numTriangles = reader.ReadUInt32(); //Normals and vertices for (int facet = 0; facet < numTriangles; facet++) { var sf = new Triangle(); //Read normal = 3 floats sf.Normal[0] = reader.ReadSingle(); sf.Normal[2] = reader.ReadSingle(); sf.Normal[1] = reader.ReadSingle(); //Read vertex 1 = 3 floats sf.Vertex1[0] = reader.ReadSingle(); sf.Vertex1[2] = reader.ReadSingle(); sf.Vertex1[1] = reader.ReadSingle(); //Read vertex 2 = 3 floats sf.Vertex2[0] = reader.ReadSingle(); sf.Vertex2[2] = reader.ReadSingle(); sf.Vertex2[1] = reader.ReadSingle(); //Read vertex 3 = 3 floats sf.Vertex3[0] = reader.ReadSingle(); sf.Vertex3[2] = reader.ReadSingle(); sf.Vertex3[1] = reader.ReadSingle(); // ignore attribute_by_count reader.ReadUInt16(); trianglesList.Add(sf); } Triangles triangles = new Triangles(trianglesList.ToArray()) { Name = filename }; return(triangles); } } catch (Exception) { return(null); } }
//Read an ascii STL file private static Triangles ReadFileAscii(string filename) { var trianglesList = new List <Triangle>(); using (var reader = new StreamReader(filename)) { Triangle triangle = null; int vertexcount = 0; while (reader.EndOfStream == false) { string str = reader.ReadLine().TrimStart(); string command = str.Split(' ')[0]; if (command == "solid") { } if (command == "facet") { //compact those open white spaces str = str.Replace(" ", " ").Replace(" ", " ").Replace(" ", " "); string[] splits = str.Split(' '); triangle = new Triangle(); trianglesList.Add(triangle); //flip y/z triangle.Normal[0] = float.Parse(splits[2]); triangle.Normal[2] = float.Parse(splits[3]); triangle.Normal[1] = float.Parse(splits[4]); vertexcount = 0; } if (command == "vertex") { str = str.Replace(" ", " ").Replace(" ", " ").Replace(" ", " "); string[] splits = str.Split(' '); //flip y/z float x = float.Parse(splits[1]); float z = float.Parse(splits[2]); float y = float.Parse(splits[3]); if (triangle != null) { if (vertexcount == 0) { triangle.Vertex1[0] = x; triangle.Vertex1[1] = y; triangle.Vertex1[2] = z; } if (vertexcount == 1) { triangle.Vertex2[0] = x; triangle.Vertex2[1] = y; triangle.Vertex2[2] = z; } if (vertexcount == 2) { triangle.Vertex3[0] = x; triangle.Vertex3[1] = y; triangle.Vertex3[2] = z; } } vertexcount++; } } } Triangles triangles = new Triangles(trianglesList.ToArray()) { Name = filename }; return(triangles); }
public static Triangles ReadfileAscii(string filename) { using (var reader = new StreamReader(filename)) { var triangles = new List <Triangle>(); var vertices = new List <float[]>(); while (reader.EndOfStream == false) { string str = reader.ReadLine().TrimStart(); string command = str.Split(' ')[0]; if (String.CompareOrdinal("#", command) == 0) { //Just a comment, ignore } if (String.CompareOrdinal("g", command) == 0) { //g Object001 } if (String.CompareOrdinal("v", command) == 0) { //v 0.000000E+00 0.000000E+00 78.0000 string[] parts = str.Split(' '); var x = (float)Convert.ToDouble(parts[1]); var y = (float)Convert.ToDouble(parts[2]); var z = (float)Convert.ToDouble(parts[3]); //Flip y, z float[] float3 = new float[] { x, z, y };// Float3(x, z, y); vertices.Add(float3); } if (String.CompareOrdinal("f", command) == 0) { //f 1 2 3 str = str.Replace(" ", " ").Replace(" ", " ").Replace(" ", " "); string[] parts = str.Split(' '); int v1 = Convert.ToInt32(parts[1]) - 1; int v2 = Convert.ToInt32(parts[2]) - 1; int v3 = Convert.ToInt32(parts[3]) - 1; Triangle triangle = new Triangle( vertices[v1][0], vertices[v1][1], vertices[v1][2], vertices[v2][0], vertices[v2][1], vertices[v2][2], vertices[v3][0], vertices[v3][1], vertices[v3][2]); triangles.Add(triangle); } } Triangles triangleSet = new Triangles(); triangleSet.SetTriangles(triangles.ToArray()); return(triangleSet); } }