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; } }