https://blog.youkuaiyun.com/qq_29143307/article/details/116235371?spm=1001.2014.3001.5501
接上一篇,再循环选择的功能窗口中增加自定义的过滤设置:
首先,需要实现revit的过滤接口:ISelectionFilter,实现接口内的成员函数
在自己实现的AllowElement和AllowReference可以根据需要实现丰富的过滤条件。
但根据业务需求可能往往过滤要求各不相同,所以我选择使用委托处理,在委托中根据业务实现过滤
我的SelectionFilter类:
/// <summary>
/// 自定义过滤构件的操作
/// </summary>
class SelectionFilter : ISelectionFilter
{
/// <summary>
/// Element 委托处理
/// </summary>
public Func<Element, bool> eleFilterDelegate { set; get; }
/// <summary>
/// Reference 委托处理
/// </summary>
public Func<Reference, XYZ, bool> referenceFilterDelegate { set; get; }
/// <summary>
/// 默认构造
/// </summary>
public SelectionFilter()
{
eleFilterDelegate = null;
referenceFilterDelegate = null;
}
/// <summary>
/// 实现过滤构件接口
/// </summary>
/// <param name="elem"></param>
/// <returns></returns>
public bool AllowElement(Element elem)
{
if (eleFilterDelegate != null)
{
return eleFilterDelegate(elem);
}
return false;
}
/// <summary>
/// 实现过滤接口。是否是允许的Reference
/// </summary>
/// <param name="reference"></param>
/// <param name="position"></param>
/// <returns></returns>
public bool AllowReference(Reference reference, XYZ position)
{
if (referenceFilterDelegate != null)
{
return referenceFilterDelegate(reference, position);
}
return false;
}
}
如果只需要基础墙,那么委托中就可以这么写:
public static bool IsNeedWall(Element ele)
{
try
{
var wall = ele as Wall;
if (wall == null)
{
return false;
}
var kind = wall.WallType.Kind;
return kind == WallKind.Basic;
}
catch
{
}
return false;
}
//使用
var filter = new SelectionFilter();
filter.eleFilterDelegate = (ele) =>
{
return IsNeedWall(ele);
};
while (true)
{
try
{
var walls = Selection.PickElementsByRectangle(filter, "请选择墙体!").ToList();
dlg.selectData.Add(walls);
dlg.SetTip();
}
catch (Exception ex)
{
break;
}
}
效果:
其他过滤效果可以根据自己的需要去实现。
下一篇介绍设置功能窗口在revit窗口的角点位置出现。
欢迎加入我的QQ群,一起探讨Revit二次开发技术!
QQ群:631436766