0021336: EDF 1717 SMESH: New algorithm "body fitting" cartesian unstructured

+  static std::string CheckExpressionFunction( const std::string& expr,
+                                              const int          convMode)
+    throw (SALOME_Exception);
This commit is contained in:
eap 2011-10-28 12:55:48 +00:00
parent e182c4b354
commit 7a8ade40f7
2 changed files with 36 additions and 14 deletions

View File

@ -31,6 +31,7 @@
#include "StdMeshers_Distribution.hxx" #include "StdMeshers_Distribution.hxx"
#include "SMESHDS_SubMesh.hxx" #include "SMESHDS_SubMesh.hxx"
#include "SMESH_Mesh.hxx" #include "SMESH_Mesh.hxx"
#include "SMESH_Comment.hxx"
#include <ExprIntrp_GenExp.hxx> #include <ExprIntrp_GenExp.hxx>
#include <Expr_Array1OfNamedUnknown.hxx> #include <Expr_Array1OfNamedUnknown.hxx>
@ -394,8 +395,27 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr)
_distrType = DT_ExprFunc; _distrType = DT_ExprFunc;
//throw SALOME_Exception(LOCALIZED("not an expression function distribution")); //throw SALOME_Exception(LOCALIZED("not an expression function distribution"));
string func = CheckExpressionFunction( expr, _convMode );
if( _func != func )
{
_func = func;
NotifySubMeshesHypothesisModification();
}
}
//=======================================================================
//function : CheckExpressionFunction
//purpose : Checks validity of the expression of the function f(t), e.g. "sin(t)".
// In case of validity returns a cleaned expression
//=======================================================================
std::string
StdMeshers_NumberOfSegments::CheckExpressionFunction( const std::string& expr,
const int convMode)
throw (SALOME_Exception)
{
// remove white spaces // remove white spaces
TCollection_AsciiString str((Standard_CString)expr); TCollection_AsciiString str((Standard_CString)expr.c_str());
str.RemoveAll(' '); str.RemoveAll(' ');
str.RemoveAll('\t'); str.RemoveAll('\t');
str.RemoveAll('\r'); str.RemoveAll('\r');
@ -403,15 +423,15 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr)
bool syntax, args, non_neg, singulars, non_zero; bool syntax, args, non_neg, singulars, non_zero;
double sing_point; double sing_point;
bool res = process( str, _convMode, 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( !res )
{ {
if( !syntax ) if( !syntax )
throw SALOME_Exception(LOCALIZED("invalid expression syntax")); throw SALOME_Exception(SMESH_Comment("invalid expression syntax: ") << str );
if( !args ) if( !args )
throw SALOME_Exception(LOCALIZED("only 't' may be used as function argument")); throw SALOME_Exception(LOCALIZED("only 't' may be used as function argument"));
if( !non_neg ) if( !non_neg )
throw SALOME_Exception(LOCALIZED("only non-negative function can be used as density")); throw SALOME_Exception(LOCALIZED("only non-negative function can be used"));
if( singulars ) if( singulars )
{ {
char buf[1024]; char buf[1024];
@ -419,17 +439,10 @@ void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr)
throw SALOME_Exception( buf ); throw SALOME_Exception( buf );
} }
if( !non_zero ) if( !non_zero )
throw SALOME_Exception(LOCALIZED("f(t)=0 cannot be used as density")); throw SALOME_Exception(LOCALIZED("f(t)=0 cannot be used"));
return;
}
string func = expr;
if( _func != func )
{
_func = func;
NotifySubMeshesHypothesisModification();
} }
return str.ToCString();
} }
//================================================================================ //================================================================================

View File

@ -142,6 +142,15 @@ public:
const char* GetExpressionFunction() const const char* GetExpressionFunction() const
throw (SALOME_Exception); throw (SALOME_Exception);
/*!
* \brief Checks validity of the expression of the function f(t), e.g. "sin(t)".
* In case of validity returns a cleaned expression
* \param convMode - 0 for "Exponent mode", 1 for "Cut negative mode"
*/
static std::string CheckExpressionFunction( const std::string& expr,
const int convMode)
throw (SALOME_Exception);
/*! /*!
* \brief Set conversion mode. When it is 0, it means "exponent mode": * \brief Set conversion mode. When it is 0, it means "exponent mode":
* the function of distribution of density is used as an exponent of 10, i,e, 10^f(t). * the function of distribution of density is used as an exponent of 10, i,e, 10^f(t).