internal static ElementId NewDirectShape(
IList<Face> faces,
Transform transform,
Document doc,
string appGuid,
string shapeName)
{
int nFaces = 0;
int nFacesFailed = 0;
ElementId materialId = GetMaterial(doc);
TessellatedShapeBuilder builder = new TessellatedShapeBuilder { LogString = shapeName };
builder.OpenConnectedFaceSet(true);
foreach (var face in faces)
{
area += face.Area;
Mesh mesh = face.Triangulate(0.8);
mesh = mesh.get_Transformed(transform);
for (int i = 0; i < mesh.NumTriangles; i++)
{
List<XYZ> args = new List<XYZ>();
MeshTriangle triangle = mesh.get_Triangle(
i);
XYZ p1 = triangle.get_Vertex(0);
XYZ p2 = triangle.get_Vertex(1);
XYZ p3 = triangle.get_Vertex(2);
args.Add(p1);
args.Add(p2);
args.Add(p3);
Coordinates.AddRange(args.Select(p => new Point3D { X = p.X, Y = p.Y, Z = p.Z }));
TessellatedFace tesseFace = new TessellatedFace(args,materialId);
if (builder.DoesFaceHaveEnoughLoopsAndVertices(
tesseFace))
{
builder.AddFace(tesseFace);
}
}
}
builder.CloseConnectedFaceSet();
builder.Target = TessellatedShapeBuilderTarget.AnyGeometry; // 2017
builder.Fallback = TessellatedShapeBuilderFallback.Mesh; // 2017
builder.Build();
BuiltInCategory cat = GetBuiltInCategoryForShape();
DirectShape ds = DirectShape.CreateElement(doc, new ElementId(cat));
ds.ApplicationId = appGuid;
ds.ApplicationDataId = shapeName;
ds.SetShape(builder);
}