-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//=============================================================================
StdMeshers_NumberOfSegments::StdMeshers_NumberOfSegments(int hypId,
- int studyId,
SMESH_Gen * gen)
- : SMESH_Hypothesis(hypId, studyId, gen),
+ : StdMeshers_Reversible1D(hypId, gen),
_numberOfSegments(15),//issue 19923
_distrType(DT_Regular),
_scaleFactor(1.),
//=============================================================================
const vector<double>&
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 );
StdMeshers_NumberOfSegments::BuildDistributionTab( const vector<double>& tab,
int nbSeg,
int conv )
- throw ( SALOME_Exception )
{
if( !buildDistribution( tab, conv, 0.0, 1.0, nbSeg, _distr, 1E-4 ) )
_distr.resize( 0 );
*/
//=============================================================================
-void StdMeshers_NumberOfSegments::SetNumberOfSegments(int segmentsNumber)
-throw(SALOME_Exception)
+void StdMeshers_NumberOfSegments::SetNumberOfSegments(smIdType segmentsNumber)
{
- int oldNumberOfSegments = _numberOfSegments;
+ smIdType oldNumberOfSegments = _numberOfSegments;
if (segmentsNumber <= 0)
throw SALOME_Exception(LOCALIZED("number of segments must be positive"));
_numberOfSegments = segmentsNumber;
*/
//=============================================================================
-int StdMeshers_NumberOfSegments::GetNumberOfSegments() const
+smIdType StdMeshers_NumberOfSegments::GetNumberOfSegments() const
{
return _numberOfSegments;
}
//================================================================================
void StdMeshers_NumberOfSegments::SetDistrType(DistrType typ)
- throw(SALOME_Exception)
{
- if (typ < DT_Regular || typ > DT_ExprFunc)
+ if (!IsValidDistrType(typ))
throw SALOME_Exception(LOCALIZED("distribution type is out of range"));
if (typ != _distrType)
*/
//================================================================================
+bool StdMeshers_NumberOfSegments::IsValidDistrType(int distrType) const
+{
+ // DistrType is sequential, so we can just check against its first and last values
+ return distrType >= DT_Regular && distrType <= DT_BetaLaw;
+}
+
+//================================================================================
+/*!
+ *
+ */
+//================================================================================
+
void StdMeshers_NumberOfSegments::SetScaleFactor(double scaleFactor)
- throw(SALOME_Exception)
{
if (scaleFactor < PRECISION)
throw SALOME_Exception(LOCALIZED("scale factor must be positive"));
//================================================================================
double StdMeshers_NumberOfSegments::GetScaleFactor() const
- throw(SALOME_Exception)
{
if (_distrType != DT_Scale)
throw SALOME_Exception(LOCALIZED("not a scale distribution"));
return _scaleFactor;
}
+//================================================================================
+/*!
+ *
+ */
+//================================================================================
+
+void StdMeshers_NumberOfSegments::SetBeta(double beta)
+{
+ if (_distrType != DT_BetaLaw)
+ throw SALOME_Exception(LOCALIZED("not a Beta Law distribution"));
+
+ const double diff = fabs(fabs(_beta) - fabs(beta));
+ if (diff <= PRECISION)
+ {
+ // Check for a special case where we have values with
+ // equal base but opposite signs like -1.01 and 1.01
+ if (std::signbit(_beta) == std::signbit(beta))
+ return;
+ }
+
+ _beta = beta;
+ NotifySubMeshesHypothesisModification();
+}
+
+//================================================================================
+/*!
+ *
+ */
+//================================================================================
+
+double StdMeshers_NumberOfSegments::GetBeta() const
+{
+ if (_distrType != DT_BetaLaw)
+ throw SALOME_Exception(LOCALIZED("not a Beta Law distribution"));
+ return _beta;
+}
+
//================================================================================
/*!
*
//================================================================================
void StdMeshers_NumberOfSegments::SetTableFunction(const vector<double>& table)
- throw(SALOME_Exception)
{
if (_distrType != DT_TabFunc)
_distrType = DT_TabFunc;
OCC_CATCH_SIGNALS;
val = pow( 10.0, val );
}
- catch(Standard_Failure) {
+ catch(Standard_Failure&) {
throw SALOME_Exception( LOCALIZED( "invalid value"));
return;
}
//================================================================================
const vector<double>& StdMeshers_NumberOfSegments::GetTableFunction() const
- throw(SALOME_Exception)
{
if (_distrType != DT_TabFunc)
throw SALOME_Exception(LOCALIZED("not a table function distribution"));
OCC_CATCH_SIGNALS;
myExpr = ExprIntrp_GenExp::Create();
myExpr->Process( str.ToCString() );
- } catch(Standard_Failure) {
+ } catch(Standard_Failure&) {
parsed_ok = false;
}
//================================================================================
void StdMeshers_NumberOfSegments::SetExpressionFunction(const char* expr)
- throw(SALOME_Exception)
{
if (_distrType != DT_ExprFunc)
_distrType = DT_ExprFunc;
std::string
StdMeshers_NumberOfSegments::CheckExpressionFunction( const std::string& expr,
const int convMode)
- throw (SALOME_Exception)
{
// remove white spaces
TCollection_AsciiString str((Standard_CString)expr.c_str());
//================================================================================
const char* StdMeshers_NumberOfSegments::GetExpressionFunction() const
- throw(SALOME_Exception)
{
if (_distrType != DT_ExprFunc)
throw SALOME_Exception(LOCALIZED("not an expression function distribution"));
//================================================================================
void StdMeshers_NumberOfSegments::SetConversionMode( int conv )
- throw(SALOME_Exception)
{
// if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc)
// throw SALOME_Exception(LOCALIZED("not a functional distribution"));
//================================================================================
int StdMeshers_NumberOfSegments::ConversionMode() const
- throw(SALOME_Exception)
{
// if (_distrType != DT_TabFunc && _distrType != DT_ExprFunc)
// throw SALOME_Exception(LOCALIZED("not a functional distribution"));
ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save)
{
- int listSize = _edgeIDs.size();
+ size_t listSize = _edgeIDs.size();
save << _numberOfSegments << " " << (int)_distrType;
switch (_distrType)
{
case DT_ExprFunc:
save << " " << _func;
break;
+ case DT_BetaLaw:
+ save << " " << _beta;
+ break;
case DT_Regular:
default:
break;
if ( _distrType != DT_Regular && listSize > 0 ) {
save << " " << listSize;
- for ( int i = 0; i < listSize; i++ )
+ for ( size_t i = 0; i < listSize; i++ )
save << " " << _edgeIDs[i];
save << " " << _objEntry;
}
// we wait here the scale factor, which is double.
// 2. If the hypothesis is stored in new format
// (nb.segments, distr.type, some other params.),
- // we wait here the ditribution type, which is integer
+ // we wait here the distribution type, which is integer
double scale_factor;
isOK = static_cast<bool>(load >> scale_factor);
a = (int)scale_factor;
- // try to interprete ditribution type,
+ // try to interpret distribution type,
// supposing that this hypothesis was written in the new format
if (isOK)
{
- if (a < DT_Regular || a > DT_ExprFunc)
+ if (!IsValidDistrType(a))
_distrType = DT_Regular;
else
_distrType = (DistrType) a;
}
}
break;
+
+ case DT_BetaLaw:
+ {
+ isOK = static_cast<bool>(load >> b);
+ if (isOK)
+ _beta = b;
+ else
+ {
+ load.clear(ios::badbit | load.rdstate());
+ // this can mean, that the hypothesis is stored in old format
+ _distrType = DT_Regular;
+ _scaleFactor = scale_factor;
+ }
+ }
+ break;
+
case DT_Regular:
default:
break;
{
return (_numberOfSegments = dflts._nbSegments );
}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_NumberOfSegments::SetReversedEdges( std::vector<int>& ids )
-{
- if ( ids != _edgeIDs ) {
- _edgeIDs = ids;
-
- NotifySubMeshesHypothesisModification();
- }
-}
-