Skip to content
On this page

文字查找

下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中的文字查找功能。该功能中用户自主选择目标文字实体,根据文字内容查找图纸中相同的文字。文字查找功能能够帮助用户在图纸中查找文字、数字、字母等,可用于快速定位图纸内容或统计文字类图元数量等。

功能实现

  1. 设置查找文字内容

我们可以调用 MxCADUiPrString 设置我们需要查找的文字内容。此外,也可以通过输入框或其他方式获取到需要查找的文字内容。

ts
// 设置查找文字内容
const getStr = new MxCADUiPrString();
getStr.setMessage('请输入查找文字内容\n');
const string = await getStr.go();
if (!string) return;
  1. 设置查找模式

我们可以调用 MxCADUiPrKeyWord 根据用户输入关键字来设置文字查找的类型,如:全字匹配、文字包含、文字前缀匹配、文字后缀匹配等。

ts
// 设置查找模式
const getKey = new MxCADUiPrKeyWord();
getKey.setMessage('请选择查找模式\n');
getKey.setKeyWords("[全字匹配(A)/文字包含(B)/文字前缀匹配(C)/文字后缀匹配(D)]");
const key = await getKey.go();
if (!key) return;
  1. 设置查找范围并查找目标文字

我们可以调用 MxCADResbuf 设置过滤器,再通过 MxCADUtility.userSelect() 方法过滤出选择实体中的单行文本对象。

由于在上述步骤中我们已经获取到了用户选择的查找方式,因此,我们将过滤出来的文字实体根据不同查找方式过滤出符合要求的对象,并将其通过 McObject.addCurrentSelect() 方法加入当前选择实体中便于我们观察。

ts
const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT")
let ss = new MxCADSelectionSet();
if (!await ss.userSelect("选择要查找的范围:", filter)) return;
if (ss.count() == 0) return;
// 选中对象
const mxcad = MxCpp.getCurrentMxCAD();
let objArr: McObjectId[] = [];
// 遍历文字对象查找符合条件的文字
ss.forEach((id: McObjectId) => {
    const obj = id.getMcDbEntity() as McDbText;
    const str = obj.textString;
    if (key === 'A') {
        if (str === string) {
            objArr.push(id);
        }
    } else if (key === 'B') {
        if (str.includes(string)) {
            objArr.push(id);
        }
    } else if (key === 'C') {
        if (str.startsWith(string)) {
            objArr.push(id);
        }
    } else if (key === 'D') {
        if (str.endsWith(string)) {
            objArr.push(id);
        }
    }
});
if (objArr.length > 0) {
    objArr.forEach(id => {
        mxcad.addCurrentSelect(id)
    })
}

功能实践

实践效果如下:

  • 点击文字查找按钮,执行文字查找方法
  • 根据命令行提示在输入框中输入需要查找的文字内容,按下enter键确定查找内容
  • 再次根据命令行提示选择文字查找方式,在输入框中输入对应字母,按下enter键确定查找方法
  • 点击鼠标左键开始拉框选择查找范围
  • 再次点击鼠标左键结束框选
  • 成功查找到目标文字并选中