如何在 OpenCASCADE 中创建两个或多个形状的 TopTools_ListOfShape

TopTools_ListOfShape 只是 NCollection_List<TopoDS_Shape> 的另一个名称。

使用我的 OCCUtils 库,这非常简单:

list_to_occ_list.cpp
#include <TopTools_ListOfShape.hxx>
#include <occutils/ListUtils.hxx>

using namespace OCCUtils;

/* ... */

TopoDS_Solid solid1 = /* ... */;
TopoDS_Solid solid2 = /* ... */;

TopTools_ListOfShape shapes = ListUtils::ToOCCList({solid1, solid2});

ListUtils::ToOCCList() 几乎可以接受任何参数,std::initializer_list(这是上面示例中的花括号语法),也可以是任何类型的 STL 容器如 std::vectorstd::list,并将其转换为 NCollection_List<T>

list_to_occ_list.cpp
#include <TopTools_ListOfShape.hxx>
#include <occutils/ListUtils.hxx>
#include <vector>

using namespace OCCUtils;

/* ... */

TopoDS_Solid solid1 = /* ... */;
TopoDS_Solid solid2 = /* ... */;

std::vector<TopoDS_Shape> shapeVector({solid1, solid2});

TopTools_ListOfShape shapes = ListUtils::ToOCCList(shapeVector);

如果你不想使用 OCCUtils,这是手动创建 TopTools_ListOfShape 的方法:

manual_append.cpp
TopTools_ListOfShape list;
list.Append(shape1);
list.Append(shape2);

由于 NCollection_List(因此也包括 TopTools_ListOfShape)内部是链表,你也可以使用 list.Prepend(shape); 将形状添加到列表前面而不会产生任何性能损失。

如果你想从 std::vector 或任何类似 STL 容器创建列表,使用此代码片段:

manual_append.cpp
std::vector<TopoDS_Shape>& shapeVector = /* ... */;

TopTools_ListOfShape list;
for(const TopoDS_Shape& shape : shapeVector) {
    list.Append(shape);
}

创建容器后,你可以使用 C++11 基于范围的 for 循环迭代它:

iterate_listofshape.cpp
TopTools_ListOfShape myShapes = /* ... */;

// 迭代 myShapes
for(const TopoDS_Shape& shape : myShapes) {
    /* ... */
}

请参见如何在 OpenCASCADE 中迭代 TopTools_ListOfShape如何在 OpenCASCADE 中迭代 NCollection_List了解更多详情。


Check out similar posts by category: C/C++, OpenCASCADE