X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_NumberOfSegments.cxx;h=ba99cb6881f327b70d6a3516a6d701db62015f09;hp=a768b6c1670b3365ba661ba31bb6acde6572fdda;hb=4ff5bd61540272713e48de1eee75625028c32155;hpb=b90943f064c5113ef940d4c0cc049dc59f330d6c diff --git a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx index a768b6c16..ba99cb688 100644 --- a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx +++ b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx @@ -27,19 +27,23 @@ // Module : SMESH // $Header$ -using namespace std; #include "StdMeshers_NumberOfSegments.hxx" -#include -#include + +#include "StdMeshers_Distribution.hxx" +#include "SMESHDS_SubMesh.hxx" +#include "SMESH_Mesh.hxx" + +#include "CASCatch.hxx" + #include -#include -#include -#include -#include -#include #include +#include #include +#include +#include +#include +using namespace std; const double PRECISION = 1e-7; @@ -55,7 +59,7 @@ StdMeshers_NumberOfSegments::StdMeshers_NumberOfSegments(int hypId, int studyId, _numberOfSegments(1), _distrType(DT_Regular), _scaleFactor(1.), - _expMode(false) + _convMode(1) //cut negative by default { _name = "NumberOfSegments"; _param_algo_dim = 1; @@ -71,6 +75,28 @@ StdMeshers_NumberOfSegments::~StdMeshers_NumberOfSegments() { } +//============================================================================= +/*! + * + */ +//============================================================================= +const std::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 ) +{ + if( !buildDistribution( tab, conv, 0.0, 1.0, nbSeg, _distr, 1E-4 ) ) + _distr.resize( 0 ); + return _distr; +} + //============================================================================= /*! * @@ -144,8 +170,8 @@ void StdMeshers_NumberOfSegments::SetScaleFactor(double scaleFactor) 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) - throw SALOME_Exception(LOCALIZED("scale factor must not be equal to 1")); + //if (fabs(scaleFactor - 1.0) < PRECISION) + // throw SALOME_Exception(LOCALIZED("scale factor must not be equal to 1")); if (fabs(_scaleFactor - scaleFactor) > PRECISION) { @@ -190,6 +216,22 @@ void StdMeshers_NumberOfSegments::SetTableFunction(const std::vector& ta for (i=0; i < table.size()/2; i++) { double par = table[i*2]; double val = table[i*2+1]; + if( _convMode==0 ) + { + CASCatch_TRY + { + val = pow( 10.0, val ); + } + CASCatch_CATCH(Standard_Failure) + { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + throw SALOME_Exception( LOCALIZED( "invalid value")); + return; + } + } + else if( _convMode==1 && val<0.0 ) + val = 0.0; + if ( par<0 || par > 1) throw SALOME_Exception(LOCALIZED("parameter of table function is out of range [0,1]")); if ( fabs(par-prev)Process( str.ToCString() ); + bool parsed_ok = true; + Handle( ExprIntrp_GenExp ) myExpr; + CASCatch_TRY + { + myExpr = ExprIntrp_GenExp::Create(); + myExpr->Process( str.ToCString() ); + } + CASCatch_CATCH(Standard_Failure) + { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + parsed_ok = false; + } - if( myExpr->IsDone() ) + syntax = false; + args = false; + if( parsed_ok && myExpr->IsDone() ) { syntax = true; args = isCorrectArg( myExpr->Expression() ); } - bool res = syntax && args; + bool res = parsed_ok && syntax && args; if( !res ) myExpr.Nullify(); @@ -287,42 +341,27 @@ bool process( const TCollection_AsciiString& str, if( res ) { - OSD::SetSignal( true ); - CASCatch_CatchSignals aCatchSignals; - aCatchSignals.Activate(); - double res; - Expr_Array1OfNamedUnknown myVars( 1, 1 ); - TColStd_Array1OfReal myValues( 1, 1 ); - myVars.ChangeValue( 1 ) = new Expr_NamedUnknown( "t" ); - + FunctionExpr f( str.ToCString(), convMode ); const int max = 500; for( int i=0; i<=max; i++ ) { - double t = double(i)/double(max); - myValues.ChangeValue( 1 ) = t; - CASCatch_TRY - { - res = myExpr->Expression()->Evaluate( myVars, myValues ); - } - CASCatch_CATCH(CASCatch_Failure) + double t = double(i)/double(max), val; + if( !f.value( t, val ) ) { - aCatchSignals.Deactivate(); - Handle(CASCatch_Failure) aFail = CASCatch_Failure::Caught(); sing_point = t; singulars = true; break; } - if( res<0 ) + if( val<0 ) { non_neg = false; break; } - if( res>PRECISION ) + if( val>PRECISION ) non_zero = true; } - aCatchSignals.Deactivate(); } - return res && non_neg && ( !singulars ); + return res && non_neg && non_zero && ( !singulars ); } //================================================================================ @@ -346,7 +385,7 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr) bool syntax, args, non_neg, singulars, non_zero; double sing_point; - bool res = true;//process( str, syntax, args, non_neg, non_zero, singulars, sing_point ); + bool res = process( str, _convMode, syntax, args, non_neg, non_zero, singulars, sing_point ); if( !res ) { if( !syntax ) @@ -395,15 +434,15 @@ const char* StdMeshers_NumberOfSegments::GetExpressionFunction() const */ //================================================================================ -void StdMeshers_NumberOfSegments::SetExponentMode(bool isExp) +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 (isExp != _expMode) + if( conv != _convMode ) { - _expMode = isExp; + _convMode = conv; NotifySubMeshesHypothesisModification(); } } @@ -414,12 +453,12 @@ void StdMeshers_NumberOfSegments::SetExponentMode(bool isExp) */ //================================================================================ -bool StdMeshers_NumberOfSegments::IsExponentMode() const +int StdMeshers_NumberOfSegments::ConversionMode() const throw(SALOME_Exception) { if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc) throw SALOME_Exception(LOCALIZED("not a functional distribution")); - return _expMode; + return _convMode; } //============================================================================= @@ -451,7 +490,7 @@ ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save) } if (_distrType == DT_TabFunc || _distrType == DT_ExprFunc) - save << " " << (int)_expMode; + save << " " << _convMode; return save; } @@ -563,7 +602,7 @@ istream & StdMeshers_NumberOfSegments::LoadFrom(istream & load) { isOK = (load >> a); if (isOK) - _expMode = (bool) a; + _convMode = a; else load.clear(ios::badbit | load.rdstate()); } @@ -592,3 +631,40 @@ istream & operator >>(istream & load, StdMeshers_NumberOfSegments & hyp) { return hyp.LoadFrom( load ); } + +//================================================================================ +/*! + * \brief Initialize number of segments by the mesh built on the geometry + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_NumberOfSegments::SetParametersByMesh(const SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape) +{ + if ( !theMesh || theShape.IsNull() ) + return false; + + _numberOfSegments = 0; + _distrType = DT_Regular; + + int nbEdges = 0; + TopTools_IndexedMapOfShape edgeMap; + TopExp::MapShapes( theShape, TopAbs_EDGE, edgeMap ); + 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(); + + ++nbEdges; + } + if ( nbEdges ) + _numberOfSegments /= nbEdges; + + return nbEdges; +}