opencascade.js中拓扑数据的遍历
基本概念
在OCCT中,主要有两种数据,一种是Geometry几何数据,一种是Topology拓扑数据。
Topology拓扑数据是抽象类型可以总结为以下几种: -
Vertex 点 0维 - Edge 边 - Wire
由顶点相连的边组成的序列 - Face plane2D平面
或者 surface 3D表(曲)面
上由Wire所围成的一块区域 - Shell
由一组通过边连接的面组成的Wire boundaries线框 -
Solid 由Shell包围的3D空间的一部分 -
Compound Solid Solid的集合
Wire 和 Solid
可以闭合也可以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()