Skip to content
On this page

矩形缩放

下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中的矩形缩放功能。该功能中用户自主选择目标实体并设置参考矩形大小,选中的实体将按照参考矩形的宽进行X轴的缩放,按照参考矩形的高进行Y轴的缩放。

功能实现

  1. 选中目标实体并整合成块

我们可以调用 MxCADSelectionSet 选择需要进行缩放的实体。将选中后的实体通过 McDbBlockTableRecord.appendAcDbEntity() 方法整合成块,并通过属性McDbBlockTableRecord.origin 将整合好的块对象的中心点设置为基点。

ts
// 获取需要缩放的实体
let ss = new MxCADSelectionSet();
if (!await ss.userSelect("请选择需要矩形缩放的实体:")) return;
if (ss.count() == 0) return;

// 将目标实体整合成块对象
let mxcad = MxCpp.getCurrentMxCAD();
let blkTable = mxcad.getDatabase().getBlockTable();
let blkRecId = blkTable.add(new McDbBlockTableRecord());//图块记录
let blkTableRecord: McDbBlockTableRecord = blkRecId.getMcDbBlockTableRecord() as any;
if (blkTableRecord == null) return;

ss.forEach(id => {
    const ent = id.getMcDbEntity();
    if (!ent) return;
    const ent_clone = ent.clone() as McDbEntity;
    blkTableRecord.appendAcDbEntity(ent_clone);
})

let blkRef = new McDbBlockReference();
blkRef.blockTableRecordId = blkRecId;
// 通过计算实体包围盒设置块基点
const { ret, maxPt, minPt } = blkRef.getBoundingBox();
if (!ret) return;
const line = new McDbLine(minPt, maxPt);
const length = line.getLength().val;
blkTableRecord.origin = line.getPointAtDist(length / 2).val;
  1. 设置参考矩形大小

我们通过调用 MxCADUiPrPoint 取点对象来确定参考矩形的两个角点,并根据角点位置得出其他两个顶点,通过 McDbPolyline 多段线来动态绘制矩形。

ts
// 选择矩形的两个角点
const getPt1 = new MxCADUiPrPoint();
getPt1.setMessage("请指定矩形的角点1");
const pt1 = await getPt1.go();
if (!pt1) return;
const getPt2 = new MxCADUiPrPoint();
getPt2.setMessage("请指定矩形角点2");
getPt2.setUserDraw((pt, pw) => {
    let pl = new McDbPolyline();
    pl.addVertexAt(pt1);
    pl.addVertexAt(new McGePoint3d(pt1.x, pt.y));
    pl.addVertexAt(pt);
    pl.addVertexAt(new McGePoint3d(pt.x, pt1.y));
    pl.isClosed = true;
    pw.drawMcDbEntity(pl);
})
const pt2 = await getPt2.go();
if (!pt2) return;
  1. 设置缩放因子并绘制矩形缩放后的实体

我们在上述步骤中能够获取到参考的矩形的宽高,选中的所有实体所在的包围盒大小,我们可以根据两者之间比值分别得到实体在X轴和Y轴上的缩放因子。最后,根据得到的缩放因子设置快对象的 McDbBlockReference.scaleFactors 属性并绘制完成缩放后的实体。

在下面的示例中,我们将完成缩放后的实体位置设置在了参考矩形的中心点,除此之外,我们还可以通过 MxCADUiPrPoint 取点对象来动态设置对象的位置。

ts
// 计算缩放因子
const scaleX = Math.abs(pt1.x - pt2.x) / Math.abs(minPt.x - maxPt.x);
const scaleY = Math.abs(pt1.y - pt2.y) / Math.abs(minPt.y - maxPt.y);
blkRef.scaleFactors = new McGePoint3d(scaleX, scaleY, 0);
const l = new McDbLine(pt1, pt2);
blkRef.position = l.getPointAtDist(l.getLength().val / 2).val;
// 绘制对象
mxcad.drawEntity(blkRef);

功能实践

实践效果如下:

  • 点击矩形缩放按钮,执行矩形缩放方法
  • 点击左键选择目标实体,点击右键结束选择
  • 根据命令行提示设置参考矩形角点
  • 成功绘制进行矩形缩放后的实体