X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_FinderShapeOn.cxx;h=f3834064aea1e6cd97eff3ab1d9dec5377a39b78;hb=47e260a9746423b69d6f29e941c845d851da64c7;hp=775522cab969c71cd94ec16e84ffe69da9f2fe03;hpb=ca429d817a18d6acc571443f6a596575dee03c2f;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx index 775522cab..f3834064a 100644 --- a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx @@ -1,12 +1,37 @@ -// File: GEOMAlgo_FinderShapeOn.cxx -// Created: Tue Jan 11 14:44:31 2005 -// Author: Peter KURNEV -// +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File: GEOMAlgo_FinderShapeOn.cxx +// Created: Tue Jan 11 14:44:31 2005 +// Author: Peter KURNEV +#include -#include +#include + +#include #include +#include #include #include @@ -16,14 +41,18 @@ #include #include #include - #include #include #include #include +#include +#include +#include + #include +#include #include #include @@ -31,17 +60,21 @@ #include #include -#include #include #include #include #include +#include +#include +#include +#include +#include //======================================================================= //function : GEOMAlgo_FinderShapeOn -//purpose : +//purpose : //======================================================================= GEOMAlgo_FinderShapeOn::GEOMAlgo_FinderShapeOn() : @@ -49,18 +82,19 @@ GEOMAlgo_FinderShapeOn::GEOMAlgo_FinderShapeOn() { myTolerance=0.0001; myShapeType=TopAbs_VERTEX; - myState=GEOMAlgo_ST_UNKNOWN; + myState=GEOMAlgo_ST_UNKNOWN; + myIsAnalytic=Standard_True; } //======================================================================= //function : ~ -//purpose : +//purpose : //======================================================================= GEOMAlgo_FinderShapeOn::~GEOMAlgo_FinderShapeOn() { } //======================================================================= //function : SetSurface -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::SetSurface(const Handle(Geom_Surface)& aS) { @@ -68,7 +102,7 @@ void GEOMAlgo_FinderShapeOn::SetSurface(const Handle(Geom_Surface)& aS) } //======================================================================= //function : Surface -//purpose : +//purpose : //======================================================================= const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn::Surface() const { @@ -76,7 +110,7 @@ const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn::Surface() const } //======================================================================= //function : SetShapeType -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::SetShapeType(const TopAbs_ShapeEnum aType) { @@ -84,7 +118,7 @@ void GEOMAlgo_FinderShapeOn::SetShapeType(const TopAbs_ShapeEnum aType) } //======================================================================= //function : ShapeType -//purpose : +//purpose : //======================================================================= TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn::ShapeType()const { @@ -92,7 +126,7 @@ TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn::ShapeType()const } //======================================================================= //function : SetState -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::SetState(const GEOMAlgo_State aState) { @@ -100,7 +134,7 @@ void GEOMAlgo_FinderShapeOn::SetState(const GEOMAlgo_State aState) } //======================================================================= //function : State -//purpose : +//purpose : //======================================================================= GEOMAlgo_State GEOMAlgo_FinderShapeOn::State() const { @@ -108,21 +142,40 @@ GEOMAlgo_State GEOMAlgo_FinderShapeOn::State() const } //======================================================================= // function: Shapes -// purpose: +// purpose: //======================================================================= const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn::Shapes() const { + Standard_Boolean bIsConformState; + Standard_Integer i, aNb; + TopAbs_State aSt; + TopTools_ListOfShape* pL; + // + pL=(TopTools_ListOfShape*) &myLS; + pL->Clear(); + // + aNb=myMSS.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myMSS.FindKey(i); + aSt=myMSS.FindFromIndex(i); + // + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + if (bIsConformState) { + pL->Append(aS); + } + } return myLS; } //======================================================================= //function : Perform -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::Perform() { myErrorStatus=0; myWarningStatus=0; myLS.Clear(); + myMSS.Clear(); // if (!myResult.IsNull()){ myResult.Nullify(); @@ -133,128 +186,251 @@ void GEOMAlgo_FinderShapeOn::Perform() return; } // - MakeArguments(); - if(myErrorStatus || myWarningStatus) { + // Initialize the context + GEOMAlgo_ShapeAlgo::Perform(); + // + myIsAnalytic=GEOMAlgo_SurfaceTools::IsAnalytic(mySurface); + // + MakeArgument1(); + if(myErrorStatus) { return; } // - Find(); + if (myIsAnalytic && myShapeType==TopAbs_VERTEX) { + FindVertices(); + return; + } + // + MakeArgument2(); if(myErrorStatus) { return; } // + Find(); + if(myErrorStatus || myWarningStatus) { + return; + } + // +} +//======================================================================= +//function : FindVertices +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::FindVertices() +{ + Standard_Integer i, aNb, iErr; + TopAbs_State aSt; + TopAbs_Orientation aOr; + gp_Pnt aP; + TopTools_IndexedMapOfShape aM; + // + TopExp::MapShapes(myArg1, TopAbs_FACE, aM); + const TopoDS_Face& aF=TopoDS::Face(aM(1)); + aOr=aF.Orientation(); + // + aM.Clear(); + TopExp::MapShapes(myShape, myShapeType, aM); + aNb=aM.Extent(); + if (!aNb) { + myWarningStatus=10; // No found sub-shapes of type myShapeType + return; + } + // + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + const TopoDS_Vertex& aV=TopoDS::Vertex(aS); + aP=BRep_Tool::Pnt(aV); + iErr=GEOMAlgo_SurfaceTools::GetState(aP, mySurface, myTolerance, aSt); + if (aOr==TopAbs_REVERSED) { + aSt=GEOMAlgo_SurfaceTools::ReverseState(aSt); + } + myMSS.Add(aS, aSt); + } } //======================================================================= //function : Find -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::Find() { - myErrorStatus=0; + Standard_Integer i, aNb; + Standard_Boolean bICS; + TopTools_IndexedMapOfShape aM; // - Standard_Boolean bIsDone; - Standard_Integer iErr; - TopTools_ListIteratorOfListOfShape aIt; - BRep_Builder aBB; - BOPTools_DSFiller aDF; - GEOMAlgo_ShapeSolid* pSS; + TopExp::MapShapes(myArg2, myShapeType, aM); // - // 1. Prepare DSFiller - aDF.SetShapes (myArg1, myArg2); - bIsDone=aDF.IsDone(); - if (!bIsDone) { - myErrorStatus=30; // wrong args are used for DSFiller + aNb=aM.Extent(); + if (!aNb) { + myWarningStatus=10; // No found sub-shapes of type myShapeType return; } - aDF.Perform(); - bIsDone=aDF.IsDone(); - if (!bIsDone) { - myErrorStatus=31; // DSFiller failed - return; + // + bICS=GEOMAlgo_AlgoTools::IsCompositeShape(myArg2); + if (!bICS || myIsAnalytic) { + TopoDS_Compound aCmp; + BRep_Builder aBB; + // + aBB.MakeCompound(aCmp); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aSi=aM(i); + aBB.Add(aCmp, aSi); + } + // + aM.Clear(); + aM.Add(aCmp); + aNb=1; } - // - // 2. Find shapes - myLS.Clear(); // - if (myShapeType==TopAbs_VERTEX) { - pSS=new GEOMAlgo_VertexSolid; + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + Find(aS); + if (myErrorStatus) { + return; + } } - else if (myShapeType==TopAbs_EDGE) { - pSS=new GEOMAlgo_WireSolid; +} +//======================================================================= +//function : Find +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::Find(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + Standard_Integer i, iErr; + TopAbs_State aSts[]={TopAbs_IN, TopAbs_OUT, TopAbs_ON}; + TopTools_ListIteratorOfListOfShape aIt; + BOPCol_ListOfShape aLS; + BOPAlgo_PaveFiller aPF; + // + // 1. Prepare DSFiller + aLS.Append(myArg1); + aLS.Append(aS); + aPF.SetArguments(aLS); + // + aPF.Perform(); + iErr=aPF.ErrorStatus(); + if (iErr) { + myErrorStatus=31; // PaveFiller is failed + return; } - else if (myShapeType==TopAbs_FACE) { - pSS=new GEOMAlgo_ShellSolid; + // + // 2. Find shapes + GEOMAlgo_ShapeSolid* pSS; + GEOMAlgo_VertexSolid aVXS; + GEOMAlgo_WireSolid aWRS; + GEOMAlgo_ShellSolid aSHS; + GEOMAlgo_SolidSolid aSLS; + // + pSS=NULL; + // + switch (myShapeType) { + case TopAbs_VERTEX: + pSS=&aVXS; + break; + case TopAbs_EDGE: + pSS=&aWRS; + break; + case TopAbs_FACE: + pSS=&aSHS; + break; + case TopAbs_SOLID: + aSLS.SetShape2(myArg2); + pSS=&aSLS; + break; + default: + myErrorStatus=12; // unallowed sub-shape type + return; } // - pSS->SetFiller(aDF); + pSS->SetFiller(aPF); pSS->Perform(); iErr=pSS->ErrorStatus(); if (iErr) { myErrorStatus=32; // builder ShapeSolid failed - delete pSS; return; } // - const TopTools_ListOfShape& aLS=pSS->Shapes(myState); - // - aIt.Initialize(aLS); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aSImage=aIt.Value(); - if (myImages.IsBound(aSImage)) { - const TopoDS_Shape& aS=myImages.Find(aSImage); - myLS.Append(aS); - } - else { - myErrorStatus=33;// can not find original shape - return; + for (i=0; i<3; ++i) { + const TopTools_ListOfShape& aLS=pSS->Shapes(aSts[i]); + aIt.Initialize(aLS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSImage=aIt.Value(); + if (myImages.IsBound(aSImage)) { + const TopoDS_Shape& aSx=myImages.Find(aSImage); + myMSS.Add(aSx, aSts[i]); + } + else { + myErrorStatus=33;// can not find original shape + return; + } } } - // - delete pSS; } //======================================================================= -//function : MakeArguments -//purpose : +//function : MakeArgument1 +//purpose : //======================================================================= -void GEOMAlgo_FinderShapeOn::MakeArguments() +void GEOMAlgo_FinderShapeOn::MakeArgument1() { myErrorStatus=0; // Standard_Integer i, aNb; + TopAbs_ShapeEnum aType; BRepLib_FaceError aFErr; BRepLib_MakeFace aMF; TopTools_IndexedMapOfShape aM; BRep_Builder aBB; - TopoDS_Compound aCmp; + TopoDS_Face aFace; TopoDS_Shell aSh; TopoDS_Solid aSd; - TopoDS_Shape aSC; - TopTools_DataMapOfShapeShape aOriginals; - TopExp_Explorer aExp; // // Argument 1 - aMF.Init(mySurface, Standard_True); - aFErr=aMF.Error(); - if (aFErr!=BRepLib_FaceDone) { - myErrorStatus=20; // can not build the face - return; - } - // - const TopoDS_Shape& aF=aMF.Shape(); - // - // update tolerance - aExp.Init(aF, TopAbs_VERTEX); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Vertex& aV=TopoDS::Vertex(aExp.Current()); - aBB.UpdateVertex(aV, myTolerance); - } - aExp.Init(aF, TopAbs_EDGE); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current()); - aBB.UpdateEdge(aE, myTolerance); + if (!myIsAnalytic) { + aMF.Init(mySurface, Standard_True, Precision::Confusion()); + + aFErr=aMF.Error(); + if (aFErr!=BRepLib_FaceDone) { + myErrorStatus=20; // can not build the face + return; + } + // + const TopoDS_Shape& aF=aMF.Shape(); + aFace=TopoDS::Face(aF); + // + // update tolerances + aM.Add(aF); + TopExp::MapShapes(aF, TopAbs_VERTEX, aM); + TopExp::MapShapes(aF, TopAbs_EDGE, aM); + + aNb=aM.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + aType=aS.ShapeType(); + switch (aType) { + case TopAbs_VERTEX: { + const TopoDS_Vertex& aVx=TopoDS::Vertex(aS); + aBB.UpdateVertex(aVx, myTolerance); + } + break; + case TopAbs_EDGE: { + const TopoDS_Edge& aEx=TopoDS::Edge(aS); + aBB.UpdateEdge(aEx, myTolerance); + } + break; + case TopAbs_FACE: { + const TopoDS_Face& aFx=TopoDS::Face(aS); + aBB.UpdateFace(aFx, myTolerance); + } + break; + default: + break; + } + } + } // + else { + aBB.MakeFace(aFace, mySurface, myTolerance); } - const TopoDS_Face& aFace=TopoDS::Face(aF); - aBB.UpdateFace(aFace, myTolerance); // // make solid aBB.MakeShell(aSh); @@ -262,30 +438,27 @@ void GEOMAlgo_FinderShapeOn::MakeArguments() aBB.MakeSolid(aSd); aBB.Add(aSd, aSh); myArg1=aSd; +} +//======================================================================= +//function : MakeArgument2 +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::MakeArgument2() +{ + myErrorStatus=0; // - // Argument 2 + TopoDS_Shape aSC; + TopTools_DataMapOfShapeShape aOriginals; // myImages.Clear(); // GEOMAlgo_FinderShapeOn::CopySource(myShape, myImages, aOriginals, aSC); // - TopExp::MapShapes(aSC, myShapeType, aM); - aNb=aM.Extent(); - if (!aNb) { - myWarningStatus=10; // No found subshapes of type myShapeType - return; - } - // - aBB.MakeCompound(aCmp); - for (i=1; i<=aNb; ++i) { - const TopoDS_Shape& aS=aM(i); - aBB.Add(aCmp, aS); - } - myArg2=aCmp; + myArg2=aSC; } //======================================================================= //function : CheckData -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::CheckData() { @@ -302,13 +475,14 @@ void GEOMAlgo_FinderShapeOn::CheckData() } // if (!(myShapeType==TopAbs_VERTEX || - myShapeType==TopAbs_EDGE || - myShapeType==TopAbs_FACE)) { - myErrorStatus=12; // unallowed subshape type + myShapeType==TopAbs_EDGE || + myShapeType==TopAbs_FACE || + myShapeType==TopAbs_SOLID)) { + myErrorStatus=12; // unallowed sub-shape type return; } // - if (myState==GEOMAlgo_ST_UNKNOWN || + if (myState==GEOMAlgo_ST_UNKNOWN || myState==GEOMAlgo_ST_INOUT) { myErrorStatus=13; // unallowed state type return; @@ -317,12 +491,12 @@ void GEOMAlgo_FinderShapeOn::CheckData() // //======================================================================= //function : CopySource -//purpose : +//purpose : //======================================================================= void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, - TopTools_DataMapOfShapeShape& aImages, - TopTools_DataMapOfShapeShape& aOriginals, - TopoDS_Shape& aEx) + TopTools_DataMapOfShapeShape& aImages, + TopTools_DataMapOfShapeShape& aOriginals, + TopoDS_Shape& aEx) { Standard_Boolean bFree; TopAbs_ShapeEnum aType; @@ -334,9 +508,7 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, // if (aOriginals.IsBound(aE)) { aEx=aOriginals.ChangeFind(aE); - if (aType==TopAbs_EDGE) { - return; - } + return; } else { aEx=aE.EmptyCopied(); @@ -359,7 +531,7 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, const TopoDS_Shape& aV=aIt.Value(); TopoDS_Shape aVx; // - CopySource (aV, aImages, aOriginals, aVx); + CopySource (aV, aImages, aOriginals, aVx); // aVx.Orientation(aV.Orientation()); BB.Add(aEx, aVx); @@ -367,14 +539,67 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, // aEx.Free(bFree); } +// +//======================================================================= +//function : BuildTriangulation +//purpose : +//======================================================================= +Standard_Boolean + GEOMAlgo_FinderShapeOn::BuildTriangulation (const TopoDS_Shape& theShape) +{ + // calculate deflection + Standard_Real aDeviationCoefficient = 0.001; + + Bnd_Box B; + BRepBndLib::Add(theShape, B); + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + Standard_Real dx = aXmax - aXmin, dy = aYmax - aYmin, dz = aZmax - aZmin; + Standard_Real aDeflection = Max(Max(dx, dy), dz) * aDeviationCoefficient * 4; + Standard_Real aHLRAngle = 0.349066; + + // build triangulation + BRepMesh_IncrementalMesh Inc (theShape, aDeflection, Standard_False, aHLRAngle); + + // check triangulation + bool isTriangulation = true; + + TopExp_Explorer exp (theShape, TopAbs_FACE); + if (exp.More()) + { + TopLoc_Location aTopLoc; + Handle(Poly_Triangulation) aTRF; + aTRF = BRep_Tool::Triangulation(TopoDS::Face(exp.Current()), aTopLoc); + if (aTRF.IsNull()) { + isTriangulation = false; + } + } + else // no faces, try edges + { + TopExp_Explorer expe (theShape, TopAbs_EDGE); + if (!expe.More()) { + isTriangulation = false; + } + else { + TopLoc_Location aLoc; + Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(expe.Current()), aLoc); + if (aPE.IsNull()) { + isTriangulation = false; + } + } + } + + return isTriangulation; +} // // myErrorStatus : // // 10 -mySurface=NULL // 11 -myShape=NULL -// 12 -unallowed type of subshapes -// 13 -unallowed state +// 12 -unallowed type of sub-shapes +// 13 -unallowed state // 20 -can not build the face // 30 -wrong args are used for DSFiller // 31 -DSFiller failed @@ -383,5 +608,4 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, // // myWarningStatus // -// 10 -subshapes of type myShapeType can not be fond in myShape - +// 10 - sub-shapes of type myShapeType can not be fond in myShape