X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_NumberOfSegments.cxx;h=e03a921e85db59d00dd55e409503ec1082e36980;hb=55510e5ccd337f72bb1caa755b131cf0916d91b3;hp=76cd67965ccfda360d1dfd8f9ab4c64f322a2e8a;hpb=c63ee099ad2b149bd70136839c973e8910137bc5;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx index 76cd67965..e03a921e8 100644 --- a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx +++ b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx @@ -1,40 +1,36 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions +// Copyright (C) 2007-2008 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. // -// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com +// 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 : StdMeshers_NumberOfSegments.cxx // Moved here from SMESH_NumberOfSegments.cxx // Author : Paul RASCLE, EDF // Module : SMESH -// $Header$ - +// #include "StdMeshers_NumberOfSegments.hxx" #include "StdMeshers_Distribution.hxx" #include "SMESHDS_SubMesh.hxx" #include "SMESH_Mesh.hxx" -#include "CASCatch.hxx" - #include #include #include @@ -43,6 +39,16 @@ #include #include +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 +#define NO_CAS_CATCH +#endif + +#include + +#ifdef NO_CAS_CATCH +#include +#endif + using namespace std; const double PRECISION = 1e-7; @@ -53,10 +59,11 @@ const double PRECISION = 1e-7; */ //============================================================================= -StdMeshers_NumberOfSegments::StdMeshers_NumberOfSegments(int hypId, int studyId, - SMESH_Gen * gen) +StdMeshers_NumberOfSegments::StdMeshers_NumberOfSegments(int hypId, + int studyId, + SMESH_Gen * gen) : SMESH_Hypothesis(hypId, studyId, gen), - _numberOfSegments(1), + _numberOfSegments(15),//issue 19923 _distrType(DT_Regular), _scaleFactor(1.), _convMode(1) //cut negative by default @@ -80,17 +87,20 @@ StdMeshers_NumberOfSegments::~StdMeshers_NumberOfSegments() * */ //============================================================================= -const std::vector& StdMeshers_NumberOfSegments::BuildDistributionExpr( const char* expr, int nbSeg, int conv ) -throw ( SALOME_Exception ) +const vector& +StdMeshers_NumberOfSegments::BuildDistributionExpr( const char* expr,int nbSeg,int conv ) + throw ( SALOME_Exception ) { if( !buildDistribution( TCollection_AsciiString( ( Standard_CString )expr ), conv, 0.0, 1.0, nbSeg, _distr, 1E-4 ) ) _distr.resize( 0 ); return _distr; } -const std::vector& StdMeshers_NumberOfSegments::BuildDistributionTab( const std::vector& tab, - int nbSeg, int conv ) -throw ( SALOME_Exception ) +const vector& +StdMeshers_NumberOfSegments::BuildDistributionTab( const vector& tab, + int nbSeg, + int conv ) + throw ( SALOME_Exception ) { if( !buildDistribution( tab, conv, 0.0, 1.0, nbSeg, _distr, 1E-4 ) ) _distr.resize( 0 ); @@ -106,14 +116,13 @@ throw ( SALOME_Exception ) void StdMeshers_NumberOfSegments::SetNumberOfSegments(int segmentsNumber) throw(SALOME_Exception) { - int oldNumberOfSegments = _numberOfSegments; - if (segmentsNumber <= 0) - throw - SALOME_Exception(LOCALIZED("number of segments must be positive")); - _numberOfSegments = segmentsNumber; - - if (oldNumberOfSegments != _numberOfSegments) - NotifySubMeshesHypothesisModification(); + int oldNumberOfSegments = _numberOfSegments; + if (segmentsNumber <= 0) + throw SALOME_Exception(LOCALIZED("number of segments must be positive")); + _numberOfSegments = segmentsNumber; + + if (oldNumberOfSegments != _numberOfSegments) + NotifySubMeshesHypothesisModification(); } //============================================================================= @@ -124,7 +133,7 @@ throw(SALOME_Exception) int StdMeshers_NumberOfSegments::GetNumberOfSegments() const { - return _numberOfSegments; + return _numberOfSegments; } //================================================================================ @@ -167,7 +176,8 @@ void StdMeshers_NumberOfSegments::SetScaleFactor(double scaleFactor) throw(SALOME_Exception) { if (_distrType != DT_Scale) - throw SALOME_Exception(LOCALIZED("not a scale distribution")); + _distrType = DT_Scale; + //throw SALOME_Exception(LOCALIZED("not a scale distribution")); if (scaleFactor < PRECISION) throw SALOME_Exception(LOCALIZED("scale factor must be positive")); //if (fabs(scaleFactor - 1.0) < PRECISION) @@ -200,11 +210,12 @@ double StdMeshers_NumberOfSegments::GetScaleFactor() const */ //================================================================================ -void StdMeshers_NumberOfSegments::SetTableFunction(const std::vector& table) +void StdMeshers_NumberOfSegments::SetTableFunction(const vector& table) throw(SALOME_Exception) { if (_distrType != DT_TabFunc) - throw SALOME_Exception(LOCALIZED("not a table function distribution")); + _distrType = DT_TabFunc; + //throw SALOME_Exception(LOCALIZED("not a table function distribution")); if ( (table.size() % 2) != 0 ) throw SALOME_Exception(LOCALIZED("odd size of vector of table function")); @@ -218,12 +229,12 @@ void StdMeshers_NumberOfSegments::SetTableFunction(const std::vector& ta double val = table[i*2+1]; if( _convMode==0 ) { - CASCatch_TRY - { + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif val = pow( 10.0, val ); - } - CASCatch_CATCH(Standard_Failure) - { + } catch(Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); throw SALOME_Exception( LOCALIZED( "invalid value")); return; @@ -266,7 +277,7 @@ void StdMeshers_NumberOfSegments::SetTableFunction(const std::vector& ta */ //================================================================================ -const std::vector& StdMeshers_NumberOfSegments::GetTableFunction() const +const vector& StdMeshers_NumberOfSegments::GetTableFunction() const throw(SALOME_Exception) { if (_distrType != DT_TabFunc) @@ -312,13 +323,13 @@ bool process( const TCollection_AsciiString& str, int convMode, { bool parsed_ok = true; Handle( ExprIntrp_GenExp ) myExpr; - CASCatch_TRY - { + try { +#ifdef NO_CAS_CATCH + OCC_CATCH_SIGNALS; +#endif myExpr = ExprIntrp_GenExp::Create(); myExpr->Process( str.ToCString() ); - } - CASCatch_CATCH(Standard_Failure) - { + } catch(Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); parsed_ok = false; } @@ -374,7 +385,8 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr) throw(SALOME_Exception) { if (_distrType != DT_ExprFunc) - throw SALOME_Exception(LOCALIZED("not an expression function distribution")); + _distrType = DT_ExprFunc; + //throw SALOME_Exception(LOCALIZED("not an expression function distribution")); // remove white spaces TCollection_AsciiString str((Standard_CString)expr); @@ -406,7 +418,7 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr) return; } - std::string func = expr; + string func = expr; if( _func != func ) { _func = func; @@ -437,8 +449,8 @@ const char* StdMeshers_NumberOfSegments::GetExpressionFunction() const void StdMeshers_NumberOfSegments::SetConversionMode( int conv ) throw(SALOME_Exception) { - if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc) - throw SALOME_Exception(LOCALIZED("not a functional distribution")); +// if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc) +// throw SALOME_Exception(LOCALIZED("not a functional distribution")); if( conv != _convMode ) { @@ -456,8 +468,8 @@ void StdMeshers_NumberOfSegments::SetConversionMode( int conv ) int StdMeshers_NumberOfSegments::ConversionMode() const throw(SALOME_Exception) { - if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc) - throw SALOME_Exception(LOCALIZED("not a functional distribution")); +// if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc) +// throw SALOME_Exception(LOCALIZED("not a functional distribution")); return _convMode; } @@ -469,6 +481,7 @@ int StdMeshers_NumberOfSegments::ConversionMode() const ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save) { + int listSize = _edgeIDs.size(); save << _numberOfSegments << " " << (int)_distrType; switch (_distrType) { @@ -491,6 +504,13 @@ ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save) if (_distrType == DT_TabFunc || _distrType == DT_ExprFunc) save << " " << _convMode; + + if ( _distrType != DT_Regular && listSize > 0 ) { + save << " " << listSize; + for ( int i = 0; i < listSize; i++ ) + save << " " << _edgeIDs[i]; + save << " " << _objEntry; + } return save; } @@ -607,6 +627,18 @@ istream & StdMeshers_NumberOfSegments::LoadFrom(istream & load) load.clear(ios::badbit | load.rdstate()); } + // load reversed edges IDs + int intVal; + isOK = (load >> intVal); + if ( isOK && _distrType != DT_Regular && intVal > 0 ) { + _edgeIDs.reserve( intVal ); + for (int i = 0; i < _edgeIDs.capacity() && isOK; i++) { + isOK = (load >> intVal); + if ( isOK ) _edgeIDs.push_back( intVal ); + } + isOK = (load >> _objEntry); + } + return load; } @@ -653,10 +685,10 @@ bool StdMeshers_NumberOfSegments::SetParametersByMesh(const SMESH_Mesh* theMes int nbEdges = 0; TopTools_IndexedMapOfShape edgeMap; TopExp::MapShapes( theShape, TopAbs_EDGE, edgeMap ); + SMESHDS_Mesh* aMeshDS = const_cast< SMESH_Mesh* >( theMesh )->GetMeshDS(); for ( int i = 1; i <= edgeMap.Extent(); ++i ) { // get current segment length - SMESHDS_Mesh* aMeshDS = const_cast< SMESH_Mesh* >( theMesh )->GetMeshDS(); SMESHDS_SubMesh * eSubMesh = aMeshDS->MeshElements( edgeMap( i )); if ( eSubMesh && eSubMesh->NbElements()) _numberOfSegments += eSubMesh->NbElements(); @@ -666,5 +698,35 @@ bool StdMeshers_NumberOfSegments::SetParametersByMesh(const SMESH_Mesh* theMes if ( nbEdges ) _numberOfSegments /= nbEdges; + if (_numberOfSegments == 0) _numberOfSegments = 1; + return nbEdges; } +//================================================================================ +/*! + * \brief Initialize my parameter values by default parameters. + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_NumberOfSegments::SetParametersByDefaults(const TDefaults& dflts, + const SMESH_Mesh* /*theMesh*/) +{ + return (_numberOfSegments = dflts._nbSegments ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void StdMeshers_NumberOfSegments::SetReversedEdges( std::vector& ids ) +{ + if ( ids != _edgeIDs ) { + _edgeIDs = ids; + + NotifySubMeshesHypothesisModification(); + } +} +