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翻译整理,转载请标明出处