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

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

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


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


       
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值