我想创建一个仅包含少数给定类别的元素的视图,我不确定实现此目的的最佳方法是什么。我发现的例子并不能真正说明我想要做什么。
我已经尝试了以下代码,但它似乎没有产生预期的结果,模型中的所有元素仍然可见。例如,我想在新创建的视图中仅隔离墙壁:
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 = Guid.NewGuid().ToString();
if (filterId != ElementId.InvalidElementId)
{
view.AddFilter(filterId);
view.SetFilterVisibility(filterId, true);
}
viewId = view.Id;
t.Commit();
}
return viewId;
}
public static void test()
{
var id = ElementId.InvalidElementId;
using (Transaction t = new Transaction(doc, "Create filter"))
{
t.Start();
var categories = new List<ElementId>();
categories.Add(new ElementId(BuiltInCategory.OST_Walls));
var pfe = ParameterFilterElement.Create(
doc, "filter", categories);
id = pfe.Id;
t.Commit();
}
var viewId = Create3DView(doc, id);
// ...
}
IsolateCategoriesTemporary
。不过,我认为您想要的不仅仅是一个临时设置。为此,您可以使用 HideElements
方法。只需创建视图,实现一个过滤元素收集器,选择该视图中不属于所需类别的所有元素,然后隐藏它们。以下是使用 Revit API 和 Python 隔离元素的示例代码片段,看起来您可以充分利用它来实现此目的。