明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 534|回复: 0

(前端显示3D模型)在线三维CAD中创建一个三维管道模型

[复制链接]
发表于 2024-9-4 14:19:34 | 显示全部楼层 |阅读模式
前言
在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。
公众号:梦想云图网页CAD。
安装
在此之前,需要先安装mxcad包,安装的步骤可以查看梦想CAD官方的入门教程https://help.mxdraw.com/?pid=32,如下图:
本次教程我们新建一个Test3dPipe目录,然后在此目录中按照官方入门教程进行初始化项目,最后使用VS Code打开这个项目如下图:

本次教程的完整项目代码可以在这里下载:https://gitee.com/mxcadx/mxcad_docs/tree/master/examples3D/Test3dPipe.7z

代码编写及效果展示1. 添加绘制按钮
index.html文件中添加一个按钮,用于点击后绘制管道,如下图:

2. 编写绘制管道的函数
2.1本教程演示如何创建一个圆角方管,以下是在index.ts绘制圆角方管的函数代码,先导入需要用到的模块,代码如下:
  1. // 从mxcad中导入需要用到的模块
  2. import { MxCAD3DObject, MdGe, Mx3dAlgoFillet2d, Mx3dGeColor, Mx3dGeCSYSR, Mx3dGeDir, Mx3dGeMaterial, Mx3dGeomCircle,
  3. Mx3dGePlane, Mx3dGePoint, Mx3dMkFace, Mx3dMkPipe, Mx3dShapeDownCast, Mx3dShapeEdge,
  4. Mx3dShapeFace, Mx3dShapeWire, Mx3dWireTool } from "mxcad"
