如何在revit中得到一个项目的三角面片坐标数据?以生成这个桌子为例子。
文章开始前,先看下gif效果图:
1.打开个Revit项目,该项目就上图一张桌子,执行下面程序将会生成一个文件,位置在:E:\gra.txt
/// <summary>
/// 三角面片
/// </summary>
public void DrawMesh()
{
StreamWriter sw = new StreamWriter(@"E:\gra.txt", false);
var familiyInstances = this.Document.GetFamilyInstanceList();
foreach (var familyInstance in familiyInstances)
{
GeometryElement geoElements = familyInstance.get_Geometry(new Options
{
//打开计算几何引用
ComputeReferences = true,
//视图详细程度为最好
DetailLevel = ViewDetailLevel.Fine,
IncludeNonVisibleObjects = true
});
foreach (GeometryInstance geometryInstance in geoElements)
{
GeometryElement symbolGeometry = geometryInstance.SymbolGeometry;
foreach (var item in symbolGeometry)
{
if (item is Solid solid)
{
var faces = solid.Faces;
//循环每个面
foreach (Face face in faces)
{
// 对每个面进行三角面片化
Mesh mesh = face.Triangulate();
for (int i = 0; i < mesh.NumTriangles; i++)
{
string txt = "";
MeshTriangle triangular = mesh.get_Triangle(i);
//每个三角形都是3个顶点,所以循环3
for (int n = 0; n < 3; n++)
{
XYZ point = triangular.get_Vertex(n);
txt += point.ToString();
}
sw.WriteLine(txt);
}
}
}
else if (item is Autodesk.Revit.DB.Line line)
{
}
else
{
var type = item.GetType().ToString();
}
}
}
}
sw.Flush();
sw.Close();
sw.Dispose();
}
2.生成的文件内容如下,本文件内容仅作示例:
3.然后读取该三角面片的数据,您可以在其它软件重新创建出这张桌子。下图左边绿色的桌子,是根据第2步的各点坐标还原生成的。
4.生成该绿色桌子,本示例用的是图石软件,它的生成代码如下所示。本还原示例仅供参考,您应根据自己可以用的软件进行还原。原理都是一样的。
public void CreateGra()
{
Segment segment = viewer.ModelSegment.Subsegment("test");
List<GraStone.Math.Geometry.Point> points = new List<GraStone.Math.Geometry.Point>();
List<int> indices = new List<int>();
var contents = File.ReadAllLines(@"E:\gra.txt");
foreach (var line in contents)
{
int one = -1, two = -1, three = -1;
var coordinates = line.Split(new string[] { ")(" }, StringSplitOptions.RemoveEmptyEntries);
for (var i = 0; i < 3; i++)
{
var item = coordinates[i];
var array = item.Trim(')', '(').Split(',');
var x = Convert.ToDouble(array[0]);
var y = Convert.ToDouble(array[1]);
var z = Convert.ToDouble(array[2]);
var point = new GraStone.Math.Geometry.Point(x, y, z);
points.Add(point);
var index = points.Count - 1;
if (i == 0)
{
one = index;
}
else if (i == 1)
{
two = index;
}
else if (i == 2)
{
three = index;
}
}
indices.Add(3);
indices.Add(one);
indices.Add(two);
indices.Add(three);
}
segment.InsertShell(points, indices);
viewer.UpdateDisplay();
}
祝您用餐愉快。