You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Revit视图中隔离指定类别?代码实现未达预期求助

解决Revit仅显示指定类别元素的3D视图创建问题

你的代码未达到预期效果,核心原因有两点:

  1. 新建视图默认所有类别元素均可见,仅添加过滤器并设置可见性为true,只会保留墙元素的可见性,无法隐藏其他元素
  2. 创建过滤器时未关联3D视图类型,可能导致过滤器无法在目标视图中正确生效

方案一:使用过滤器实现(支持复杂过滤条件)

以下是修正后的代码,先隐藏所有类别的默认可见性,再通过过滤器仅显示目标元素:

public static ElementId Create3DView(Document doc, ElementId filterId)
{
    ViewFamilyType vft = new FilteredElementCollector(doc)
        .OfClass(typeof(ViewFamilyType))
        .Cast<ViewFamilyType>()
        .FirstOrDefault(q => q.ViewFamily == ViewFamily.ThreeDimensional);

    var viewId = ElementId.InvalidElementId;

    using (Transaction t = new Transaction(doc, "Create 3d view"))
    {
        t.Start();

        View3D view = View3D.CreatePerspective(doc, vft.Id);
        view.DisplayStyle = DisplayStyle.FlatColors;
        view.Name = "Wall Only 3D View";

        // 隐藏所有类别的默认可见性
        foreach (Category category in doc.Settings.Categories)
        {
            if (category.CanBeHidden(view))
            {
                view.SetCategoryHidden(category.Id, true);
            }
        }

        // 添加过滤器并设置可见性
        if (filterId != ElementId.InvalidElementId)
        {
            view.AddFilter(filterId);
            view.SetFilterVisibility(filterId, true);
        }

        viewId = view.Id;
        t.Commit();
    }

    return viewId;
}

public static void TestCreateWallView(Document doc)
{
    ElementId filterId = ElementId.InvalidElementId;
    ViewFamilyType vft = new FilteredElementCollector(doc)
        .OfClass(typeof(ViewFamilyType))
        .Cast<ViewFamilyType>()
        .FirstOrDefault(q => q.ViewFamily == ViewFamily.ThreeDimensional);

    using (Transaction t = new Transaction(doc, "Create Wall Filter"))
    {
        t.Start();

        var categories = new List<ElementId>
        {
            new ElementId(BuiltInCategory.OST_Walls)
        };

        // 创建关联3D视图类型的过滤器
        var pfe = ParameterFilterElement.Create(
            doc, "Wall Filter", categories, vft.Id, new FilterRule[0]);

        filterId = pfe.Id;
        t.Commit();
    }

    var viewId = Create3DView(doc, filterId);
}

方案二:直接设置类别可见性(仅按类别过滤,更简洁)

如果仅需要按类别过滤,无需复杂条件,可以直接修改视图的类别可见性,省去过滤器创建步骤:

public static ElementId Create3DViewOnlyWalls(Document doc)
{
    ViewFamilyType vft = new FilteredElementCollector(doc)
        .OfClass(typeof(ViewFamilyType))
        .Cast<ViewFamilyType>()
        .FirstOrDefault(q => q.ViewFamily == ViewFamily.ThreeDimensional);

    var viewId = ElementId.InvalidElementId;

    using (Transaction t = new Transaction(doc, "Create Wall-Only 3D View"))
    {
        t.Start();

        View3D view = View3D.CreatePerspective(doc, vft.Id);
        view.DisplayStyle = DisplayStyle.FlatColors;
        view.Name = "Wall Only 3D View";

        // 隐藏所有类别
        foreach (Category category in doc.Settings.Categories)
        {
            if (category.CanBeHidden(view))
            {
                view.SetCategoryHidden(category.Id, true);
            }
        }

        // 仅开启墙类别的可见性
        Category wallCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
        if (wallCategory != null && wallCategory.CanBeHidden(view))
        {
            view.SetCategoryHidden(wallCategory.Id, false);
        }

        viewId = view.Id;
        t.Commit();
    }

    return viewId;
}

内容的提问来源于stack exchange,提问作者Felipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:54:55