Skip to content
On this page

事件监听

在通过 mxcad 进行 CAD 二次开发的过程中,我们经常会涉及到对一些事件的监听,如图纸上的实体选择事件,夹点编辑事件,mxcad实例对象创建完成时间等。因此,我们提供了McObject.on()McObject.mxdraw.on()方法来设置相关的一系列监听事件,以及McObject.off()McObject.mxdraw.off()方法来关闭监听事件。了解并熟练的使用这些事件能够帮助用户更加顺利的完成项目的开发,下面我们将介绍几种常用的事件监听。

点击 [McObject.on()]https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McObject.html#on)、McObject.mxdraw.on()、[McObject.off()]https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McObject.html#off)、McObject.mxdraw.off() 查看更多详细属性和方法说明。

监听项目初始化

我们在McObject.on()方法中设置事件名为init来监听项目的初始化阶段,在该阶段MxCAD实例对象还未被创建。

ts
import { McObject } from "mxcad"

const mxcad = new McObject;
mxcad.on("init", () => {
   console.log('项目初始化')
});

监听 mxcad 初始化

我们在McObject.on()方法中设置事件名为init_mxcad来监听MxCAD实例对象的初始化时期,在该阶段我们可以完成设置添加鼠标键盘响应事件、设置监听文件完全打开事件,注册命令等操作。

ts
import { McObject } from "mxcad"

const mxcad = new McObject;
mxcad.on("init_mxcad", () => {
   console.log('mxcad 初始化')
});

监听对象选择事件

我们在McObject.on()方法中设置事件名为selectChange来监听图纸上的实体是否被选择,在该事件的回调函数参数中将返回被选择实体的id数组(McObjectId[])。

ts
import { MxCpp, McObject, McObjectId } from "mxcad"

const mxcad:McObject = MxCpp.getCurrentMxCAD();
mxcad.on("selectChange", (ids: McObjectId[])=> {
     if (ids.length == 0) return;
     ids.forEach( id =>{
        let ent = id.getMcDbEntity()
       if(!ent) return
       console.log(ent.objectName)
     })
})

此外,我们还可以在监听对象选择事件的基础上,通过监听用户是否在短时间内多次点击同一个实体来实现监听双击对象事件。

ts
import { MxCpp, McDbMText, McDbText, McDbEntity } from "mxcad";
let oldEnt: McDbEntity | null
let time: NodeJS.Timeout
MxCpp.getCurrentMxCAD().on("selectChange", (selectEnt) => {
  if (selectEnt.length === 0) return
  const ent = selectEnt[0]?.getMcDbEntity()
  if (ent && ent instanceof McDbMText && oldEnt?.getHandle() === ent.getHandle()) {
    // 双击多行文本
    console.log(ent.contents)
  }
  if (ent && ent instanceof McDbText && oldEnt?.getHandle() === ent.getHandle()) {
    // 双击单行文本
    console.log(ent.textString)
  }
  oldEnt = ent
  if (time) clearTimeout(time)
  time = setTimeout(() => {
    oldEnt = null
  }, 300)
})

监听文件完全打开事件

我们在McObject.on()方法中设置事件名为openFileComplete来监听 MxCAD 实例对象成功打开图纸。

ts
import { MxCpp } from "mxcad"

const mxcad:McObject = MxCpp.getCurrentMxCAD();
mxcad.on("openFileComplete", () => {
    console.log("MxTip:openFileComplete ")
});

监听夹点编辑事件

我们在McObject.mxdraw.on()方法中设置事件名为objectGripEdit来监听是否有编辑图纸中的实体夹点,在该事件的回调函数参数中将返回移动的夹点信息。

ts
import { MxCpp, McObjectIdType, McObjectId } from "mxcad"

const mxcad:McObject = MxCpp.getCurrentMxCAD();
mxcad.mxdraw.on("objectGripEdit",(grips)=>{
    grips.forEach((grip)=>{
        const id = new McObjectId(grip.id, grip.type === "mxcad" ? McObjectIdType.kMxCAD: McObjectIdType.kMxDraw);
        const ent = id.getMcDbEntity();
        console.log('编辑实体信息',ent)
    })
})

关闭监听事件

如果我们想关闭之前设置的监听事件,我们可以调用该事件对应的关闭方法off()

ts
import { MxCpp } from "mxcad"

const mxcad:McObject = MxCpp.getCurrentMxCAD();

mxcad.off("selectChange", () => {
    console.log("成功关闭监听选择事件!")
});

mxcad.mxdraw.off("objectGripEdit",()=>{
    console.log("成功关闭夹点编辑事件!")
})