From: dbv Date: Thu, 24 Dec 2015 07:25:40 +0000 (+0300) Subject: GeomAlgoAPI_Placement now derived from GeomAlgoAPI_MakeShape X-Git-Tag: V_2.1.0~80 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=20e689e7e08e86645076eb6aa99dbedf9352f65a;p=modules%2Fshaper.git GeomAlgoAPI_Placement now derived from GeomAlgoAPI_MakeShape --- diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp index 4e29cdb30..fb139dd8e 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp @@ -4,10 +4,13 @@ // Created: 2 Dec 2014 // Author: Artem ZHIDKOV -#include +#include "GeomAlgoAPI_Placement.h" + #include +#include #include +#include #include #include #include @@ -15,38 +18,30 @@ #include #include +#include #include #include -#include -#include -#include -#include -#include #include -GeomAlgoAPI_Placement::GeomAlgoAPI_Placement( - std::shared_ptr theSourceSolid, - std::shared_ptr theDestSolid, - std::shared_ptr theSourceShape, - std::shared_ptr theDestShape, - bool theIsReverse, - bool theIsCentering, - bool theSimpleTransform) - : myDone(false), - myShape(new GeomAPI_Shape()) +GeomAlgoAPI_Placement::GeomAlgoAPI_Placement(const std::shared_ptr theSourceSolid, + const std::shared_ptr theDestSolid, + const std::shared_ptr theSourceShape, + const std::shared_ptr theDestShape, + const bool theIsReverse, + const bool theIsCentering, + const bool theSimpleTransform) { - build(theSourceSolid, theDestSolid, theSourceShape, theDestShape, + build(theSourceSolid, theDestSolid, theSourceShape, theDestShape, theIsReverse, theIsCentering, theSimpleTransform); } -void GeomAlgoAPI_Placement::build( - const std::shared_ptr& theSourceSolid, - const std::shared_ptr& theDestSolid, - const std::shared_ptr& theSourceShape, - const std::shared_ptr& theDestShape, - bool theIsReverse, - bool theIsCentering, - bool theSimpleTransform) +void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourceSolid, + const std::shared_ptr& theDestSolid, + const std::shared_ptr& theSourceShape, + const std::shared_ptr& theDestShape, + const bool theIsReverse, + const bool theIsCentering, + const bool theSimpleTransform) { // Filling the parameters of the objects static const int aNbObjects = 2; @@ -192,83 +187,36 @@ void GeomAlgoAPI_Placement::build( if (theSimpleTransform) { // just add transformation TopLoc_Location aDelta(aTrsf); - TopoDS_Shape aResult = aSourceShape.Moved(aDelta); - myShape->setImpl(new TopoDS_Shape(aResult)); // store the accumulated information about the result and this delta //myTrsf = std::shared_ptr(new GeomAPI_Trsf(new gp_Trsf(aTrsf * aSourceShape.Location().Transformation()))); - myTrsf = std::shared_ptr(new GeomAPI_Trsf(new gp_Trsf(aTrsf))); - myDone = true; // it is allways true for simple transformation generation + myTrsf.reset(new GeomAPI_Trsf(new gp_Trsf(aTrsf))); + TopoDS_Shape aResult = aSourceShape.Moved(aDelta); + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); // it is allways true for simple transformation generation } else { // internal rebuild of the shape // Transform the shape with copying it BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, aTrsf, true); - if(aBuilder) { - setImpl(aBuilder); - myDone = aBuilder->IsDone() == Standard_True; - if (myDone) { - TopoDS_Shape aResult = aBuilder->Shape(); - // fill data map to keep correct orientation of sub-shapes - for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) { - std::shared_ptr aCurrentShape(new GeomAPI_Shape()); - aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current())); - myMap.bind(aCurrentShape, aCurrentShape); - } - myShape->setImpl(new TopoDS_Shape(aResult)); - myMkShape = new GeomAlgoAPI_MakeShape (aBuilder); - } + if(!aBuilder) { + return; } - } -} - -//============================================================================ -const bool GeomAlgoAPI_Placement::isValid() const -{ - if (myShape.get()) { // only for not-simple transform - BRepCheck_Analyzer aChecker(myShape->impl()); - return (aChecker.IsValid() == Standard_True); - } - return true; -} + this->setImpl(aBuilder); + this->setBuilderType(OCCT_BRepBuilderAPI_MakeShape); + if(aBuilder->IsDone() != Standard_True) { + return; + } + TopoDS_Shape aResult = aBuilder->Shape(); -//============================================================================ -const bool GeomAlgoAPI_Placement::hasVolume() const -{ - bool hasVolume(false); - if(isValid()) { - const TopoDS_Shape& aRShape = myShape->impl(); - GProp_GProps aGProp; - BRepGProp::VolumeProperties(aRShape, aGProp); - if(aGProp.Mass() > Precision::Confusion()) - hasVolume = true; + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); } - return hasVolume; -} - -//============================================================================ -const std::shared_ptr& GeomAlgoAPI_Placement::shape () const -{ - return myShape; -} - -//============================================================================ -void GeomAlgoAPI_Placement::mapOfShapes (GeomAPI_DataMapOfShapeShape& theMap) const -{ - theMap = myMap; -} - -//============================================================================ -GeomAlgoAPI_MakeShape * GeomAlgoAPI_Placement::makeShape() const -{ - return myMkShape; } +//================================================================================================= std::shared_ptr GeomAlgoAPI_Placement::transformation() const { return myTrsf; } - -//============================================================================ -GeomAlgoAPI_Placement::~GeomAlgoAPI_Placement() -{ - if (!empty()) - myMap.clear(); -} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.h b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.h index 866791a02..7fa31bcd5 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.h @@ -8,79 +8,48 @@ #define GeomAlgoAPI_Placement_H_ #include +#include + #include -#include -#include #include -#include -#include -#include -/**\class GeomAlgoAPI_Placement - * \ingroup DataAlgo - * \brief Creates the copied object which sub-element is placed on the given element - */ -class GeomAlgoAPI_Placement : public GeomAPI_Interface +/// \class GeomAlgoAPI_Placement +/// \ingroup DataAlgo +/// \brief Creates the copied object which sub-element is placed on the given element +class GeomAlgoAPI_Placement : public GeomAlgoAPI_MakeShape { public: - /** \brief Creates an object which is obtained from current object by transformation calculated - * as a movement of the source object to be coincident with the destination object - * \param[in] theSourceSolid a shape to be moved - * \param[in] theDestSolid invariant shape - * \param[in] theSourceShape a shape on the solid to be made coincident with destination object - * \param[in] theDestShape destination object - * \param[in] theIsReverse indicates that the solid materials should be on the same side against the destination plane - * \param[in] theIsCentering indicates the planes should be centered - * \param[in] theSimpleTransform makes just transformation of shape without changing of topology or geometry - */ - GEOMALGOAPI_EXPORT GeomAlgoAPI_Placement(std::shared_ptr theSourceSolid, - std::shared_ptr theDestSolid, - std::shared_ptr theSourceShape, - std::shared_ptr theDestShape, - bool theIsReverse = false, - bool theIsCentering = false, - bool theSimpleTransform = false); - - /// Returns True if algorithm succeed - GEOMALGOAPI_EXPORT const bool isDone() const - { return myDone; } - - /// Returns True if resulting shape is valid - GEOMALGOAPI_EXPORT const bool isValid() const; - - /// Returns True if resulting shape has volume - GEOMALGOAPI_EXPORT const bool hasVolume() const; - - /// Returns result of the Placement algorithm which may be a Solid or a Face - GEOMALGOAPI_EXPORT const std::shared_ptr& shape () const; - - /// Returns map of sub-shapes of the result. To be used for History keeping - GEOMALGOAPI_EXPORT void mapOfShapes (GeomAPI_DataMapOfShapeShape& theMap) const; - - /// Return interface for for History processing - GEOMALGOAPI_EXPORT GeomAlgoAPI_MakeShape* makeShape () const; + /// \brief Creates an object which is obtained from current object by transformation calculated + /// as a movement of the source object to be coincident with the destination object + /// \param[in] theSourceSolid a shape to be moved + /// \param[in] theDestSolid invariant shape + /// \param[in] theSourceShape a shape on the solid to be made coincident with destination object + /// \param[in] theDestShape destination object + /// \param[in] theIsReverse indicates that the solid materials should be on the same side against the destination plane + /// \param[in] theIsCentering indicates the planes should be centered + /// \param[in] theSimpleTransform makes just transformation of shape without changing of topology or geometry + GEOMALGOAPI_EXPORT GeomAlgoAPI_Placement(const std::shared_ptr theSourceSolid, + const std::shared_ptr theDestSolid, + const std::shared_ptr theSourceShape, + const std::shared_ptr theDestShape, + const bool theIsReverse = false, + const bool theIsCentering = false, + const bool theSimpleTransform = false); /// Returns the simple transformation GEOMALGOAPI_EXPORT std::shared_ptr transformation() const; - /// Destructor - GEOMALGOAPI_EXPORT virtual ~GeomAlgoAPI_Placement(); - private: /// builds resulting shape void build(const std::shared_ptr& theSourceSolid, const std::shared_ptr& theDestSolid, const std::shared_ptr& theSourceShape, const std::shared_ptr& theDestShape, - bool theIsReverse, - bool theIsCentering, - bool theSimpleTransform); + const bool theIsReverse, + const bool theIsCentering, + const bool theSimpleTransform); - /// fields - bool myDone; - std::shared_ptr myShape; - GeomAPI_DataMapOfShapeShape myMap; - GeomAlgoAPI_MakeShape * myMkShape; +private: std::shared_ptr myTrsf; ///< transformation of the shape in case theSimpleTransform };