首先贴出ISelection代码
public interface ISelectionFilter
{
bool AllowElement(DB.Element elem);
bool AllowReference(Reference reference, DB.XYZ position);
}
继承此接口需要实现这两个类,如果没有特殊要求,直接都返回True都是可以的
过滤元素
举例:只能选中墙
public class SelectionFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
return elem is Wall;
}
public bool AllowReference(Reference reference, XYZ position)
{
return true;
}
}
过滤链接CAD图纸
AllowElement可以玩出花来,写复杂点也没关系;
public class SelectionFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
if (elem is ImportInstance importIns)
return importIns.IsLinked;
return false;
}
public bool AllowReference(Reference reference, XYZ position)
{
return true;
}
}
/// 主函数
doc.GetElement(uidoc.Selection.PickObject(ObjectType.PointOnElement, new SelectionFilter(doc)));
完成效果
限制可选范围
AllowReference也可以玩出花,比如以下代码,就是只能选中平面,并且要满足鼠标点选位置在1m以上
public bool AllowReference(Reference reference, XYZ position)
{
var go = doc.GetElement(reference).GetGeometryObjectFromReference(reference);
if (go is PlanarFace pf && position.Z > 1000.FT())
{
return true;
}
return false;
}
完成效果如下