X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeBoolean.h;h=e3fd68a69bc78c8b1bb005f97a11c1b1bc1fb518;hb=ac6689aff8d62d06f13c278d146978a303a0e7db;hp=c5ef7f3e6e656c640e4ad3879dcb73db8cf630d0;hpb=d9e58981abfe2d72c00c285ba40b63135629aa86;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.h b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.h index c5ef7f3e6..e3fd68a69 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.h +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.h @@ -1,79 +1,125 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: FeaturesPlugin_CompositeBoolean.h -// Created: 11 June 2015 -// Author: Dmitry Bobylev +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #ifndef FeaturesPlugin_CompositeBoolean_H_ #define FeaturesPlugin_CompositeBoolean_H_ -#include - -#include +#include "FeaturesPlugin.h" -#include +#include +#include +#include +#include -/** \class FeaturesPlugin_CompositeBoolean - * \ingroup Plugins - */ -class FeaturesPlugin_CompositeBoolean : public ModelAPI_CompositeFeature +/// \class FeaturesPlugin_CompositeBoolean +/// \ingroup Plugins +/// \brief Interface for the composite boolean feature. +class FeaturesPlugin_CompositeBoolean { - public: - /// Attribute name of sketch feature. - inline static const std::string& SKETCH_OBJECT_ID() +public: + enum OperationType { + BOOL_CUT, + BOOL_FUSE, + BOOL_COMMON, + BOOL_SMASH + }; + + /// Attribute name of main objects. + inline static const std::string& OBJECTS_ID() { - static const std::string MY_SKETCH_OBJECT_ID("sketch"); - return MY_SKETCH_OBJECT_ID; + static const std::string MY_OBJECTS_ID("main_objects"); + return MY_OBJECTS_ID; } - /// Attribute name of objects for boolean operation. - inline static const std::string& BOOLEAN_OBJECTS_ID() - { - static const std::string MY_BOOLEAN_OBJECTS_ID("boolean_objects"); - return MY_BOOLEAN_OBJECTS_ID; - } - - /// Creates a new part document if needed. - FEATURESPLUGIN_EXPORT virtual void execute(); - - /// Request for initialization of data model of the feature: adding all attributes. - FEATURESPLUGIN_EXPORT virtual void initAttributes(); - - /// Appends a feature to the sketch sub-elements container. - FEATURESPLUGIN_EXPORT virtual std::shared_ptr addFeature(std::string theID); + /// Performs the algorithm and stores results it in the data structure. + FEATURESPLUGIN_EXPORT virtual void executeCompositeBoolean(); - /// \return the number of sub-elements. - FEATURESPLUGIN_EXPORT virtual int numberOfSubs(bool forTree = false) const; + const OperationType& operationType() const { return myOperationType; } - /// \return the sub-feature by zero-base index. - FEATURESPLUGIN_EXPORT virtual std::shared_ptr subFeature(const int theIndex, bool forTree = false) const; - - /// \return the sub-feature unique identifier in this composite feature by zero-base index. - FEATURESPLUGIN_EXPORT virtual int subFeatureId(const int theIndex) const; - - /// \return true if feature or reuslt belong to this composite feature as subs. - FEATURESPLUGIN_EXPORT virtual bool isSub(ObjectPtr theObject) const; - - /// This method to inform that sub-feature is removed and must be removed from the internal data - /// structures of the owner (the remove from the document will be done outside just after) - FEATURESPLUGIN_EXPORT virtual void removeFeature(std::shared_ptr theFeature); +protected: + struct ResultBaseAlgo { + ResultBodyPtr resultBody; + GeomShapePtr baseShape; + std::shared_ptr makeShape; + }; protected: FeaturesPlugin_CompositeBoolean(){}; - /// Define this function to init attributes for extrusion/revolution. - virtual void initMakeSolidsAttributes() = 0; - - /// Define this function to create solids from faces with extrusion/revolution. - virtual ListOfShape MakeSolids(const ListOfShape& theFaces) = 0; - - void LoadNamingDS(std::shared_ptr theResultBody, - const std::shared_ptr& theBaseShape, - const ListOfShape& theTools, - const GeomAlgoAPI_Boolean& theAlgo); + /// Initializes boolean attributes. + void initBooleanAttributes(); + + /// This function need to be defined for extrusion/revolution generation. + virtual bool makeGeneration(ListOfShape& theBaseShapes, + ListOfMakeShape& theMakeShapes) = 0; + + /// Makes boolean operation. + /// \param[in] theTools list of tools. + /// \param[out] theObjects list of objects. + /// \param[out] theMakeShapes list of according algos. + /// \return false if failed. + bool makeBoolean(const ListOfShape& theTools, + ListOfShape& theObjects, + ListOfMakeShape& theMakeShapes); + + /// Stores generation history. + virtual void storeGenerationHistory(ResultBodyPtr theResultBody, + const GeomShapePtr theBaseShape, + const GeomMakeShapePtr theMakeShape) = 0; + + /// Stores modification history. + void storeModificationHistory(ResultBodyPtr theResultBody, + const GeomShapePtr theObject, + const ListOfShape& theTools, + const std::shared_ptr theMakeShape); + + /// Stores deleted shapes. + void storeDeletedShapes(std::vector& theResultBaseAlgoList, + const ListOfShape& theTools, + const GeomShapePtr theResultShapesCompound); + +private: + /// Makes cut operation recursively. + /// Called from makeBoolean(). + /// \param[in] theCompound the shape to be cut. + /// \param[in] theTools list of tools. + /// \param[out] theMakeShapeList list of according algos. + /// \param[out] theResult result of cut. + /// \return false if failed or no cuts done (this is normal case). + bool cutRecursiveCompound (const GeomShapePtr theCompound, + const ListOfShape& theTools, + std::shared_ptr& theMakeShapeList, + GeomShapePtr& theResult); + + /// Add subshapes of \a theCompound to \a theSubShapesToAdd list, + /// except ones from \a theSubShapesToAvoid. + /// Called from makeBoolean(). + /// \param[in] theCompound the shape to collect sub-shapes of. + /// \param[in] theSubShapesToAvoid list of shapes that should not be added to the result. + /// \param[out] theSubShapesToAdd list of found sub-shapes. + void addSubShapes (const GeomShapePtr theCompound, + const ListOfShape& theSubShapesToAvoid, + ListOfShape& theSubShapesToAdd); protected: - GeomAlgoAPI_Boolean::OperationType myBooleanOperationType; + ModelAPI_Feature* myFeature; + OperationType myOperationType; }; #endif