Skip to content

Instantly share code, notes, and snippets.

@pzurek
Created January 10, 2011 03:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pzurek/772300 to your computer and use it in GitHub Desktop.
Save pzurek/772300 to your computer and use it in GitHub Desktop.
Revit 2011 filter performance testing
//
// Compare TypeFilter versus using an
// anonymous method to filter elements.
// By Guy Robinson, info@r-e-d.co.nz.
//
// Copyright (C) 2008 by Jeremy Tammik,
// Autodesk Inc. All rights reserved.
//
// Updated to the Revit 2011 API and added LINQ filtering.
// Changed the anonymous method to a lambda expression.
// By Piotr Zurek, p.zurek@gmail.com
//
#region Imported Namespaces
//.NET common used namespaces
using System;
using System.Linq;
using System.Diagnostics;
using System.Collections.Generic;
//Revit.NET common used namespaces
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Application = Autodesk.Revit.ApplicationServices.Application;
#endregion
namespace FilterPerformance
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class Commands : IExternalCommand
{
public Result Execute(ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
try
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Application app = uiApp.Application;
Document doc = uiDoc.Document;
Stopwatch sw = Stopwatch.StartNew();
// f5 = f1 && f4
// = f1 && (f2 || f3)
// = family instance and (door or window)
#region Filters and collector definitions
ElementClassFilter f1 = new ElementClassFilter(typeof(FamilyInstance));
ElementCategoryFilter f2 = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
ElementCategoryFilter f3 = new ElementCategoryFilter(BuiltInCategory.OST_Windows);
LogicalOrFilter f4 = new LogicalOrFilter(f2, f3);
LogicalAndFilter f5 = new LogicalAndFilter(f1, f4);
FilteredElementCollector collector = new FilteredElementCollector(doc);
#endregion
//#region Filtering with a class filter
//List<Element> openingInstances = collector.WherePasses(f5).ToElements() as List<Element>;
//#endregion
#region Filtering with a lambda expression
List<Element> openings = collector.WherePasses(f4).ToElements() as List<Element>;
List<Element> openingInstances = openings.FindAll(element => element is FamilyInstance);
#endregion
//#region Filtering with LINQ
//List<Element> openings = collector.WherePasses(f4).ToElements() as List<Element>;
//List<Element> openingInstances = (from instances in openings
// where instances is FamilyInstance
// select instances).ToList<Element>();
//#endregion
int n = openingInstances.Count;
sw.Stop();
Debug.WriteLine(string.Format("Time to get {0} elements: {1}ms", n, sw.ElapsedMilliseconds));
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message + ex.StackTrace;
return Result.Failed;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment