TopoDS_Shapes in OpenCASCADE fusionieren (boolean OR)
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:
#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:
#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:
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:
// 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:
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.