TopoDS_Solid(s) aus TopoDS_Shape in OpenCASCADE ermitteln
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
#include <TopoDS_Shape.hxx>
TopoDS_Shape myShape = /* ... */
bool isSolid = myShape.ShapeType() == TopAbs_SOLID;Alternativ kannst du die Shape::IsSolid()-Funktion von OCCUtils verwenden:
#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:
TopoDS::Solid(myShape);Vollständiges Beispiel:
#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.
#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:
#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:
#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
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 ! */
}