复制代码
2.2编写绘制管道的函数,代码如下:
  1.   function drawRoundRectPipe() {  
  2.      // 管道用到的颜色材质  
  3.     const grayColor = new Mx3dGeColor(MdGe.MxNameOfColor.Color_NOC_GRAY25);  
  4.     const mat = new Mx3dGeMaterial(MdGe.MxNameOfMaterial.Material_NOM_Steel);  
  5.      // 管道的路径,由直线和圆弧构成,必须C1连续。  
  6.     let wire: Mx3dShapeWire;  
  7.     {  
  8.       const pt1 = new Mx3dGePoint(0, 0, 0);  
  9.       const pt2 = new Mx3dGePoint(0, 0, 85);  
  10.        // 直线段  
  11.       const edge1 = new Mx3dShapeEdge(pt1, pt2);         
  12.       const filletCsysr1 = new Mx3dGeCSYSR(new Mx3dGePoint(15, 0, 85), new Mx3dGeDir(0, -1, 0), new Mx3dGeDir(0, 0, 1));  
  13.       const fillet1 = new Mx3dGeomCircle(filletCsysr1, 15);  
  14.        // 圆弧  
  15.       const edge2 = fillet1.Edge(0, Math.PI / 2);  
  16.       const pt3 = new Mx3dGePoint(15, 0, 100);  
  17.       const pt4 = new Mx3dGePoint(85, 0, 100);  
  18.        // 直线段  
  19.       const edge3 = new Mx3dShapeEdge(pt3, pt4);  
  20.       const filletCsysr2 = new Mx3dGeCSYSR(new Mx3dGePoint(85, 15, 100), new Mx3dGeDir(0, 0, 1), new Mx3dGeDir(0, -1, 0));  
  21.       const fillet2 = new Mx3dGeomCircle(filletCsysr2, 15);  
  22.        // 圆弧  
  23.       const edge4 = fillet2.Edge(0, Math.PI / 2);  
  24.       const pt5 = new Mx3dGePoint(100, 15, 100);  
  25.       const pt6 = new Mx3dGePoint(100, 85, 100);  
  26.        // 直线段  
  27.       const edge5 = new Mx3dShapeEdge(pt5, pt6);  
  28.       const filletCsysr3 = new Mx3dGeCSYSR(new Mx3dGePoint(100, 85, 115), new Mx3dGeDir(1, 0, 0), new Mx3dGeDir(0, 0, -1));  
  29.       const fillet3 = new Mx3dGeomCircle(filletCsysr3, 15);  
  30.        // 圆弧  
  31.       const edge6 = fillet3.Edge(0, Math.PI / 2);  
  32.       const pt7 = new Mx3dGePoint(100, 100, 115);  
  33.       const pt8 = new Mx3dGePoint(100, 100, 200);  
  34.        // 直线段  
  35.       const edge7 = new Mx3dShapeEdge(pt7, pt8);  
  36.       const shape = Mx3dWireTool.ConnectEdgesToWires([edge1, edge2, edge3, edge4, edge5, edge6, edge7], 1e-6, false)[0];  
  37.        // 得到最后连接组合而成的管道路径  
  38.       wire = Mx3dShapeDownCast.Wire(shape);  
  39.     }  
  40.      // 管道横截面形状,由一个内圆角方形和外圆角方形之间构成的区域  
  41.     let faceRoundRect:Mx3dShapeFace;  
  42.     {  
  43.       const pts: Mx3dGePoint[] = [];  
  44.       const pt1 = new Mx3dGePoint(0, 0, 0);  
  45.       const pt2 = new Mx3dGePoint(0, 10, 0);  
  46.       const pt3 = new Mx3dGePoint(10, 10, 0);  
  47.       const pt4 = new Mx3dGePoint(10, 0, 0);     
  48.       pts.push(pt2);  
  49.       pts.push(pt3);  
  50.       pts.push(pt4);  
  51.       pts.push(pt1);  
  52.        // 四条直线段构成正方形  
  53.       const edges: Mx3dShapeEdge[] = [];  
  54.       const edge1 = new Mx3dShapeEdge(pt1, pt2);  
  55.       const edge2 = new Mx3dShapeEdge(pt2, pt3);  
  56.       const edge3 = new Mx3dShapeEdge(pt3, pt4);  
  57.       const edge4 = new Mx3dShapeEdge(pt4, pt1);  
  58.       edges.push(edge1);  
  59.       edges.push(edge2);  
  60.       edges.push(edge3);  
  61.       edges.push(edge4);     
  62.        // 四条直线段,循环进行二维倒圆角,圆角放入arcs数组。  
  63.       const arcs: Mx3dShapeEdge[] = [];  
  64.       for(let i = 0; i < edges.length; i++)  
  65.       {  
  66.          // 矩形所在平面,默认构造就是在XOY平面(右手系)  
  67.         const pln = new Mx3dGePlane();  
  68.          // 二维倒圆角算法对象  
  69.         const f2d = new Mx3dAlgoFillet2d();  
  70.         if (i < edges.length - 1) {  
  71.            // 初始化时,传入两条要进行倒圆角的直线段,以及他们所在的平面(必须是在同一平面)  
  72.           f2d.Init(edges[i], edges[i + 1], pln);  
  73.            // 执行倒圆角算法,圆角半径为2  
  74.           f2d.Perform(2);  
  75.            // Result方法返回倒圆角算法在所在点执行倒圆角后的圆弧段,Result方法传入第一个参数是要执行倒圆角的点,因为我们当前是两个直线段倒圆角,所以就只有在这两个直线段的交点或延长后的交点倒圆角,只有这个一个交点,所以这里就传入这个交点,如果不是两直线段倒圆角,比如一个直线段和一个圆弧,他们就可能有两个交点,这时就要指定要返回哪个交点处倒圆角的结果了。第二个参数和第三个参数分别传入参与倒圆角的两条直线段,Result方法会将这两个参数修改为倒圆角之后改变过后的两条直线段。  
  76.           arcs.push(f2d.Result(pts[i], edges[i], edges[i + 1]));  
  77.         }  
  78.         else{  
  79.           f2d.Init(edges[i], edges[0], pln);  
  80.           f2d.Perform(2);  
  81.           arcs.push(f2d.Result(pts[i], edges[i], edges[0]));  
  82.         }  
  83.       }  
  84.        // 连接所有的直线段和圆弧  
  85.       const wireOuterShape = Mx3dWireTool.ConnectEdgesToWires([...edges, ...arcs], 1e-6, false)[0];  
  86.        // 外圈  
  87.       const wireOuter = Mx3dShapeDownCast.Wire(wireOuterShape);  
  88.        // 内圈  
  89.       const wireInner = wireOuter.Scaled(new Mx3dGePoint(5, 5, 0), 0.8);  
  90.        // 内圈方向要进行个反向  
  91.       wireInner.reverse();  
  92.        // 生成内外圈之间构成的环面  
  93.       const faceMaker = new Mx3dMkFace(wireOuter, true);  
  94.       faceMaker.Add(wireInner);  
  95.       faceRoundRect = faceMaker.Face();  
  96.        // 移动到中心位置和管道路径起点一致  
  97.       faceRoundRect.TranslateByVec(-5, -5, 0);  
  98.     }  
  99.    // 通过路径和截面生成管道形状  
  100.     const pipe = new Mx3dMkPipe(wire, faceRoundRect);  
  101.     const pipeShape = pipe.Shape();  
  102.    
  103.    // 给pipeShape设置材质颜色,放入模型文档并显示  
  104.     mxcad3d.removeAll();  
  105.     const doc = mxcad3d.getDocument();  
  106.     const pipeShapeLabel = doc.addShapeLabel();  
  107.     pipeShapeLabel.setShape(pipeShape);  
  108.     pipeShapeLabel.setMaterial(mat);  
  109.     pipeShapeLabel.setColor(grayColor);  
  110.     mxcad3d.update();  
  111. }
复制代码
2.3然后给绘制按钮添加点击事件,触发绘制管道函数的调用代码如下:
  1. // 给button添加点击事件,点击后调用drawRoundRectPipe函数,进行圆角方管的绘制
  2. // 立即执行函数
  3. (function addEventToButton(){  
  4.   const btn = document.querySelector("button");  
  5.   if (btn) {  
  6.     btn.addEventListener("click", () =>  {  
  7.       drawRoundRectPipe();  
  8.     });  
  9.   }  
  10. })()
复制代码
点击绘制管道按钮,效果如下图:

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-25 04:05 , Processed in 0.151092 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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