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