Skip to content
On this page

旋转

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

功能实现

  1. 选中目标实体

我们可以调用 MxCADSelectionSet 选择需要进行旋转的实体。

ts
// 选择需要镜像的对象
let ss = new MxCADSelectionSet();
if (!await ss.userSelect("\n选择旋转对象")) return;
  1. 设置旋转角度

我们通过调用 MxCADUiPrPoint 取点对象来确定对象的旋转基点。再调用 MxCADUiPrAngle 获取用户设置的对象旋转角度。在设置过程中,我们可以通过 MxCADUiPrAngle.setUserDraw() 动态绘制镜像对象,能够使我们更加直观的看到旋转后的对象位置。由于在动态绘制过程中需要不断执行重绘功能,因此为了提高渲染速率减少因旋转对象过多导致的绘制卡顿问题,我们可以暂时将目标对象整合为一个图块 McDbBlockTableRecord,在动态绘制过程中以图块的形式进行初始旋转,最后在确定最终旋转角度后再将目标对象进行旋转。

ts
// 设置图块
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)=>{
    let ent = id.getMcDbEntity();
    if(!ent) return;
    let cent = ent.clone() as McDbEntity;
    blkTableRecord.appendAcDbEntity(cent);
})
// 设置图块基点
blkTableRecord.origin = basePt;
let blkRef = new McDbBlockReference();
blkRef.blockTableRecordId = blkRecId;
// 设置图块位置
blkRef.position = basePt;


// 指定旋转角度
let getAngle = new MxCADUiPrAngle();
getAngle.setMessage('请指定旋转角度')
getAngle.setBasePt(basePt);
getAngle.setUserDraw((pt, pw) => {
    pw.drawLine(pt.toVector3(), basePt.toVector3());
    // 动态旋转图块
    let a = pt.sub(basePt).angleTo2(McGeVector3d.kXAxis, McGeVector3d.kNegateZAxis);
    const _clone = blkRef.clone() as McDbBlockReference;
    _clone.rotation = a;
    pw.drawMcDbEntity(_clone)
})
let val = await getAngle.go();
if (!val) return;
const angle = getAngle.value();
  1. 旋转对象

在上述步骤中,我们获取到了旋转角度,因此,我们可以直接调用 McDbEntity.rotate() 方法来旋转对象。移动后,调用 McObject.updateDisplay() 方法来更新图纸显示。

ts
const mxcad = MxCpp.getCurrentMxCAD();
// 镜像旋转实体
ss.forEach(id => {
    let ent = id.getMcDbEntity();
    if (!ent) return;
    ent.rotate(basePt, angle);
})
// 更新显示
mxcad.updateDisplay();

功能实践

实践效果如下:

  • 点击旋转按钮,执行旋转方法
  • 点击左键选择目标实体,点击右键结束选择(也可直接框选)
  • 根据命令行提示点击左键设置旋转基点
  • 移动鼠标再次点击左键设置旋转角度(或输入框内直接输入角度值摁下enter键)
  • 成功旋转对象