常用过滤器
- 房间过滤器: RoomFilter
- 元素相交过滤器: BoundingBoxIntersectsFilter
- 元素包含过滤器:BoundingBoxlslnsideFilter
- 元素类别过滤器:ElementCategoryFilter等同于OfCategory
- 元素过滤器:ElementFilter等同于OfClass()
用法:
- new过滤器如RoomFilter roomFilter = new RoomFilter();
- 放入WherePasses() 如WherePasses(roomFilter)
房间过滤器
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
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();
Autodesk.Revit.DB.Architecture.RoomFilter roomFilter = new RoomFilter();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
foreach (Room item in rooms)
{
stringBuilder2.AppendLine(item.Name);
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
通过当前视图过滤
七个房间标高1和标高2的
获取当前活跃的视图
ElementId viewId = document.ActiveView.Id;
加上当前视图
FilteredElementCollector collector = new FilteredElementCollector(document, viewId);
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
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();
Autodesk.Revit.DB.Architecture.RoomFilter roomFilter = new RoomFilter();
ElementId viewId = document.ActiveView.Id;
FilteredElementCollector collector = new FilteredElementCollector(document, viewId);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
foreach (Room item in rooms)
{
stringBuilder2.AppendLine(item.Name);
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
当前活跃的是标高2,三个房间
通过LevelName过滤
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
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();
Autodesk.Revit.DB.Architecture.RoomFilter roomFilter = new RoomFilter();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
foreach (Room item in rooms)
{
if (item.Level.Name.Equals("标高 2"))
{
stringBuilder2.AppendLine(item.Name);
}
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
房间删除了还能拿到
房间5删除了但是还是存在房屋明细表中,可以在明细表中删除或者判断Location != null
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
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();
RoomFilter roomFilter = new RoomFilter();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
foreach (Room item in rooms)
{
if (item.Level.Name.Equals("标高 2") && item.Location != null) {
stringBuilder2.AppendLine(item.Name);
}
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
也可以使用以下方法起到同样的效果
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
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();
RoomFilter roomFilter = new RoomFilter();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().Where(x=>x.Location != null).ToList();
foreach (Room item in rooms)
{
if (item.Level.Name.Equals("标高 2") ) {
stringBuilder2.AppendLine(item.Name);
}
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
WherePasses()
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
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();
//得到房间
Room room = document.GetElement(new ElementId(337222)) as Room;
//得到房间的编辑框
BoundingBoxXYZ boundingBoxXYZ = room.get_BoundingBox(document.ActiveView);
//通过边框创建一个OutLine
Outline outLine = new Outline(boundingBoxXYZ.Min, boundingBoxXYZ.Max);
//通过outLine创建一个BoundingBoxIntersectsFilter 元素边界过滤器
BoundingBoxIntersectsFilter boundingBoxIntersectsFilter = new BoundingBoxIntersectsFilter(outLine);
FilteredElementCollector collector = new FilteredElementCollector(document);
IList<Element> elements1 = collector.WherePasses(boundingBoxIntersectsFilter).ToElements();
foreach (Element item in elements1)
{
stringBuilder2.AppendLine(item.Name);
}
TaskDialog.Show("弹窗", stringBuilder2.ToString());
return Result.Succeeded;
}
}
}
返回了四个墙,一个门,还有它本身
要这样选中房间
元素高亮后的结果
在族里面加两个桌子运行结果
进一步进行筛选,只选出房间的桌子
if (item.Category.Id.IntegerValue.Equals( -2000080)) {
stringBuilder2.AppendLine(item.Name);
ids.Add(item.Id);
}
也可以把
IList<Element> elements1 = collector.WherePasses(boundingBoxIntersectsFilter).ToElements();
换成
IList<Element> elements1 = collector.WherePasses(boundingBoxIntersectsFilter).OfClass(typeof(FamilyInstance)).ToElements();
不需要循环里判断也可以达到同样的效果