0022104: EDF 2550 SMESH: 2D viscous layer, allow specifying edges with viscous layer

This commit is contained in:
eap 2013-05-30 14:17:56 +00:00
parent cb2ff0ef70
commit 62c442d05f
10 changed files with 280 additions and 34 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -53,8 +53,8 @@ segments on all four sides of the face must be even (divisible by 2).
<h2>Viscous Layers and Viscous Layers 2D</h2> <h2>Viscous Layers and Viscous Layers 2D</h2>
<b>Viscous Layers</b> and <b>Viscous Layers 2D </b> additional <b>Viscous Layers</b> and <b>Viscous Layers 2D </b> additional
hypotheses can be used together with some 3D algorithms, for example, hypotheses can be used together with either some 3D algorithms, for example
Hexahedron(i,j,k) or 2D algorithms, for example, Triangle Hexahedron(i,j,k), or 2D algorithms, for example Triangle
(MEFISTO), correspondingly. These hypotheses allow creation of layers (MEFISTO), correspondingly. These hypotheses allow creation of layers
of highly stretched elements, prisms in 3D and quadrilaterals in 2D, of highly stretched elements, prisms in 3D and quadrilaterals in 2D,
near mesh boundary, which is beneficial for high quality viscous near mesh boundary, which is beneficial for high quality viscous
@ -67,13 +67,20 @@ computations.
<li><b>Total thickness</b> - gives the total thickness of element layers.</li> <li><b>Total thickness</b> - gives the total thickness of element layers.</li>
<li><b>Number of layers</b> - defines the number of element layers.</li> <li><b>Number of layers</b> - defines the number of element layers.</li>
<li><b>Stretch factor</b> - defines the growth factor of element height <li><b>Stretch factor</b> - defines the growth factor of element height
from the mesh boundary inwards.</li> from the mesh boundary inwards.</li>
<li><b>Faces (Edges) without layers</b> - defines geometrical faces <li><b>Specified Edges are</b> - defines how the shapes specified by
(or edges in 2D) on which element layers should not be the next parameter are used.
constructed. By default the element layers are not constructed on <li><b>Faces without layers</b> and <b>Edges with/without layers</b> -
geometrical faces shared by solids (and edges shared by faces in 2D). in the 3D case it defines geometrical faces on which element layers
should not be constructed; in the 2D case it defines geometrical edges
on which element layers either should be or should not be
constructed, depending on the value of the previous parameter
(<b>Specified Edges are</b>). Whatever shapes are specified by this
parameter, the element layers are not constructed on geometrical
faces shared by several solids in 3D case and edges shared by
several faces in 2D case.
\note A mesh shown in the 3D Viewer can prevent selection of faces \note A mesh shown in the 3D Viewer can prevent selection of faces
and edges, in this case just hide the mesh. To avoid a long wait when a and edges, just hide the mesh to avoid this. To avoid a long wait when a
geometry with many faces (or edges) is displayed, the number of faces geometry with many faces (or edges) is displayed, the number of faces
(edges) shown at a time is limited by the value of "Sub-shapes (edges) shown at a time is limited by the value of "Sub-shapes
preview chunk size" preference (in Preferences/Mesh/General tab). preview chunk size" preference (in Preferences/Mesh/General tab).

View File

