选择图形​

选择图形​

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

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

tsimport { MxFun } from "mxdraw"

MxFun.setIniset({

// 启动夹点编辑功能, 开启单选图形(mxcad默认开启)

"EnableGripEidt": true,

/**

* 开启多选

* 选择方式控制 1:多选,暂不支持连续多选,2:多选,并支持连续多选,默认值为1

*/

"IntelliSelectType": 2

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

我们可以通过实例化 mxcad 提供的 MxCADUtilityClass 类调用 findEntAtPoint() 方法在指定坐标点附近查找图形对象或 selectEnt() 方法在指定位置选择图形对象。点击 MxCADUtilityClass() 查看详细属性和方法说明。

tsimport { 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() 查看详细属性和方法说明。

tsimport { 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)框选 ​框选即在绘图区的空白处点击一点确定选框的一个交点,然后拖动鼠标形成一个矩形框来选择对象。

我们可以通过实例化 mxcad 提供的选择集 MxCADSelectionSet() 调用 userSelect() 方法对图纸内容进行框选。点击 userSelect() 查看详细属性和方法说明。

tsimport { 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)

})

}

})我们可以通过实例化 mxcad 提供的 MxCADUtilityClass 类调用 userSelect() 方法对图纸内容进行框选。点击 MxCADUtilityClass() 查看详细属性和方法说明。

tsimport { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const filter = new MxCADResbuf();

// 添加对象类型,选择集只选择文字类型的对象

filter.AddMcDbEntityTypes("TEXT,MTEXT")

let ids = await MxCADUtility.userSelect('框选需要的对象', filter)

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

点选:我们可以调用mxcad 实例对象中的 addCurrentSelect() 方法手动添加图形对象ID到当前选择中,再通过 MxCADUtilityClass 类中的getCurrentSelect() 方法得到当前选中的对象。点击 addCurrentSelect()、getCurrentSelect() 查看详细属性和方法说明。

tsimport { 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())

}

})框选:我们可以通过设置选择集 MxCADUtilityClass() 的 isWhileSelect 属性值为 true 来实现累加框选。tsimport { MxCADSelectionSet, MxCADResbuf } from "mxcad"

const ss = new MxCADSelectionSet();

ss.isWhileSelect = true

ss.isSelectHighlight = true

ss.userSelect("框选需要的对象").then(() => {})全选 ​全选即选择当前图纸上所有图形对象。我们可以直接调用选择集 MxCADSelectionSet() 中的 allselect() 方法,该方法也可以结合 MxCADResbuf() 类实现过滤选择。

tsimport { 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() 方法监听对象选择事件。

tsimport { MxCpp } from "mxcad"

// 当图形被当前选中时会触发`selectChange`事件并回调当前已选中的id对象列表

MxCpp.getCurrentMxCAD().on("selectChange", (ids: McObjectId[])=> {})清除选择 ​我们可以调用 clearMxCurrentSelect() 方法将目标图纸的所有选择清空。

tsimport { MxCpp } from "mxcad"

// 放弃目标图纸上所有的选择对象

MxCpp.getCurrentMxCAD().mxdraw.clearMxCurrentSelect()

❈ ❈ ❈

相关文章

✧ ✧ ✧
小米4還能用多久?盤點其使用壽命背後的因素
原神世界任务有哪些?全部世界任务攻略汇总一览
365网站余额截图

原神世界任务有哪些?全部世界任务攻略汇总一览

📅 08-07 👁️ 101
西游记里面的大雷音寺在哪里
365网站余额截图

西游记里面的大雷音寺在哪里

📅 06-30 👁️ 6868