private Mesh GetMesh(GeometryElement geom) { var speckleMesh = new Mesh(); foreach (var element in geom) { if (element is DB.Mesh) { var mesh = (DB.Mesh)element; foreach (var vert in mesh.Vertices) { var vertex = PointToSpeckle(vert); speckleMesh.vertices.AddRange(new double[] { vertex.x, vertex.y, vertex.z }); } for (int i = 0; i < mesh.NumTriangles; i++) { var triangle = mesh.get_Triangle(i); var A = triangle.get_Index(0); var B = triangle.get_Index(1); var C = triangle.get_Index(2); speckleMesh.faces.Add(0); speckleMesh.faces.AddRange(new int[] { (int)A, (int)B, (int)C }); } } } speckleMesh.units = ModelUnits; return(speckleMesh); }
public Mesh GetElementMesh(DB.Element element, List <DB.Element> subElements = null) { Mesh mesh = new Mesh(); var allSolids = GetElementSolids(element, opt: new Options() { DetailLevel = ViewDetailLevel.Fine, ComputeReferences = true }); if (!allSolids.Any()) //it's a mesh! { var geom = element.get_Geometry(new Options()); mesh = GetMesh(geom); } else { if (subElements != null) { foreach (var sb in subElements) { allSolids.AddRange(GetElementSolids(sb)); } } (mesh.faces, mesh.vertices) = GetFaceVertexArrFromSolids(allSolids); } mesh.units = ModelUnits; return(mesh); }
private Mesh GetMesh(GeometryElement geom) { var speckleMesh = new Mesh(); foreach (var element in geom) { if (element is DB.Mesh) { var mesh = (DB.Mesh)element; foreach (var vert in mesh.Vertices) { speckleMesh.vertices.AddRange(new double[] { ScaleToSpeckle(vert.X), ScaleToSpeckle(vert.Y), ScaleToSpeckle(vert.Z) }); } for (int i = 0; i < mesh.NumTriangles; i++) { var triangle = mesh.get_Triangle(i); var A = triangle.get_Index(0); var B = triangle.get_Index(1); var C = triangle.get_Index(2); speckleMesh.faces.Add(0); speckleMesh.faces.AddRange(new int[] { (int)A, (int)B, (int)C }); } } } return(speckleMesh); }
private (Mesh, Mesh) GetCurtainWallDisplayMesh(DB.Wall wall) { var grid = wall.CurtainGrid; var meshPanels = new Mesh(); var meshMullions = new Mesh(); var solidPanels = new List <Solid>(); var solidMullions = new List <Solid>(); foreach (ElementId panelId in grid.GetPanelIds()) { solidPanels.AddRange(GetElementSolids(Doc.GetElement(panelId))); } foreach (ElementId mullionId in grid.GetMullionIds()) { solidMullions.AddRange(GetElementSolids(Doc.GetElement(mullionId))); } (meshPanels.faces, meshPanels.vertices) = GetFaceVertexArrFromSolids(solidPanels); (meshMullions.faces, meshMullions.vertices) = GetFaceVertexArrFromSolids(solidMullions); meshPanels.units = ModelUnits; meshMullions.units = ModelUnits; return(meshPanels, meshMullions); }
/// <summary> /// Returns a mesh representing the provided element, if possible. /// </summary> /// <param name="elem">Element you want a mesh from.</param> /// <param name="opt">The view options to use</param> /// <param name="useOriginGeom4FamilyInstance">Whether to refer to the orignal geometry of the family (if it's a family).</param> /// <returns></returns> public Mesh GetElementDisplayMesh(DB.Element elem, Options opt = null, bool useOriginGeom4FamilyInstance = false) { var mesh = new Mesh(); mesh.units = ModelUnits; List <Solid> solids = new List <Solid>(); if (elem is Group g) { foreach (var id in g.GetMemberIds()) { var subSolids = GetElementSolids(Doc.GetElement(id), opt, useOriginGeom4FamilyInstance); if (subSolids != null && subSolids.Any()) { solids.AddRange(subSolids); } } } else { solids = GetElementSolids(elem, opt, useOriginGeom4FamilyInstance); } (mesh.faces, mesh.vertices) = GetFaceVertexArrFromSolids(solids); return(mesh); }
private Mesh GetWallDisplayMesh(DB.Wall wall) { var grid = wall.CurtainGrid; var mesh = new Mesh(); // meshing for walls in case they are curtain grids if (grid != null) { var mySolids = new List <Solid>(); foreach (ElementId panelId in grid.GetPanelIds()) { mySolids.AddRange(GetElementSolids(Doc.GetElement(panelId))); } foreach (ElementId mullionId in grid.GetMullionIds()) { mySolids.AddRange(GetElementSolids(Doc.GetElement(mullionId))); } (mesh.faces, mesh.vertices) = GetFaceVertexArrFromSolids(mySolids); } else { (mesh.faces, mesh.vertices) = GetFaceVertexArrayFromElement(wall, new Options() { DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false }); } return(mesh); }
public Mesh SurfaceToSpeckle(CivilDB.GridSurface surface) { Mesh mesh = null; // output vars var _vertices = new List <Acad.Point3d>(); var faces = new List <int>(); foreach (var cell in surface.GetCells(false)) { // get vertices var faceIndices = new List <int>(); foreach (var vertex in new List <CivilDB.GridSurfaceVertex>() { cell.BottomLeftVertex, cell.BottomRightVertex, cell.TopLeftVertex, cell.TopRightVertex }) { if (!_vertices.Contains(vertex.Location)) { faceIndices.Add(_vertices.Count); _vertices.Add(vertex.Location); } else { faceIndices.Add(_vertices.IndexOf(vertex.Location)); } vertex.Dispose(); } // get face faces.AddRange(new List <int> { 1, faceIndices[0], faceIndices[1], faceIndices[2], faceIndices[3] }); cell.Dispose(); } var vertices = PointsToFlatList(_vertices); mesh = new Mesh(vertices, faces); mesh.units = ModelUnits; mesh.bbox = BoxToSpeckle(surface.GeometricExtents); // add grid surface props try{ mesh["name"] = surface.DisplayName; mesh["description"] = surface.Description; } catch {} return(mesh); }
// surfaces public Mesh SurfaceToSpeckle(CivilDB.TinSurface surface) { Mesh mesh = null; // output vars var _vertices = new List <Acad.Point3d>(); var faces = new List <int>(); foreach (var triangle in surface.GetTriangles(false)) { // get vertices var faceIndices = new List <int>(); foreach (var vertex in new List <CivilDB.TinSurfaceVertex>() { triangle.Vertex1, triangle.Vertex2, triangle.Vertex3 }) { if (!_vertices.Contains(vertex.Location)) { faceIndices.Add(_vertices.Count); _vertices.Add(vertex.Location); } else { faceIndices.Add(_vertices.IndexOf(vertex.Location)); } vertex.Dispose(); } // get face faces.AddRange(new List <int> { 0, faceIndices[0], faceIndices[1], faceIndices[2] }); triangle.Dispose(); } var vertices = PointsToFlatList(_vertices); mesh = new Mesh(vertices, faces); mesh.units = ModelUnits; mesh.bbox = BoxToSpeckle(surface.GeometricExtents); // add tin surface props try{ mesh["name"] = surface.DisplayName; mesh["description"] = surface.Description; } catch {} return(mesh); }
private object GetWallDisplayMesh(DB.Wall wall) { var grid = wall.CurtainGrid; var mesh = new Mesh(); // meshing for walls in case they are curtain grids if (grid != null) { var meshPanels = new Mesh(); var meshMullions = new Mesh(); var panels = new List <Solid>(); var mullions = new List <Solid>(); foreach (ElementId panelId in grid.GetPanelIds()) { panels.AddRange(GetElementSolids(Doc.GetElement(panelId))); } foreach (ElementId mullionId in grid.GetMullionIds()) { mullions.AddRange(GetElementSolids(Doc.GetElement(mullionId))); } (meshPanels.faces, meshPanels.vertices) = GetFaceVertexArrFromSolids(panels); (meshMullions.faces, meshMullions.vertices) = GetFaceVertexArrFromSolids(mullions); meshPanels["renderMaterial"] = new Other.RenderMaterial() { opacity = 0.2, diffuse = System.Drawing.Color.AliceBlue.ToArgb() }; meshMullions["renderMaterial"] = new Other.RenderMaterial() { diffuse = System.Drawing.Color.DarkGray.ToArgb() }; meshPanels.units = ModelUnits; meshMullions.units = ModelUnits; return(new List <Base>() { meshPanels, meshMullions }); } else { (mesh.faces, mesh.vertices) = GetFaceVertexArrayFromElement(wall, new Options() { DetailLevel = ViewDetailLevel.Fine, ComputeReferences = false }); mesh.units = ModelUnits; return(mesh); } }