Salome HOME
updated copyright message
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Boolean.h
index 63185b17220ec5436653a7de227891d2cb8cb8cf..e1a32b240fe19b0191264b9b38b03d345e366d75 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #ifndef FeaturesPlugin_Boolean_H_
 #define FeaturesPlugin_Boolean_H_
 
-#include "FeaturesPlugin.h"
-#include "FeaturesPlugin_Tools.h"
-
-#include <GeomAlgoAPI_MakeShape.h>
-#include <GeomAlgoAPI_Tools.h>
-
-#include <ModelAPI_Feature.h>
-
-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 {
@@ -59,6 +51,20 @@ public:
     return MY_TOOL_LIST_ID;
   }
 
+  /// Attribute name of use fuzzy parameter.
+  inline static const std::string& USE_FUZZY_ID()
+  {
+    static const std::string MY_USE_FUZZY_ID("use_fuzzy");
+    return MY_USE_FUZZY_ID;
+  }
+
+  /// Attribute name of fuzzy parameter.
+  inline static const std::string& FUZZY_PARAM_ID()
+  {
+    static const std::string MY_FUZZY_PARAM_ID("fuzzy_param");
+    return MY_FUZZY_PARAM_ID;
+  }
+
   /// \return boolean operation type.
   FEATURESPLUGIN_EXPORT OperationType operationType();
 
@@ -77,108 +83,13 @@ protected:
                     const std::shared_ptr<GeomAPI_Shape> 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<GeomShapePtr, ListOfShape, GeomAPI_Shape::Comparator>  MapShapeToSubshapes;
-    typedef std::map<GeomShapePtr, GeomShapePtr, GeomAPI_Shape::Comparator> MapShapeToParent;
-    typedef std::set<GeomShapePtr, GeomAPI_Shape::Comparator> 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<FeaturesPlugin_Tools::ResultBaseAlgo>& 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<FeaturesPlugin_Tools::ResultBaseAlgo>& 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<FeaturesPlugin_Tools::ResultBaseAlgo>& theResultBaseAlgoList,
-                       ListOfShape& theResultShapesList);
-
-private:
-  void parentForShape(const GeomShapePtr& theShape,
-                      const std::shared_ptr<ModelAPI_Result>& 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<GeomAlgoAPI_MakeShapeList> theMakeShapeList,
+                   std::vector<ModelAPI_Tools::ResultBaseAlgo>& theResultBaseAlgoList);
 
 private:
   OperationType myOperationType;