如何在Revit视图中隔离指定类别?代码实现未达预期求助
解决Revit仅显示指定类别元素的3D视图创建问题
你的代码未达到预期效果,核心原因有两点:
- 新建视图默认所有类别元素均可见,仅添加过滤器并设置可见性为true,只会保留墙元素的可见性,无法隐藏其他元素
- 创建过滤器时未关联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
相关产品推荐
相关产品推荐

