确定是否在视图

时间:2017-05-16 22:30:18

标签: c# view element revit-api revit

我有FamilyInstance pFamAutodesk.Revit.DB.View pView。我想知道pFampView是否可见。我尝试过使用

if (pFam.IsHidden(pView)
    continue;

不幸的是,这只会告诉我该元素是否应该被隐藏,但事实并非如此。但是,元素在每个View中都不可见,在这种情况下,我想要(或者更确切地说,不想要)某些事情发生。 Visible没有IsVisibleFamilyInstance属性...是否有人知道处理这些情况的方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

我发现了解视图中元素是否可见的最可靠方法是使用特定于该视图的FilteredElementCollector。有许多不同的方法来控制元素的可见性,尝试以任何其他方式确定这一点是不切实际的。

以下是我用来实现这一目的的实用功能。请注意,这适用于任何元素,而不仅适用于族实例。

public static bool IsElementVisibleInView([NotNull] this View view, [NotNull] Element el)
    {
        if (view == null)
        {
            throw new ArgumentNullException(nameof(view));
        }

        if (el == null)
        {
            throw new ArgumentNullException(nameof(el));
        }

        // Obtain the element's document
        Document doc = el.Document;

        ElementId elId = el.Id;

        // Create a FilterRule that searches for an element matching the given Id
        FilterRule idRule = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ID_PARAM), elId);
        var idFilter = new ElementParameterFilter(idRule);

        // Use an ElementCategoryFilter to speed up the search, as ElementParameterFilter is a slow filter
        Category cat = el.Category;
        var catFilter = new ElementCategoryFilter(cat.Id);

        // Use the constructor of FilteredElementCollector that accepts a view id as a parameter to only search that view
        // Also use the WhereElementIsNotElementType filter to eliminate element types
        FilteredElementCollector collector =
            new FilteredElementCollector(doc, view.Id).WhereElementIsNotElementType().WherePasses(catFilter).WherePasses(idFilter);

        // If the collector contains any items, then we know that the element is visible in the given view
        return collector.Any();
    }

在使用较慢的参数过滤器查找所需元素之前,类别过滤器用于消除不属于所需类别的任何元素。通过巧妙地使用过滤器可能会进一步提高速度,但我发现在实践中它足够快。

如果您没有ReSharper,请删除您看到的[NotNull]注释。