在 Revit Api 中创建没有相应元素的共享参数过滤器

问题描述 投票:0回答:1

我正在尝试在我的项目中创建一个 ElementFilter,它将仅选择某个共享参数具有特定值的元素。

查阅文档(此处:https://www.revitapidocs.com/2023/b231dc85-516a-5e75-c634-c6cd81b43fc5.htm)似乎我需要相应参数的id。

在同一个条目中,似乎暗示恢复参数的唯一方法是通过查询元素(任何元素),例如使用共享参数的 guid。 我不确定我是否理解底层逻辑,这是否意味着没有元素就不存在参数?这似乎违反直觉,因为 ElementFilters 先于文档中的 Elements 存在。

有谁知道如何在没有 Element 的情况下创建 ElementFilter 吗?否则,在我看来,我将不得不经历创建元素的过程,检查参数,然后删除元素。

c# revit-api
1个回答
0
投票

这里的 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.