public static void ExecuteSolid2(ExternalCommandData commandData)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
var app = uiapp.Application;
Document doc = uidoc.Document;
IList<Reference> references = uidoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Face);
IList<IList<IList<XYZ>>> all = new List<IList<IList<XYZ>>>();
foreach (Reference reference in references)
{
Face face = doc.GetElement(reference).GetGeometryObjectFromReference(reference) as Face;
IList<IList<XYZ>> loopVertices = new List<IList<XYZ>>();
PlanarFace planarFace = face as PlanarFace;
if (!planarFace.FaceNormal.IsAlmostEqualTo(XYZ.BasisZ))
{
EdgeArrayArray edgeArrayArray = planarFace.EdgeLoops;
foreach (EdgeArray ea in edgeArrayArray)
{
IList<XYZ> loops = new List<XYZ>();
foreach (Edge e in ea)
{
Curve c = e.AsCurve();
loops.Add(c.GetEndPoint(0));
}
loopVertices.Add(loops);
}
}
all.Add(loopVertices);
}
CreateTessellatedShape(doc, all, ElementId.InvalidElementId);
// return Result.Succeeded;
}
public static void CreateTessellatedShape(Document doc, IList<IList<IList<XYZ>>> all, ElementId materialId)
{
TessellatedShapeBuilder builder = new TessellatedShapeBuilder();
builder.OpenConnectedFaceSet(true);
foreach (IList<IList<XYZ>> loopVertices in all)
{
TessellatedFace tessellatedFace = new TessellatedFace(loopVertices, materialId);
if (builder.DoesFaceHaveEnoughLoopsAndVertices(tessellatedFace))
{
builder.AddFace(tessellatedFace);
}
}
builder.CloseConnectedFaceSet();
builder.Target = TessellatedShapeBuilderTarget.AnyGeometry;
builder.Fallback = TessellatedShapeBuilderFallback.Mesh;
builder.Build();
TessellatedShapeBuilderResult result = builder.GetBuildResult();
using (Transaction t = new Transaction(doc, "Create tessellated direct shape"))
{
t.Start();
DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_Floors));
ds.ApplicationId = "Application id";
ds.ApplicationDataId = "Geometry object id";
ds.SetShape(result.GetGeometricalObjects());
t.Commit();
}
}