TopoDS_Solid(s) aus TopoDS_Shape in OpenCASCADE ermitteln

English Deutsch

Es gibt zwei wichtige Fälle, wenn du ein TopoDS_Solid-Objekt aus einem TopoDS_Shape erhalten möchtest:

A: Der TopoDS_Shape ist ein Solid

Du kannst überprüfen, ob das der Fall ist mit

check_is_solid.cpp
#include <TopoDS_Shape.hxx>

TopoDS_Shape myShape = /* ... */

bool isSolid = myShape.ShapeType() == TopAbs_SOLID;

Alternativ kannst du die Shape::IsSolid()-Funktion von OCCUtils verwenden:

shape_is_compound.cpp
#include <occutils/Shape.hxx>

using namespace OCCUtils;

TopoDS_Shape myShape = /* ... */;

if(Shape::IsSolid(myShape)) {
    /* ... */
}

Wenn es ein Solid ist, kannst du es direkt in ein TopoDS_Solid konvertieren mit:

check_is_solid.cpp
TopoDS::Solid(myShape);

Vollständiges Beispiel:

check_is_solid.cpp
#include <TopoDS_Shape.hxx>
#include <TopoDS.hxx>
#include <occutils/Shape.hxx>

using namespace OCCUtils;

TopoDS_Shape myShape = /* ... */;

if (Shape::IsSolid(myShape)) {
    TopoDS_Solid solid = TopoDS::Solid(myShape);
    /* ... */
}

B: Das Shape ist nicht selbst ein TopoDS_Solid, enthält aber eines oder mehrere TopoDS_Solids

Dies ist oft bei TopoDS_Compounds der Fall. Verwende Shape::IsCompound() aus OCCUtils, um zu überprüfen, ob dein TopoDS_Shape tatsächlich ein TopoDS_Compound ist.

all_solids_within.cpp
#include <occutils/Shape.hxx>
using namespace OCCUtils;

TopoDS_Shape myShape = /* ... */;
if(Shape::IsCompound(myShape)) { /* ... */ }

Mit OCCUtils hast du nun mehrere Optionen, um die TopoDS_Solids aus dem Compound zu erhalten:

Wenn es eine Chance gibt, dass es null oder mehr als ein TopoDS_Solid in deinem Compound gibt:

Verwende ShapeComponents::AllSolidsWithin() aus OCCUtils, um einen std::vector<TopoDS_Solid> aller Solids innerhalb des TopoDS_Compound zu erhalten:

all_solids_within.cpp
#include <occutils/Shape.hxx>
#include <occutils/ShapeComponents.hxx>

using namespace OCCUtils;

TopoDS_Shape myShape = /* ... */;

auto solids = ShapeComponents::AllSolidsWithin(myShape);

// Alle Solids iterieren
for(const TopoDS_Solid& solid : solids) {
    /* ... */
}

Wenn du sicher bist, dass das Compound nur ein Solid enthält (funktioniert auch, wenn es selbst ein Solid ist):

Verwende ShapeComponents::TryGetSingleSolid(shape), welches ein std::optional<TopoDS_Solid> zurückgibt (kein Wert, wenn es kein Solid gibt oder mehrere Solids im Shape sind) oder ShapeComponents::GetSingleSolid(shape), welches eine Ausnahme wirft, wenn es kein Solid gibt oder mehrere Solids im Shape sind.

Beispiel:

try_get_single_solid.cpp
#include <occutils/ShapeComponents.hxx>
#include <iostream> // cerr, endl

using namespace std;
using namespace OCCUtils;

TopoDS_Shape myShape = /* ... */;

auto solidOpt = ShapeComponents::TryGetSingleSolid(myShape);

if(solidOpt.has_value()) {
    TopoDS_Solid solid = solidOpt.value();
} else {
    cerr << "Kein Solid oder mehrere Solids im Shape!" << endl;
}

Wenn du reines OpenCASCADE ohne OCCUtils verwenden möchtest:

Verwende dieses Snippet, um die TopoDS_Solid-Instanzen im Shape direkt zu iterieren

iterate_solid_shapes.cpp
TopTools_IndexedMapOfShape solidShapes;
TopExp::MapShapes (myShape, TopAbs_SOLID, solidShapes);

for (int i = 1; i <= solidShapes.Extent (); i++) {
    TopoDS_Solid solid = TopoDS::Solid(solidShapes(i));
    /* Mache, was du mit dem Solid tun musst ! */
}

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