// must return an array to make mesh double sided public static Mesh3D[] RevitMeshToHelixMesh(Autodesk.Revit.DB.Mesh rmesh) { List<int> indices_front = new List<int>(); List<int> indices_back = new List<int>(); List<Point3D> vertices = new List<Point3D>(); for (int i = 0; i < rmesh.NumTriangles; ++i) { MeshTriangle tri = rmesh.get_Triangle(i); for (int k = 0; k < 3; ++k) { Point3D new_point = RevitPointToWindowsPoint(tri.get_Vertex(k)); bool new_point_exists = false; for (int l = 0; l < vertices.Count; ++l) { Point3D p = vertices[l]; if ((p.X == new_point.X) && (p.Y == new_point.Y) && (p.Z == new_point.Z)) { indices_front.Add(l); new_point_exists = true; break; } } if (new_point_exists) continue; indices_front.Add(vertices.Count); vertices.Add(new_point); } int a = indices_front[indices_front.Count - 3]; int b = indices_front[indices_front.Count - 2]; int c = indices_front[indices_front.Count - 1]; indices_back.Add(c); indices_back.Add(b); indices_back.Add(a); } List<Mesh3D> meshes = new List<Mesh3D>(); meshes.Add(new Mesh3D(vertices, indices_front)); meshes.Add(new Mesh3D(vertices, indices_back)); return meshes.ToArray(); }