data()->addAttribute(COMBINE_ID(), ModelAPI_AttributeBoolean::typeId());
}
-//=================================================================================================
-std::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Partition::getShape(const std::string& theAttrName)
-{
- std::shared_ptr<ModelAPI_AttributeReference> aObjRef =
- std::dynamic_pointer_cast<ModelAPI_AttributeReference>(data()->attribute(theAttrName));
- if (aObjRef) {
- std::shared_ptr<ModelAPI_ResultBody> aConstr =
- std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObjRef->value());
- if (aConstr)
- return aConstr->shape();
- }
- return std::shared_ptr<GeomAPI_Shape>();
-}
-
//=================================================================================================
void FeaturesPlugin_Partition::execute()
{
anObjects.clear();
anObjects.push_back(aCompoud);
}
- GeomAlgoAPI_Partition aPartitionAlgo(anObjects, aTools);
+ std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo(new GeomAlgoAPI_Partition(anObjects, aTools));
// Checking that the algorithm worked properly.
- if (!aPartitionAlgo.isDone()) {
+ if (!aPartitionAlgo->isDone()) {
static const std::string aFeatureError = "Partition algorithm failed";
setError(aFeatureError);
return;
}
- if (aPartitionAlgo.shape()->isNull()) {
+ if (aPartitionAlgo->shape()->isNull()) {
static const std::string aShapeError = "Resulting shape is Null";
setError(aShapeError);
return;
}
- if (!aPartitionAlgo.isValid()) {
+ if (!aPartitionAlgo->isValid()) {
std::string aFeatureError = "Warning: resulting shape is not valid";
setError(aFeatureError);
return;
}
- if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) {
+ if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo->shape()) > 1.e-7) {
std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data(), aResultIndex);
- aMakeShapeList.appendAlgo(aPartitionAlgo.makeShape());
- GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo.mapOfShapes().get();
- loadNamingDS(aResultBody, anObjects.front(), aToolsForNaming, aPartitionAlgo.shape(), aMakeShapeList, aMapOfShapes);
+ aMakeShapeList.appendAlgo(aPartitionAlgo);
+ GeomAPI_DataMapOfShapeShape& aMapOfShapes = *aPartitionAlgo->mapOfSubShapes().get();
+ loadNamingDS(aResultBody, anObjects.front(), aToolsForNaming, aPartitionAlgo->shape(), aMakeShapeList, aMapOfShapes);
setResult(aResultBody, aResultIndex);
aResultIndex++;
}
for (ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++) {
std::shared_ptr<GeomAPI_Shape> anObject = *anObjectsIt;
ListOfShape aListWithObject; aListWithObject.push_back(anObject);
- GeomAlgoAPI_Partition aPartitionAlgo(aListWithObject, aTools);
+ std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo(new GeomAlgoAPI_Partition(aListWithObject, aTools));
// Checking that the algorithm worked properly.
- if (!aPartitionAlgo.isDone()) {
+ if (!aPartitionAlgo->isDone()) {
static const std::string aFeatureError = "Partition algorithm failed";
setError(aFeatureError);
return;
}
- if (aPartitionAlgo.shape()->isNull()) {
+ if (aPartitionAlgo->shape()->isNull()) {
static const std::string aShapeError = "Resulting shape is Null";
setError(aShapeError);
return;
}
- if (!aPartitionAlgo.isValid()) {
+ if (!aPartitionAlgo->isValid()) {
std::string aFeatureError = "Warning: resulting shape is not valid";
setError(aFeatureError);
return;
}
- if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) {
+ if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo->shape()) > 1.e-7) {
std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data(), aResultIndex);
- aMakeShapeList.appendAlgo(aPartitionAlgo.makeShape());
- GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo.mapOfShapes().get();
- loadNamingDS(aResultBody, anObject, aToolsForNaming, aPartitionAlgo.shape(), aMakeShapeList, aMapOfShapes);
+ GeomAlgoAPI_MakeShapeList aMakeShapeListCopy = aMakeShapeList;
+ aMakeShapeListCopy.appendAlgo(aPartitionAlgo);
+ GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo->mapOfSubShapes().get();
+ loadNamingDS(aResultBody, anObject, aToolsForNaming, aPartitionAlgo->shape(), aMakeShapeListCopy, aMapOfShapes);
setResult(aResultBody, aResultIndex);
aResultIndex++;
}
#include <GeomAlgoAPI_Partition.h>
-/**\class FeaturesPlugin_Partition
- * \ingroup Plugins
- * \brief Feature for applying of Partition operations on Solids. Partition makes conjunctional
- * faces of solids as shared. The result of partitions is a compsolid.
- * Main objects are solids, tool objects are solids or faces
- */
+/// \class FeaturesPlugin_Partition
+/// \ingroup Plugins
+/// \brief Feature for applying of Partition operations on Solids. Partition makes conjunctional
+/// faces of solids as shared. The result of partitions is a compsolid.
+/// Main objects are solids, tool objects are solids or faces
class FeaturesPlugin_Partition : public ModelAPI_Feature
{
public:
FeaturesPlugin_Partition();
private:
- std::shared_ptr<GeomAPI_Shape> getShape(const std::string& theAttrName);
-
/// Load Naming data structure of the feature to the document
void loadNamingDS(std::shared_ptr<ModelAPI_ResultBody> theResultBody,
const std::shared_ptr<GeomAPI_Shape> theBaseShape,
#include <GEOMAlgo_Splitter.hxx>
-#include <Bnd_Box.hxx>
-#include <BRep_Tool.hxx>
-#include <BRepBndLib.hxx>
-#include <BRepCheck_Analyzer.hxx>
-#include <BRepLib_MakeFace.hxx>
-#include <BRepTools.hxx>
-#include <Geom_Plane.hxx>
-#include <GeomLib_IsPlanarSurface.hxx>
-#include <GeomLib_Tool.hxx>
-#include <IntAna_IntConicQuad.hxx>
-#include <IntAna_Quadric.hxx>
-#include <Precision.hxx>
#include <TopExp_Explorer.hxx>
-#include <TopoDS.hxx>
#include <TopoDS_Builder.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopTools_ListOfShape.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);
}
// Creating partition operation.
GEOMAlgo_Splitter* anOperation = new GEOMAlgo_Splitter;
- myMkShape.reset(new GeomAlgoAPI_MakeShape(anOperation, GeomAlgoAPI_MakeShape::OCCT_BOPAlgo_Builder));
+ 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);
}
}
- // 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);
- }
- 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);
}
#include <GeomAlgoAPI_MakeShape.h>
#include <GeomAPI_Shape.h>
-#include <GeomAPI_Interface.h>
-#include <GeomAPI_DataMapOfShapeShape.h>
-#include <memory>
-
-/** \class GeomAlgoAPI_Partition
- * \ingroup DataAlgo
- * \brief Allows to perform of partition operations
- */
-class GeomAlgoAPI_Partition : public GeomAPI_Interface
+/// \class GeomAlgoAPI_Partition
+/// \ingroup DataAlgo
+/// \brief Allows to perform of partition operations
+class GeomAlgoAPI_Partition : public GeomAlgoAPI_MakeShape
{
public:
- /** \brief Creates common partition operation.
- * \param[in] theObjects the main shape.
- * \param[in] theTools second shape.
- * \return a solid as result of operation.
- */
+ /// \brief Creates common partition operation.
+ /// \param[in] theObjects the main shape.
+ /// \param[in] theTools second shape.
+ /// \return a solid as result of operation.
GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Shape> make(const ListOfShape& theObjects,
const ListOfShape& theTools);
GEOMALGOAPI_EXPORT GeomAlgoAPI_Partition(const ListOfShape& theObjects,
const ListOfShape& theTools);
- /// \return true if algorithm succeed.
- GEOMALGOAPI_EXPORT const bool isDone() const;
-
- /// \return true if resulting shape is valid.
- GEOMALGOAPI_EXPORT const bool isValid() const;
-
- /// \return result of the boolean algorithm.
- GEOMALGOAPI_EXPORT const std::shared_ptr<GeomAPI_Shape>& shape() const;
-
- /// \return map of sub-shapes of the result. To be used for History keeping.
- GEOMALGOAPI_EXPORT std::shared_ptr<GeomAPI_DataMapOfShapeShape> mapOfShapes() const;
-
- /// \return interface for for History processing.
- GEOMALGOAPI_EXPORT std::shared_ptr<GeomAlgoAPI_MakeShape> makeShape() const;
-
private:
/// Builds resulting shape.
void build(const ListOfShape& theObjects,
const ListOfShape& theTools);
-
-private:
- /// Fields.
- bool myDone;
- std::shared_ptr<GeomAPI_Shape> myShape;
- std::shared_ptr<GeomAPI_DataMapOfShapeShape> myMap;
- std::shared_ptr<GeomAlgoAPI_MakeShape> myMkShape;
};
#endif