CAD二次开发中选择集过滤器的应用

创建选择集过滤器的语句很繁琐,特别是同时指定多个过滤条件时。对此有必要创建一个函数,来简化步骤:

/// <summary>
/// TypedValue列表类,简化选择集过滤器的构造
/// </summary>
public class TypedValueList : List<TypedValue> {
    /// <summary>
    /// 接受可变参数的构造函数
    /// </summary>
    /// <param name="args">TypedValue对象</param>
    public TypedValueList(params TypedValue[] args) {
        AddRange(args);
    }

    /// <summary>
    /// 添加DXF组码及对应的类型
    /// </summary>
    /// <param name="typecode">DXF组码</param>
    /// <param name="value">类型</param>
    public void Add(int typecode, object value) {
        base.Add(new TypedValue(typecode, value));
    }

    /// <summary>
    /// 添加DXF组码
    /// </summary>
    /// <param name="typecode">DXF组码</param>
    public void Add(int typecode) {
        base.Add(new TypedValue(typecode));
    }

    /// <summary>
    /// 添加DXF组码及对应的类型
    /// </summary>
    /// <param name="typecode">DXF组码</param>
    /// <param name="value">类型</param>
    public void Add(DxfCode typecode, object value) {
        base.Add(new TypedValue((int)typecode, value));
    }

    /// <summary>
    /// 添加DXF组码
    /// </summary>
    /// <param name="typecode">DXF组码</param>
    public void Add(DxfCode typecode) {
        base.Add(new TypedValue((int)typecode));
    }

    /// <summary>
    /// 添加图元类型,DXF组码缺省为0
    /// </summary>
    /// <param name="entityType">图元类型</param>
    public void Add(Type entityType) {
        base.Add(new TypedValue(0, RXClass.GetClass(entityType).DxfName));
    }

    /// <summary>
    /// TypedValueList隐式转换为SelectionFilter
    /// </summary>
    /// <param name="src">要转换的TypedValueList对象</param>
    /// <returns>返回对应的SelectionFilter类对象</returns>
    public static implicit operator SelectionFilter(TypedValueList src) {
        return src != null ? new SelectionFilter(src) : null;
    }

    /// <summary>
    /// TypedValueList隐式转换为ResultBuffer
    /// </summary>
    /// <param name="src">要转换的TypedValueList对象</param>
    /// <returns>返回对应的ResultBuffer对象</returns>
    public static implicit operator ResultBuffer(TypedValueList src) {
        return src != null ? new ResultBuffer(src) : null;
    }

    /// <summary>
    /// TypedValueList隐式转换为TypedValue数组
    /// </summary>
    /// <param name="src">要转换的TypedValueList对象</param>
    /// <returns>返回对应的TypedValue数组</returns>
    public static implicit operator TypedValue[] (TypedValueList src) {
        return src != null ? src.ToArray() : null;
    }

    /// <summary>
    /// TypedValue数组隐式转换为TypedValueList
    /// </summary>
    /// <param name="src">要转换的TypedValue数组</param>
    /// <returns>返回对应的TypedValueList</returns>
    public static implicit operator TypedValueList(TypedValue[] src) {
        return src != null ? new TypedValueList(src) : null;
    }

    /// <summary>
    /// SelectionFilter隐式转换为TypedValueList
    /// </summary>
    /// <param name="src">要转换的SelectionFilter</param>
    /// <returns>返回对应的TypedValueList</returns>
    public static implicit operator TypedValueList(SelectionFilter src) {
        return src != null ? new TypedValueList(src.GetFilter()) : null;
    }

    /// <summary>
    /// ResultBuffer隐式转换为TypedValueList
    /// </summary>
    /// <param name="src">要转换的ResultBuffer</param>
    /// <returns>返回对应的TypedValueList</returns>
    public static implicit operator TypedValueList(ResultBuffer src) {
        return src != null ? new TypedValueList(src.AsArray()) : null;
    }

}

调用函数:

[CommandMethod("TestFilter")]
public static void TestFilter() {
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    TypedValueList tvs=new TypedValueList();
    tvs.Add(DxfCode.LayerName,"图层1");
    tvs.Add(typeof(Line));
    SelectionFilter filter=new SelectionFilter(tvs);
    PromptSelectionResult psr = ed.SelectAll(filter);
    if(psr.Status==PromptStatus.OK)
        AcAp.ShowAlertDialog($"选择集中实体的数量:{psr.Value.Count}");
}

在过滤器中使用通配符

TypedValueList values=new TypedValueList();
values.Add(typeof(DBText));
values.Add(DxfCode.LayerName,"0,图层1");
values.Add(DxfCode.Text,"*cad*");
SelectionFilter sf=new SelectionFilter(values);

选择所有的文字和多行文字

TypedValueList values=new TypedValueList();
values.Add(DxfCode.Operator,"<or");
values.Add(typeof(DBText));
values.Add(typeof(MText));
values.Add(DxfCode.Operator, "or>");
SelectionFilter sf=new SelectionFilter(values);

选择半径大于30的园

TypedValueList values=new TypedValueList();
values.Add(typeof(Circle));
values.Add(DxfCode.Operator, ">=");
values.Add(DxfCode.Real,30);
SelectionFilter sf=new SelectionFilter(values);

创建复杂的过滤器,选择圆心在pt1和pt2两点构成的矩形内的园

Point3d pt1=new Point3d(0,0,0);
Point3d pt2=new Point3d(100,100,0);
TypedValueList values=new TypedValueList();
values.Add(typeof(Circle));
values.Add(DxfCode.Operator, ">,>,*");
values.Add(DxfCode.XCoordinate,pt1);
values.Add(DxfCode.Operator, "<,<,*");
values.Add(DxfCode.XCoordinate, pt2);
SelectionFilter sf=new SelectionFilter(values);

通配符

大多数对话框和命令行条目都支持以下通配符。

这些通配符可以用于对象数据查询和特性查询中。要在 SQL 查询中使用通配符,请参考数据库软件以获得支持的字符列表。

通配符 说明
# (井号) 匹配任意数字位。
@ (at) 匹配任意字母字符。
. (句号) 匹配任意非字母数字字符。
* (星号) % (百分号) 匹配任意字符串,包括空字符串。可用在字符串的开头、中间或结尾处。
? (问号) 匹配任意单个字符。
~ (波浪号) 匹配除其后续字符外的任意字符。
[ ] (括号) 匹配括起来的任一字符。
[~ ] (波浪号和括号) 匹配没有被括起来的任意字符。
- (连字符) 出现在括号内时指定单个字符的范围。
’ (后引号) 换码符;逐字读取下一字符。
, (逗号) 在各项之间使用时将输入一个集合。