The post “Randomize Color and Material in Revit” seemed like a good reason for me to write a post about randomly setting materials.
First, some random number humor:
public void RandomMaterial()
{
Document doc = this.ActiveUIDocument.Document;
// get all glass materials in document
IEnumerable<Element> materials = new FilteredElementCollector(doc)
.OfClass(typeof(Material))
.Cast<Material>()
.Where(q => q.MaterialClass == "Glass");
using (Transaction t = new Transaction(doc,"Random Materials"))
{
t.Start();
foreach (Element e in new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_CurtainWallPanels))
{
Parameter materialParam = e.get_Parameter("Material");
if (materialParam == null)
continue;
int randomNumber = new Random(Guid.NewGuid().GetHashCode()).Next(0,materials.Count());
materialParam.Set(materials.ElementAt(randomNumber).Id);
}
t.Commit();
}
}