@ -35,7 +35,8 @@ salomeinclude_HEADERS = \
StdMeshersGUI_LayerDistributionParamWdg.h \ StdMeshersGUI_LayerDistributionParamWdg.h \
StdMeshersGUI_FixedPointsParamWdg.h \ StdMeshersGUI_FixedPointsParamWdg.h \
StdMeshersGUI_SubShapeSelectorWdg.h \ StdMeshersGUI_SubShapeSelectorWdg.h \
StdMeshersGUI_CartesianParamCreator.h StdMeshersGUI_CartesianParamCreator.h \
StdMeshersGUI_RadioButtonsGrpWdg.h
# Libraries targets # Libraries targets
lib_LTLIBRARIES = libStdMeshersGUI.la lib_LTLIBRARIES = libStdMeshersGUI.la
@ -51,7 +52,8 @@ dist_libStdMeshersGUI_la_SOURCES = \
StdMeshersGUI_LayerDistributionParamWdg.cxx \ StdMeshersGUI_LayerDistributionParamWdg.cxx \
StdMeshersGUI_FixedPointsParamWdg.cxx \ StdMeshersGUI_FixedPointsParamWdg.cxx \
StdMeshersGUI_SubShapeSelectorWdg.cxx \ StdMeshersGUI_SubShapeSelectorWdg.cxx \
StdMeshersGUI_CartesianParamCreator.cxx StdMeshersGUI_CartesianParamCreator.cxx \
StdMeshersGUI_RadioButtonsGrpWdg.cxx
MOC_FILES = \ MOC_FILES = \
StdMeshersGUI_StdHypothesisCreator_moc.cxx \ StdMeshersGUI_StdHypothesisCreator_moc.cxx \
@ -63,7 +65,8 @@ MOC_FILES = \
StdMeshersGUI_LayerDistributionParamWdg_moc.cxx \ StdMeshersGUI_LayerDistributionParamWdg_moc.cxx \
StdMeshersGUI_FixedPointsParamWdg_moc.cxx \ StdMeshersGUI_FixedPointsParamWdg_moc.cxx \
StdMeshersGUI_SubShapeSelectorWdg_moc.cxx \ StdMeshersGUI_SubShapeSelectorWdg_moc.cxx \
StdMeshersGUI_CartesianParamCreator_moc.cxx StdMeshersGUI_CartesianParamCreator_moc.cxx \
StdMeshersGUI_RadioButtonsGrpWdg_moc.cxx
nodist_libStdMeshersGUI_la_SOURCES= \ nodist_libStdMeshersGUI_la_SOURCES= \
$(MOC_FILES) $(MOC_FILES)

View File

@ -0,0 +1,82 @@
// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
//
// 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
//
#include "StdMeshersGUI_RadioButtonsGrpWdg.h"
#include <QVBoxLayout>
#include <QRadioButton>
#include <QButtonGroup>
#include <QStringList>
#define SPACING 6
#define MARGIN 11
//================================================================================
/*!
* \brief Creates a QGroupBox with a given title
*/
//================================================================================
StdMeshersGUI_RadioButtonsGrpWdg::StdMeshersGUI_RadioButtonsGrpWdg( const QString& title )
: QGroupBox( title )
{
myButtonGrp = new QButtonGroup( this );
}
//================================================================================
/*!
* \brief Creates a given nubmer of button labels with given labels (QString's)
*/
//================================================================================
void StdMeshersGUI_RadioButtonsGrpWdg::setButtonLabels( const QStringList& buttonLabels )
{
QVBoxLayout* layout = new QVBoxLayout( this );
layout->setSpacing(SPACING);
layout->setMargin(MARGIN);
for ( int id = 0; id < buttonLabels.size(); ++id )
{
QRadioButton* button = new QRadioButton( buttonLabels.at(id), this );
layout->addWidget( button );
myButtonGrp->addButton( button, id );
}
}
//================================================================================
/*!
* \brief Set checked a radio button with a give id.
*/
//================================================================================
void StdMeshersGUI_RadioButtonsGrpWdg::setChecked(int id)
{
if ( QAbstractButton* but = myButtonGrp->button( id ))
but->setChecked( true );
}
//================================================================================
/*!
* \brief Return id (zero based) of a checked radio button
*/
//================================================================================
int StdMeshersGUI_RadioButtonsGrpWdg::checkedId () const
{
return myButtonGrp->checkedId();
}

View File

@ -0,0 +1,53 @@
// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
//
// 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
//
#ifndef STDMESHERSGUI_RadioButtonsGrpWdg_H
#define STDMESHERSGUI_RadioButtonsGrpWdg_H
// SMESH includes
#include "SMESH_StdMeshersGUI.hxx"
// Qt includes
#include <QGroupBox>
class QButtonGroup;
class QStringList;
/*!
* \brief A QGroupBox holding several radio buttons
*/
class STDMESHERSGUI_EXPORT StdMeshersGUI_RadioButtonsGrpWdg : public QGroupBox
{
Q_OBJECT
public:
StdMeshersGUI_RadioButtonsGrpWdg (const QString& title);
void setButtonLabels( const QStringList& buttonLabels );
void setChecked(int id);
int checkedId() const;
QButtonGroup* getButtonGroup() { return myButtonGrp; }
private:
QButtonGroup* myButtonGrp;
};
#endif // STDMESHERSGUI_RadioButtonsGrpWdg_H

