-// 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 {
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();
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;