OpenCascade形状遍历

在 Open CASCADE 中,有不同的 API 可用于探索给定的形状(shape)。还有一些其他技术是探索形状的基础。在本文中,你将了解我尝试探索形状的不同技术和 API。那么,让我们开始旅程吧。

在本文中,我们将探索 6 个 API。

  • TopExp_Explorer
  • TopOpeBRepTool_ShapeExplorer
  • ️TopoDS_Iterator
  • ️TopTools_IndexedMapOfShape
  • ️TopTools_IndexedDataMapOfShapeListOfShape
  • ️ShapeAnalysis_ShapeContents

1、TopExp_Explorer

这是探索形状最著名的方法。你可能在阅读本文之前就听说过这个 API 😀。

在这里,形状是从上到下的层次结构进行探索的。因此,给定形状中的所有子形状都将通过探索进行计数。

示例:如果你想探索特定形状的所有边,则可以按如下方式定义:

在探索形状的边缘之前,它会先查看“面”级别。在这里,它会逐个面进行探索,并探索每个面的边。由于采用这种方法,公共边将被多次计算。

基于此,上述形状的边数将为 24。

你可能不会使用此 API 中的 ToAvoid参数。此参数的用途是避免在探索形状时考虑形状类型:

在上面的例子中,你将获得所有不属于面的边。这意味着形状的自由边。

如果你想要计算给定类型的子形状的数量,只需在 for 循环外部定义一个整数,并在探索过程中逐个递增即可。

2、TopOpeBRepTool_ShapeExplorer

下一种方法是使用 TopOpeBRepTool_ShapeExplorer 而不是 TopExp_Explorer,并在其中使用 Index函数。

3、TopoDS_Iterator

TopoDS_Iterator 用于探索形状直到下一个形状类型。例如,如果你正在使用 TopoDS_Iterator 探索一个面,将获得该形状的线。如果你正在探索一条线,将获得该形状的边。

我们可以在此 API 中定义另外两个变量。要迭代所有子形状,你必须使用递归函数或任何其他形式的使用。

TopoDS_Iterator可以像 TopoDS_Explorer一样使用。示例如下:

4、TopTools_IndexedMapOfShape

如果你想要使用索引映射子形状,您可以简单地使用此 API。在这里,子形状使用索引进行映射。

这里的主要优点是每个形状只计算一次。如果我们用 TopTools_IndexedMapOfShape探索一个框以获取边,将获得 12 条边。

5、TopTools_IndexedDataMapOfShapeListOfShape

当需要获取形状和子形状连接时,可以使用此方法。例如,当需要检查连接到特定形状的每个边的面是什么时,可以按如下方式使用此 API。在此映射中,键是边,值是面列表。

你可以按照给定的示例从形状映射和形状列表中提取数据。

6、ShapeAnalysis_ShapeContents

如果只想获取形状的数量,可以直接使用此 API。在这里,你可以根据需要获取不同的子形状数量。仔细选择要获取的参数。

从下面的列表中选择要获取的参数。

你可能会想为什么有不同的方法来获取边数。让我描述一个子形状;边。

  • NbEdges — 此参数将返回与我们可以从“TopExp_Explorer”中获得的边数相同的边数。这里将返回所有重复的边。
  • NbSharedEdges — 此参数将返回与我们可以从 TopTools_IndexedMapOfShape中获得的边数相同的边数。这里省略了公共边数。
  • NbFreeEdges — 此参数将返回给定形状中的自由边。自由边是指不属于任何面或线的边。
  • NbFreeSharedEdges — 此参数将返回不属于任何面的边数。 NbFreeEdges 和 NbFreeSharedEdges 都相同。

我们遗漏了什么?

我们需要从给定形状中获取其他形状计数,但 ShapeAnalysis_ShapeContents 中未包含这些计数。其中一些是非流形边的数量和退化边的数量。

需要新版本!

为了填补这一空白,我创建了一个名为 geom_ShapeContent的新类,它基于 ShapeAnalysis_ShapeContenets。在这里,我包含了获取非流形边和退化边数量的函数。

你可以查看此 github 存储库,并欢迎就此API 提出建议。


原文链接:Explore your shape using OPEN CASCADE

BimAnt翻译整理,转载请标明出处