Skip to content
On this page

选择图形

在CAD中,选择图形的方法有多种,包括点选、框选、累加选择、全选等。mxcad 也根据这些选择方法提供了多个接口来实现选择图形,如MxCADUtilityClass 类提供了一系列与绘图相关的工具方法,选择集 MxCADSelectionSet() 用于选择实体,MxCADResbuf 类用于操作 AutoCAD 中的 resbuf 数据等。

基础设置

mxcad在默认配置下是开启了选择图形的编辑功能, 我们可以通过mxdraw提供的MxFun.setIniset实现各种初始化配置, 配置参数参考 iniConfig 。通过如下设置, 我们就可以通过鼠标对应的图形进行编辑和选择。

ts
import { MxFun } from "mxdraw"
MxFun.setIniset({
    // 启动夹点编辑功能, 开启单选图形(mxcad默认开启)
    "EnableGripEidt": true,
    // 开启多选
    "multipleSelect": true
})

点选

点选即使用鼠标直接点击图形就能选中目标对象。

  1. 我们可以通过实例化 mxcad 提供的 MxCADUtilityClass 类调用 findEntAtPoint() 方法在指定坐标点附近查找图形对象或 selectEnt() 方法在指定位置选择图形对象。

点击 MxCADUtilityClass() 查看详细属性和方法说明。

ts
import { MxCADUiPrPoint, MxCADResbuf, MxCADUtility } from "mxcad"

const getPoint = new MxCADUiPrPoint()
// 定义过滤器
const filter = new MxCADResbuf()
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT")

// 方式一:findEntAtPoint
const getPoint = new MxCADUiPrPoint()
const point = await getPoint.go()
if(!point) return
let objId = MxCADUtility.findEntAtPoint(point.x, point.y,point.z,-1,filter)
// 选中对象设置高亮
MxCADUtility.highlightEntity(objId.id, true)
console.log(objId)

// 方式二:selectEnt
let objIds = await MxCADUtility.selectEnt("指定位置选择图形对象", filter)
console.log(objIds)

2.我们可以通过实例化 mxcad 提供的选择集 MxCADSelectionSet() 调用 pointSelect() 方法实现点选。

点击 pointSelect() 查看详细属性和方法说明。

ts
import { MxCADSelectionSet, MxCADResbuf } from "mxcad"

// 通过单个点选择
const ss = new MxCADSelectionSet();
const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT")
const getPoint = new MxCADUiPrPoint()
const point = await getPoint.go()
if (!point) return;
// 加filter过滤选择集, 这里只会选择文字对象
const index = ss.pointSelect(point.x, point.y, filter)
const objId = ss.item(index)
const ent = objId.getMcDbEntity()
console.log(ent)

框选

框选即在绘图区的空白处点击一点确定选框的一个交点,然后拖动鼠标形成一个矩形框来选择对象。

  1. 我们可以通过实例化 mxcad 提供的选择集 MxCADSelectionSet() 调用 userSelect() 方法对图纸内容进行框选。

点击 userSelect() 查看详细属性和方法说明。

ts
import { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const ss = new MxCADSelectionSet();
const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT")
// 加filter过滤选择集, 这里只会选择文字对象
ss.userSelect("框选需要的对象", filter).then((is) => {
    if (is) {
        // 得到框选的两个选择点
        const { pt1, pt2 } = ss.getSelectPoint()
        ss.getIds()
        ss.forEach((id) => {
            let ent = id.getMcDbEntity();
            if (!ent) return;
            console.log(ent)
        })
    }
})
  1. 我们可以通过实例化 mxcad 提供的 MxCADUtilityClass 类调用 userSelect() 方法对图纸内容进行框选。

点击 MxCADUtilityClass() 查看详细属性和方法说明。

ts
import { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT")
let ids = await MxCADUtility.userSelect('框选需要的对象', filter)
console.log(ids)

累加选择

累加选择即只要在选中对象,可以不断点选和框选,所有选择对象都会被添加到选择集中。下面介绍的累加选择为参考示例,你也可以根据上述介绍的点选和框选方法自行实现累加选择。

  1. 点选:我们可以调用mxcad 实例对象中的 addCurrentSelect() 方法手动添加图形对象ID到当前选择中,再通过 MxCADUtilityClass 类中的getCurrentSelect() 方法得到当前选中的对象。

点击 addCurrentSelect()getCurrentSelect() 查看详细属性和方法说明。

ts
import { McApp, MxCADUiPrPoint, MxCADUtility, McObjectId, McObjectIdType } from "mxcad"

let mxcad = MxCpp.getCurrentMxCAD();
while(true){
    const getPoint = new MxCADUiPrPoint()
    const point = await getPoint.go()
    if(!point) break;
    let objId = MxCADUtility.findEntAtPoint(point.x, point.y,point.z,-1)
    mxcad.addCurrentSelect(objId)
}

const objIds = MxCADUtility.getCurrentSelect()
objIds.forEach((objId: McObjectId)=> {
    if(objId.type === McObjectIdType.kMxCAD) {
        console.log("CAD图形对象", objId.getMcDbEntity())
    }
    if(objId.type === McObjectIdType.kMxDraw) {
        console.log("绘图对象", objId.getMxDbEntity())
    }
})
  1. 框选:我们可以通过设置选择集 MxCADUtilityClass() 的 isWhileSelect 属性值为 true 来实现累加框选。
ts
import { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const ss = new MxCADSelectionSet();
ss.isWhileSelect = true
ss.isSelectHighlight = true
ss.userSelect("框选需要的对象").then(() => {})

全选

全选即选择当前图纸上所有图形对象。我们可以直接调用选择集 MxCADSelectionSet() 中的 allselect() 方法,该方法也可以结合 MxCADResbuf() 类实现过滤选择。

ts
import { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const ss = new MxCADSelectionSet();
//选择所有图形元素
ss.allSelect();
ss.forEach((id)=> {
    let ent = id.getMcDbEntity();
    if (!ent) return;
    console.log(ent)
})

const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT")
//选择所有文本对象
ss.allSelect(filter);

监听选择事件

我们可以调用 mxcad 的实例对象中的 on() 方法监听对象选择事件。

ts
import { MxCpp } from "mxcad"
// 当图形被当前选中时会触发`selectChange`事件并回调当前已选中的id对象列表
MxCpp.getCurrentMxCAD().on("selectChange", (ids: McObjectId[])=> {})

清除选择

我们可以调用 clearMxCurrentSelect() 方法将目标图纸的所有选择清空。

ts
import { MxCpp } from "mxcad"
// 放弃目标图纸上所有的选择对象
 MxCpp.getCurrentMxCAD().mxdraw.clearMxCurrentSelect()