如何在网页3D CAD中创建一个三维管道模型
yund56 2025-05-12 16:43 17 浏览
前言
在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。
安装
在此之前,需要先安装mxcad包,安装的步骤可以查看梦想CAD官方的入门教程,如下图:
本次教程我们新建一个Test3dPipe目录,然后在此目录中按照官方入门教程进行初始化项目,最后使用VS Code打开这个项目,如下图:
代码编写及效果展示
1. 添加绘制按钮
在index.html文件中添加一个按钮,用于点击后绘制管道,如下图:
2. 编写绘制管道的函数
2.1本教程演示如何创建一个圆角方管,以下是在index.ts绘制圆角方管的函数代码,先导入需要用到的模块,代码如下:
// 从mxcad中导入需要用到的模块
import { MxCAD3DObject, MdGe, Mx3dAlgoFillet2d, Mx3dGeColor, Mx3dGeCSYSR, Mx3dGeDir, Mx3dGeMaterial, Mx3dGeomCircle,
Mx3dGePlane, Mx3dGePoint, Mx3dMkFace, Mx3dMkPipe, Mx3dShapeDownCast, Mx3dShapeEdge,
Mx3dShapeFace, Mx3dShapeWire, Mx3dWireTool } from "mxcad"
2.2编写绘制管道的函数,代码如下:
function drawRoundRectPipe() {
// 管道用到的颜色材质
const grayColor = new Mx3dGeColor(MdGe.MxNameOfColor.Color_NOC_GRAY25);
const mat = new Mx3dGeMaterial(MdGe.MxNameOfMaterial.Material_NOM_Steel);
// 管道的路径,由直线和圆弧构成,必须C1连续。
let wire: Mx3dShapeWire;
{
const pt1 = new Mx3dGePoint(0, 0, 0);
const pt2 = new Mx3dGePoint(0, 0, 85);
// 直线段
const edge1 = new Mx3dShapeEdge(pt1, pt2);
const filletCsysr1 = new Mx3dGeCSYSR(new Mx3dGePoint(15, 0, 85), new Mx3dGeDir(0, -1, 0), new Mx3dGeDir(0, 0, 1));
const fillet1 = new Mx3dGeomCircle(filletCsysr1, 15);
// 圆弧
const edge2 = fillet1.Edge(0, Math.PI / 2);
const pt3 = new Mx3dGePoint(15, 0, 100);
const pt4 = new Mx3dGePoint(85, 0, 100);
// 直线段
const edge3 = new Mx3dShapeEdge(pt3, pt4);
const filletCsysr2 = new Mx3dGeCSYSR(new Mx3dGePoint(85, 15, 100), new Mx3dGeDir(0, 0, 1), new Mx3dGeDir(0, -1, 0));
const fillet2 = new Mx3dGeomCircle(filletCsysr2, 15);
// 圆弧
const edge4 = fillet2.Edge(0, Math.PI / 2);
const pt5 = new Mx3dGePoint(100, 15, 100);
const pt6 = new Mx3dGePoint(100, 85, 100);
// 直线段
const edge5 = new Mx3dShapeEdge(pt5, pt6);
const filletCsysr3 = new Mx3dGeCSYSR(new Mx3dGePoint(100, 85, 115), new Mx3dGeDir(1, 0, 0), new Mx3dGeDir(0, 0, -1));
const fillet3 = new Mx3dGeomCircle(filletCsysr3, 15);
// 圆弧
const edge6 = fillet3.Edge(0, Math.PI / 2);
const pt7 = new Mx3dGePoint(100, 100, 115);
const pt8 = new Mx3dGePoint(100, 100, 200);
// 直线段
const edge7 = new Mx3dShapeEdge(pt7, pt8);
const shape = Mx3dWireTool.ConnectEdgesToWires([edge1, edge2, edge3, edge4, edge5, edge6, edge7], 1e-6, false)[0];
// 得到最后连接组合而成的管道路径
wire = Mx3dShapeDownCast.Wire(shape);
}
// 管道横截面形状,由一个内圆角方形和外圆角方形之间构成的区域
let faceRoundRect:Mx3dShapeFace;
{
const pts: Mx3dGePoint[] = [];
const pt1 = new Mx3dGePoint(0, 0, 0);
const pt2 = new Mx3dGePoint(0, 10, 0);
const pt3 = new Mx3dGePoint(10, 10, 0);
const pt4 = new Mx3dGePoint(10, 0, 0);
pts.push(pt2);
pts.push(pt3);
pts.push(pt4);
pts.push(pt1);
// 四条直线段构成正方形
const edges: Mx3dShapeEdge[] = [];
const edge1 = new Mx3dShapeEdge(pt1, pt2);
const edge2 = new Mx3dShapeEdge(pt2, pt3);
const edge3 = new Mx3dShapeEdge(pt3, pt4);
const edge4 = new Mx3dShapeEdge(pt4, pt1);
edges.push(edge1);
edges.push(edge2);
edges.push(edge3);
edges.push(edge4);
// 四条直线段,循环进行二维倒圆角,圆角放入arcs数组。
const arcs: Mx3dShapeEdge[] = [];
for(let i = 0; i < edges.length; i++)
{
// 矩形所在平面,默认构造就是在XOY平面(右手系)
const pln = new Mx3dGePlane();
// 二维倒圆角算法对象
const f2d = new Mx3dAlgoFillet2d();
if (i < edges.length - 1) {
// 初始化时,传入两条要进行倒圆角的直线段,以及他们所在的平面(必须是在同一平面)
f2d.Init(edges[i], edges[i + 1], pln);
// 执行倒圆角算法,圆角半径为2
f2d.Perform(2);
// Result方法返回倒圆角算法在所在点执行倒圆角后的圆弧段,Result方法传入第一个参数是要执行倒圆角的点,因为我们当前是两个直线段倒圆角,所以就只有在这两个直线段的交点或延长后的交点倒圆角,只有这个一个交点,所以这里就传入这个交点,如果不是两直线段倒圆角,比如一个直线段和一个圆弧,他们就可能有两个交点,这时就要指定要返回哪个交点处倒圆角的结果了。第二个参数和第三个参数分别传入参与倒圆角的两条直线段,Result方法会将这两个参数修改为倒圆角之后改变过后的两条直线段。
arcs.push(f2d.Result(pts[i], edges[i], edges[i + 1]));
}
else{
f2d.Init(edges[i], edges[0], pln);
f2d.Perform(2);
arcs.push(f2d.Result(pts[i], edges[i], edges[0]));
}
}
// 连接所有的直线段和圆弧
const wireOuterShape = Mx3dWireTool.ConnectEdgesToWires([...edges, ...arcs], 1e-6, false)[0];
// 外圈
const wireOuter = Mx3dShapeDownCast.Wire(wireOuterShape);
// 内圈
const wireInner = wireOuter.Scaled(new Mx3dGePoint(5, 5, 0), 0.8);
// 内圈方向要进行个反向
wireInner.reverse();
// 生成内外圈之间构成的环面
const faceMaker = new Mx3dMkFace(wireOuter, true);
faceMaker.Add(wireInner);
faceRoundRect = faceMaker.Face();
// 移动到中心位置和管道路径起点一致
faceRoundRect.TranslateByVec(-5, -5, 0);
}
// 通过路径和截面生成管道形状
const pipe = new Mx3dMkPipe(wire, faceRoundRect);
const pipeShape = pipe.Shape();
// 给pipeShape设置材质颜色,放入模型文档并显示
mxcad3d.removeAll();
const doc = mxcad3d.getDocument();
const pipeShapeLabel = doc.addShapeLabel();
pipeShapeLabel.setShape(pipeShape);
pipeShapeLabel.setMaterial(mat);
pipeShapeLabel.setColor(grayColor);
mxcad3d.update();
}
2.3然后给绘制按钮添加点击事件,触发绘制管道函数的调用,代码如下:
// 给button添加点击事件,点击后调用drawRoundRectPipe函数,进行圆角方管的绘制
// 立即执行函数
(function addEventToButton(){
const btn = document.querySelector("button");
if (btn) {
btn.addEventListener("click", () => {
drawRoundRectPipe();
});
}
})()
点击绘制管道按钮,效果如下图:
公Z号:梦想云图网页CAD。
相关推荐
- 今日起,办理游戏版号这么做就行了!真的太方便了
-
在“大众创业,万众创新”的浪潮下,我国很多创业者也看到了游戏的前景,准备在游戏行业分一杯羹。 但根据国家新闻出版广电总局颁布的《关于移动游戏出版服务管理的通知》,游戏需要通过国家新闻出版广电总局...
- 给大家推荐些好的c语言代码的网站
-
C语言,那就来推荐几个吧,部分含有C++:1、TheLinuxKernelArchives(kernel.org)Linux内核源码,仅限于C,但内核庞大,不太适合新手;2、redis(redi...
- 手游平台没有源码的三大危害
-
搭建一款属于自己的手游平台可以直接和游戏研发商对接游戏,既减少中介的差价,还能根据自己需求去选择游戏。对于玩家而言,手游平台给予了玩家更多的选择机会,对于运营者而言,借助平台可以更好地服务玩家,通过对...
- 游戏源代码开发时需要什么,需要哪些团队成员?
-
游戏由于她轻松娱乐,对战刺激,寓教于乐等特点,吸引住了一大批不一样年龄阶段的用户,例如喜爱竞技游戏的年轻群体,需要益智游戏的儿童等。游戏源代码是游戏构建的基础,尽管将开发时分成开发软件和游戏开发2个概...
- 育碧经典游戏《孤岛惊魂1》源代码遭泄露,玩家表示可以运行
-
IT之家7月3日消息,一份名为“FarCry1.34Complete”的游戏源代码已经出现在了互联网档案网站“Archive.org”上,并且在Reddit论坛和各种社交媒体上得到...
- 神秘网站倒数结束 令人一头雾水
-
还记得那个疑似小岛秀夫作品的《黑色猎犬》倒计时网站吗?现在该网站已经停止倒计时,仅剩一段话“这里原来有一个倒计时,现在没了”……点击这句话会跳转到国外网站Funhaus的一个莫名其妙的视频,然而评论的...
- LOL源代码娜美免费领取地址 LOL源代码娜美领取活动网址分享
-
[海峡网]在英雄联盟中近日国服的服务器一直不稳定,繁出现卡顿和功能错误等问题,官方现在正在努力维护,为表歉意将免费赠送给玩家一款“源代码·娜美”的皮肤,那么这个皮肤要怎么领取呢,小编相信小伙伴们一定都...
- 个人网站集成js小游戏《圈小猫》教程及源码
-
今天在某网站浏览帖子的时候,发现帖子被删除了,然后弹出了404页面,页面上集成了一个小游戏,小游戏长什么样子呢?看下面这个图!第一步查看小游戏源码,发现这个小游戏完全是由JavaScript编写的,因...
- Scratch创意编程-数学问答游戏
-
项目名称:数学问答游戏目标年龄群体:8-12岁项目简介:在这个Scratch创意编程项目中,学生们将扮演数学家,通过解答数学题目来挑战自己的数学技能。游戏中包含了加法、减法、乘法和除法等基本算术题,以...
- 少时不努力长大程序猿 酷比魔方AI百变编程套件体验测评
-
本文产品为厂家送测,坚持独立的评价观点是笔者创作的基本底线,绝不会因商品来源不同而有所偏颇,请各位放心。写在开始讲讲今天男主的故事这篇体验到的目标群体是跟我一样,家中有个在上小学二年级的小学生。首先...
- 孩子的scratch作品只能演示?教你把它三步变为电脑软件
-
随着少儿编程的发展,越来越多的家长和孩子开始投身其中。对于初学者来说,最好的编程工具就是Scratch,它是麻省理工学院的“终身幼儿园团队”开发的图形化编程工具,主要面对青少年开放。这是对孩子最好的编...
- 打地鼠小游戏制作教程
-
打地鼠这个小游戏貌似比我的年龄都要大,这次我们使用scratch3.0图形化编程软件来制作一款我们自己的“打地鼠”。我们先准备4样角色,分别是:地鼠角色、锤子角色、地洞角色、草地角色。地鼠→使用猫...
- Scratch2.0接苹果小游戏讲义整理
-
Scratch2.0接苹果小游戏概貌见动图:这又是一款经典的Scratch小游戏,是孩子们学习Scratch编程软件的良好载体,不容错过。(一)玩法说明接到慢速的红苹果一个加1分;接到中速的红苹果一个...
- 少儿编程太难?原来可以闯关玩游戏啊
-
随着编程学习全球化的趋势,国内编程学习热潮日盛,越来越多的家长开始让孩子接触学习编程。然而我们都不了解这个少儿编程是到底是什么,近年来,许多家长开始给小孩报编程学习班。最小的从幼儿园开始就在学习...
- 如何在Scratch中创建一个两人赛艇游戏
-
本分步指南将教您如何使用Scratch程序创建划船游戏。完成对这个简单游戏的编程后,两条船将使用按键命令一起竞赛。步骤1.打开Scratch。2.删除名为“Sprite1”的猫。您可以通过右键单击它...
- 一周热门
- 最近发表
- 标签列表
-
- filter函数js (37)
- filter函数excel用不了 (73)
- 商城开发 (40)
- 影视网站免费源码最新版 (57)
- 影视资源api接口 (46)
- 网站留言板代码大全 (56)
- java版软件下载 (52)
- java教材电子课本下载 (48)
- 0基础编程从什么开始学 (50)
- java是用来干嘛的 (51)
- it入门应该学什么 (55)
- java线上课程 (55)
- 学java的软件叫什么软件 (38)
- 程序开发软件有哪些 (53)
- 软件培训 (59)
- 机器人编程代码大全 (50)
- 少儿编程教程免费 (45)
- 新代系统编程教学 (61)
- 共创世界编程网站 (38)
- 亲测源码 (36)
- 三角函数积分公式表 (35)
- 函数的表示方法 (34)
- 表格乘法的公式怎么设置 (34)
- sumif函数的例子 (34)
- 图片素材 (36)