Salome HOME
Merge branch 'master' of newgeom:newgeom
authorszy <szy@opencascade.com>
Mon, 27 Oct 2014 15:48:46 +0000 (18:48 +0300)
committerszy <szy@opencascade.com>
Mon, 27 Oct 2014 15:48:46 +0000 (18:48 +0300)
Conflicts:
src/GeomAPI/GeomAPI_Shape.h

1  2 
src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp
src/GeomAPI/GeomAPI_Shape.h
src/Model/Model_ResultBody.cpp
src/ModelAPI/ModelAPI_ResultBody.h

index 737a563b34aeaa54469b29c06045357c45a75d86,0e997edafe6fe27d0eda36920a0cdb026c80a0e9..b49f5885488d020c7618e28923def08d36433ae3
  #include <ModelAPI_AttributeDouble.h>
  #include <ModelAPI_AttributeSelection.h>
  #include <ModelAPI_AttributeBoolean.h>
 -
 +#include <Events_Error.h>
  #include <GeomAlgoAPI_Extrusion.h>
 -
 +#include <TopoDS_Shape.hxx>
 +#include <TopTools_DataMapOfShapeShape.hxx>
 +#include <TopExp_Explorer.hxx>
 +#include <TopTools_MapOfShape.hxx>
  using namespace std;
 -
 +#define _LATERAL_TAG 1
 +#define _FIRST_TAG 2
 +#define _LAST_TAG 3
 +#ifdef _DEBUG
 +#include <iostream>
 +#include <ostream>
 +#endif
  FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion()
  {
  }
