明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 504|回复: 0

在线三维CAD中创建三维建筑墙体

[复制链接]
发表于 2024-10-9 14:42:11 | 显示全部楼层 |阅读模式
一、前言
1.本文将介绍如何使用mxcad3d来创建建筑墙体模型。该工具提供了丰富的三维建模功能和便捷的API,首先通过npm包管理器来新建测试项目并引入mxcad包,所以需要先安装Node.js,里面自带了npm包管理器 以及包含在npm包管理器中的npx工具 (用于启动运行我们的测试项目),Node.js下载和安装教程
更多详细的教程Z号:梦想云图网页CAD
二、新建测试项目
1.在合适的位置创建本次教程的测试项目文件夹Test3dWall ,并在Test3dWall 文件夹中打开cmd命令行工具 ,依次输入以下指令来初始化项目并引入mxcad包。新建项目的方法也可以在官方的快速入门文档中找到,依次输入以下操作命令,如下图:
npm init -y
npm install vite -D
npm install mxcad@latest

2. 使用VS CODE打开新建的测试项目文件夹(VS CODE是一款好用的集成开发工具,如何安装这里不再赘述,下载地址:https://code.visualstudio.com/Download

3.打开项目后,在项目目录下新建一个index.html文件以及一个src目录,然后在src目录下新建一个index.ts文件 并编写最基本的代码:
index.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>vite use mxcad</title>
  8. </head>
  9. <body>
  10.     <div style="height: 800px; overflow: hidden;"> <canvas id="myCanvas"></canvas></div>
  11.     <script type="module" src="./src/index.ts"></script>
  12. </body>
  13. </html>
复制代码
src/index.ts
  1. import { MxCAD3DObject } from "mxcad"
  2. // 创建mxcad3d对象
  3. const mxcad3d = new MxCAD3DObject()
  4. // 初始化mxcad3d对象
  5. mxcad3d.create({
  6.     // canvas元素的css选择器字符串(示例中是id选择器),或canvas元素对象
  7.     canvas: "#myCanvas",
  8.     // 获取加载wasm相关文件(wasm/js/worker.js)路径位置
  9.     locateFile: (fileName)=> new URL(`/node_modules/mxcad/dist/wasm/3d/${fileName}`, import.meta.url).href,
  10. })
  11. // 初始化完成
  12. mxcad3d.on("init", ()=>{
  13.     console.log("初始化完成");
  14. });
复制代码

三、运行测试
1.新建终端
2.开启服务
3.打开网页,查看效果

四、编写绘制建筑墙体的代码
1.墙体的二维平面设计图
2.index.html中添加一个按钮(以下是index.html完整代码)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>vite use mxcad</title>
  8. </head>
  9. <body>
  10.     <div style="height: 800px; overflow: hidden;"> <canvas id="myCanvas"></canvas></div>
  11.     <script type="module" src="./src/index.ts"></script>
  12.     <button>绘制建筑墙体</button>
  13. </body>
  14. </html>
复制代码
3.src/index.ts中添加绘制墙体的代码,给按钮添加点击事件来触发绘制墙体的代码执行以下是src/index.ts完整代码
  1. import { MxCAD3DObject, Mx3dGePoint, Mx3dMkPolygon, Mx3dMkFace, Mx3dMkPrism, Mx3dGeVec, Mx3dGeColor, MdGe } from "mxcad"   
  2. // 创建mxcad3d对象  
  3. const mxcad3d = new MxCAD3DObject()   
  4. // 初始化mxcad3d对象  
  5. mxcad3d.create({  
  6.     // canvas元素的css选择器字符串(示例中是id选择器),或canvas元素对象  
  7.     canvas: "#myCanvas",  
  8.     // 获取加载wasm相关文件(wasm/js/worker.js)路径位置  
  9.     locateFile: (fileName)=> new URL(`/node_modules/mxcad/dist/wasm/3d/${fileName}`, import.meta.url).href,  
  10. })   
  11. // 初始化完成  
  12. mxcad3d.on("init", ()=>{  
  13.     console.log("初始化完成");  
  14. });  
  15. function funDrawWall(){  
  16.   // 外墙轮廓  
  17.   const wallOutterPts: Mx3dGePoint[] = [];  
  18.   wallOutterPts.push(new Mx3dGePoint(0, 0, 0));  
  19.   wallOutterPts.push(new Mx3dGePoint(0, 4480, 0));  
  20.   wallOutterPts.push(new Mx3dGePoint(5480, 4480, 0));  
  21.   wallOutterPts.push(new Mx3dGePoint(5480, 0, 0));  
  22.   const wallOutterPolygon = new Mx3dMkPolygon();  
  23.   wallOutterPts.forEach((pt) => {  
  24.     wallOutterPolygon.Add(pt);  
  25.   });  
  26.   wallOutterPolygon.Close();  
  27.   const wallOutterWire = wallOutterPolygon.Wire();  
  28.   const wallOutterMkFace = new Mx3dMkFace(wallOutterWire);  
  29.   const wallOutterFace = wallOutterMkFace.Face();   
  30.   // 内墙轮廓  
  31.   const wallInnerPts: Mx3dGePoint[] = [];  
  32.   wallInnerPts.push(new Mx3dGePoint(240, 240, 0));  
  33.   wallInnerPts.push(new Mx3dGePoint(240, 4240, 0));  
  34.   wallInnerPts.push(new Mx3dGePoint(5240, 4240, 0));  
  35.   wallInnerPts.push(new Mx3dGePoint(5240, 240, 0));  
  36.   const wallInnerPolygon = new Mx3dMkPolygon();  
  37.   wallInnerPts.forEach((pt) => {  
  38.     wallInnerPolygon.Add(pt);  
  39.   });  
  40.   wallInnerPolygon.Close();  
  41.   const wallInnerWire = wallInnerPolygon.Wire();  
  42.   const wallInnerMkFace = new Mx3dMkFace(wallInnerWire);  
  43.   const wallInnerFace = wallInnerMkFace.Face();   
  44.   // 墙体截面  
  45.   const wallFace = wallOutterFace.cut(wallInnerFace);  
  46.   // 拉伸墙体  
  47.   const wallMkPrism = new Mx3dMkPrism(wallFace, new Mx3dGeVec(0, 0, 3000));  
  48.   let wall = wallMkPrism.Shape();  
  49.   // 开窗洞  
  50.   const winPts: Mx3dGePoint[] = [];  
  51.   winPts.push(new Mx3dGePoint(1990, 4240, 1000));  
  52.   winPts.push(new Mx3dGePoint(1990, 4240, 2200));  
  53.   winPts.push(new Mx3dGePoint(3490, 4240, 2200));  
  54.   winPts.push(new Mx3dGePoint(3490, 4240, 1000));  
  55.   const winPolygon = new Mx3dMkPolygon();  
  56.   winPts.forEach((pt) => {  
  57.     winPolygon.Add(pt);  
  58.   });  
  59.   winPolygon.Close();  
  60.   const winWire = winPolygon.Wire();  
  61.   const winMkFace = new Mx3dMkFace(winWire);  
  62.   const winFace = winMkFace.Face();  
  63.   const winMkPrism = new Mx3dMkPrism(winFace, new Mx3dGeVec(0, 240, 0));  
  64.   const win = winMkPrism.Shape();   
  65.   // 开门洞  
  66.   const doorPts: Mx3dGePoint[] = [];  
  67.   doorPts.push(new Mx3dGePoint(5240, 1160, 0));  
  68.   doorPts.push(new Mx3dGePoint(5240, 1160, 2000));  
  69.   doorPts.push(new Mx3dGePoint(5240, 360, 2000));  
  70.   doorPts.push(new Mx3dGePoint(5240, 360, 0));  
  71.   const doorPolygon = new Mx3dMkPolygon();  
  72.   doorPts.forEach((pt) => {  
  73.     doorPolygon.Add(pt);  
  74.   });  
  75.   doorPolygon.Close();  
  76.   const doorWire = doorPolygon.Wire();  
  77.   const doorMkFace = new Mx3dMkFace(doorWire);  
  78.   const doorFace = doorMkFace.Face();  
  79.   const doorMkPrism = new Mx3dMkPrism(doorFace, new Mx3dGeVec(240, 0, 0));  
  80.   const door = doorMkPrism.Shape();   
  81.   wall = wall.cut(win).cut(door);  
  82.   // 准备一个棕色  
  83.   const brownColor = new Mx3dGeColor(MdGe.MxNameOfColor.Color_NOC_BROWN);  
  84.   // 先清除视图中的模型  
  85.   mxcad3d.removeAll();  
  86.   // 获取视图文档  
  87.   const doc = mxcad3d.getDocument();  
  88.   // 文档中创建一个标签用于存储墙体形状  
  89.   const wallLabel = doc.addShapeLabel();  
  90.   // 墙体形状放入文档标签中  
  91.   wallLabel.setShape(wall);  
  92.   // 给墙体设置为棕色  
  93.   wallLabel.setColor(brownColor);  
  94.   // 更新显示视图  
  95.   mxcad3d.update();  
  96. }  
  97. // 给button添加点击事件,点击后调用drawRoundRectPipe函数,进行圆角方管的绘制  
  98. // 立即执行函数  
  99. (function addEventToButton(){  
  100.   const btn = document.querySelector("button");  
  101.   if (btn) {  
  102.     btn.addEventListener("click", () => {  
  103.       funDrawWall();  
  104.     });  
  105.   }  
  106. })()
复制代码
4. 重新查看运行效果
5. 本次教程最后完成的完整测试项目压缩包下载地址为:https://gitee.com/mxcadx/mxcad_docs/tree/master/examples3D/Test3dWall.7z
压缩包下载解压后需要在项目目录下打开cmd命令行,然后在命令行中执行npm install来安装依赖,然后再按照本教程中的方式来运行项目查看效果。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-22 19:32 , Processed in 0.179422 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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