From 651e4ea969b0a4bdedeb838f3fb627acd5be36ec Mon Sep 17 00:00:00 2001 From: Konstantin Leontev Date: Fri, 22 Mar 2024 09:28:22 +0000 Subject: [PATCH] [bos #40650][CEA 33012] Beta Law distribution: added a new type of distribution for Wire Discretisation algorith Number of Segments. --- doc/gui/images/nbsegment_beta_law_formula.png | Bin 0 -> 34350 bytes doc/gui/images/nbsegments_beta_law_dlg.png | Bin 0 -> 75081 bytes .../images/nbsegments_beta_law_example.png | Bin 0 -> 6049 bytes doc/gui/input/1d_meshing_hypo.rst | 17 ++ idl/SMESH_BasicHypothesis.idl | 12 ++ src/SMESHGUI/CMakeLists.txt | 2 + .../SMESHGUI_SpinBoxForbiddendRange.cxx | 197 ++++++++++++++++++ .../SMESHGUI_SpinBoxForbiddendRange.h | 66 ++++++ src/SMESHGUI/SMESH_msg_en.ts | 8 + src/SMESHGUI/SMESH_msg_fr.ts | 8 + src/SMESHGUI/SMESH_msg_ja.ts | 8 + src/SMESH_SWIG/StdMeshersBuilder.py | 26 ++- .../StdMeshers_NumberOfSegments.cxx | 72 ++++++- .../StdMeshers_NumberOfSegments.hxx | 24 ++- src/StdMeshers/StdMeshers_Regular_1D.cxx | 76 +++++++ src/StdMeshers/StdMeshers_Regular_1D.hxx | 9 + .../StdMeshersGUI_NbSegmentsCreator.cxx | 37 +++- .../StdMeshersGUI_NbSegmentsCreator.h | 6 +- src/StdMeshersGUI/StdMeshers_msg_en.ts | 8 + src/StdMeshersGUI/StdMeshers_msg_fr.ts | 8 + src/StdMeshersGUI/StdMeshers_msg_ja.ts | 8 + .../StdMeshers_NumberOfSegments_i.cxx | 44 ++++ .../StdMeshers_NumberOfSegments_i.hxx | 5 + test/SMESH_beta_law.py | 92 ++++++++ test/SMESH_reg.py | 32 ++- test/tests.set | 1 + 26 files changed, 748 insertions(+), 18 deletions(-) create mode 100755 doc/gui/images/nbsegment_beta_law_formula.png create mode 100755 doc/gui/images/nbsegments_beta_law_dlg.png create mode 100755 doc/gui/images/nbsegments_beta_law_example.png create mode 100644 src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.cxx create mode 100644 src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.h create mode 100644 test/SMESH_beta_law.py diff --git a/doc/gui/images/nbsegment_beta_law_formula.png b/doc/gui/images/nbsegment_beta_law_formula.png new file mode 100755 index 0000000000000000000000000000000000000000..fb61edeab0973745eed222bf7cbd040149d4cd66 GIT binary patch literal 34350 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 literal 0 HcmV?d00001 diff --git a/doc/gui/images/nbsegments_beta_law_dlg.png b/doc/gui/images/nbsegments_beta_law_dlg.png new file mode 100755 index 0000000000000000000000000000000000000000..dbed86935265e15fe6c48d62738aceb0d3c4462d GIT binary patch literal 75081 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 r9LHV*+5AkzdVlo4i9oLv4mWGCm4fqH#Hc` hypothesis operation. diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index eb46c3c78..c8fcd58e0 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -201,6 +201,18 @@ module StdMeshers double GetScaleFactor() raises (SALOME::SALOME_Exception); + /*! + * Sets coefficient for Beta Law distribution + */ + void SetBeta(in double beta) + raises (SALOME::SALOME_Exception); + + /*! + * Returns coefficient for Beta Law distribution + */ + double GetBeta() + raises (SALOME::SALOME_Exception); + /*! * Sets parameter value for distribution DT_TabFunc */ diff --git a/src/SMESHGUI/CMakeLists.txt b/src/SMESHGUI/CMakeLists.txt index 6d83cf954..a3cdc6197 100644 --- a/src/SMESHGUI/CMakeLists.txt +++ b/src/SMESHGUI/CMakeLists.txt @@ -89,6 +89,7 @@ SET(_moc_HEADERS SMESHGUI_CreatePatternDlg.h SMESHGUI_NodesDlg.h SMESHGUI_SpinBox.h + SMESHGUI_SpinBoxForbiddendRange.h SMESHGUI_TransparencyDlg.h SMESHGUI_ClippingDlg.h SMESHGUI_GroupDlg.h @@ -203,6 +204,7 @@ SET(_other_SOURCES SMESHGUI_CreatePatternDlg.cxx SMESHGUI_NodesDlg.cxx SMESHGUI_SpinBox.cxx + SMESHGUI_SpinBoxForbiddendRange.cxx SMESHGUI_TransparencyDlg.cxx SMESHGUI_ClippingDlg.cxx SMESHGUI_GroupDlg.cxx diff --git a/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.cxx b/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.cxx new file mode 100644 index 000000000..bc0a54c2d --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.cxx @@ -0,0 +1,197 @@ +// 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 +// +// 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. +// +// 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 SMESHGUI : GUI for SMESH component +// File : SMESHGUI_SpinBoxForbiddendRange.cxx +// Author : Konstantin Leontev, Open CASCADE S.A.S. +// SMESH includes +// +#include "SMESHGUI_SpinBoxForbiddendRange.h" + +#include + +#include "utilities.h" + + +//================================================================================= +// class : SMESHGUI_SpinBoxForbiddendRange() +// purpose : constructor +//================================================================================= +SMESHGUI_SpinBoxForbiddendRange::SMESHGUI_SpinBoxForbiddendRange(QWidget* parent) + : SMESHGUI_SpinBox(parent), forbiddenMin(0.0), forbiddenMax(1.0) +{ + // This property allows to return QValidator::Invalid from QtxDoubleSpinBox::validate() + // for any values outside of the min/max range. + // Otherwise a user could type any intermediate value. + setProperty("strict_validity_check", true); +} + +//================================================================================= +// function : ~SMESHGUI_SpinBoxForbiddendRange() +// purpose : destructor +//================================================================================= +SMESHGUI_SpinBoxForbiddendRange::~SMESHGUI_SpinBoxForbiddendRange() +{ +} + +//================================================================================= +// function : stepBy() +// purpose : Validates value in ranges on each step +//================================================================================= +void SMESHGUI_SpinBoxForbiddendRange::stepBy(const int steps) +{ + double const newValue = value() + (steps * singleStep()); + double const validatedValue = GetValueInRange(newValue); + + setValue(validatedValue); +} + +//================================================================================= +// function : valueFromText() +// purpose : Validates value entered by user +//================================================================================= +double SMESHGUI_SpinBoxForbiddendRange::valueFromText(QString const& text) const +{ + double const newValue = SMESHGUI_SpinBox::valueFromText(text); + return GetValueInRange(newValue); +} + +QValidator::State SMESHGUI_SpinBoxForbiddendRange::validate(QString& text, int& pos) const +{ + // Do parent's min/max and all other validation first + const QValidator::State res = SMESHGUI_SpinBox::validate(text, pos); + if (res != QValidator::Acceptable) + return res; + + // Now we know that we have a valid numeric value in the text + // that we can check against forbidden range. + bool ok = false; + const double inputValue = text.toDouble(&ok); + + // Return intermediate to allow a user input any value. + // If press ok button, it will be checked again with checkRange() call. + const QValidator::State state = ok && IsValueInRange(inputValue) ? + QValidator::Acceptable : QValidator::Intermediate; + + showValidationToolTip(state); + + return state; +} + +//================================================================================= +// function : SetForbiddenRange() +// purpose : Sets min and max values for forbidden range +//================================================================================= +void SMESHGUI_SpinBoxForbiddendRange::SetForbiddenRange(const double min, const double max) +{ + forbiddenMin = min; + forbiddenMax = max; +} + +//================================================================================= +// function : checkRange() +// purpose : adds checking against forbidden range to the parent's inmplementation +//================================================================================= +bool SMESHGUI_SpinBoxForbiddendRange::checkRange(const double value) const +{ + return SalomeApp_DoubleSpinBox::checkRange(value) && IsValueInRange(value); +} + +//================================================================================= +// function : IsValueInRange() +// purpose : Validates a given value against forbidden range +//================================================================================= +bool SMESHGUI_SpinBoxForbiddendRange::IsValueInRange(const double inputValue) const +{ + // A given value must be outside of [forbiddenMin, forbiddenMax] scope + return inputValue < forbiddenMin || inputValue > forbiddenMax; +} + +//================================================================================= +// function : GetValueInRange() +// purpose : Validates value considering forbidden range +//================================================================================= +double SMESHGUI_SpinBoxForbiddendRange::GetValueInRange(const double inputValue) const +{ + // Check if a given value is outside of [forbiddenMin, forbiddenMax] scope + if (IsValueInRange(inputValue)) + return inputValue; + + const double curValue = value(); + const double step = SMESHGUI_SpinBox::singleStep(); + + // Find the nearest value outside of forbidden range + if (inputValue > curValue) + return forbiddenMax + step; + else + return forbiddenMin - step; +} + +//================================================================================= +// function : showValidationToolTip() +// purpose : Shows tooltip with a valid range +//================================================================================= +void SMESHGUI_SpinBoxForbiddendRange::showValidationToolTip(const QValidator::State state) const +{ + if (state == QValidator::Acceptable) + { + QToolTip::hideText(); + return; + } + + // All the rest is an edited copy from SalomeApp_DoubleSpinBox::validate() + + // Get position and min/max values + const QPoint pos(size().width(), 0.); + const QPoint globalPos = mapToGlobal(pos); + const QString minVal = textFromValue(minimum()); + const QString maxVal = textFromValue(maximum()); + + // Same stuff as in QtxDoubleSpinBox::textFromValue() + int digits = getPrecision(); + + // For 'g' format, max. number of digits after the decimal point is getPrecision() - 1 + // See also QtxDoubleSpinBox::validate() + if (digits < 0) + digits = qAbs(digits) - 1; + + QString msg = QString(tr("VALID_RANGE_NOVAR_MSG")). + arg(minVal). + arg(forbiddenMin). + arg(forbiddenMax). + arg(maxVal). + arg(digits); + + // It is not possible to hide and shortly afterwards reshow a tooltip + // with the same text because of some interference between the internal hideTimer of the tooltip and + // the QToolTip::showText(). As a result, the tooltip does not persist - it disappears immediately. + // If we are here, then QToolTip::hideText() was just called from the parent. + // So, below is a workaround that changes the text and lets the tooltip stay in place. + toolTipFlag = !toolTipFlag; + if (toolTipFlag) + { + msg.append(" "); + } + + // Show tooltip + QToolTip::showText(globalPos, msg, const_cast(this)); +} diff --git a/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.h b/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.h new file mode 100644 index 000000000..97bf54df1 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_SpinBoxForbiddendRange.h @@ -0,0 +1,66 @@ +// 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 +// +// 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. +// +// 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 SMESHGUI : GUI for SMESH component +// File : SMESHGUI_SpinBoxForbiddendRange.h +// Author : Konstantin Leontev, Open CASCADE S.A.S. +// +#ifndef SMESHGUI_SPINBOXFORBIDDENRANGE_H +#define SMESHGUI_SPINBOXFORBIDDENRANGE_H + +// SMESH includes +#include "SMESHGUI_SpinBox.h" + + +//================================================================================= +// class : SMESHGUI_SpinBoxForbiddendRange +// purpose : Allows validating with a range of forbidden values +//================================================================================= +class SMESHGUI_EXPORT SMESHGUI_SpinBoxForbiddendRange : public SMESHGUI_SpinBox +{ + Q_OBJECT + +public: + SMESHGUI_SpinBoxForbiddendRange(QWidget*); + ~SMESHGUI_SpinBoxForbiddendRange(); + + virtual void stepBy(const int steps) override; + virtual double valueFromText(QString const& text) const override; + virtual QValidator::State validate(QString& text, int& pos) const override; + + void SetForbiddenRange(const double min, const double max); + +protected: + virtual bool checkRange(const double value) const override; + bool IsValueInRange(const double value) const; + double GetValueInRange(const double value) const; + + virtual void showValidationToolTip(const QValidator::State state) const override; +private: + double forbiddenMin; + double forbiddenMax; + + mutable bool toolTipFlag = false; +}; + +#endif // SMESHGUI_SPINBOXFORBIDDENRANGE_H + diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 5e07a0d31..7d40dd113 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -9154,4 +9154,12 @@ red in the Object Browser. Mean Size + + SMESHGUI_SpinBoxForbiddendRange + + VALID_RANGE_NOVAR_MSG + Specify a floating-point value in range [%1; %2) U (%3; %4] +with %5-digit precision + + diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index c6c37fef5..e528d3e8b 100644 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -9172,4 +9172,12 @@ en rouge dans le browser. Taille moyenne + + SMESHGUI_SpinBoxForbiddendRange + + VALID_RANGE_NOVAR_MSG + Spécifier une valeur à virgule flottante dans la plage [%1; %2) U (%3; %4] +avec une précision de %5 chiffres + + diff --git a/src/SMESHGUI/SMESH_msg_ja.ts b/src/SMESHGUI/SMESH_msg_ja.ts index 37cc0a015..1cf301ad4 100644 --- a/src/SMESHGUI/SMESH_msg_ja.ts +++ b/src/SMESHGUI/SMESH_msg_ja.ts @@ -8286,4 +8286,12 @@ pip install meshio[all] オプション値 + + SMESHGUI_SpinBoxForbiddendRange + + VALID_RANGE_NOVAR_MSG + 範囲内の浮動小数点値を指定します [%1; %2) U (%3; %4] +%5 桁の精度 + + diff --git a/src/SMESH_SWIG/StdMeshersBuilder.py b/src/SMESH_SWIG/StdMeshersBuilder.py index 280ae889f..1b76873ed 100644 --- a/src/SMESH_SWIG/StdMeshersBuilder.py +++ b/src/SMESH_SWIG/StdMeshersBuilder.py @@ -188,7 +188,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp.SetUsePreestimatedLength( length == 0.0 ) return hyp - def NumberOfSegments(self, n, s=[], reversedEdges=[], UseExisting=0): + def NumberOfSegments(self, n, s=[], reversedEdges=[], UseExisting=0, beta=None): """ Defines "NumberOfSegments" hypothesis to cut an edge in a fixed number of segments @@ -199,6 +199,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): A list item can also be a tuple (edge, 1st_vertex_of_edge) UseExisting: if ==true - searches for an existing hypothesis created with the same parameters, else (default) - create a new one + beta: beta coefficient for Beta Law distribution Returns: an instance of StdMeshers_NumberOfSegments hypothesis @@ -209,15 +210,22 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): reversedEdges, UseExisting = [], reversedEdges entry = self.MainShapeEntry() reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) - if not s: - hyp = self.Hypothesis("NumberOfSegments", [n, reversedEdgeInd, entry], - UseExisting=UseExisting, - CompareMethod=self._compareNumberOfSegments) - else: - hyp = self.Hypothesis("NumberOfSegments", [n,s, reversedEdgeInd, entry], - UseExisting=UseExisting, - CompareMethod=self._compareNumberOfSegments) + + args = [n, reversedEdgeInd, entry] + if s: + args.insert(1, s) + elif beta: + args.append(beta) + + hyp = self.Hypothesis( + "NumberOfSegments", args, + UseExisting=UseExisting, CompareMethod=self._compareNumberOfSegments) + + if s: hyp.SetScaleFactor(s) + elif beta: + hyp.SetBeta(s) + hyp.SetNumberOfSegments(n) hyp.SetReversedEdges( reversedEdgeInd ) hyp.SetObjectEntry( entry ) diff --git a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx index c2a89b38c..338f3ca52 100644 --- a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx +++ b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx @@ -139,7 +139,7 @@ smIdType StdMeshers_NumberOfSegments::GetNumberOfSegments() const void StdMeshers_NumberOfSegments::SetDistrType(DistrType typ) { - if (typ < DT_Regular || typ > DT_ExprFunc) + if (!IsValidDistrType(typ)) throw SALOME_Exception(LOCALIZED("distribution type is out of range")); if (typ != _distrType) @@ -166,6 +166,18 @@ StdMeshers_NumberOfSegments::DistrType StdMeshers_NumberOfSegments::GetDistrType */ //================================================================================ +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) { if (scaleFactor < PRECISION) @@ -198,6 +210,43 @@ double StdMeshers_NumberOfSegments::GetScaleFactor() const 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; +} + //================================================================================ /*! * @@ -492,6 +541,9 @@ ostream & StdMeshers_NumberOfSegments::SaveTo(ostream & save) case DT_ExprFunc: save << " " << _func; break; + case DT_BetaLaw: + save << " " << _beta; + break; case DT_Regular: default: break; @@ -542,7 +594,7 @@ istream & StdMeshers_NumberOfSegments::LoadFrom(istream & load) // 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; @@ -607,6 +659,22 @@ istream & StdMeshers_NumberOfSegments::LoadFrom(istream & load) } } break; + + case DT_BetaLaw: + { + isOK = static_cast(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; diff --git a/src/StdMeshers/StdMeshers_NumberOfSegments.hxx b/src/StdMeshers/StdMeshers_NumberOfSegments.hxx index 4e637ba44..38a85fca8 100644 --- a/src/StdMeshers/StdMeshers_NumberOfSegments.hxx +++ b/src/StdMeshers/StdMeshers_NumberOfSegments.hxx @@ -72,7 +72,8 @@ public: DT_Regular, //!< equidistant distribution DT_Scale, //!< scale distribution DT_TabFunc, //!< distribution with density function presented by table - DT_ExprFunc //!< distribution with density function presented by expression + DT_ExprFunc, //!< distribution with density function presented by expression + DT_BetaLaw //!< distribution with Beta Law using parameter beta (expansion coefficient) }; /*! @@ -85,6 +86,11 @@ public: */ DistrType GetDistrType() const; + /*! + * \brief Check if a given int falls into distribution type scope + */ + bool IsValidDistrType(int distrType) const; + /*! * \brief Set scale factor for scale distribution * \param scaleFactor - positive value different from 1 @@ -101,6 +107,21 @@ public: */ double GetScaleFactor() const; + /*! + * \brief Set beta coefficient for Beta Law distribution + * \param beta - usually set between 1.01 (narrow mesh) and 1.00001 (very narrow mesh) + * + * Throws SALOME_Exception if distribution type is not DT_BetaLaw + */ + virtual void SetBeta(double scaleFactor); + + /*! + * \brief Get beta coefficient for Beta Law distribution + * + * Throws SALOME_Exception if distribution type is not DT_BetaLaw + */ + double GetBeta() const; + /*! * \brief Set table function for distribution DT_TabFunc * \param table - this vector contains the pairs (parameter, value) @@ -184,6 +205,7 @@ protected: smIdType _numberOfSegments; //!< an edge will be split on to this number of segments DistrType _distrType; //!< the type of distribution of density function double _scaleFactor; //!< the scale parameter for DT_Scale + double _beta; //!< beta coefficient for DT_BetaLaw std::vector _table, _distr; //!< the table for DT_TabFunc, a sequence of pairs of numbers std::string _func; //!< the expression of the function for DT_ExprFunc int _convMode; //!< flag of conversion mode: 0=exponent, 1=cut negative diff --git a/src/StdMeshers/StdMeshers_Regular_1D.cxx b/src/StdMeshers/StdMeshers_Regular_1D.cxx index 44c7c1a75..13b63bcc6 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.cxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.cxx @@ -209,6 +209,10 @@ bool StdMeshers_Regular_1D::CheckHypothesis( SMESH_Mesh& aMesh, _svalue[ EXPR_FUNC_IND ] = hyp->GetExpressionFunction(); _revEdgesIDs = hyp->GetReversedEdges(); break; + case StdMeshers_NumberOfSegments::DT_BetaLaw: + _value[BETA_IND] = hyp->GetBeta(); + _revEdgesIDs = hyp->GetReversedEdges(); + break; case StdMeshers_NumberOfSegments::DT_Regular: break; default: @@ -714,6 +718,74 @@ void StdMeshers_Regular_1D::redistributeNearVertices (SMESH_Mesh & theM } } +bool StdMeshers_Regular_1D::computeBetaLaw( + Adaptor3d_Curve& theC3d, + std::list& theParams, + double f, + double theLength, + double beta, + int nbSegments, + bool theReverse + ) +{ + // Implemented with formula, where h is the position of a point on the segment [0,1]: + // ratio=(1+beta)/(beta -1) + // zlog=log(ratio) + // puiss=exp(zlog*(1-h)) + // rapp=(1-puiss)/(1+puiss) + // f(h) =1+beta*rapp + // + // Look at https://gitlab.onelab.info/gmsh/gmsh/-/commit/d581b381f2b8639fba40f2e771e2573d1a0f8424 + // Especially gmsh/src/mesh/meshGEdge.cpp, 507: createPoints() + + if (theReverse) + { + beta *= -1; + } + + MESSAGE("Compute BetaLaw. beta: " << beta); + + // Prepare a temp storage for position values + const int nbNewPoints = nbSegments - 1; + std::vector t(nbNewPoints); + + // Calculate position values with beta for each point + const double zlog = log((1. + beta) / (beta - 1.)); + for(smIdType i = 0; i < nbNewPoints; i++) + { + const double eta = (double)(i + 1) / nbSegments; + const double power = exp(zlog * (1. - eta)); + const double ratio = (1. - power) / (1. + power); + const double pos = 1.0 + beta * ratio; + + // Check if we need to reverse distribution + if (beta > 0) + { + t[i] = pos; + } + else + { + t[nbNewPoints - i - 1] = 1.0 - pos; + } + + // Commented to prevent bloated output with a casual debug + // MESSAGE("Calculated position " << i << ": " << pos); + } + + // Make points for each calculated value + for(const auto i : t) + { + const double abscissa = i * theLength; + MESSAGE("abscissa: " << abscissa); + + GCPnts_AbscissaPoint Discret(Precision::Confusion(), theC3d, abscissa, f); + if (Discret.IsDone()) + theParams.push_back(Discret.Parameter()); + } + + return true; +} + //============================================================================= /*! * @@ -906,6 +978,10 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, theParams); } break; + + case StdMeshers_NumberOfSegments::DT_BetaLaw: + return computeBetaLaw(theC3d, theParams, f, theLength, _value[BETA_IND], nbSegments, theReverse); + case StdMeshers_NumberOfSegments::DT_Regular: eltSize = theLength / double( nbSegments ); break; diff --git a/src/StdMeshers/StdMeshers_Regular_1D.hxx b/src/StdMeshers/StdMeshers_Regular_1D.hxx index b19e81ec5..a4c01c9ef 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.hxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.hxx @@ -106,6 +106,14 @@ protected: double theLastU, std::list & theParameters ); + bool computeBetaLaw(Adaptor3d_Curve& theC3d, + std::list& theParams, + double f, + double theLength, + double beta, + int nbSegments, + bool theReverse); + /*! * \brief Return StdMeshers_SegmentLengthAroundVertex assigned to vertex */ @@ -117,6 +125,7 @@ protected: enum ValueIndex { SCALE_FACTOR_IND = 0, + BETA_IND = 0, BEG_LENGTH_IND = 0, END_LENGTH_IND = 1, DEFLECTION_IND = 0, diff --git a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx index 116df94bc..d60a9a9bd 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx @@ -36,6 +36,7 @@ #include #include #include +#include // IDL includes #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) @@ -65,6 +66,7 @@ StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator() myNbSeg( 0 ), myDistr( 0 ), myScale( 0 ), + myBeta( 0 ), myTable( 0 ), #ifndef DISABLE_PLOT2DVIEWER myPreview( 0 ), @@ -73,6 +75,7 @@ StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator() myConvBox( 0 ), myConv( 0 ), myLScale( 0 ), + myLBeta( 0 ), myLTable( 0 ), myLExpr( 0 ), myInfo( 0 ), @@ -96,6 +99,7 @@ bool StdMeshersGUI_NbSegmentsCreator::checkParams( QString& msg ) const bool res = storeParamsToHypo( data_new ); res = myNbSeg->isValid( msg, true ) && res; res = myScale->isValid( msg, true ) && res; + res = myBeta->isValid( msg, true ) && res; if ( !res ) storeParamsToHypo( data_old ); return res; @@ -151,6 +155,7 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame() types.append( tr( "SMESH_DISTR_SCALE" ) ); types.append( tr( "SMESH_DISTR_TAB" ) ); types.append( tr( "SMESH_DISTR_EXPR" ) ); + types.append( tr( "SMESH_DISTR_BETALAW" ) ); myDistr->addItems( types ); myGroupLayout->addWidget( myDistr, row, 1 ); row++; @@ -238,6 +243,14 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame() lay->setStretchFactor( myReversedEdgesHelper, 1 ); } + // 7) Beta Law distribution + myGroupLayout->addWidget(myLBeta = new QLabel(tr("SMESH_NB_SEGMENTS_BETA_PARAM"), GroupC1), row, 0); + myBeta = new SMESHGUI_SpinBoxForbiddendRange(GroupC1); + myBeta->RangeStepAndValidator(-1E+5, 1E+5, 0.00001, "parametric_precision"); + myBeta->SetForbiddenRange(-1.0, 1.0); + myGroupLayout->addWidget(myBeta, row, 1); + row++; + connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) ); connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) ); connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) ); @@ -271,6 +284,8 @@ void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const myTable->setData( data.myTable ); myExpr->setText( data.myExpr ); + myBeta->setValue(data.myBeta); + if ( dlg() ) dlg()->setMinimumSize( dlg()->minimumSizeHint().width(), dlg()->minimumSizeHint().height() ); } @@ -288,7 +303,8 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const Regular, //!< equidistant distribution Scale, //!< scale distribution TabFunc, //!< distribution with density function presented by table - ExprFunc //!< distribution with density function presented by expression + ExprFunc, //!< distribution with density function presented by expression + BetaLaw //!< distribution with density function presented by expression }; bool hasConv = false; switch ( data.myDistrType ) { @@ -314,6 +330,10 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const valStr += data.myExpr; hasConv = true; break; + + case BetaLaw: + valStr += tr("SMESH_NB_SEGMENTS_BETA_PARAM") + " = " + QString::number(data.myBeta); + break; } if ( hasConv ) { @@ -366,6 +386,7 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisDa h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1"; h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1; /*cut negative by default*/ + h_data.myBeta = distr==4 ? h->GetBeta() : 1.01; return true; } @@ -394,7 +415,7 @@ bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothe if( distr==2 || distr==3 ) h->SetConversionMode( h_data.myConv ); - if( distr==1 || distr==2 || distr==3 ) { + if( distr==1 || distr==2 || distr==3 || distr == 4) { h->SetReversedEdges( myDirectionWidget->GetListOfIDs() ); h->SetObjectEntry( myDirectionWidget->GetMainShapeEntry() ); } @@ -407,6 +428,12 @@ bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothe //setting of function must follow after setConversionMode, because otherwise //the function will be checked with old conversion mode, so that it may occurs //unexpected errors for user + + if(distr == 4) + { + h->SetDistrType(distr); + h->SetBeta(h_data.myBeta); + } } catch(const SALOME::SALOME_Exception& ex) { @@ -425,6 +452,7 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesi h_data.myDistrType = myDistr->currentIndex(); h_data.myConv = myConv->checkedId(); h_data.myScale = myScale->value(); + h_data.myBeta = myBeta->value(); myTable->data( h_data.myTable ); h_data.myExpr = myExpr->text(); return true; @@ -483,6 +511,11 @@ void StdMeshersGUI_NbSegmentsCreator::onValueChanged() myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->checkedId() ) ); #endif + // Beta Law UI elements + const bool isBetaLaw = distr == 4; + myBeta->setVisible(isBetaLaw); + myLBeta->setVisible(isBetaLaw); + if ( (QtxComboBox*)sender() == myDistr && dlg() ) { QApplication::instance()->processEvents(); myGroupLayout->invalidate(); diff --git a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.h b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.h index d873fdae1..67b612ce9 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.h +++ b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.h @@ -49,15 +49,16 @@ class QGridLayout; class QRadioButton; class StdMeshersGUI_SubShapeSelectorWdg; class StdMeshersGUI_PropagationHelperWdg; +class SMESHGUI_SpinBoxForbiddendRange; typedef struct { int myNbSeg, myDistrType, myConv; double myScale; + double myBeta; SMESH::double_array myTable; QString myName, myExpr; QString myNbSegVarName, myScaleVarName; - } NbSegmentsHypothesisData; class STDMESHERSGUI_EXPORT StdMeshersGUI_NbSegmentsCreator : public StdMeshersGUI_StdHypothesisCreator @@ -87,6 +88,7 @@ private: SalomeApp_IntSpinBox* myNbSeg; QtxComboBox* myDistr; SMESHGUI_SpinBox* myScale; + SMESHGUI_SpinBoxForbiddendRange* myBeta; StdMeshersGUI_DistrTableFrame* myTable; #ifndef DISABLE_PLOT2DVIEWER StdMeshersGUI_DistrPreview* myPreview; @@ -94,7 +96,7 @@ private: QLineEdit *myName, *myExpr; QGroupBox* myConvBox; QButtonGroup* myConv; - QLabel *myLScale, *myLTable, *myLExpr, *myInfo; + QLabel *myLScale, *myLTable, *myLExpr, *myInfo, *myLBeta; QGridLayout* myGroupLayout; int myTableRow, myPreviewRow; //QRadioButton* myCutNeg; diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts index 85a684bc6..8df409d6d 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_en.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts @@ -154,6 +154,10 @@ Consider creating another hypothesis instead of using this one for this mesh/sub SMESH_DISTR_TAB Distribution with table density + + SMESH_DISTR_BETALAW + Distribution with Beta Law + SMESH_DISTR_TYPE Type of distribution @@ -310,6 +314,10 @@ Consider creating another hypothesis instead of using this one for this mesh/sub SMESH_NB_SEGMENTS_SCALE_PARAM Scale Factor + + SMESH_NB_SEGMENTS_BETA_PARAM + Expansion coefficient + SMESH_NB_SEGMENTS_TITLE Hypothesis Construction diff --git a/src/StdMeshersGUI/StdMeshers_msg_fr.ts b/src/StdMeshersGUI/StdMeshers_msg_fr.ts index 1558c5476..96643ce93 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_fr.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_fr.ts @@ -154,6 +154,10 @@ Veuillez plutôt créer une autre hypothèse à la place de celle-ci pour ce mai SMESH_DISTR_TAB Distribution avec une table de densités + + SMESH_DISTR_BETALAW + Distribution avec la Loi Bêta + SMESH_DISTR_TYPE Type de distribution @@ -306,6 +310,10 @@ Veuillez plutôt créer une autre hypothèse à la place de celle-ci pour ce mai SMESH_NB_SEGMENTS_PARAM Nombre de segments + + SMESH_NB_SEGMENTS_BETA_PARAM + Coefficient de dilatation + SMESH_NB_SEGMENTS_SCALE_PARAM Facteur d'échelle diff --git a/src/StdMeshersGUI/StdMeshers_msg_ja.ts b/src/StdMeshersGUI/StdMeshers_msg_ja.ts index 3e0763809..78eefcc80 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_ja.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_ja.ts @@ -142,6 +142,10 @@ SMESH_DISTR_TAB 密度のテーブル + + SMESH_DISTR_BETALAW + ベータ法による分布 + SMESH_DISTR_TYPE 分布の種類 @@ -294,6 +298,10 @@ SMESH_NB_SEGMENTS_PARAM セグメントの数 + + SMESH_NB_SEGMENTS_BETA_PARAM + 膨張係数 + SMESH_NB_SEGMENTS_SCALE_PARAM スケール ファクター diff --git a/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.cxx b/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.cxx index 5a3a0af40..597f7a5c9 100644 --- a/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.cxx +++ b/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.cxx @@ -234,6 +234,50 @@ CORBA::Double StdMeshers_NumberOfSegments_i::GetScaleFactor() return scale; } +//============================================================================= +/*! + * StdMeshers_NumberOfSegments_i::SetBeta + * + * Set beta coefficient for Beta Law distribution + */ +//============================================================================= + +void StdMeshers_NumberOfSegments_i::SetBeta(CORBA::Double beta) +{ + ASSERT(myBaseImpl); + try { + this->GetImpl()->SetBeta(beta); + // Update Python script + SMESH::TPythonDump() << _this() << ".SetBeta( " << SMESH::TVar(beta) << " )"; + } + catch (SALOME_Exception& S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } +} + +//============================================================================= +/*! + * StdMeshers_NumberOfSegments_i::GetBeta + * + * Get beta coefficient for Beta Law distribution + */ +//============================================================================= + +CORBA::Double StdMeshers_NumberOfSegments_i::GetBeta() +{ + ASSERT(myBaseImpl); + + double beta = 1.0; + try { + beta = this->GetImpl()->GetBeta(); + } + catch (SALOME_Exception& S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + return beta; +} + //============================================================================= /*! */ diff --git a/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.hxx b/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.hxx index 28e94d0e6..521828a23 100644 --- a/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.hxx +++ b/src/StdMeshers_I/StdMeshers_NumberOfSegments_i.hxx @@ -72,6 +72,11 @@ public: // Get scalar factor CORBA::Double GetScaleFactor(); + // Set beta coefficient for Beta Law distribution + void SetBeta(CORBA::Double beta); + // Get beta coefficient for Beta Law distribution + CORBA::Double GetBeta(); + // Set table function for distribution DT_TabFunc void SetTableFunction(const SMESH::double_array& table); // Get table function for distribution DT_TabFunc diff --git a/test/SMESH_beta_law.py b/test/SMESH_beta_law.py new file mode 100644 index 000000000..db9c8e031 --- /dev/null +++ b/test/SMESH_beta_law.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +import salome + +salome.salome_init() + +### +### GEOM component +### + +from salome.geom import geomBuilder + +geompy = geomBuilder.New() + +p1 = geompy.MakeVertex(0, 0, 0, theName="p1") +p2 = geompy.MakeVertex(.1, 0, 0, theName="p2") +p3 = geompy.MakeVertex(.1, .3, 0, theName="p3") +p4 = geompy.MakeVertex(0, .3, 0, theName="p4") + +p5 = geompy.MakeVertex(-0.05, 0.1, 0, theName="p5") +p6 = geompy.MakeVertex(-0.05, 0.05, 0, theName="p6") + +points = [p1, p2, p3, p4, p5, p6, p1] + +polyline = geompy.MakePolyline(points, theName="polyline") + +face = geompy.MakeFace(polyline, 1, theName="face") + +edges_by_name = {} +for i in range(len(points)-1): + name = "edge_%i"%(i+1) + edge = geompy.GetEdge(face, points[i], points[i+1], theName=name) + edges_by_name[name] = edge + +### +### SMESH component +### + +import SMESH +from salome.smesh import smeshBuilder + +smesh = smeshBuilder.New() + +Mesh_1 = smesh.Mesh(face,'Mesh_1') + +main_algo1D = Mesh_1.Segment() +main_algo1D.NumberOfSegments(5) + +sub_algo1D = Mesh_1.Segment(edges_by_name["edge_1"]) +nb_seg_hyp = sub_algo1D.NumberOfSegments(29) +nb_seg_hyp.SetDistrType( 4 ) +nb_seg_hyp.SetBeta( 1.001 ) + + +sub_algo1D = Mesh_1.Segment(edges_by_name["edge_2"]) +nb_seg_hyp = sub_algo1D.NumberOfSegments(19) + +sub_algo1D = Mesh_1.Segment(edges_by_name["edge_3"]) +nb_seg_hyp = sub_algo1D.NumberOfSegments(29) +nb_seg_hyp.SetDistrType( 4 ) +nb_seg_hyp.SetBeta( -1.001 ) + +sub_algo1D = Mesh_1.Segment(edges_by_name["edge_4"]) +nb_seg_hyp = sub_algo1D.NumberOfSegments(9) + +Quadrangle_2D = Mesh_1.Quadrangle() + +isDone = Mesh_1.Compute() +Mesh_1.CheckCompute() + +gr_edges_by_name = {} +for name, edge in edges_by_name.items(): + gr_edge = Mesh_1.Group(edge) + gr_edges_by_name[name] = gr_edge + +assert Mesh_1.NbEdges() == 5+5+29*2+19+9 +assert Mesh_1.NbQuadrangles() == 551 + +expected_mini = 2.9948449467664952e-05 +expected_maxi = 0.013044372341778604 +mini_1, maxi_1 = Mesh_1.GetMinMax(SMESH.FT_Length, meshPart=gr_edges_by_name["edge_1"]) +mini_3, maxi_3 = Mesh_1.GetMinMax(SMESH.FT_Length, meshPart=gr_edges_by_name["edge_3"]) + +assert abs(expected_mini-mini_1)/mini_1 < 1e-12 +assert abs(expected_mini-mini_3)/mini_3 < 1e-12 + +assert abs(expected_maxi-maxi_1)/maxi_1 < 1e-12 +assert abs(expected_maxi-maxi_3)/maxi_3 < 1e-12 + + +if salome.sg.hasDesktop(): + salome.sg.updateObjBrowser() diff --git a/test/SMESH_reg.py b/test/SMESH_reg.py index df568d872..b7c14880a 100644 --- a/test/SMESH_reg.py +++ b/test/SMESH_reg.py @@ -70,7 +70,7 @@ smesh.UpdateStudy() # ---- Creating meshes box = salome.IDToObject(idbox) -names = [ "MeshBoxReg", "MeshBoxScale", "MeshBoxTable", "MeshBoxExpr" ] +names = [ "MeshBoxReg", "MeshBoxScale", "MeshBoxTable", "MeshBoxExpr", "MeshBoxBeta" ] print("-------------------------- Create ", names[0], " mesh") @@ -82,6 +82,9 @@ smesh.SetName(hyp, "NumberOfSegmentsReg") algo = mesh.Triangle() algo.MaxElementArea(2500) +mesh.Compute() +mesh.CheckCompute() + print("-------------------------- Create ", names[1], " mesh") mesh = smesh.Mesh(box, names[1]) algo = mesh.Segment() @@ -92,6 +95,9 @@ smesh.SetName(hyp, "NumberOfSegmentsScale") algo = mesh.Triangle() algo.MaxElementArea(2500) +mesh.Compute() +mesh.CheckCompute() + print("-------------------------- Create ", names[2], " mesh") mesh = smesh.Mesh(box,names[2]) algo = mesh.Segment() @@ -103,6 +109,9 @@ smesh.SetName(hyp, "NumberOfSegmentsTable") algo = mesh.Triangle() algo.MaxElementArea(2500) +mesh.Compute() +mesh.CheckCompute() + print("-------------------------- Create ", names[3], " mesh") mesh = smesh.Mesh(box, names[3]) algo = mesh.Segment() @@ -114,6 +123,25 @@ smesh.SetName(hyp, "NumberOfSegmentsExpr") algo = mesh.Triangle() algo.MaxElementArea(2500) +mesh.Compute() +mesh.CheckCompute() + +print("-------------------------- Create ", names[4], " mesh") +mesh = smesh.Mesh(box, names[4]) +algo = mesh.Segment() +hyp = algo.NumberOfSegments(7) +hyp.SetDistrType(4) +hyp.SetBeta(1.01) +smesh.SetName(hyp, "NumberOfSegmentsBeta") + +quad_2d = mesh.Quadrangle() +quad_2d.SetName("Quadrangle_2D") + +hexa_3d = mesh.Hexahedron() +hexa_3d.SetName("Hexa_3D") + +mesh.Compute() +mesh.CheckCompute() + salome.sg.updateObjBrowser() - diff --git a/test/tests.set b/test/tests.set index 9de76f4a3..9ed691711 100644 --- a/test/tests.set +++ b/test/tests.set @@ -42,6 +42,7 @@ SET(BAD_TESTS PAL_MESH_041_mesh.py PAL_MESH_043_3D.py SMESH_BelongToGeom.py + SMESH_beta_law.py SMESH_box2_tetra.py SMESH_box3_tetra.py SMESH_box_tetra.py