以梦为马,不负韶华

搜索
查看: 633|回复: 3
收起左侧

在线CAD(H5网页CAD SDK)实现阵列功能

[复制链接]
 楼主| 发表于 2023-9-12 14:08:39 显示全部楼层 |阅读模式
前言
在线CAD SDK的集成过程中,甲方客户可能有阵列功能的需求,作为开发者如何利用WEB CAD SDK展现此功能效果呢?本章节我们重点讲述一下。
首先看一下在线CAD的DEMO:https://demo.mxdraw3d.com:3000/mxcad/,阵列功能如下图:
1.png
环境搭建
首先按照 mxcad入门文档 创建环境,如下图:
2.png
基于mxcad库实现阵列功能
阵列功能是按一定规律对某个或多个图形组合进行复制偏移,生成出新的图形组合在实现它之前我们要确保已经用mxcad库在页面中显示了一个cad图纸
然后我们用鼠标点击一个或者多个图形, 就可以选中它们选中后执行以下代码:
  1. <font size="3">const rowNum = Number(prompt("输入行数"))
  2. const colNum = Number(prompt("输入列数"))
  3. if (isNaN(rowNum) || isNaN(colNum)) return

  4. alert("点击画布两点之间的距离作为偏移量")
  5. let offset = await MxCADUtility.getCorner("输入偏移距离");
  6. if (!offset) return
  7. let dColOffset = offset.pt2.x - offset.pt1.x;
  8. let dRowOffset = offset.pt2.y - offset.pt1.y;

  9. // 得到选中的图形
  10. let aryId = await MxCADUtility.userSelect("选择陈列对象");
  11. // 得到这些图形的包围盒
  12. let ext = MxCADUtility.getMcDbEntitysBoundingBox(aryId);
  13. if (!ext) return;

  14. let cenPt = new McGePoint3d();

  15. if (dColOffset > 0)
  16.     cenPt.x = ext.minPt.x;
  17. else
  18.     cenPt.x = ext.maxPt.x;

  19. if (dRowOffset > 0)
  20.     cenPt.y = ext.minPt.y;
  21. else
  22.     cenPt.y = ext.maxPt.y;
  23. // 角度
  24. let dAng = Number(prompt("输入角度"));
  25. if (isNaN(dAng)) return
  26. let matRot = new McGeMatrix3d().setToRotation(dAng * Math.PI / 180.0, McGeVector3d.kZAxis, cenPt);

  27. // 循环渲染
  28. let iMaxNum = 50000;
  29. let iCount = 0;
  30. for (let i = 0; i < rowNum; i++) {
  31.     // 行 平移矩阵
  32.     let yOffsetVec = new McGeVector3d(0.0, dRowOffset * i, 0.0);
  33.     let offsetMatY = new McGeMatrix3d().setToTranslation(yOffsetVec);

  34.     for (let j = 0; j < colNum; j++) {
  35.         if (i == 0 && j == 0)
  36.             continue;
  37.         // 列 平移矩阵
  38.         let xOffsetVec = new McGeVector3d(dColOffset * j, 0.0, 0.0);
  39.         let ofssetMatX = new McGeMatrix3d().setToTranslation(xOffsetVec);

  40.         let vecOffset = new McGePoint3d(cenPt.x, cenPt.y, cenPt.z);
  41.         // 应用对应矩阵
  42.         vecOffset.transformBy(offsetMatY);
  43.         vecOffset.transformBy(ofssetMatX);
  44.         vecOffset.transformBy(matRot);

  45.         // 最终的变换矩阵
  46.         let tmpMat = new McGeMatrix3d().setToTranslation(new McGeVector3d(vecOffset.x - cenPt.x, vecOffset.y - cenPt.y, vecOffset.z - cenPt.z));
  47.         for (let m = 0; m < aryId.length; m++) {
  48.             let tmp = aryId[m].clone() as McDbEntity
  49.             if (!tmp) {
  50.                 continue;
  51.             }
  52.             // 将该变换矩阵应用在图形对象上
  53.             tmp.TransformBy(tmpMat);
  54.             MxCpp.GetCurrentMxCAD().DrawEntity(tmp);
  55.             iCount++;
  56.             if (iCount > iMaxNum) {
  57.                 alert("超出最大阵列对象个数" + iMaxNum + "限制. \n");
  58.                 return;
  59.             }
  60.         }
  61.     }
  62. }</font>
复制代码

代码中主要让用户输入一些行列数和偏移距离以及角度值, 然后得到选中图形, 得到其包围盒,并计算出变换矩阵, 复制这些对象然后绘制在画布效果如下:
3.png
4.png
5.png
对于需要自己二次开发cad相关功能, 可以参考:
mxcad入门: https://mxcadx.gitee.io/mxcad_docs/zh/
mxcad API文档 :https://mxcadx.gitee.io/mxcad_docs/api/README.html
DEMO源码:https://gitee.com/mxcadx/mxdraw-article/tree/master/%E5%AE%9E%E7%8E%B0%E9%98%B5%E5%88%97%E5%8A%9F%E8%83%BD



[发帖际遇]: lihao2014 屌丝逆袭成功,获得白富美女神垂青,赚了 5 个 韶华币. 幸运榜 / 衰神榜
发表于 2023-9-12 14:08:39 显示全部楼层
学习制图了,谢谢楼主分享
[发帖际遇]: liangyj99736 成功获得红包 9 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2023-9-12 14:08:39 显示全部楼层
太好了呀,真的是的啊,哈哈
[发帖际遇]: wmm598 成功获得红包 6 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

不想打字就选择快捷回复吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|以梦为马,不负韶华

GMT+8, 2025-4-5 11:47

Powered by 以梦为马,不负韶华

© 2024-2099 Meng.Horse

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