Skip to content
On this page

文字加框

下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中的文字加框功能。该功能中用户自主选择目标文字实体,根据文字所在位置为文字实体加一个外边框。文字加框功能能够帮助用户着重标注文字,或修改显示形式等。

功能实现

  1. 选中目标文字实体

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

ts
// 设置过滤器
const filter = new MxCADResbuf();
filter.AddMcDbEntityTypes("TEXT, MTEXT");
// 选择文字对象
let aryIds = await MxCADUtility.userSelect("请选择文字对象", filter);
if (aryIds.length == 0) {
    return;
};
  1. 绘制文字边框

我们根据 McDbEntity.getBoundingBox() 能够获取到文字实体所在的最小包围盒,以该最小包围盒中的最大点和最小点为文字边框的两个角点。最后通过 McDbPolyline 多段线来绘制文字边框。

此外,由于直接绘制由文字最小包围盒构成的文字边框会显得较为拥挤,因此我们可以为该文字边框设置内边距来做一个优化。

ts
// 为一个文字实体加边框
aryIds.forEach(id => {
    const event = id.getMcDbEntity();
    // 获取文字的两个角点
    let bound = event.getBoundingBox();
    if (!bound.ret) return;
    const maxPt: McGePoint3d = bound.maxPt;
    const minPt: McGePoint3d = bound.minPt;
    // 获取其他两个角点
    const pt1 = new McGePoint3d(minPt.x, maxPt.y);
    const pt2 = new McGePoint3d(maxPt.x, minPt.y);
    // 为文字框设置内边距
    const vec1 = minPt.clone().sub(maxPt).normalize().mult(2);
    const vec2 = pt1.clone().sub(pt2).normalize().mult(2);
    // 绘制文字框
    const pl = new McDbPolyline();
    pl.addVertexAt(minPt.addvec(vec1));
    pl.addVertexAt(pt1.addvec(vec2));
    pl.addVertexAt(maxPt.subvec(vec1));
    pl.addVertexAt(pt2.subvec(vec2));
    pl.isClosed = true;
    MxCpp.getCurrentMxCAD().drawEntity(pl);
})

功能实践

实践效果如下:

  • 点击文字加框按钮,执行文字加框方法
  • 点击左键选择目标文字实体,点击右键结束选择
  • 成功绘制文字框