private void GetPly(Face item, List<String> MaterialIDsList, List<LuxExporter.PLY.PLY_By_Material> PLYList, Transform instTransform)
        {
            //get the material ID
            String sMaterialID = item.MaterialElementId.ToString();
            //check whether we have this material already
            if (MaterialIDsList.Contains(sMaterialID))
            {
                //get index of PLY
                LuxExporter.PLY.PLY_By_Material PLYWorker = PLYList[MaterialIDsList.IndexOf(sMaterialID)];
                //process face
                PLYWorker.TriangulateFace(item, instTransform);
            }
            else
            {
                MaterialIDsList.Add(sMaterialID);
                LuxExporter.PLY.PLY_By_Material PLYWorker = new PLY.PLY_By_Material();
                //process face
                PLYWorker.TriangulateFace(item, instTransform);
                PLYWorker.MaterialID = item.MaterialElementId;
                Material FaceMaterial;
                FaceMaterial = vDoc.get_Element(PLYWorker.MaterialID) as Material;

                if (FaceMaterial == null)
                {
                    PLYWorker.MaterialName = "Default";
                }
                else
                {
                    PLYWorker.MaterialName = FaceMaterial.Name.ToString();
                    //in future: check whether this is a Glass2 Material via stored data
                    //for now just check transparency
                    if (FaceMaterial.Transparency > 0)
                    {
                        PLYWorker.Is_Glass2 = true;
                    }
                }
                //add to list
                PLYList.Add(PLYWorker);

            }
        }
        public StringBuilder ExportToPLY_Mesh(Options GeometryOption, Transform t)
        {
            try
            {
                GeometryElement element = vRevitElement.get_Geometry(GeometryOption);
                GeometryObjectArray geoObjectArray = element.Objects;

                //setup export string
                StringBuilder strMesh = new StringBuilder("");

                //setup mesh
                Mesh mesh = null;

                foreach (GeometryObject obj in geoObjectArray)
                {
                    mesh = obj as Mesh;
                    if (null != mesh)
                    {
                        break;
                    }
                }
                if (null != mesh)
                {
                    //create a PLY by naterial class
                    LuxExporter.PLY.PLY_By_Material PLYWorker = new PLY.PLY_By_Material();

                    //get the mesh material
                    PLYWorker.MaterialID = mesh.MaterialElementId;
                    Material FaceMaterial;
                    FaceMaterial = vDoc.get_Element(PLYWorker.MaterialID) as Material;

                    if (FaceMaterial == null)
                    {
                        PLYWorker.MaterialName = "Default";
                    }
                    else
                    {
                        PLYWorker.MaterialName = FaceMaterial.Name.ToString();
                        //in future: check whether this is a Glass2 Material via stored data
                        //for now just check transparency
                        if (FaceMaterial.Transparency > 0)
                        {
                            PLYWorker.Is_Glass2 = true;
                        }
                    }

                    //export mesh
                    PLYWorker.TriangulateTopoMesh(mesh);
                    //create output filr path
                    String sOutputPathSceneFile = vOutputFilePath + vRevitElement.UniqueId.ToString() + "_0_0.PLY";

                    //write ply file out:
                    WritePLYFile(PLYWorker, sOutputPathSceneFile);

                    //create geo file string
                    strMesh.AppendLine("AttributeBegin  # " + vRevitElement.Name.ToString());
                    strMesh.AppendLine("NamedMaterial \"" + PLYWorker.MaterialName + "\"");
                    strMesh.AppendLine("");
                    if (PLYWorker.Is_Glass2)
                    {
                        strMesh.AppendLine("Interior \""+PLYWorker.MaterialName+"\"");
                        //strMesh.AppendLine("Exterior  \"World\"");
                    }
                    strMesh.AppendLine("Shape \"plymesh\"");
                    strMesh.AppendLine("\"string filename\" [\"" + sOutputPathSceneFile + "\"]");
                    strMesh.AppendLine("\"string subdivscheme\" [\"loop\"]");
                    strMesh.AppendLine("\"integer nsubdivlevels\" [0]");
                    strMesh.AppendLine("\"bool dmnormalsmooth\" [\"false\"]");
                    strMesh.AppendLine("\"bool dmsharpboundary\" [\"true\"]");
                    strMesh.AppendLine("\"bool dmnormalsplit\" [\"false\"]");
                    strMesh.AppendLine("AttributeEnd #  \"\"");
                }
                else
                {
                    //no valid mesh found
                    strMesh = null;
                }

                //return geo file info
                return strMesh;

            }
            catch (Exception)
            {
                System.Windows.Forms.MessageBox.Show("Error in module Revit_Geometry_Worker (ExportToPLY_Mesh)");
                return null;
                throw;
            }
        }