> 技术文档 > OCCT TopTools_Array1OfListOfShape 详解

OCCT TopTools_Array1OfListOfShape 详解


1. 代码逐行分析

  • #include :

    • 这行代码引入了 TopTools_ListOfShape 的定义。根据 OCCT 的命名规范,这本身也是一个 typedef,通常指向 NCollection_List
    • 核心理解: TopTools_ListOfShape 是一个形状的链表。你可以把它想象成一个可以动态增长或缩小的列表,里面存放着一个个的 TopoDS_Shape(OCCT 中表示任何拓扑实体,如点、边、面、实体等的通用类)。
  • #include :

    • 这行代码引入了 NCollection_Array1 的定义。这是 OCCT 自己的一个模板类。
    • 核心理解: NCollection_Array1 是一个一维数组。它有以下几个关键特点:
      • 固定大小: 在创建时需要指定大小,之后大小不能改变。
      • 从1开始索引: 与 C++ 标准数组(从0开始)不同,OCCT 的集合类通常是从索引 1 开始的,这在一些工程计算领域更符合直觉。
      • 类型安全: 它是一个模板,可以存放任何指定类型的元素。
  • typedef NCollection_Array1 TopTools_Array1OfListOfShape;:

    • 这是整个文件的核心。它定义了一个新的类型别名 (Type Alias)
    • 它没有创建新的类或新的数据结构,只是给一个已经存在的、复杂的模板实例化类型起了一个更简单、更具描述性的名字。
    • 分解来看:
      • NCollection_Array1: 外层结构是一个固定大小的数组
      • : 数组中每个元素的类型是 TopTools_ListOfShape,也就是一个形状的链表
      • TopTools_Array1OfListOfShape: 这就是我们给这个“数组的链表”起的新名字。

2. 对数据结构的整体理解

TopTools_Array1OfListOfShape 本质上是一个 “形状链表的数组”

为了更好地理解,我们可以用一个现实生活中的例子来比喻:

想象一个文件柜(Array1),这个文件柜有固定数量的抽屉(数组的元素),比如说有 10 个抽屉,编号从 1 到 10。

  • 你不能增加或减少抽屉的数量(固定大小)。
  • 每个抽屉(数组中的一个元素)里面,存放的不是单个文件,而是一个文件袋(ListOfShape)
  • 每个文件袋里可以放任意数量的文件(TopoDS_Shape),你可以随时往里面添加文件或取出文件(链表的动态大小)。

所以,TopTools_Array1OfListOfShape 的结构是这样的:

[ // Array (e.g., size 4) (ListOfShape_1) -> Shape1 -> Shape2 -> ... -> null , // Index 1: A list of shapes (ListOfShape_2) -> ShapeA -> ShapeB -> ... -> null , // Index 2: Another list of shapes (ListOfShape_3) -> (empty list)  , // Index 3: An empty list (ListOfShape_4) -> ShapeX -> null  // Index 4: A list with one shape]

3. 应用场景和设计哲学

这个数据结构为什么存在?它在三维建模中有什么用?

这种“数组的列表”结构在需要对一组对象进行分类存储时非常有用。外层的数组通常用作分类的索引,而内层的列表则用来存储属于该分类的所有成员

典型应用场景:

假设你正在分析一个复杂的三维模型,你想找出模型中所有的面(Face),并将每个面上的所有**边(Edge)**进行归类。

  1. 第一步:获取所有面。假设模型有 N 个面。
  2. 第二步:创建数据结构。你可以创建一个大小为 NTopTools_Array1OfListOfShape
    // 伪代码TopTools_Array1OfListOfShape edgesOnFaces(1, N); // 创建一个大小为N的数组,索引从1到N

    现在,edgesOnFaces 的第 i 个元素(一个空的 ListOfShape)将用来存放第 i 个面上的所有边。

  3. 第三步:填充数据。你遍历模型中的每一个面(从面1到面N):
    • 对于第 i 个面,你找到构成它边界的所有边。
    • 将找到的每一条边,都添加到 edgesOnFaces.ChangeValue(i) 这个链表中。
    // 伪代码for (int i = 1; i <= N; ++i) { TopoDS_Face currentFace = ...; // 获取第i个面 // 遍历这个面上的所有边 for (const auto& edge : EdgesOnFace(currentFace)) { edgesOnFaces.ChangeValue(i).Append(edge); }}
  4. 完成。现在,edgesOnFaces 这个数据结构清晰地存储了“哪个面上有哪些边”的对应关系。edgesOnFaces.Value(5) 将会返回一个包含第5个面上所有边的链表。

总结

TopTools_Array1OfListOfShape 是一个为了方便开发者而预定义的复合数据结构。它代表一个固定大小的、以1为起始索引的数组,其每个元素本身是一个可以动态增删元素的形状链表。它在需要对拓扑形状进行分组、归类或建立索引映射关系的场景下非常高效和实用。