X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_HypoFilter.cxx;h=d0125d1e56083efe4f2c89912ffd6333a8196d01;hp=2e4469fb45aa58deebb255fbe9412e5f300f2dc1;hb=eb22cf46cb0f386218d79291dfebcec8fc831055;hpb=4ff5bd61540272713e48de1eee75625028c32155 diff --git a/src/SMESH/SMESH_HypoFilter.cxx b/src/SMESH/SMESH_HypoFilter.cxx index 2e4469fb4..d0125d1e5 100644 --- a/src/SMESH/SMESH_HypoFilter.cxx +++ b/src/SMESH/SMESH_HypoFilter.cxx @@ -1,35 +1,38 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions +// Copyright (C) 2007-2014 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. // -// Copyright (C) 2003 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. -// -// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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 // + +// SMESH SMESH : implementaion of SMESH idl descriptions // File : SMESH_HypoFilter.cxx // Module : SMESH -// $Header$ - +// #include "SMESH_HypoFilter.hxx" +#include "SMESH_Gen.hxx" #include "SMESH_Hypothesis.hxx" +#include "SMESH_MesherHelper.hxx" #include "SMESH_subMesh.hxx" +#include + using namespace std; @@ -113,17 +116,77 @@ bool SMESH_HypoFilter::InstancePredicate::IsOk(const SMESH_Hypothesis* aHyp, //======================================================================= bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const + const TopoDS_Shape& aShape) const { return ( !_mainShape.IsNull() && !aShape.IsNull() && _mainShape.IsSame( aShape )); } +//================================================================================ +/*! + * \brief Finds shapes preferable over _shape due to sub-mesh order + */ +//================================================================================ + +void SMESH_HypoFilter::IsMoreLocalThanPredicate::findPreferable() +{ + const int shapeID = _mesh.GetMeshDS()->ShapeToIndex( _shape ); + const TListOfListOfInt& listOfShapeIDList = _mesh.GetMeshOrder(); + TListOfListOfInt::const_iterator listsIt = listOfShapeIDList.begin(); + for ( ; listsIt != listOfShapeIDList.end(); ++listsIt ) + { + const TListOfInt& idList = *listsIt; + TListOfInt::const_iterator idIt = + std::find( idList.begin(), idList.end(), shapeID ); + if ( idIt != idList.end() && *idIt != idList.front() ) + { + for ( ; idIt != idList.end(); --idIt ) + { + const TopoDS_Shape& shape = _mesh.GetMeshDS()->IndexToShape( *idIt ); + if ( !shape.IsNull()) + _preferableShapes.Add( shape ); + } + } + } +} + +//======================================================================= +//function : IsMoreLocalThanPredicate::IsOk +//purpose : +//======================================================================= + +bool SMESH_HypoFilter::IsMoreLocalThanPredicate::IsOk(const SMESH_Hypothesis* aHyp, + const TopoDS_Shape& aShape) const +{ + if ( aShape.IsSame( _mesh.GetShapeToMesh() ) || // aHyp is global + aShape.IsSame( _shape )) + return false; + + if ( SMESH_MesherHelper::IsSubShape( aShape, /*mainShape=*/_shape )) + return true; + + if ( aShape.ShapeType() == TopAbs_COMPOUND && + !SMESH_MesherHelper::IsSubShape( _shape, /*mainShape=*/aShape)) // issue 0020963 + { + for ( int type = TopAbs_SOLID; type < TopAbs_SHAPE; ++type ) + if ( aHyp->GetDim() == SMESH_Gen::GetShapeDim( TopAbs_ShapeEnum( type ))) + for ( TopExp_Explorer exp( aShape, TopAbs_ShapeEnum( type )); exp.More(); exp.Next()) + if ( SMESH_MesherHelper::IsSubShape( exp.Current(), /*mainShape=*/_shape )) + return true; + } + + if ( _preferableShapes.Contains( aShape )) + return true; // issue 21559, Mesh_6 + + return false; +} + //======================================================================= //function : SMESH_HypoFilter //purpose : //======================================================================= SMESH_HypoFilter::SMESH_HypoFilter() + : myNbPredicates(0) { } @@ -132,9 +195,10 @@ SMESH_HypoFilter::SMESH_HypoFilter() //purpose : //======================================================================= -SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate ) +SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNegate ) + : myNbPredicates(0) { - add( notNagate ? AND : AND_NOT, aPredicate ); + add( notNegate ? AND : AND_NOT, aPredicate ); } //======================================================================= @@ -262,6 +326,17 @@ SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theSha return new ApplicablePredicate( theShape ); } +//======================================================================= +//function : IsMoreLocalThan +//purpose : +//======================================================================= + +SMESH_HypoPredicate* SMESH_HypoFilter::IsMoreLocalThan(const TopoDS_Shape& theShape, + const SMESH_Mesh& theMesh) +{ + return new IsMoreLocalThanPredicate( theShape, theMesh ); +} + //======================================================================= //function : HasType //purpose : @@ -280,15 +355,14 @@ SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType) bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp, const TopoDS_Shape& aShape) const { - if ( myPredicates.empty() ) + if ( IsEmpty() ) return true; - bool ok = ( myPredicates.front()->_logical_op <= AND_NOT ); - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) + bool ok = ( myPredicates[0]->_logical_op <= AND_NOT ); + for ( int i = 0; i < myNbPredicates; ++i ) { - bool ok2 = (*pred)->IsOk( aHyp, aShape ); - switch ( (*pred)->_logical_op ) { + bool ok2 = myPredicates[i]->IsOk( aHyp, aShape ); + switch ( myPredicates[i]->_logical_op ) { case AND: ok = ok && ok2; break; case AND_NOT: ok = ok && !ok2; break; case OR: ok = ok || ok2; break; @@ -304,14 +378,15 @@ bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp, //purpose : //======================================================================= -SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bool notNagate ) +SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bool notNegate ) { - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) + SMESH_HypoPredicate** pred = &myPredicates[0]; + SMESH_HypoPredicate** end = &myPredicates[myNbPredicates]; + for ( ; pred != end; ++pred ) delete *pred; - myPredicates.clear(); + myNbPredicates = 0; - add( notNagate ? AND : AND_NOT, aPredicate ); + add( notNegate ? AND : AND_NOT, aPredicate ); return *this; } @@ -323,6 +398,12 @@ SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bo SMESH_HypoFilter::~SMESH_HypoFilter() { - Init(0); + SMESH_HypoPredicate** pred = &myPredicates[0]; + SMESH_HypoPredicate** end = &myPredicates[myNbPredicates]; + for ( ; pred != end; ++pred ) + delete *pred; + myNbPredicates = 0; } + +