TopoDS_Shapes in OpenCASCADE fusionieren (boolean OR)

English Deutsch

Die OCCUtils-Bibliothek bietet einen einfachen Weg, zwei Shapes in OpenCASCADE zu fusionieren.

Lass uns zuerst eine Box und einen Zylinder mit OCCUtils’s Primitiv-Generierungsfunktionen erzeugen:

make_box_and_cylinder.cpp
#include <occutils/Primitive.hxx>

using namespace OCCUtils;

TopoDS_Shape solid1 = Primitive::MakeBox(18 /* X */, 8 /* Y */, 14 /* Z */,
    Primitive::CenterX | Primitive::CenterY);

TopoDS_Shape solid2 = Primitive::MakeCylinder(5 /* d */, 35 /* L */,
    Primitivs::Orientation::Z,
    Primitive::CenterD);

Nun können wir die Primitive mit diesem Snippet fusionieren:

fuse_with_boolean.cpp
#include <occutils/Boolean.hxx>

using namespace OCCUtils;

TopoDS_Shape fused = Boolean::Fuse({solid1, solid2});

Boolean::Fuse() kann verschiedene Argumenttypen annehmen. In diesem Beispiel verwenden wir eine std::initializer_list (dies ist die geschweifte-Klammer-Syntax) - aber es kann auch eine TopTools_ListOfShape oder einen std::vector<TopoDS_Shape> (und auch die meisten anderen STL- oder Nicht-STL-Container) annehmen.

Wenn du eine Fusion ohne OCCUtils durchführen möchtest, könntest du versucht sein, diese Syntax zu verwenden:

deprecated_fuse_constructor.cpp
BRepAlgoAPI_Fuse fuse(solid1, solid2);
fuse.Build();
TopoDS_Shape result = fuse.Shape();

Jedoch ist der BRepAlgoAPI_Fuse(TopoDS, TopoDS)-Konstruktor veraltet und sollte daher nicht verwendet werden. Stattdessen sollte die folgende Syntax verwendet werden:

correct_fuse_configuration.cpp
// Fusion konfigurieren
BRepAlgoAPI_Fuse fuse;
fuse.SetArguments(arguments);
fuse.SetTools(tools);
// Fusion ausführen
fuse.Build();
TopoDS_Shape shape = fuse.Shape(); // Raises NotDone if not done.

wobei arguments und tools zwei TopTools_ListOfShape-Instanzen sind. Für andere boolesche Algorithmen wie BRepAlgoAPI_Cut (boolesche Differenz) haben die beiden unterschiedliche Bedeutungen, aber für BRepAlgoAPI_Fuse ist es nur wichtig, dass sowohl arguments als auch tools jeweils mindestens ein Element haben!

Du kannst ListUtils::SplitIntoHeadAndTail aus OCCUtils verwenden, um ein std::pair von Listen (arguments und tools) zu generieren, wobei arguments ein Element hat und tools den Rest, wie folgt:

listutils_split_example.cpp
auto toolsAndArgs = ListUtils::SplitIntoHeadAndTail(shapes, 1);
auto tools = toolsAndArgs.first;
auto arguments = toolsAndArgs.second;

Wenn du jedoch ListUtils::SplitIntoHeadAndTail() verwendest, kannst du einfach direkt Boolean::Fuse() verwenden.


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