-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2020 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
#include "FeaturesPlugin.h"
#include "FeaturesPlugin_Tools.h"
+#include <GeomAPI_ShapeHierarchy.h>
#include <GeomAlgoAPI_Tools.h>
#include <ModelAPI_Feature.h>
/// \brief Feature controls a version of Boolean operations.
class FeaturesPlugin_VersionedBoolean : public ModelAPI_Feature
{
-public:
- /// Attribute name of the version of Boolean feature
- inline static const std::string& VERSION_ID()
+protected:
+ static const std::string& BOP_VERSION_9_4()
{
- static const std::string MY_VERSION_ID("version");
- return MY_VERSION_ID;
+ static const std::string VERSION("v9.4");
+ return VERSION;
}
-protected:
-
/// Use plugin manager for features creation.
FeaturesPlugin_VersionedBoolean() {}
/// Initialize version field of the Boolean feature.
/// The version is initialized for newly created features,
/// not read from previously stored document.
- void initVersion(const int theVersion,
+ void initVersion(const std::string& theVersion,
const std::shared_ptr<ModelAPI_Attribute> theObjectsAttr
= std::shared_ptr<ModelAPI_Attribute>(),
const std::shared_ptr<ModelAPI_Attribute> theToolsAttr
= std::shared_ptr<ModelAPI_Attribute>());
- /// Auxiliary class to store hierarchy of Boolean operation objects/tools
- /// and their parent shapes (compounds or compsolids)
- class ObjectHierarchy {
- typedef std::pair<GeomShapePtr, ListOfShape> ShapeAndSubshapes;
- typedef std::map<GeomShapePtr, GeomShapePtr, GeomAPI_Shape::Comparator> MapShapeToParent;
- typedef std::map<GeomShapePtr, size_t, GeomAPI_Shape::Comparator> MapShapeToIndex;
- typedef std::set<GeomShapePtr, GeomAPI_Shape::Comparator> SetOfShape;
-
- ListOfShape myObjects; ///< list of objects/tools of Boolean operation
- MapShapeToParent myParent; ///< refer a shape to compound/compsolid containing it
- /// indices of compounds/compsolids to keep the order of parent shapes
- /// corresponding to the order of objects
- MapShapeToIndex myParentIndices;
- /// list of shape and its subshapes stored according to the index of parent shape
- std::vector<ShapeAndSubshapes> 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);
-
- /// Marke the shape as already processed
- void MarkProcessed(const GeomShapePtr& theShape);
- /// Marke list ofshapes as already processed
- void MarkProcessed(const ListOfShape& theShapes);
-
- /// Split compound/compsolid shape for subshapes selected for Boolean operation and the other.
- void SplitCompound(const GeomShapePtr& theCompShape,
- ListOfShape& theUsed,
- ListOfShape& theNotUsed) const;
-
- /// Generates the list of top-level compounds, which contain the objects of Boolean operation.
- /// The generated list will contain only shapes unused during the Boolean operation.
- void CompoundsOfUnusedObjects(ListOfShape& theDestination) const;
-
- /// Return \c true if there is no object in hierarchy
- bool IsEmpty() const;
-
- /// Return list of objects
- const ListOfShape& Objects() const { return myObjects; }
- /// Separate objects of the given range of types and all other objects
- void ObjectsByType(ListOfShape& theShapesByType, ListOfShape& theOtherShapes,
- const GeomAPI_Shape::ShapeType theMinType = GeomAPI_Shape::COMPOUND,
- const GeomAPI_Shape::ShapeType theMaxType = GeomAPI_Shape::SHAPE) const;
-
- private:
- GeomShapePtr collectUnusedSubs(const GeomShapePtr theTopLevelCompound,
- const SetOfShape& theUsed) const;
-
- 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,
+ GeomAPI_ShapeHierarchy& theObjects,
ListOfShape& thePlanesList);
/// Perform Boolean operation of the object with the tools.
/// is added to this compound, and corresponding ResultBody is not generated.
/// \return \c false if something went wrong
bool processCompsolid(const GeomAlgoAPI_Tools::BOPType theBooleanType,
- ObjectHierarchy& theCompsolidHierarchy,
+ GeomAPI_ShapeHierarchy& theCompsolidHierarchy,
const GeomShapePtr& theCompsolid,
const ListOfShape& theTools,
const ListOfShape& thePlanes,
/// is added to this compound, and corresponding ResultBody is not generated.
/// \return \c false if something went wrong
bool processCompound(const GeomAlgoAPI_Tools::BOPType theBooleanType,
- ObjectHierarchy& theCompoundHierarchy,
+ GeomAPI_ShapeHierarchy& theCompoundHierarchy,
const GeomShapePtr& theCompound,
const ListOfShape& theTools,
int& theResultIndex,
/// into a single compound and add the result of the FUSE operation.
GeomShapePtr keepUnusedSubsOfCompound(
const GeomShapePtr& theResult,
- const ObjectHierarchy& theObjectsHierarchy,
- const ObjectHierarchy& theToolsHierarchy,
+ const GeomAPI_ShapeHierarchy& theObjectsHierarchy,
+ const GeomAPI_ShapeHierarchy& theToolsHierarchy,
std::shared_ptr<GeomAlgoAPI_MakeShapeList> theMakeShapeList);
-
- /// Return version of the feature
- int version();
-
-private:
- void parentForShape(const GeomShapePtr& theShape,
- const std::shared_ptr<ModelAPI_Result>& theContext,
- ObjectHierarchy& theShapesHierarchy);
};
#endif