-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMeshExtractor.cs
More file actions
69 lines (57 loc) · 1.82 KB
/
Copy pathMeshExtractor.cs
File metadata and controls
69 lines (57 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System.Collections.Generic;
using Autodesk.Revit.DB;
namespace VertexFlow.RevitAddin.Exporter
{
public class MeshExtractor
{
private readonly Transform _transform;
private readonly Options _geometryOptions;
public MeshExtractor()
{
_transform = Transform.Identity;
_geometryOptions = new Options();
}
public List<Mesh> GetMeshes(Element element)
{
var meshes = new List<Mesh>();
var geometryElement = GetGeometryElement(element);
foreach (var geometry in geometryElement)
{
if (IsSolid(geometry, out var solid))
{
meshes.AddRange(GetMeshes(solid));
continue;
}
if (IsMesh(geometry, out var mesh))
{
meshes.Add(mesh);
}
}
return meshes;
}
private GeometryElement GetGeometryElement(Element element)
{
return element.get_Geometry(_geometryOptions).GetTransformed(_transform);
}
private bool IsSolid(GeometryObject geometry, out Solid solid)
{
solid = geometry as Solid;
return solid != null && 0 < solid.Faces.Size;
}
private bool IsMesh(GeometryObject geometry, out Mesh mesh)
{
mesh = geometry as Mesh;
return mesh != null && 0 < mesh.NumTriangles;
}
private Mesh[] GetMeshes(Solid solid)
{
var facesCount = solid.Faces.Size;
var meshes = new Mesh[facesCount];
for (var i = 0; i < facesCount; i++)
{
meshes[i] = solid.Faces.get_Item(i).Triangulate();
}
return meshes;
}
}
}