X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Boolean.h;h=3bb43570d66cfcc03cf615928863f51ccbeb1304;hb=e6b5b9be3312c0e124ec381fd0e19d8d4d9521d1;hp=63185b17220ec5436653a7de227891d2cb8cb8cf;hpb=519c75aa9071eda76f3d928a95715475a9da8ac7;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Boolean.h b/src/FeaturesPlugin/FeaturesPlugin_Boolean.h index 63185b172..3bb43570d 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Boolean.h +++ b/src/FeaturesPlugin/FeaturesPlugin_Boolean.h @@ -20,21 +20,13 @@ #ifndef FeaturesPlugin_Boolean_H_ #define FeaturesPlugin_Boolean_H_ -#include "FeaturesPlugin.h" -#include "FeaturesPlugin_Tools.h" - -#include -#include - -#include - -class ModelAPI_Result; +#include "FeaturesPlugin_VersionedBoolean.h" /// \class FeaturesPlugin_Boolean /// \ingroup Plugins /// \brief Feature for applying of Boolean operations on Solids. /// Supports four kinds of Boolean operations: Cut, Fuse, Common and Smash. -class FeaturesPlugin_Boolean : public ModelAPI_Feature +class FeaturesPlugin_Boolean : public FeaturesPlugin_VersionedBoolean { public: enum OperationType { @@ -77,108 +69,13 @@ protected: const std::shared_ptr theResultShape, const GeomMakeShapePtr& theMakeShape); - - /// Auxiliary class to store hierarchy of Boolean operation objects/tools - /// and their parent shapes (compounds or compsolids) - class ObjectHierarchy { - typedef std::map MapShapeToSubshapes; - typedef std::map MapShapeToParent; - typedef std::set SetOfShape; - - ListOfShape myObjects; - MapShapeToParent myParent; - MapShapeToSubshapes mySubshapes; - - SetOfShape myProcessedObjects; - - public: - /// Add object of Boolean opration - void AddObject(const GeomShapePtr& theObject); - - /// Maps shape and its parent - void AddParent(const GeomShapePtr& theShape, const GeomShapePtr& theParent); - - /// Return parent shape for the given, or empty if it is a high-level shape. - /// By default, the parent and all its subshapes are marked as processed for further skip. - GeomShapePtr Parent(const GeomShapePtr& theShape, bool theMarkProcessed = true); - - /// Split compound/compsolid shape for subshapes selected for Boolean operation and the other. - void SplitCompound(const GeomShapePtr& theCompShape, - ListOfShape& theUsed, - ListOfShape& theNotUsed) const; - - /// Return \c true if there is no object in hierarchy - bool IsEmpty() const; - - /// Return list of objects - const ListOfShape& Objects() const { return myObjects; } - - public: - class Iterator { - friend class ObjectHierarchy; - - ObjectHierarchy* myHierarchy; - ListOfShape::iterator myObject; - - Iterator() {} - Iterator(ObjectHierarchy* theHierarchy, bool isBegin = true); - - void SkipAlreadyProcessed(); - - public: - bool operator==(const Iterator&) const; - bool operator!=(const Iterator&) const; - - Iterator& operator++(); - Iterator operator++(int); - - GeomShapePtr operator*() const; - }; - - Iterator Begin(); - Iterator End(); - }; - - /// Process SelectionList attribute and fill the objects hierarchy. - bool processAttribute(const std::string& theAttributeName, - ObjectHierarchy& theObjects, - ListOfShape& thePlanesList); - - /// Perform Boolean operation of the object with the tools - /// \return \c false if something went wrong - bool processObject(const GeomAlgoAPI_Tools::BOPType theBooleanType, - const GeomShapePtr& theObject, - const ListOfShape& theTools, - const ListOfShape& thePlanes, - int& theResultIndex, - std::vector& theResultBaseAlgoList, - ListOfShape& theResultShapesList); - - /// Perform Boolean operation of the Compsolid with the tools - /// \return \c false if something went wrong - bool processCompsolid(const GeomAlgoAPI_Tools::BOPType theBooleanType, - const ObjectHierarchy& theCompsolidHierarchy, - const GeomShapePtr& theCompsolid, - const ListOfShape& theTools, - const ListOfShape& thePlanes, - int& theResultIndex, - std::vector& theResultBaseAlgoList, - ListOfShape& theResultShapesList); - - /// Perform Boolean operation of the Compound with the tools - /// \return \c false if something went wrong - bool processCompound(const GeomAlgoAPI_Tools::BOPType theBooleanType, - const ObjectHierarchy& theCompoundHierarchy, - const GeomShapePtr& theCompound, - const ListOfShape& theTools, - int& theResultIndex, - std::vector& theResultBaseAlgoList, - ListOfShape& theResultShapesList); - -private: - void parentForShape(const GeomShapePtr& theShape, - const std::shared_ptr& theContext, - ObjectHierarchy& theShapesHierarchy); + /// Store result shape if it is not empty and increase results counter + void storeResult(const ListOfShape& theObjects, + const ListOfShape& theTools, + const GeomShapePtr theResultShape, + int& theResultIndex, + std::shared_ptr theMakeShapeList, + std::vector& theResultBaseAlgoList); private: OperationType myOperationType;