예제 #1
0
        // 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();
        }