Skip to content
On this page

缩放

下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中的缩放功能。该功能中用户可以框选或点选目标实体对其进行缩放,用于编辑图纸中实体的大小。在我们文档的常用编辑操作中已经对缩放操作做了基础讲解,下面我们将在此基础上实现能与用户交互的缩放功能。

功能实现

  1. 选中目标实体

我们可以调用 MxCADSelectionSet 选择需要进行缩放的实体。根据选中的实体获得其包围盒的最大点与最小点,并根据获得的数据设置缩放的距离比例。

ts
// 选择需要缩放的对象
let ss = new MxCADSelectionSet();
if (!await ss.userSelect("\n选择移动对象")) return;
// 获取缩放包围盒最大点与最小点
let pt1 = null, pt2 = null;
ss.forEach(id => {
    const ent = id.getMcDbEntity();
    const { minPt, maxPt } = ent.getBoundingBox();
    if (!pt1 || !pt2) {
        pt1 = minPt;
        pt2 = maxPt;
    } else {
        if (maxPt.x > pt2.x) pt2.x = maxPt.x;
        if (maxPt.y > pt2.y) pt2.y = maxPt.y;
        if (minPt.x < pt1.x) pt1.x = minPt.x;
        if (minPt.y < pt1.y) pt1.y = minPt.y;
    }
});

// 设置缩放距离比例
let dXLen = pt2.x - pt1.x;
let dYLen = pt2.y - pt1.y;
let dScaleLen = (dXLen + dYLen) / 3.0;
if (dScaleLen < 0.00001) dScaleLen = 1;
  1. 设置缩放基点和缩放比例

我们通过调用 MxCADUiPrPoint 取点对象来确定缩放对象的基点,调用 MxCADUiPrDist 来动态设置或直接输入缩放对象的缩放因子。

ts
// 指定基点
const getBasePt = new MxCADUiPrPoint();
getBasePt.setMessage('请设置缩放基点');
const basePoint = await getBasePt.go();
if (!basePoint) return;

// 设置缩放比例
const getScale = new MxCADUiPrDist();
getScale.setMessage('请设置缩放比例');
getScale.setBasePt(basePoint);
getScale.setUserDraw((pt, pw) => {
    const dist = pt.distanceTo(basePoint);
    let dScale = dist / dScaleLen;
    ss.forEach(id => {
        const ent = id.getMcDbEntity();
        const _clone = ent.clone() as McDbEntity;
        let mat = new McGeMatrix3d();
        mat.setToScaling(dScale, basePoint);
        _clone.transformBy(mat);
        pw.drawMcDbEntity(_clone);
    })
})
const val = await getScale.go();
if (!val) return;
const dist = getScale.value() || 1;
  1. 缩放实体

由于我们获取缩放因子的方式有两种,一种是根据用户移动鼠标位置与与基点之间的动态距离来计算缩放因子,一种是用户直接通过输入框输入实体的缩放因子,因此,我们可以通过 MxCADUiPrDist.getDetailedResult() 方法获取交互退出的详细原因来根据两种方式分别设置实体的缩放因子。缩放后,调用 McObject.updateDisplay() 方法来更新图纸显示。

ts
// 获取缩放因子
let dScale = 0;
if(getScale.getDetailedResult() === DetailedResult.kCoordIn){
    // 直接输入缩放因子
    dScale = dist;
}else{
    // 根据距离比例计算出缩放因子
    dScale = dist / dScaleLen;
}
// 缩放实体
ss.forEach(id => {
    const ent = id.getMcDbEntity();
    let mat = new McGeMatrix3d();
    mat.setToScaling(dScale, basePoint);
    ent.transformBy(mat);
})
// 更新图纸显示
MxCpp.getCurrentMxCAD().updateDisplay();

功能实践

实践效果如下:

  • 点击缩放按钮,执行缩放方法
  • 点击左键选择目标实体,点击右键结束选择(也可直接框选)
  • 根据命令行提示点击左键设置缩放基点
  • 移动鼠标设置缩放因子
  • 再次点击左键确定实体缩放后的大小
  • (或直接在输入框中输入缩放因子再按下enter键)
  • 成功缩放实体