明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 534|回复: 0

网页CAD中选择图形进行编辑(WEB CAD SDK)

[复制链接]
发表于 2024-1-3 10:28:59 | 显示全部楼层 |阅读模式
本帖最后由 MxDraw 于 2024-1-3 10:30 编辑

前言
在网页修改DWG,经常会有对图形进行编辑以及对图形的夹点进行编辑的需求,MxCAD提供的在线版CAD提供了这样的功能,效果如下:

选择图形编辑功能
mxcad在默认配置下是开启了选择图形的编辑功能, 我们可以通过mxdraw提供的MxFun.setIniset实现各种初始化配置, 配置参数参考iniConfig代码如下:
  1. import { MxFun } from "mxdraw"

  2. MxFun.setIniset({

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

  4.     "EnableGripEidt": true,

  5.     // 开启多选

  6.     "multipleSelect": true

  7. })
复制代码
通过如上设置, 我们就可以通过鼠标对应的图形进行编辑和选择。
获取当前选择的图形:
  1. import { MxCpp, MxCADUtility, McObjectId, McObjectIdType } from "mxcad"

  2. // 需要等待createMxCad完成创建控件后才能得到

  3. const objIds = MxCADUtility.getCurrentSelect()

  4. objIds.forEach((objId: McObjectId)=> {

  5.     if(objId.type === McObjectIdType.kMxCAD) {

  6.         console.log("CAD图形对象", objId.getMcDbEntity())

  7.     }

  8.     if(objId.type === McObjectIdType.kMxDraw) {

  9.         console.log("绘图对象", objId.getMxDbEntity())

  10.     }

  11. })
复制代码

MxCADSelectionSet
我们也可以通过MxCADSelectionSet进行选择:
  1. import { MxCADSelectionSet, MxCADResbuf, MxCADUiPrPoint } from "mxcad"

  2. const ss = new MxCADSelectionSet();

  3. //选择所有图形元素

  4. ss.allSelect();

  5. ss.forEach(()=> {

  6.     let ent = id.getMcDbEntity();

  7.     if (!ent) return;

  8.     console.log(ent)

  9. })



  10. const filter = new MxCADResbuf();

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

  12. filter.AddMcDbEntityTypes("TEXT,MTEXT");

  13. ss.allSelect(filter);

  14. // 第一种方式获取对象id集合

  15. ss.getIds()

  16. // 第二种方式获取对象id集合

  17. ss.forEach((id)=> {

  18.     let ent = id.getMcDbEntity();

  19.     if (!ent) return;

  20.     console.log(ent)

  21. })



  22. // 通过单个点选择

  23. const getPoint = new MxCADUiPrPoint()

  24. getPoint.go((point)=> {

  25.     if(!point) return;

  26.     // 加filter过滤选择集, 这里只会选择文字对象

  27.     const index = ss.pointSelect(point.x, point.y, filter)

  28.     const objId = ss.item(index)

  29.     const ent = objId.getMcDbEntity()

  30.     console.log(ent)

  31. })



  32. // 通过鼠标选择多个对象

  33. // 加filter过滤选择集, 这里只会选择文字对象

  34. ss.userSelect("框选需要的对象", filter).then((is)=> {

  35.     if(is) {

  36.         // 得到框选的两个选择点

  37.         const { pt1, pt2 } =  ss.getSelectPoint()

  38.         ss.getIds()

  39.         ss.forEach((id)=> {

  40.             let ent = id.getMcDbEntity();

  41.             if (!ent) return;

  42.             console.log(ent)

  43.         })

  44.     }

  45. })

复制代码

还可以手动将图形对象ID添加到当前选择中:
  1. import { McApp } from "mxcad"

  2. let mxcad = MxCpp.getCurrentMxCAD();

  3. let id = mxcad.drawLine(0,0,1000,1000);

  4. mxcad.addCurrentSelect(id);
复制代码

选择编辑事件:
  1. import { MxCpp } from "mxcad"

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

  3. MxCpp.getCurrentMxCAD().on("selectChange", (ids: McObjectId[])=> {})



  4. // 当我们点击某个CAD图形并对其进行编辑或者夹点拖动后, mxdraw会触发`databaseModify`事件表示该图纸已被修改, 并且该事件只会触发一次

  5. const mxdraw = MxCpp.getCurrentMxCAD().getMxDrawObject()

  6. mxdraw.on("databaseModify", ()=> {

  7.     console.log("图纸被修改")

  8. })
复制代码

下面是一个将选中的图形颜色变成红色的完整代码示例, 可以根据如下代码理解图形的选择:
  1. import { McCmColor, McObjectId, MxCpp, createMxCad } from "mxcad"

  2. import { MxFun } from "mxdraw"

  3. window.onload = async () => {

  4.     const mode = "SharedArrayBuffer" in window ? "2d" : "2d-st"

  5.     MxFun.setIniset({

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

  7.         "EnableGripEidt": true,

  8.         // 开启多选

  9.         "multipleSelect": true

  10.     })

  11.     await createMxCad({

  12.         canvas: "#mxcad",

  13.         locateFile: (fileName) => {

  14.             return new URL(`/node_modules/mxcad/dist/wasm/${mode}/${fileName}`, import.meta.url).href

  15.         },

  16.         fileUrl: new URL("../public/test2.mxweb", import.meta.url).href,

  17.         fontspath: new URL("../node_modules/mxcad/dist/fonts", import.meta.url).href,

  18.     })

  19.     let oldColors: (McCmColor | undefined)[] =  []

  20.     let oldIds: McObjectId[] = []

  21.     MxCpp.getCurrentMxCAD().on("selectChange", (ids: McObjectId[])=> {

  22.         // 还原颜色

  23.         oldIds.forEach((id, index)=> {

  24.             const color = oldColors[index]

  25.             const ent = id.getMcDbEntity()

  26.             if(!ent) return

  27.             if(color) ent.trueColor = color

  28.         })

  29.         // 选中更改颜色

  30.         oldColors = ids.map((id)=> {

  31.             const ent = id.getMcDbEntity()

  32.             if(!ent) return

  33.             const color =  ent.trueColor.clone()

  34.             ent.trueColor = new McCmColor(255, 0, 0)

  35.             return color

  36.         })

  37.         oldIds = ids

  38.     })

  39. }
复制代码

效果图如下:

本文源码下载地址:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:34 , Processed in 0.169326 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表