我正在尝试在我的项目中创建一个 ElementFilter,它将仅选择某个共享参数具有特定值的元素。
查阅文档(此处:https://www.revitapidocs.com/2023/b231dc85-516a-5e75-c634-c6cd81b43fc5.htm)似乎我需要相应参数的id。
在同一个条目中,似乎暗示恢复参数的唯一方法是通过查询元素(任何元素),例如使用共享参数的 guid。 我不确定我是否理解底层逻辑,这是否意味着没有元素就不存在参数?这似乎违反直觉,因为 ElementFilters 先于文档中的 Elements 存在。
有谁知道如何在没有 Element 的情况下创建 ElementFilter 吗?否则,在我看来,我将不得不经历创建元素的过程,检查参数,然后删除元素。
这里的 API 有点令人困惑。
ElementFilter
可用于在 Revit 文档中查询特定的 Element
,还有 FilterElement
可用于为文档中的视图创建过滤器。
如果您尝试在模型中查询给定参数值的元素,您可以使用该元素的
get_Parameter()
或 LookUpParameter()
方法来执行此操作。 get_Parameter()
适用于您知道 GUID 的内置参数或共享参数。如果你只知道参数的名称,你可以使用LookupParameter()
,但要知道这种方法有点慢。
例如,如果您尝试获取所有高度大于 5 英尺的墙壁,您可以执行以下操作:
var fec = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.Where(x => x.get_Parameter(BuiltInParameter.WALL_USER_HEIGHT_PARAM)?.AsDouble() > 5)
.ToList();
如果您只知道参数名称,您可以执行以下操作:
var fec = new FilteredElementCollector(doc)
.OfClass(typeof(Wall))
.Where(x => x.LookupParameter("Unconnected Height")?.AsDouble() > 5)
.ToList();
如果您希望将过滤器应用到视图,那么您将需要使用
FilterElement
并将其应用到视图。例如,以下命令将隐藏当前视图中名称中包含“Wall”一词的所有墙壁:
using (var t = new Transaction(doc, "Add filter"))
{
t.Start();
var filterRule = ParameterFilterRuleFactory.CreateContainsRule(
new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), "Wall");
var parameterFilter = new ElementParameterFilter(filterRule);
var categories = new List<ElementId> { new ElementId(BuiltInCategory.OST_Walls) };
var filterElement = ParameterFilterElement.Create(doc, "Filter", categories, parameterFilter);
view.SetFilterVisibility(filterElement.Id, false);
t.Commit();
}