X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Extrusion.cpp;h=29c4aec277baa4167af118b36f05d4f343f9e261;hb=8d8878b385494638fbe5fad10bbcdee9c9d04f30;hp=b81b0f5fe2b1fa09b9a9150b70ac6ba4dac3f7d7;hpb=ba8a9c21c83e3ab7e65e5a1aa961bbd1df6850a2;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Extrusion.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Extrusion.cpp index b81b0f5fe..29c4aec27 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Extrusion.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Extrusion.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: GeomAlgoAPI_Extrusion.cpp // Created: 06 Jun 2014 // Author: Artem ZHIDKOV @@ -5,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -19,27 +21,25 @@ #include #include #include -#include +#include #include #include const double tolerance = Precision::Angular(); // Constructor GeomAlgoAPI_Extrusion::GeomAlgoAPI_Extrusion( - boost::shared_ptr theBasis, double theSize) -: mySize(theSize), myDone(false), - myShape(new GeomAPI_Shape()), myFirst(new GeomAPI_Shape()), myLast(new GeomAPI_Shape()) + std::shared_ptr theBasis, double theSize) +: mySize(theSize), myDone(false), myShape(new GeomAPI_Shape()), + myFirst(new GeomAPI_Shape()), myLast(new GeomAPI_Shape()) { build(theBasis); } //============================================================================ -void GeomAlgoAPI_Extrusion::build(const boost::shared_ptr& theBasis) +void GeomAlgoAPI_Extrusion::build(const std::shared_ptr& theBasis) { bool isFirstNorm = true; gp_Dir aShapeNormal; - - //const TopoDS_Shape& aShape = theShape->impl(); TopoDS_Face aBasis = TopoDS::Face(theBasis->impl()); Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast( BRep_Tool::Surface(aBasis)); @@ -54,21 +54,24 @@ void GeomAlgoAPI_Extrusion::build(const boost::shared_ptr& theBas if(aBuilder) { setImpl(aBuilder); myDone = aBuilder->IsDone() == Standard_True; - if (myDone) { - BRepCheck_Analyzer aChecker(aBuilder->Shape()); - myDone = aChecker.IsValid() == Standard_True; - } - if(myDone) { + if (myDone) { TopoDS_Shape aResult; if(aBuilder->Shape().ShapeType() == TopAbs_COMPOUND) aResult = GeomAlgoAPI_DFLoader::refineResult(aBuilder->Shape()); else 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)); myFirst->setImpl(new TopoDS_Shape(aBuilder->FirstShape())); myLast->setImpl(new TopoDS_Shape(aBuilder-> LastShape())); - } - } + myMkShape = new GeomAlgoAPI_MakeShape (aBuilder); + } + } } //============================================================================ @@ -78,7 +81,8 @@ const bool GeomAlgoAPI_Extrusion::isDone() const //============================================================================ const bool GeomAlgoAPI_Extrusion::isValid() const { - return myDone; + BRepCheck_Analyzer aChecker(myShape->impl()); + return (aChecker.IsValid() == Standard_True); } //============================================================================ @@ -96,104 +100,39 @@ const bool GeomAlgoAPI_Extrusion::hasVolume() const } //============================================================================ -const boost::shared_ptr& GeomAlgoAPI_Extrusion::shape () const -{return myShape;} - -//============================================================================ -void GeomAlgoAPI_Extrusion::generated( - const boost::shared_ptr theShape, ListOfShape& theHistory) +const std::shared_ptr& GeomAlgoAPI_Extrusion::shape () const { - theHistory.clear(); - if(myDone) { - const TopTools_ListOfShape& aList = implPtr() - ->Generated(theShape->impl()); - TopTools_ListIteratorOfListOfShape it(aList); - for(;it.More();it.Next()) { - boost::shared_ptr aShape(new GeomAPI_Shape()); - aShape->setImpl(&(it.Value())); - theHistory.push_back(aShape); - } - } + return myShape; } //============================================================================ -const boost::shared_ptr& GeomAlgoAPI_Extrusion::firstShape() +const std::shared_ptr& GeomAlgoAPI_Extrusion::firstShape() { return myFirst; } //============================================================================ -const boost::shared_ptr& GeomAlgoAPI_Extrusion::lastShape() +const std::shared_ptr& GeomAlgoAPI_Extrusion::lastShape() { return myLast; } //============================================================================ -/* -void GeomAlgoAPI_Extrusion::LoadNamingDS(boost::shared_ptr theResultBody, -boost::shared_ptr theContext) +void GeomAlgoAPI_Extrusion::mapOfShapes (GeomAPI_DataMapOfShapeShape& theMap) const { -if(isValid()) { -const TopoDS_Shape& aShape = myBuilder->Shape(); -TopoDS_Shape aResult = GeomAlgoAPI_DFLoader::refineResult(aShape); -boost::shared_ptr aData = boost::dynamic_pointer_cast(theResultBody->data()); -if (aData) { -const TDF_Label& aShapeLab = aData->shapeLab(); -const Handle(TDF_TagSource)& Tagger = TDF_TagSource::Set(aShapeLab); -if (Tagger.IsNull()) return; -Tagger->Set(0); - -TNaming_Builder aBuilder (aShapeLab); -if(myBasis.IsEqual(theContext->impl())) -aBuilder.Generated(aResult); -else -aBuilder.Generated(theContext->impl(), aResult); - -TopTools_DataMapOfShapeShape aSubShapes; -for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) { -aSubShapes.Bind(Exp.Current(),Exp.Current()); -} - -//Insert lateral face : Face from Edge -TNaming_Builder aLateralFaceBuilder(aShapeLab.NewChild()); -GeomAlgoAPI_DFLoader::loadAndOrientGeneratedShapes(*myBuilder, myBasis, TopAbs_EDGE, aLateralFaceBuilder, aSubShapes); - -//Insert bottom face -TopoDS_Shape aBottomFace = myBuilder->FirstShape(); -if (!aBottomFace.IsNull()) { -if (aBottomFace.ShapeType() != TopAbs_COMPOUND) { -TNaming_Builder aBottomBuilder(aShapeLab.NewChild()); //2 -if (aSubShapes.IsBound(aBottomFace)) { -aBottomFace = aSubShapes(aBottomFace); -} -aBottomBuilder.Generated(aBottomFace); -} else { -TopoDS_Iterator itr(aBottomFace); -for (; itr.More(); itr.Next()) { -TNaming_Builder aBottomBuilder(aShapeLab.NewChild()); -aBottomBuilder.Generated(itr.Value()); -} + theMap = myMap; } +//============================================================================ +GeomAlgoAPI_MakeShape * GeomAlgoAPI_Extrusion::makeShape() const +{ + return myMkShape; } -//Insert top face -TopoDS_Shape aTopFace = myBuilder->LastShape(); -if (!aTopFace.IsNull()) { -if (aTopFace.ShapeType() != TopAbs_COMPOUND) { -TNaming_Builder aTopBuilder(aShapeLab.NewChild()); //3 -if (aSubShapes.IsBound(aTopFace)) { -aTopFace = aSubShapes(aTopFace); -} -aTopBuilder.Generated(aTopFace); -} else { -TopoDS_Iterator itr(aTopFace); -for (; itr.More(); itr.Next()) { -TNaming_Builder aTopBuilder(aShapeLab.NewChild()); -aTopBuilder.Generated(itr.Value()); -} -} -} -} -} -*/ \ No newline at end of file +//============================================================================ +GeomAlgoAPI_Extrusion::~GeomAlgoAPI_Extrusion() +{ + if (myImpl) { + myMap.clear(); + } +} \ No newline at end of file