private void SendSolid(Autodesk.Revit.DB.Solid geomSolid, Autodesk.Revit.DB.Element elem) { Autodesk.Revit.DB.Material m = null; bool sameMaterial=true; int triangles=0; bool twoSided=false; Autodesk.Revit.DB.FaceArray faces = geomSolid.Faces; if (faces.Size == 0) { return; } Autodesk.Revit.DB.WallType wallType = elem.Document.GetElement(elem.GetTypeId()) as Autodesk.Revit.DB.WallType; // get element type if (wallType != null) { if (wallType.Kind == Autodesk.Revit.DB.WallKind.Curtain) { //return; // don't display curtain walls, these are probably fassades with bars and Glazing } } Autodesk.Revit.DB.ElementId materialID; materialID = faces.get_Item(0).MaterialElementId; foreach (Autodesk.Revit.DB.Face face in faces) { if (m == null) { materialID = face.MaterialElementId; Autodesk.Revit.DB.Material materialElement = elem.Document.GetElement(face.MaterialElementId) as Autodesk.Revit.DB.Material; /* Autodesk.Revit.DB.ElementId appearanceID = materialElement.AppearanceAssetId; Autodesk.Revit.DB.AppearanceAssetElement ae = elem.Document.GetElement(appearanceID) as Autodesk.Revit.DB.AppearanceAssetElement; Autodesk.Revit.Utility.Asset asset = ae.GetRenderingAsset(); Autodesk.Revit.DB.ParameterSet ps = ae.Parameters; for (int i = 0; i < asset.Size; i++) { Autodesk.Revit.Utility.AssetProperty ap = asset[i]; string pn = ap.Name; string val = ap.ToString(); System.Collections.Generic.IList<string> props = ap.GetConnectedPropertiesNames(); foreach (string p in props) { string pName = p; } } foreach (Autodesk.Revit.DB.Parameter p in ae.Parameters) { string pName = p.AsString(); string val = p.AsValueString(); } System.Collections.Generic.IList<Autodesk.Revit.Utility.AssetProperty> props2 = asset.GetAllConnectedProperties();*/ m = materialElement; twoSided = face.IsTwoSided; } Autodesk.Revit.DB.Mesh geomMesh = face.Triangulate(); if (geomMesh != null) { triangles += geomMesh.NumTriangles; if (materialID != face.MaterialElementId) { sameMaterial = false; break; } } } if (triangles == 0) return; if (sameMaterial) { MessageBuffer mb = new MessageBuffer(); mb.add(elem.Id.IntegerValue); mb.add(elem.Name + "_combined"); mb.add((int)ObjectTypes.Mesh); mb.add(twoSided); mb.add(triangles); int i = 0; foreach (Autodesk.Revit.DB.Face face in geomSolid.Faces) { Autodesk.Revit.DB.Mesh geomMesh = face.Triangulate(); if (geomMesh != null) { for (i = 0; i < geomMesh.NumTriangles; i++) { Autodesk.Revit.DB.MeshTriangle triangle = default(Autodesk.Revit.DB.MeshTriangle); triangle = geomMesh.get_Triangle(i); mb.add((float)triangle.get_Vertex(0).X); mb.add((float)triangle.get_Vertex(0).Y); mb.add((float)triangle.get_Vertex(0).Z); mb.add((float)triangle.get_Vertex(1).X); mb.add((float)triangle.get_Vertex(1).Y); mb.add((float)triangle.get_Vertex(1).Z); mb.add((float)triangle.get_Vertex(2).X); mb.add((float)triangle.get_Vertex(2).Y); mb.add((float)triangle.get_Vertex(2).Z); } } } if (m == null) { mb.add((byte)220); // color mb.add((byte)220); mb.add((byte)220); mb.add((byte)255); mb.add(-1); // material ID } else { mb.add(m.Color); mb.add((byte)(((100 - (m.Transparency)) / 100.0) * 255)); mb.add(m.Id.IntegerValue); } sendMessage(mb.buf, MessageTypes.NewObject); } else { int num = 0; foreach (Autodesk.Revit.DB.Face face in geomSolid.Faces) { Autodesk.Revit.DB.Mesh geomMesh = face.Triangulate(); if (geomMesh != null) { MessageBuffer mb = new MessageBuffer(); mb.add(elem.Id.IntegerValue); mb.add(elem.Name + "_f_" + num.ToString()); mb.add((int)ObjectTypes.Mesh); SendMesh(geomMesh, ref mb, face.IsTwoSided); if (face.MaterialElementId == Autodesk.Revit.DB.ElementId.InvalidElementId) { mb.add((byte)220); // color mb.add((byte)220); mb.add((byte)220); mb.add((byte)255); mb.add(-1); // material ID } else { Autodesk.Revit.DB.Material materialElement = elem.Document.GetElement(face.MaterialElementId) as Autodesk.Revit.DB.Material; mb.add(materialElement.Color); mb.add((byte)(((100 - (materialElement.Transparency)) / 100.0) * 255)); mb.add(materialElement.Id.IntegerValue); } sendMessage(mb.buf, MessageTypes.NewObject); } num++; } } //Autodesk.Revit.DB.Edge Edge = default(Autodesk.Revit.DB.Edge); //foreach (var Edge in geomSolid.Edges) //{ // DrawEdge(Edge); //} }
private bool isCalculationOn(Document doc, Autodesk.Revit.DB.MEPSystem mepSys) { if (mepSys == null) return false; MEPSystemType sysType = doc.GetElement(mepSys.GetTypeId()) as MEPSystemType; if (sysType == null) return false; return sysType.CalculationLevel == Autodesk.Revit.DB.Mechanical.SystemCalculationLevel.All; }