@@@ -42,110 -33,16 +42,112 @@@ void FeaturesPlugin_Extrusion::execute(
        ModelAPI_AttributeSelection>(data()->attribute(FeaturesPlugin_Extrusion::FACE_ID()));
    if (!aFaceRef)
      return;
 +
    boost::shared_ptr<GeomAPI_Shape> aFace = 
      boost::dynamic_pointer_cast<GeomAPI_Shape>(aFaceRef->value());
+   if (!aFace)
+     return;
  
 +  boost::shared_ptr<GeomAPI_Shape> aContext = 
 +    boost::dynamic_pointer_cast<GeomAPI_Shape>(aFaceRef->context());
 +
    double aSize = data()->real(FeaturesPlugin_Extrusion::SIZE_ID())->value();
    if (data()->boolean(FeaturesPlugin_Extrusion::REVERSE_ID())->value())
      aSize = -aSize;
  
 -  boost::shared_ptr<ModelAPI_ResultBody> aResult = document()->createBody(data());
 -  aResult->store(GeomAlgoAPI_Extrusion::makeExtrusion(aFace, aSize));
 -  setResult(aResult);
 +  boost::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data());
 +  //TCollection_AsciiString anError;
 +  GeomAlgoAPI_Extrusion aFeature(aFace, aSize);
 +  if(!aFeature.isDone()) {
 +      std::string aFeatureError = "Extrusion algorithm failed";  
 +    Events_Error::send(aFeatureError, this);
 +      return;
 +  }
 +
 +   // Check if shape is valid
 +  if (!aFeature.shape()->impl<TopoDS_Shape>().IsNull()) {
 +    std::string aShapeError = "Resulting shape is Null";     
 +    Events_Error::send(aShapeError, this);
 + #ifdef _DEBUG
 +    std::cerr << aShapeError << std::endl;
 + #endif
 +    return;
 +  }
 +   if(!aFeature.isValid()) {
 +      std::string aFeatureError = "Warning: resulting shape is not valid";  
 +    Events_Error::send(aFeatureError, this);
 +      return;
 +  }  
 +  //LoadNamingDS
 +  LoadNamingDS(aFeature, aResultBody, aFace, aContext);
 +
 +  setResult(aResultBody);
 +}
 +
 +  //============================================================================
 +void FeaturesPlugin_Extrusion::LoadNamingDS(GeomAlgoAPI_Extrusion& theFeature, 
 +                                   boost::shared_ptr<ModelAPI_ResultBody> theResultBody, 
 +                                                               boost::shared_ptr<GeomAPI_Shape> theBasis,
 +                                   boost::shared_ptr<GeomAPI_Shape> theContext)
 +{  
 +
 +      
 +    //load result
 +      if(theBasis->impl<TopoDS_Shape>().IsEqual(theContext->impl<TopoDS_Shape>()))
 +        theResultBody->store(theFeature.shape());
 +      else
 +        theResultBody->storeGenerated(theContext, theFeature.shape());
 +
 +      TopTools_DataMapOfShapeShape aSubShapes;
 +      for (TopExp_Explorer Exp(theFeature.shape()->impl<TopoDS_Shape>(),TopAbs_FACE); Exp.More(); Exp.Next()) {
 +        aSubShapes.Bind(Exp.Current(),Exp.Current());
 +      }
 +
 +      //Insert lateral face : Face from Edge
 +      //GeomAlgoAPI_DFLoader::loadAndOrientGeneratedShapes(*myBuilder, myBasis, TopAbs_EDGE, aLateralFaceBuilder, aSubShapes);
 +
 +
 +  TopTools_MapOfShape aView;
 +  TopExp_Explorer aShapeExplorer (theFeature.shape()->impl<TopoDS_Shape>(), TopAbs_EDGE);
 +  for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
 +    const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
 +    if (!aView.Add(aRoot)) continue;
 +      boost::shared_ptr<GeomAPI_Shape> aRootG(new GeomAPI_Shape());
 +      aRootG->setImpl((void *)&aRoot);
 +      const ListOfShape& aShapes = theFeature.generated(aRootG);
 +      std::list<boost::shared_ptr<GeomAPI_Shape> >::const_iterator anIt = aShapes.begin(), aLast = aShapes.end();       
 +      for (; anIt != aLast; anIt++) {
 +      TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>(); 
 +      if (aSubShapes.IsBound(aNewShape)) {
 +        aNewShape.Orientation((aSubShapes(aNewShape)).Orientation());
 +      }
 +
 +        if (!aRoot.IsSame (aNewShape)) {
 +              boost::shared_ptr<GeomAPI_Shape> aNew(new GeomAPI_Shape());
 +          aNew->setImpl((void *)&aNewShape);
 +                theResultBody->generated(aRootG, aNew,_LATERAL_TAG); 
 +        }
 +      }
 +  }
 +
 +  //Insert bottom face
 +  const boost::shared_ptr<GeomAPI_Shape>& aBottomFace = theFeature.firstShape();
 +  if (!aBottomFace->impl<TopoDS_Shape>().IsNull()) {
 +        if (aSubShapes.IsBound(aBottomFace->impl<TopoDS_Shape>())) {
 +              aBottomFace->setImpl((void *)&aSubShapes(aBottomFace->impl<TopoDS_Shape>()));
 +        }    
 +  theResultBody->generated(aBottomFace, _FIRST_TAG);
 +  }
 +
 +  
 +
 + //Insert top face
 +  boost::shared_ptr<GeomAPI_Shape> aTopFace = theFeature.lastShape();
 +  if (!aTopFace->impl<TopoDS_Shape>().IsNull()) {
 +      if (aSubShapes.IsBound(aTopFace->impl<TopoDS_Shape>())) {
 +              aTopFace->setImpl((void *)&aSubShapes(aTopFace->impl<TopoDS_Shape>()));
 +      }
 +    theResultBody->generated(aTopFace, _FIRST_TAG);
 +  }
 +
