三维网格实体 (MeshEnt)
大约 3 分钟
三维网格实体 (MeshEnt)
MeshEnt 表示 CAD 中的三维网格实体,是所有 3D 实体类型的统一前端表示。
概述
MeshEnt 用于表示从 DWG 文件导入的三维实体,包括:
| DWG 实体类型 | sourceType | 说明 |
|---|---|---|
| AcDb3dSolid | 3DSOLID | 三维实体(长方体、圆柱体等) |
| AcDbRegion | REGION | 面域 |
| AcDbSurface 及派生类 | SURFACE | 曲面(拉伸面、旋转面等) |
| AcDbPolyFaceMesh | POLYFACE | 多面网格 |
| AcDbPolygonMesh | POLYMESH | 多边形网格 |
| AcDbFace / AcDb3dFace | 3DFACE | 三维面 |
所有 3D 实体在导入时统一转换为三角网格(顶点 + 三角面索引),以线框形式渲染。完整的 3D 坐标数据(含 Z 值)被保留,以支持未来的三维查看插件。
构造函数
import { MeshEnt } from 'vjcad';
const mesh = new MeshEnt();通常 MeshEnt 不需要手动创建,它由 DWG 文件导入时自动生成。如需手动创建:
import { MeshEnt, DbMesh } from 'vjcad';
const mesh = new MeshEnt();
mesh.fromDb({
type: "MESH",
sourceType: "3DSOLID",
vertices: [0,0,0, 100,0,0, 100,100,0, 0,100,0, 50,50,80],
indices: [0,1,4, 1,2,4, 2,3,4, 3,0,4, 0,1,2, 0,2,3],
color: 5
} as DbMesh);
mesh.setDefaults();属性
| 属性 | 类型 | 说明 |
|---|---|---|
sourceType | string | 原始 DWG 实体类型(只读) |
vertexCount | number | 顶点数量(只读) |
triangleCount | number | 三角面数量(只读) |
vertices | Float64Array | 顶点数据,扁平化 [x,y,z, x,y,z, ...](只读) |
indices | Uint32Array | 三角面索引,扁平化 [i,i,i, ...](只读) |
方法
| 方法 | 说明 |
|---|---|
fromDb(dbData) | 从数据库对象加载 |
toDb() | 序列化为数据库对象 |
boundingBox() | 获取二维投影的边界框 |
getProjectedEdges() | 获取投影后的可见边线(用于渲染) |
move(from, to) | 移动(支持三维偏移) |
rotate(center, angle) | 绕点旋转 |
scale(center, factor) | 缩放 |
mirror(start, end) | 镜像 |
stretch(from, to, box) | 拉伸 |
clone() | 克隆 |
getPoints() | 获取所有顶点(Point2D 数组,含 Z) |
渲染模式
当前 MeshEnt 以 线框模式 渲染:
- 轮廓边(仅被一个三角面引用的边)始终绘制
- 内部边(被两个三角面共享的边)仅在标记为可见时绘制
- 3D 坐标投影到 XY 平面显示
导出还原
导出为 DWG 时,按 sourceType 尝试还原为原始实体类型:
| sourceType | 导出目标 | 还原程度 |
|---|---|---|
3DFACE | OdDbFace | 精确还原 |
POLYFACE | OdDbPolyFaceMesh | 精确还原 |
POLYMESH | OdDbPolygonMesh(需要 meshSize) | 精确/近似 |
REGION / SURFACE / 3DSOLID | 多个 OdDbFace 组 | 降级还原 |
提示
REGION、SURFACE、3DSOLID 类型由于原始参数化数据(ACIS/SAT)丢失,导出时降级为三维面组合。这是预期行为。
示例
创建立方体网格
import { Engine, MeshEnt } from 'vjcad';
const vertices = [
0,0,0, 100,0,0, 100,100,0, 0,100,0,
0,0,100, 100,0,100, 100,100,100, 0,100,100
];
const indices = [
0,1,2, 0,2,3, // bottom
4,6,5, 4,7,6, // top
0,1,5, 0,5,4, // front
2,3,7, 2,7,6, // back
0,3,7, 0,7,4, // left
1,2,6, 1,6,5 // right
];
const cube = new MeshEnt();
cube.fromDb({
type: "MESH",
sourceType: "3DSOLID",
vertices,
indices,
color: 5
});
cube.setDefaults();
Engine.addEntities(cube);
Engine.zoomExtents();在线示例
| 示例 | 描述 | 链接 |
|---|---|---|
| 创建三维网格 | MeshEnt 基本创建示例(立方体、金字塔、地形) | 在线演示{target="_blank"} |