#include "GeomAlgoAPI_Partition.h"
#include <GeomAlgoAPI_DFLoader.h>
+#include <GeomAlgoAPI_ShapeTools.h>
#include <GEOMAlgo_Splitter.hxx>
-#include <BRepCheck_Analyzer.hxx>
#include <TopExp_Explorer.hxx>
-#include <TopTools_ListOfShape.hxx>
+#include <TopoDS_Builder.hxx>
//=================================================================================================
std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Partition::make(const ListOfShape& theObjects,
const ListOfShape& theTools)
{
- GeomAlgoAPI_Partition aBoolAlgo(theObjects, theTools);
- if(aBoolAlgo.isDone() && !aBoolAlgo.shape()->isNull() && aBoolAlgo.isValid()) {
- return aBoolAlgo.shape();
+ GeomAlgoAPI_Partition aPartitionAlgo(theObjects, theTools);
+ if(aPartitionAlgo.isDone() && !aPartitionAlgo.shape()->isNull() && aPartitionAlgo.isValid()) {
+ return aPartitionAlgo.shape();
}
return std::shared_ptr<GeomAPI_Shape>();
}
//=================================================================================================
GeomAlgoAPI_Partition::GeomAlgoAPI_Partition(const ListOfShape& theObjects,
const ListOfShape& theTools)
-: myDone(false)
{
build(theObjects, theTools);
}
void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects,
const ListOfShape& theTools)
{
- if (theObjects.empty() || theTools.empty()) {
+ if (theObjects.empty()) {
return;
}
// Creating partition operation.
GEOMAlgo_Splitter* anOperation = new GEOMAlgo_Splitter;
- myMkShape.reset(new GeomAlgoAPI_MakeShape(anOperation, GeomAlgoAPI_MakeShape::BOPAlgoBuilder));
+ this->setImpl(anOperation);
+ this->setBuilderType(OCCT_BOPAlgo_Builder);
// Getting objects.
for (ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) {
// Building and getting result.
anOperation->Perform();
- TopoDS_Shape aResult = anOperation->Shape();
- myDone = !aResult.IsNull();
- if (!myDone) {
+ if(anOperation->ErrorStatus() != 0) {
return;
}
+ TopoDS_Shape aResult = anOperation->Shape();
if(aResult.ShapeType() == TopAbs_COMPOUND) {
- aResult = GeomAlgoAPI_DFLoader::refineResult(aResult);
+ std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
+ aGeomShape->setImpl(new TopoDS_Shape(aResult));
+ aResult = GeomAlgoAPI_ShapeTools::groupSharedTopology(aGeomShape)->impl<TopoDS_Shape>();
}
- // fill data map to keep correct orientation of sub-shapes
- myMap.reset(new GeomAPI_DataMapOfShapeShape());
- for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) {
- std::shared_ptr<GeomAPI_Shape> aCurrentShape(new GeomAPI_Shape());
- aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current()));
- myMap->bind(aCurrentShape, aCurrentShape);
+ // Setting result.
+ if(aResult.IsNull()) {
+ return;
}
- myShape.reset(new GeomAPI_Shape());
- myShape->setImpl(new TopoDS_Shape(aResult));
-}
-
-//=================================================================================================
-const bool GeomAlgoAPI_Partition::isDone() const
-{
- return myDone;
-}
-
-//=================================================================================================
-const bool GeomAlgoAPI_Partition::isValid() const
-{
- BRepCheck_Analyzer aChecker(myShape->impl<TopoDS_Shape>());
- return (aChecker.IsValid() == Standard_True);
-}
-
-//=================================================================================================
-const std::shared_ptr<GeomAPI_Shape>& GeomAlgoAPI_Partition::shape() const
-{
- return myShape;
-}
-
-//=================================================================================================
-std::shared_ptr<GeomAPI_DataMapOfShapeShape> GeomAlgoAPI_Partition::mapOfShapes() const
-{
- return myMap;
-}
-
-//=================================================================================================
-std::shared_ptr<GeomAlgoAPI_MakeShape> GeomAlgoAPI_Partition::makeShape() const
-{
- return myMkShape;
+ std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+ aShape->setImpl(new TopoDS_Shape(aResult));
+ this->setShape(aShape);
+ this->setDone(true);
}