根据自己的需求来使用 第二种有时会出现过滤不出来
第一种方法
思路是根据这个元素得到一个包围这个元素的盒子 和要过滤的相交元素的类别 组合成一个 筛选器
/// <summary>
/// 获取相交元素 boundingBox
/// </summary>
/// <param name="element">根据图元找相交</param>
/// <param name="category">类别</param>
/// <param name="contain">是否包含自身</param>
/// <returns>查找结果</returns>
public static List<Element> GetIntersectElements(this Element element, BuiltInCategory category,bool contain=false)
{
List<Element> listElement = new List<Element>();
Document doc = element.Document;
BoundingBoxXYZ boundingBoxXyz = element.get_BoundingBox(doc.ActiveView);
Outline outline = new Outline(boundingBoxXyz.Min, boundingBoxXyz.Max);
BoundingBoxIntersectsFilter boundFilter = new BoundingBoxIntersectsFilter(outline);
ElementCategoryFilter filter2 = new ElementCategoryFilter(category);
LogicalAndFilter filter3 = new LogicalAndFilter(boundFilter, filter2);
FilteredElementCollector collector = new FilteredElementCollector(doc);
listElement = collector.WherePasses(filter3).WhereElementIsNotElementType().ToList();
if (contain == false)
{
listElement.RemoveAll(m => m.Id == element.Id);
}
return listElement;
}
第二种方法
思路 先过滤类别 再根据api提供的相交的类进行过滤
/// <summary>
/// 获取相交图元
/// </summary>
/// <param name="element">根据图元找相交</param>
/// <param name="category">类别</param>
/// <param name="contain">是否包含自身</param>
/// <returns>查找结果</returns>
public static List<Element> GetIntersectElements(this Element element, BuiltInCategory category, bool contain = false)
{
var listResults = new FilteredElementCollector(element.Document).OfCategory(category).WherePasses(
new ElementIntersectsElementFilter(element)).ToList();
if (contain == false)
{
listResults.RemoveAll(p => p.Id == element.Id);
}
return listResults;
}
————————————————
版权声明:本文为CSDN博主「张亚旗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37867305/article/details/88183079