通过指定过滤器获取图元的基本步骤如下:
①新建一个FilteredElementCollector。
②对它运用一个或多个过滤器。
③获取滤过的图元或图元ID。
过滤器的某些类型有其专用过滤器,如RoomFilter。
1、new过滤器 如RoomFilter roomFilter = new RoomFilter();
2、放入WherePasses() 如WherePasses(roomFilter)
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace work03._1
{
[TransactionAttribute(TransactionMode.Manual)]
public class 练习书本例题 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//获取文档
UIDocument uIDocument = commandData.Application.ActiveUIDocument;
Document document = uIDocument.Document;
Selection selection = uIDocument.Selection;
//创建房间过滤器
RoomFilter roomFilter = new RoomFilter();
StringBuilder stringBuilder = new StringBuilder();
//创建收集器
FilteredElementCollector collector = new FilteredElementCollector(document);
//应用过滤器过滤
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
//遍历元素
foreach (Room item in rooms)
{
stringBuilder.Append(item.Name);
}
TaskDialog.Show("提示",stringBuilder.ToString());
return Result.Succeeded;
}
}
}
如果revit操作中将其中一个房间删除,但是该房间仍保留在此项目中,这时按照上述代码执行,仍然显示删除掉的那个房间。
这时可以通过判断房间的location值是否为空值来判断。
这里有两种写法:
写法一:通过if来判断
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace work03._1
{
[TransactionAttribute(TransactionMode.Manual)]
public class 练习书本例题 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uIDocument = commandData.Application.ActiveUIDocument;
Document document = uIDocument.Document;
Selection selection = uIDocument.Selection;
RoomFilter roomFilter = new RoomFilter();
StringBuilder stringBuilder = new StringBuilder();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().ToList();
foreach (Room item in rooms)
{
if(item.Level.Name.Equals("标高 1")&& item.Location !=null)
{
stringBuilder.Append(item.Name);
}
}
TaskDialog.Show("提示",stringBuilder.ToString());
return Result.Succeeded;
}
}
}
写法二:Where(x=>x.Location!=null)进行判断location值不为空的筛选过滤
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace work03._1
{
[TransactionAttribute(TransactionMode.Manual)]
public class 练习书本例题 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uIDocument = commandData.Application.ActiveUIDocument;
Document document = uIDocument.Document;
Selection selection = uIDocument.Selection;
RoomFilter roomFilter = new RoomFilter();
StringBuilder stringBuilder = new StringBuilder();
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Room> rooms = collector.WherePasses(roomFilter).Cast<Room>().Where(x=>x.Location!=null).ToList();
foreach (Room item in rooms)
{
stringBuilder.Append(item.Name);
}
TaskDialog.Show("提示",stringBuilder.ToString());
return Result.Succeeded;
}
}
}