View File

@ -39,6 +39,7 @@
#include "StdMeshersGUI_ObjectReferenceParamWdg.h" #include "StdMeshersGUI_ObjectReferenceParamWdg.h"
#include "StdMeshersGUI_QuadrangleParamWdg.h" #include "StdMeshersGUI_QuadrangleParamWdg.h"
#include "StdMeshersGUI_SubShapeSelectorWdg.h" #include "StdMeshersGUI_SubShapeSelectorWdg.h"
#include "StdMeshersGUI_RadioButtonsGrpWdg.h"
#include <SALOMEDSClient_Study.hxx> #include <SALOMEDSClient_Study.hxx>
@ -58,6 +59,7 @@
#include <QSlider> #include <QSlider>
#include <QLabel> #include <QLabel>
#include <QCheckBox> #include <QCheckBox>
#include <QButtonGroup>
const double VALUE_MAX = 1.0e+15, // COORD_MAX const double VALUE_MAX = 1.0e+15, // COORD_MAX
VALUE_MAX_2 = VALUE_MAX * VALUE_MAX, VALUE_MAX_2 = VALUE_MAX * VALUE_MAX,
@ -709,9 +711,9 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const
h->SetStretchFactor ( params[2].myValue.toDouble() ); h->SetStretchFactor ( params[2].myValue.toDouble() );
if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg = if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg =
widget< StdMeshersGUI_SubShapeSelectorWdg >( 3 )) widget< StdMeshersGUI_SubShapeSelectorWdg >( 4 ))
{ {
h->SetIgnoreEdges( idsWg->GetListOfIDs() ); h->SetEdges( idsWg->GetListOfIDs(), params[3].myValue.toInt() );
} }
} }
else if( hypType()=="QuadrangleParams" ) else if( hypType()=="QuadrangleParams" )
@ -1198,7 +1200,19 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry();
if ( !aMainEntry.isEmpty() ) if ( !aMainEntry.isEmpty() )
{ {
item.myName = tr( "SMESH_EDGES_WO_LAYERS" ); item.myName = tr("TO_IGNORE_EDGES_OR_NOT");
p.append( item );
StdMeshersGUI_RadioButtonsGrpWdg* ignoreWdg = new StdMeshersGUI_RadioButtonsGrpWdg("");
ignoreWdg->setButtonLabels ( QStringList()
<< tr("NOT_TO_IGNORE_EDGES")
<< tr("TO_IGNORE_EDGES") );
ignoreWdg->setChecked( h->GetIsToIgnoreEdges() );
connect(ignoreWdg->getButtonGroup(),SIGNAL(buttonClicked(int)),this,SLOT(onValueChanged()));
customWidgets()->append( ignoreWdg );
item.myName =
tr( h->GetIsToIgnoreEdges() ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" );
p.append( item ); p.append( item );
StdMeshersGUI_SubShapeSelectorWdg* idsWg = StdMeshersGUI_SubShapeSelectorWdg* idsWg =
@ -1206,7 +1220,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
idsWg->SetGeomShapeEntry( aMainEntry ); idsWg->SetGeomShapeEntry( aMainEntry );
idsWg->SetMainShapeEntry( aMainEntry ); idsWg->SetMainShapeEntry( aMainEntry );
idsWg->SetListOfIDs( h->GetIgnoreEdges() ); idsWg->SetListOfIDs( h->GetEdges() );
idsWg->showPreview( true ); idsWg->showPreview( true );
customWidgets()->append ( idsWg ); customWidgets()->append ( idsWg );
} }
@ -1489,6 +1503,13 @@ bool StdMeshersGUI_StdHypothesisCreator::getParamFromCustomWidget( StdParam & pa
//param.myValue = w->isChecked(); //param.myValue = w->isChecked();
return true; return true;
} }
if ( widget->inherits( "StdMeshersGUI_RadioButtonsGrpWdg" ))
{
const StdMeshersGUI_RadioButtonsGrpWdg * w =
static_cast<const StdMeshersGUI_RadioButtonsGrpWdg*>( widget );
param.myValue = w->checkedId();
return true;
}
return false; return false;
} }
@ -1539,6 +1560,14 @@ void StdMeshersGUI_StdHypothesisCreator::valueChanged( QWidget* paramWidget)
toCopyGroups->setEnabled( true ); toCopyGroups->setEnabled( true );
} }
} }
else if ( hypType() == "ViscousLayers2D" && paramWidget->inherits("QButtonGroup"))
{
if ( QLabel* label = getLabel(4) )
{
bool toIgnore = widget< StdMeshersGUI_RadioButtonsGrpWdg >( 3 )->checkedId();
label->setText( tr( toIgnore ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" ));
}
}
} }
//================================================================================ //================================================================================

