Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        // 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);
        }
Exemplo n.º 9
0
        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);
            }
        }