文字加框
下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中的文字加框功能。该功能中用户自主选择目标文字实体,根据文字所在位置为文字实体加一个外边框。文字加框功能能够帮助用户着重标注文字,或修改显示形式等。
功能实现
- 选中目标文字实体
我们可以调用 MxCADResbuf 设置过滤器,再通过 MxCADUtility.userSelect() 方法过滤出选择实体中的单行文本对象和多行文本对象。
ts
// 设置过滤器
const filter = new MxCADResbuf();
filter.AddMcDbEntityTypes("TEXT, MTEXT");
// 选择文字对象
let aryIds = await MxCADUtility.userSelect("请选择文字对象", filter);
if (aryIds.length == 0) {
return;
};
- 绘制文字边框
我们根据 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);
})
功能实践
实践效果如下:
- 点击文字加框按钮,执行文字加框方法
- 点击左键选择目标文字实体,点击右键结束选择
- 成功绘制文字框