欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RevitAPI之利用网格Mesh创建实体面

程序员文章站 2022-06-11 08:08:29
...
Revit的网格是多边形网格,每一个三维面都可以由一系列顶点以及对应的一系列三角形组成。

概念已经知道了,那如何用很多小三角形来表示一个体量(放样)的几何空间面。

解决思路是:
首先获取放样Sweep的几何元素,从其中获取实体和构成实体的面;
然后对“面”进行三角面片化后形成对应的网格,遍历网格的所有三角形并收集所有的顶点;
最后把这些顶点在文档中描绘出来。

代码

 
public void DrawMesh(Document doc, Autodesk.Revit.ApplicationServices.Application app)
        {
            Transaction transaction = new Transaction(doc, "Draw Mesh");
            transaction.Start();


            Sweep sweep = doc.GetElement(new ElementId(2311)) as Sweep;
            Options option = GetGeometryOption(app);
            Autodesk.Revit.DB.GeometryElement geomElement = sweep.get_Geometry(option);


            foreach (GeometryObject geomObj in geomElement)
            {
                Solid geomSolid = geomObj as Solid;
                if (null != geomSolid)
                {
                    foreach (Face geomFace in geomSolid.Faces)
                    {
                        // 对面进行三角面片化形成一个网格 
                        Mesh mesh = geomFace.Triangulate();
                        for (int i = 0; i < mesh.NumTriangles; i++)
                        {
                            MeshTriangle triangular = mesh.get_Triangle(i);
                            // 定义  XYZ 列表来存放三角形的顶点 
                            List<XYZ> triangularPoints = new List<XYZ>();
                            for (int n = 0; n < 3; n++)
                            {
                                XYZ point = triangular.get_Vertex(n);
                                triangularPoints.Add(point);
                            }
                            // 调用方法把所有三角形在文档中描绘出来 
                            DrawTriangle(doc, triangularPoints);
                        }
                    }
                }
            }


            transaction.Commit();
        }
        private void DrawTriangle(Document RevitDoc, List<XYZ> triangularPoints)
        {
            if (triangularPoints.Count > 3)
            {
                CurveArray curveArray = new CurveArray();
                curveArray.Append(Line.CreateBound(triangularPoints[0], triangularPoints[1]));
                curveArray.Append(Line.CreateBound(triangularPoints[0], triangularPoints[2]));
                curveArray.Append(Line.CreateBound(triangularPoints[1], triangularPoints[2]));
                Floor floor = RevitDoc.Create.NewFloor(curveArray, false);
            }
        }
        public Options GetGeometryOption(Autodesk.Revit.ApplicationServices.Application app)
        {
            Autodesk.Revit.DB.Options option = app.Create.NewGeometryOptions();
            option.ComputeReferences = true;      //打开计算几何引用 
            option.DetailLevel = ViewDetailLevel.Fine;      //视图详细程度为最好 
            return option;
        }

=========【更多高级应用请关注公众号】========

RevitAPI之利用网格Mesh创建实体面

===================================


       
相关标签: RevitAPI 几何