View File

@ -1,6 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS> <!DOCTYPE TS>
<TS version="2.0" language="en_US"> <TS version="2.0" language="en_US">
<context>
<name>StdMeshersGUI_StdHypothesisCreator</name>
<message>
<source>TO_IGNORE_EDGES_OR_NOT</source>
<translation>Specified edges are</translation>
</message>
<message>
<source>NOT_TO_IGNORE_EDGES</source>
<translation>Edges with layers (walls)</translation>
</message>
<message>
<source>TO_IGNORE_EDGES</source>
<translation>Edges without layers (inlets and oulets)</translation>
</message>
</context>
<context> <context>
<name>@default</name> <name>@default</name>
<message> <message>
@ -170,8 +185,16 @@
</message> </message>
<message> <message>
<source>SMESH_EDGES_WO_LAYERS</source> <source>SMESH_EDGES_WO_LAYERS</source>
<translation>Edges without layers <translation>Edges without layers</translation>
(inlets and oulets)</translation> </message>
<message>
<source>SMESH_FACES_WITH_LAYERS</source>
<translation>Faces with layers
(walls)</translation>
</message>
<message>
<source>SMESH_EDGES_WITH_LAYERS</source>
<translation>Edges with layers</translation>
</message> </message>
<message> <message>
<source>SMESH_MAX_LENGTH_TITLE</source> <source>SMESH_MAX_LENGTH_TITLE</source>

View File

@ -77,15 +77,48 @@ StdMeshers_ViscousLayers2D_i::~StdMeshers_ViscousLayers2D_i()
*/ */
//================================================================================ //================================================================================
void StdMeshers_ViscousLayers2D_i::SetIgnoreEdges(const ::SMESH::long_array& edgeIDs) void StdMeshers_ViscousLayers2D_i::SetEdges(const ::SMESH::long_array& edgeIDs,
throw ( SALOME::SALOME_Exception ) CORBA::Boolean toIgnore)
throw ( SALOME::SALOME_Exception )
{ {
vector<int> ids( edgeIDs.length() ); vector<int> ids( edgeIDs.length() );
for ( unsigned i = 0; i < ids.size(); ++i ) for ( unsigned i = 0; i < ids.size(); ++i )
if (( ids[i] = edgeIDs[i] ) < 1 ) if (( ids[i] = edgeIDs[i] ) < 1 )
THROW_SALOME_CORBA_EXCEPTION( "Invalid edge id", SALOME::BAD_PARAM ); THROW_SALOME_CORBA_EXCEPTION( "Invalid edge id", SALOME::BAD_PARAM );
GetImpl()->SetBndShapesToIgnore( ids );
SMESH::TPythonDump() << _this() << ".SetIgnoreEdges( " << edgeIDs << " )"; GetImpl()->SetBndShapes( ids, toIgnore );
SMESH::TPythonDump() << _this() << ".SetEdges( " << edgeIDs << ", " << toIgnore << " )";
}
//================================================================================
/*!
* \brief
*/
//================================================================================
void StdMeshers_ViscousLayers2D_i::SetIgnoreEdges(const ::SMESH::long_array& edgeIDs)
throw ( SALOME::SALOME_Exception )
{
SMESH::TPythonDump pyDump;
this->SetEdges( edgeIDs, true );
pyDump<< _this() << ".SetIgnoreEdges( " << edgeIDs << " )";
}
//================================================================================
/*!
* \brief
*/
//================================================================================
SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetEdges()
{
vector<int> idsVec = GetImpl()->GetBndShapes();
SMESH::long_array_var ids = new SMESH::long_array;
ids->length( idsVec.size() );
for ( unsigned i = 0; i < idsVec.size(); ++i )
ids[i] = idsVec[i];
return ids._retn();
} }
//================================================================================ //================================================================================
@ -96,12 +129,20 @@ throw ( SALOME::SALOME_Exception )
SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetIgnoreEdges() SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetIgnoreEdges()
{ {
vector<int> idsVec = GetImpl()->GetBndShapesToIgnore(); if ( GetImpl()->IsToIgnoreShapes() )
SMESH::long_array_var ids = new SMESH::long_array; return this->GetEdges();
ids->length( idsVec.size() ); return new SMESH::long_array;
for ( unsigned i = 0; i < idsVec.size(); ++i ) }
ids[i] = idsVec[i];
return ids._retn(); //================================================================================
/*!
* \brief
*/
//================================================================================
CORBA::Boolean StdMeshers_ViscousLayers2D_i::GetIsToIgnoreEdges()
{
return GetImpl()->IsToIgnoreShapes();
} }
//================================================================================ //================================================================================

