opencascade.js中拓扑数据的遍历

基本概念

在OCCT中,主要有两种数据,一种是Geometry几何数据,一种是Topology拓扑数据。

Topology拓扑数据是抽象类型可以总结为以下几种: - Vertex 点 0维 - Edge 边 - Wire 由顶点相连的边组成的序列 - Face plane2D平面 或者 surface 3D表(曲)面 上由Wire所围成的一块区域 - Shell 由一组通过边连接的面组成的Wire boundaries线框 - SolidShell包围的3D空间的一部分 - Compound Solid Solid的集合

WireSolid 可以闭合也可以infinity不闭合

对应到OCCT中的类型有,即TopAbs_ShapeEnum的枚举值有: - COMPOUND: 一组任意类型的拓扑数据 - COMPSOLID: Compound Solid - SOLID: Solid - SHELL: Shell - FACE: Face - WIRE: Wire - EDGE Edge - VERTEX: Vertex - SHPAE: TopoDS_Shape是所有类型的基类

遍历方法

通常的遍历方法是通过TopExp_Explorer
例如遍历一个面的所有边

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// oc 是已经加载的 OpenCascadeInstance 实例
// face 是 TopoDS_Face 类

// explorer 是一个迭代器
const explorer = new oc.TopExp_Explorer_2(face, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE)
while (explorer.More()) {
// 通过explorer.Current() 拿到当前只向的TopoDS_Shape
// 由于OCCT基于C++编写,是强类型的,所以需要通过下面的方法声明为TopoDS_Edge类型
const edge = oc.TopoDS.Edge_1(explorer.Current())
// 后续操作
// ...
// 后续操作
}

不过这样的遍历并不保证顺序,即遍历得到的边不保证是首尾相连的
如果需要按照顺序遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// oc 是已经加载的 OpenCascadeInstance 实例
// face 是 TopoDS_Face 类

// explorer 是一个迭代器
// 使用 BRepTools_WireExplorer 替代 TopExp_Explorer 遍历Face/Wire的Edge可以保证顺序
const explorer = new OcctInstance.oc.BRepTools_WireExplorer_3(outerWire, face)
while (explorer.More()) {
// 通过explorer.Current() 拿到当前只向的TopoDS_Shape
// 由于OCCT基于C++编写,是强类型的,所以需要通过下面的方法声明为TopoDS_Edge类型
const edge = oc.TopoDS.Edge_1(explorer.Current())
// 后续操作
// ...
// 后续操作
}

最佳实践

opencascade.js中,创建的OCCT对象不会被JavaScript的垃圾回收机制自动清理,需要手动调用delete方法删除内存占用。因此,应该尽可能少地创建对象 例如,需要遍历face1 和 face2 的边,可以这样

1
2
3
4
5
6
7
8
9
10
11
12
13
// 在某处创建迭代器
const explorer = new oc.TopExp_Explorer_1()
for (explorer.Init(face1, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE); explorer.More(); explorer.Next()) {
// ...
}

for (explorer.Init(face2, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE); explorer.More(); explorer.Next()) {
// ...
}

// 销毁迭代器
explorer.delete()