- }
+ }
index acd39c6ec400dbcb37e0d388790647f2e11d6dec,96db714562f42983e3730546629d62bb049c306e..55db3759aec02a5e3cc56653910723489a845365
@@@ -7,7 -7,6 +7,7 @@@
  
  #include <GeomAPI_Interface.h>
  #include <boost/shared_ptr.hpp>
 +#include <list>
  
  /**\class GeomAPI_Shape
   * \ingroup DataModel
@@@ -32,5 -31,7 +32,11 @@@ class GEOMAPI_EXPORT GeomAPI_Shape : pu
  
  };
  
++<<<<<<< HEAD
 +typedef std::list<boost::shared_ptr<GeomAPI_Shape>> ListOfShape;
++=======
+ //! Pointer on attribute object
+ typedef boost::shared_ptr<GeomAPI_Shape> GeomShapePtr;
++>>>>>>> 01cda8378dd1cff425f88438e8c0085122ed7495
  #endif
index 090de2d9e3200da44225803c0a25ebd440b16e40,1fad264d8122ff265b11deea8178ad15d0ce9bce..9b18bc0469d0bc5492d6e270d84aebd05c3012e9
@@@ -12,6 -12,7 +12,7 @@@
  
  Model_ResultBody::Model_ResultBody()
  {
+   setIsConcealed(false);
  }
  
  void Model_ResultBody::store(const boost::shared_ptr<GeomAPI_Shape>& theShape)
    boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
    if (aData) {
      TDF_Label& aShapeLab = aData->shapeLab();
 -    // remove the previous history
 -    clean();
 -    aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID());
 -    for(TDF_ChildIterator anIter(aShapeLab); anIter.More(); anIter.Next()) {
 -      anIter.Value().ForgetAllAttributes();
 -    }
 +    // clean builders
 +    clean();   
      // store the new shape as primitive
      TNaming_Builder aBuilder(aShapeLab);
      if (!theShape)
    }
  }
  
 +void Model_ResultBody::storeGenerated(const boost::shared_ptr<GeomAPI_Shape>& theFromShape,
 +                                        const boost::shared_ptr<GeomAPI_Shape>& theToShape)
 +{
 +  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
 +  if (aData) {
 +    TDF_Label& aShapeLab = aData->shapeLab();
 +    // clean builders
 +    clean();   
 +    // store the new shape as primitive
 +    TNaming_Builder aBuilder(aShapeLab);
 +    if (!theFromShape || !theToShape)
 +      return;  // bad shape
 +    TopoDS_Shape aShapeBasis = theFromShape->impl<TopoDS_Shape>();
 +    if (aShapeBasis.IsNull())
 +      return;  // null shape inside
 +      TopoDS_Shape aShapeNew = theToShape->impl<TopoDS_Shape>();
 +    if (aShapeNew.IsNull())
 +      return;  // null shape inside
 +    aBuilder.Generated(aShapeBasis, aShapeNew);
 +  }
 +}
 +
 +void Model_ResultBody::storeModified(const boost::shared_ptr<GeomAPI_Shape>& theOldShape,
 +                                        const boost::shared_ptr<GeomAPI_Shape>& theNewShape)
 +{
 +  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
 +  if (aData) {
 +    TDF_Label& aShapeLab = aData->shapeLab();
 +    // clean builders
 +    clean();   
 +    // store the new shape as primitive
 +    TNaming_Builder aBuilder(aShapeLab);
 +    if (!theOldShape || !theNewShape)
 +      return;  // bad shape
 +    TopoDS_Shape aShapeOld = theOldShape->impl<TopoDS_Shape>();
 +    if (aShapeOld.IsNull())
 +      return;  // null shape inside
 +      TopoDS_Shape aShapeNew = theNewShape->impl<TopoDS_Shape>();
 +    if (aShapeNew.IsNull())
 +      return;  // null shape inside
 +    aBuilder.Generated(aShapeOld, aShapeNew);
 +  }
 +}
 +
  boost::shared_ptr<GeomAPI_Shape> Model_ResultBody::shape()
  {
    boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(data());
index 36154744134df671ddee40c329eb2dd67a51c920,db329c1fc621be76c2fab6d7afd0015c197ab20a..8942a62f207a10a6917389e718c386b721a1559e
@@@ -36,23 -36,9 +36,18 @@@ public
  
    /// Stores the shape (called by the execution method).
    virtual void store(const boost::shared_ptr<GeomAPI_Shape>& theShape) = 0;
 +
 +  /// Stores the generated shape (called by the execution method).
 +  virtual void storeGenerated(const boost::shared_ptr<GeomAPI_Shape>& theFromShape,
 +                                const boost::shared_ptr<GeomAPI_Shape>& theToShape) = 0;
 +
 +  /// Stores the modified shape (called by the execution method).
 +  virtual void storeModified(const boost::shared_ptr<GeomAPI_Shape>& theOldShape,
 +                                const boost::shared_ptr<GeomAPI_Shape>& theNewShape) = 0;
 +
    /// Returns the shape-result produced by this feature
    virtual boost::shared_ptr<GeomAPI_Shape> shape() = 0;
  
-   /// To virtually destroy the fields of successors
-   virtual ~ModelAPI_ResultBody()
-   {
-   }
    /// Records the subshape newShape which was generated during a topological construction.
    /// As an example, consider the case of a face generated in construction of a box.
    virtual void generated(
      const boost::shared_ptr<GeomAPI_Shape>& theOldShape, const int theTag = 1) = 0;
  
  protected:
-   /// Use plugin manager for features creation: this method is 
-   /// defined here only for SWIG-wrapping
-   ModelAPI_ResultBody()
-   {
-   }
  };
  
  //! Pointer on feature object