收集器FilteredElementCollector
三种构造函数
- 收集全部元素: FilteredElementCollector(Document document)
- 根据指定的ld集合:FilteredElementCollector(Document document, List < Elementld > ids)
- 根据指定的视图: FilteredElementCollector(Document document,Elementld viewld)
FilteredElementCollector常用的方法:
- 通过类型: OfCategoryld() 或 OfCategory()
- 通过类:ofClass()
- 通过wherePasses()
Example
通过类型: OfCategoryld() 或 OfCategory()
拿到窗的id
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Text;
namespace pro
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
//普通
FilteredElementCollector collector = new FilteredElementCollector(document);
IList<Element> elements2 = collector.OfCategoryId(new ElementId(-2000014)).ToElements();
StringBuilder stringBuilder = new StringBuilder();
foreach (Element item in elements2)
{
if (item is FamilySymbol)
{
stringBuilder.AppendLine("族类型\t\t" + item.Name);
}
else if (item is FamilyInstance)
{
stringBuilder.AppendLine("族实例\t\t" + item.Name);
}
}
TaskDialog.Show("弹窗", stringBuilder.ToString());
return Result.Succeeded;
}
}
}
运行结果
OfClass 和 OfCategory()
拿到门的BuiltInCategory 必须是FamilyInstance
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Text;
namespace pro
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
FilteredElementCollector collector = new FilteredElementCollector(document);
StringBuilder stringBuilder = new StringBuilder();
IList<Element> elements4 = collector.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).ToElements();
//获取所有族
foreach (Element item in elements4)
{
stringBuilder.AppendLine("族实例\t\t" + item.Name + "id" + item.Id);
}
TaskDialog.Show("弹窗", stringBuilder.ToString());
return Result.Succeeded;
}
}
}
两个门
通过类:ofClass()
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Text;
namespace pro
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
//得到所有的指定类型
FilteredElementCollector collector = new FilteredElementCollector(document);
StringBuilder stringBuilder = new StringBuilder();
//获取所有的族实例
IList<Element> elements4 = collector.OfClass(typeof(FamilyInstance)).ToElements();
//获取所有族类型
//IList<Element> elemnets4 = collector.OfClass(typeof(FailySymble)).ToElements();
//获取所有族
//IList<Element> elements4 = collector.OfClass(typeof(Family)).ToElements();
foreach (Element item in elements4)
{
stringBuilder.AppendLine("族实例\t\t" + item.Name + "id" + item.Id);
}
TaskDialog.Show("弹窗", stringBuilder.ToString());
return Result.Succeeded;
}
}
}
两个窗和一个门都是FamilyInstance类型,一共三个
根据标高来筛选
Level level = document.GetElement(item.LeveId) as Level;
if(level.Name.Equals("标高 1")){
stringBuilder2.AppendLine("名称\t\t"+item.Name+"id "+item.Id+" 标高"+level.Name);
}
根据名称来筛选
FamilyInstance instance = item as FamilyInstance;
string symbolName = instance.Symbol.Name;
if("750 x 2000mm".Equals(symbolName)){
stringBuilder2.AppendLine("名称\t\t"+item.Name+"id "+item.Id+" 标高"+level.Name);
}
按ids过滤
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Text;
namespace pro
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
FilteredElementCollector collector = new FilteredElementCollector(document);
StringBuilder stringBuilder2 = new StringBuilder();
//按ids过滤
IList<Reference> references = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
List<ElementId> ids = new List<ElementId>();
foreach (Reference reference in references)
{
ids.Add(reference.ElementId);
}
FilteredElementCollector collector2 = new FilteredElementCollector(document, ids);
//BuiltInCategory.OST_Windows/OST_Doors选择门或窗
IList<Element> elements4 = collector2.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilyInstance)).ToElements();
foreach (Element item in elements4)
{
stringBuilder2.AppendLine(item.Name);
}
TaskDialog.Show("弹窗",stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
三个门两个窗,只选择了窗,弹出两条信息
指定视图
传入标高1的id(传入标高2的id则全部拿到)
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Text;
namespace pro
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uIDocument = uiApp.ActiveUIDocument;
Document document = uIDocument.Document;
StringBuilder stringBuilder2 = new StringBuilder();
//指定视图
ElementId viewId = new ElementId(312);
FilteredElementCollector collector3 = new FilteredElementCollector(document, viewId);
IList<Element> elements4 = collector3.OfCategory(BuiltInCategory.OST_Doors).OfClass(typeof(FamilyInstance)).ToElements();
//List<ElementId> ids1 = new List<ElementId>();
foreach (Element item in elements4)
{
stringBuilder2.AppendLine(item.Name+"item.id:"+ item.Id);
//ids1.Add(item.Id);
}
TaskDialog.Show("弹窗",stringBuilder2.ToString());
//uIDocument.Selection.SetElementIds(ids1);
return Result.Succeeded;
}
}
}
把注释放开使用高亮元素
只拿到标高1的门信息
使用标高2的id时把标高1的门也选中了修改底部范围-底部标高(即标高1换成标高2)
也可以使用Level.Name来过滤视图