View File

@ -48,9 +48,14 @@ class STDMESHERS_I_EXPORT StdMeshers_ViscousLayers2D_i:
// Destructor // Destructor
virtual ~StdMeshers_ViscousLayers2D_i(); virtual ~StdMeshers_ViscousLayers2D_i();
void SetIgnoreEdges(const ::SMESH::long_array& edgeIDs) throw ( SALOME::SALOME_Exception ); void SetIgnoreEdges(const SMESH::long_array& edgeIDs) throw ( SALOME::SALOME_Exception );
SMESH::long_array* GetIgnoreEdges(); SMESH::long_array* GetIgnoreEdges();
void SetEdges(const SMESH::long_array& edgeIDs,
CORBA::Boolean toIgnore) throw (SALOME::SALOME_Exception);
SMESH::long_array* GetEdges();
CORBA::Boolean GetIsToIgnoreEdges();
void SetTotalThickness(::CORBA::Double thickness) throw ( SALOME::SALOME_Exception ); void SetTotalThickness(::CORBA::Double thickness) throw ( SALOME::SALOME_Exception );
::CORBA::Double GetTotalThickness(); ::CORBA::Double GetTotalThickness();

View File

@ -85,7 +85,7 @@ throw ( SALOME::SALOME_Exception )
for ( unsigned i = 0; i < ids.size(); ++i ) for ( unsigned i = 0; i < ids.size(); ++i )
if (( ids[i] = faceIDs[i] ) < 1 ) if (( ids[i] = faceIDs[i] ) < 1 )
THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM ); THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM );
GetImpl()->SetBndShapesToIgnore( ids ); GetImpl()->SetBndShapes( ids, /*toIgnore=*/true );
SMESH::TPythonDump() << _this() << ".SetIgnoreFaces( " << faceIDs << " )"; SMESH::TPythonDump() << _this() << ".SetIgnoreFaces( " << faceIDs << " )";
} }
@ -97,11 +97,14 @@ throw ( SALOME::SALOME_Exception )
SMESH::long_array* StdMeshers_ViscousLayers_i::GetIgnoreFaces() SMESH::long_array* StdMeshers_ViscousLayers_i::GetIgnoreFaces()
{ {
vector<int> idsVec = GetImpl()->GetBndShapesToIgnore();
SMESH::long_array_var ids = new SMESH::long_array; SMESH::long_array_var ids = new SMESH::long_array;
if ( GetImpl()->IsToIgnoreShapes() )
{
vector<int> idsVec = GetImpl()->GetBndShapes();
ids->length( idsVec.size() ); ids->length( idsVec.size() );
for ( unsigned i = 0; i < idsVec.size(); ++i ) for ( unsigned i = 0; i < idsVec.size(); ++i )
ids[i] = idsVec[i]; ids[i] = idsVec[i];
}
return ids._retn(); return ids._retn();
} }