Revit的网格是多边形网格,每一个三维面都可以由一系列顶点以及对应的一系列三角形组成。
概念已经知道了,那如何用很多小三角形来表示一个体量(放样)的几何空间面。
解决思路是:
首先获取放样Sweep的几何元素,从其中获取实体和构成实体的面;
然后对“面”进行三角面片化后形成对应的网格,遍历网格的所有三角形并收集所有的顶点;
最后把这些顶点在文档中描绘出来。
代码
概念已经知道了,那如何用很多小三角形来表示一个体量(放样)的几何空间面。
解决思路是:
首先获取放样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;
}
=========【更多高级应用请关注公众号】========
===================================