mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-24 16:30:34 +05:00
0020978: EDF 1475 SMESH: Convert linear to quadratic on a submesh
This commit is contained in:
parent
c774eacd4e
commit
d992d85973
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
@ -2,12 +2,18 @@
|
||||
|
||||
\page convert_to_from_quadratic_mesh_page Convert to/from Quadratic Mesh
|
||||
|
||||
\n This functionality allows you to transtorm standard meshes to
|
||||
quadratic and vice versa. See \ref adding_quadratic_elements_page "Adding quadratic elements"
|
||||
\n This functionality allows you to transtorm standard meshes (or
|
||||
sum-mesh) to quadratic and vice versa.
|
||||
See \ref adding_quadratic_elements_page "Adding quadratic elements"
|
||||
for more information about quadratic meshes.
|
||||
Note that conversion of the sub-mesh most probably will
|
||||
produce a non-conformal mesh. Elements on the boundary between
|
||||
quadratic and linear sub-meshes become (or remain) quadratic.
|
||||
|
||||
<em>To produce a conversion:</em>
|
||||
<ol>
|
||||
<li>Select a mesh or a sub-mesh in the Object Browser or in the
|
||||
Viewer.</li>
|
||||
<li>From the Modification menu choose the Convert to/from Quadratic
|
||||
Mesh item, or click <em>"Convert to/from quadratic"</em> button in the
|
||||
toolbar.
|
||||
@ -20,11 +26,18 @@ The following dialog box will appear:
|
||||
\image html convert.png
|
||||
|
||||
</li>
|
||||
<li>In this dialog box you should select:
|
||||
<li>In this dialog box you should specify:
|
||||
|
||||
<ul>
|
||||
<li>if you wish to convert standard mesh to quadratic or quadratic to standard;</li>
|
||||
<li>if you wish to place medium nodes of the quadratic mesh on the geometry (meshed object).</li>
|
||||
<li>if you wish to convert a standard mesh to quadratic or a quadratic
|
||||
mesh to standard. Note that the choice is available only if the selected mesh
|
||||
(or sub-mesh) contains both quadratic and linear elements, else the
|
||||
sole direction of convertion is automatically selected.</li>
|
||||
|
||||
<li>if you wish to place medium nodes of the quadratic mesh on the
|
||||
geometry (meshed object). This option is active at convertion to
|
||||
qudratic mesh only and provided that the mesh is based on some
|
||||
geometry (not imported from the file).</li>
|
||||
</ul>
|
||||
|
||||
\image html image156.gif
|
||||
|
@ -959,6 +959,13 @@ Mesh.ConvertFromQuadratic()
|
||||
|
||||
Mesh.ConvertToQuadratic( theForce3d=0 )
|
||||
|
||||
# to convert not the whole mesh but a sub-mesh, provide it as
|
||||
# an additional argument to the functions:
|
||||
# Mesh.ConvertToQuadratic( 0, subMesh )
|
||||
# Mesh.ConvertFromQuadratic( subMesh )
|
||||
#
|
||||
# Note that the mesh becomes non-conformal at conversion of sub-mesh.
|
||||
|
||||
\endcode
|
||||
|
||||
*/
|
||||
|
@ -3778,8 +3778,8 @@ void SMESHGUI::initialize( CAM_Application* app )
|
||||
popupMgr()->insert( separator(), -1, 0 );
|
||||
createPopupItem( 4043, OB, mesh ); // CLEAR_MESH
|
||||
popupMgr()->insert( separator(), -1, 0 );
|
||||
createPopupItem( 417, OB, mesh/*, "&& " + hasElems*/); // convert to quadratic
|
||||
createPopupItem( 418, OB, mesh/*, "&& " + hasVolumes*/); // create 2D mesh on 3D
|
||||
createPopupItem( 417, OB, mesh + " " + subMesh ); // convert to quadratic
|
||||
createPopupItem( 418, OB, mesh/*, "&& " + hasVolumes*/); // create 2D mesh on 3D
|
||||
popupMgr()->insert( separator(), -1, 0 );
|
||||
|
||||
QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <QFrame>
|
||||
#include <QHBoxLayout>
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
|
||||
#define SPACING 6
|
||||
#define MARGIN 11
|
||||
@ -70,6 +71,8 @@ SMESHGUI_ConvToQuadDlg::SMESHGUI_ConvToQuadDlg()
|
||||
myBG->addButton(myRB2, 1);
|
||||
myRB1->setChecked( true );
|
||||
|
||||
myWarning = new QLabel(QString("<b>%1</b>").arg(tr("NON_CONFORM_WARNING")), mainFrame());
|
||||
|
||||
// Fill layout
|
||||
QGridLayout* aLay = new QGridLayout( mainFrame() );
|
||||
aLay->setMargin( 5 );
|
||||
@ -80,6 +83,7 @@ SMESHGUI_ConvToQuadDlg::SMESHGUI_ConvToQuadDlg()
|
||||
aLay->addWidget( objectWg( 0, Control ), 0, 2 );
|
||||
aLay->addWidget( myMedNdsOnGeom, 1, 0, 1, 3 );
|
||||
aLay->addWidget( myBGBox, 2, 0, 1, 3 );
|
||||
aLay->addWidget( myWarning, 3, 0, 1, 3 );
|
||||
|
||||
connect(myBG, SIGNAL( buttonClicked( int ) ), this, SIGNAL( onClicked( int ) ) );
|
||||
}
|
||||
@ -113,11 +117,26 @@ int SMESHGUI_ConvToQuadDlg::CurrentRB( )
|
||||
return myBG->checkedId();
|
||||
}
|
||||
|
||||
void SMESHGUI_ConvToQuadDlg::ShowWarning(bool toShow)
|
||||
{
|
||||
if ( toShow )
|
||||
myWarning->show();
|
||||
else
|
||||
myWarning->hide();
|
||||
}
|
||||
|
||||
bool SMESHGUI_ConvToQuadDlg::isWarningShown()
|
||||
{
|
||||
return myWarning->isVisible();
|
||||
}
|
||||
|
||||
void SMESHGUI_ConvToQuadDlg::SetEnabledControls( const bool theCheck )
|
||||
{
|
||||
myBGBox->setEnabled( theCheck );
|
||||
//myBGBox->setEnabled( theCheck );
|
||||
myRB1->setEnabled( theCheck );
|
||||
myRB2->setEnabled( theCheck );
|
||||
myMedNdsOnGeom->setEnabled( theCheck );
|
||||
setButtonEnabled( theCheck, QtxDialog::OK | QtxDialog::Apply );
|
||||
//setButtonEnabled( theCheck, QtxDialog::OK | QtxDialog::Apply );
|
||||
}
|
||||
|
||||
void SMESHGUI_ConvToQuadDlg::SetEnabledRB( const int idx, const bool theCheck )
|
||||
|
@ -36,6 +36,7 @@ class QCheckBox;
|
||||
class QRadioButton;
|
||||
class QButtonGroup;
|
||||
class QGroupBox;
|
||||
class QLabel;
|
||||
|
||||
class SMESHGUI_EXPORT SMESHGUI_ConvToQuadDlg : public SMESHGUI_Dialog
|
||||
{
|
||||
@ -53,6 +54,8 @@ public:
|
||||
void SetEnabledControls( const bool );
|
||||
void SetEnabledRB( const int, const bool );
|
||||
int CurrentRB(); //returns the ID of the selected toggle button
|
||||
void ShowWarning(bool);
|
||||
bool isWarningShown();
|
||||
|
||||
signals:
|
||||
void onClicked( int );
|
||||
@ -63,6 +66,7 @@ private:
|
||||
QButtonGroup* myBG;
|
||||
QRadioButton* myRB1;
|
||||
QRadioButton* myRB2;
|
||||
QLabel* myWarning;
|
||||
};
|
||||
|
||||
#endif // SMESHGUI_CONVTOQUADDLG_H
|
||||
|
@ -30,8 +30,9 @@
|
||||
#include "SMESHGUI.h"
|
||||
#include "SMESHGUI_ConvToQuadDlg.h"
|
||||
#include "SMESHGUI_Utils.h"
|
||||
#include "SMDSAbs_ElementType.hxx"
|
||||
|
||||
#include <SMESH_TypeFilter.hxx>
|
||||
#include "SMESH_TypeFilter.hxx"
|
||||
|
||||
// SALOME GUI includes
|
||||
#include <LightApp_UpdateFlags.h>
|
||||
@ -100,6 +101,7 @@ void SMESHGUI_ConvToQuadOp::startOperation()
|
||||
|
||||
myDlg->SetMediumNdsOnGeom( false );
|
||||
myDlg->activateObject( 0 );
|
||||
myDlg->ShowWarning( false );
|
||||
myDlg->show();
|
||||
|
||||
selectionDone();
|
||||
@ -120,22 +122,26 @@ void SMESHGUI_ConvToQuadOp::selectionDone()
|
||||
SMESHGUI_SelectionOp::selectionDone();
|
||||
try
|
||||
{
|
||||
QString anMeshEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.toLatin1().data() );
|
||||
if ( !pMesh ) return;
|
||||
QString anObjEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
|
||||
if ( !pObj ) return;
|
||||
|
||||
SMESH::SMESH_Mesh_var mesh =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );
|
||||
SMESH::SMESH_IDSource_var idSource =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_IDSource>( pObj );
|
||||
|
||||
if( mesh->_is_nil() )
|
||||
myDlg->setButtonEnabled( true, QtxDialog::OK | QtxDialog::Apply );
|
||||
if( idSource->_is_nil() )
|
||||
{
|
||||
myDlg->SetEnabledControls( false );
|
||||
myDlg->setButtonEnabled( false, QtxDialog::OK | QtxDialog::Apply );
|
||||
return;
|
||||
}
|
||||
else if( ConsistMesh( mesh ) == SMESHGUI_ConvToQuadOp::Quadratic )
|
||||
MeshType meshType = ConsistMesh( idSource );
|
||||
if( meshType == SMESHGUI_ConvToQuadOp::Quadratic )
|
||||
{
|
||||
myDlg->SetEnabledRB( 0, false );
|
||||
}
|
||||
else if( ConsistMesh( mesh ) == SMESHGUI_ConvToQuadOp::Linear )
|
||||
else if( meshType == SMESHGUI_ConvToQuadOp::Linear )
|
||||
{
|
||||
myDlg->SetEnabledRB( 1, false );
|
||||
}
|
||||
@ -143,6 +149,22 @@ void SMESHGUI_ConvToQuadOp::selectionDone()
|
||||
{
|
||||
myDlg->SetEnabledControls( true );
|
||||
}
|
||||
|
||||
// show warning on non-conformal result mesh
|
||||
if ( ! idSource->_is_nil() )
|
||||
{
|
||||
SMESH::SMESH_subMesh_var subMesh =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_subMesh>( pObj );
|
||||
bool toShow = false;
|
||||
if ( !subMesh->_is_nil() )
|
||||
{
|
||||
SMESH::SMESH_Mesh_var mesh = idSource->GetMesh();
|
||||
idSource = SMESH::SMESH_IDSource::_narrow( mesh );
|
||||
MeshType fullMeshType = ConsistMesh( idSource );
|
||||
toShow = ( fullMeshType != Comp );
|
||||
}
|
||||
myDlg->ShowWarning( toShow );
|
||||
}
|
||||
}
|
||||
catch ( const SALOME::SALOME_Exception& S_ex )
|
||||
{
|
||||
@ -165,7 +187,7 @@ void SMESHGUI_ConvToQuadOp::selectionDone()
|
||||
SUIT_SelectionFilter* SMESHGUI_ConvToQuadOp::createFilter( const int theId ) const
|
||||
{
|
||||
if ( theId == 0 )
|
||||
return new SMESH_TypeFilter( MESH );
|
||||
return new SMESH_TypeFilter( MESHorSUBMESH );
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@ -183,45 +205,52 @@ bool SMESHGUI_ConvToQuadOp::onApply()
|
||||
|
||||
QString aMess;
|
||||
|
||||
QString anMeshEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.toLatin1().data() );
|
||||
if ( !pMesh )
|
||||
QString anObjEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
|
||||
if ( !pObj )
|
||||
{
|
||||
dlg()->show();
|
||||
SUIT_MessageBox::warning( myDlg,
|
||||
tr( "SMESH_WRN_WARNING" ), tr("MESH_IS_NOT_SELECTED") );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
SMESH::SMESH_Mesh_var mesh =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );
|
||||
SMESH::SMESH_Mesh_var mesh;
|
||||
SMESH::SMESH_IDSource_var idSource =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_IDSource>( pObj );
|
||||
if( !CORBA::is_nil(idSource) )
|
||||
mesh = idSource->GetMesh();
|
||||
|
||||
if( CORBA::is_nil(mesh) )
|
||||
{
|
||||
SUIT_MessageBox::warning( myDlg,
|
||||
tr( "SMESH_WRN_WARNING" ), tr("REF_IS_NULL") );
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool aResult = false;
|
||||
|
||||
try
|
||||
{
|
||||
SMESH::SMESH_MeshEditor_var aEditor = mesh->GetMeshEditor();
|
||||
aResult = true;
|
||||
if( !myDlg->CurrentRB() )
|
||||
{
|
||||
bool aParam = true;
|
||||
if( myDlg->IsEnabledCheck() )
|
||||
aParam = myDlg->IsMediumNdsOnGeom();
|
||||
|
||||
aEditor->ConvertToQuadratic( aParam );
|
||||
aResult = true;
|
||||
if ( myDlg->isWarningShown() )
|
||||
aEditor->ConvertToQuadraticObject( aParam, idSource );
|
||||
else
|
||||
aEditor->ConvertToQuadratic( aParam );
|
||||
}
|
||||
else
|
||||
{
|
||||
aResult = aEditor->ConvertFromQuadratic();
|
||||
if ( myDlg->isWarningShown() )
|
||||
aEditor->ConvertFromQuadraticObject( idSource );
|
||||
else
|
||||
aEditor->ConvertFromQuadratic();
|
||||
}
|
||||
}
|
||||
catch ( const SALOME::SALOME_Exception& S_ex )
|
||||
@ -247,42 +276,43 @@ bool SMESHGUI_ConvToQuadOp::onApply()
|
||||
* Determines, what elements this mesh contains.
|
||||
*/
|
||||
//================================================================================
|
||||
SMESHGUI_ConvToQuadOp::MeshType SMESHGUI_ConvToQuadOp::ConsistMesh( const SMESH::SMESH_Mesh_var& mesh) const
|
||||
SMESHGUI_ConvToQuadOp::MeshType SMESHGUI_ConvToQuadOp::ConsistMesh( const SMESH::SMESH_IDSource_var& idSource) const
|
||||
{
|
||||
int nbAllElem = 0, nbQEdges =0, nbQFaces =0, nbQVolum = 0;
|
||||
int nbEdges = 0, nbFaces = 0, nbVolum = 0;
|
||||
SMESH::long_array_var nbElemOfType = idSource->GetMeshInfo();
|
||||
bool hasQuad = ( nbElemOfType[SMDSEntity_Quad_Edge ] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Triangle ] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Quadrangle] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Tetra ] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Hexa ] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Pyramid ] ||
|
||||
nbElemOfType[SMDSEntity_Quad_Penta ] );
|
||||
|
||||
nbAllElem = (int)mesh->NbElements();
|
||||
nbQEdges = (int)mesh->NbEdgesOfOrder(SMESH::ORDER_QUADRATIC);
|
||||
nbQFaces = (int)mesh->NbFacesOfOrder(SMESH::ORDER_QUADRATIC);
|
||||
nbQVolum = (int)mesh->NbVolumesOfOrder(SMESH::ORDER_QUADRATIC);
|
||||
bool hasLin = ( nbElemOfType[SMDSEntity_Edge ] ||
|
||||
nbElemOfType[SMDSEntity_Triangle ] ||
|
||||
nbElemOfType[SMDSEntity_Quadrangle] ||
|
||||
nbElemOfType[SMDSEntity_Tetra ] ||
|
||||
nbElemOfType[SMDSEntity_Hexa ] ||
|
||||
nbElemOfType[SMDSEntity_Pyramid ] ||
|
||||
nbElemOfType[SMDSEntity_Penta ] );
|
||||
|
||||
nbEdges = (int)mesh->NbEdgesOfOrder(SMESH::ORDER_LINEAR);
|
||||
nbFaces = (int)mesh->NbFacesOfOrder(SMESH::ORDER_LINEAR);
|
||||
nbVolum = (int)mesh->NbVolumesOfOrder(SMESH::ORDER_LINEAR);
|
||||
|
||||
if( nbAllElem == (nbQEdges+nbQFaces+nbQVolum) )
|
||||
return SMESHGUI_ConvToQuadOp::Quadratic;
|
||||
else if ( nbAllElem == (nbEdges+nbFaces+nbVolum) )
|
||||
return SMESHGUI_ConvToQuadOp::Linear;
|
||||
else
|
||||
return SMESHGUI_ConvToQuadOp::Comp;
|
||||
if ( hasQuad && hasLin )
|
||||
return Comp;
|
||||
return hasQuad ? Quadratic : Linear;
|
||||
}
|
||||
|
||||
|
||||
void SMESHGUI_ConvToQuadOp::ConnectRadioButtons( int id )
|
||||
{
|
||||
QString anMeshEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.toLatin1().data() );
|
||||
if ( !pMesh ) return;
|
||||
QString anObjEntry = myDlg->selectedObject( 0 );
|
||||
_PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
|
||||
if ( !pObj ) return;
|
||||
|
||||
SMESH::SMESH_Mesh_var mesh =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );
|
||||
SMESH::SMESH_IDSource_var idSource =
|
||||
SMESH::SObjectToInterface<SMESH::SMESH_IDSource>( pObj );
|
||||
SMESH::SMESH_Mesh_var mesh = idSource->GetMesh();
|
||||
|
||||
GEOM::GEOM_Object_var mainGeom;
|
||||
mainGeom = mesh->GetShapeToMesh();
|
||||
bool hasGeom = mesh->HasShapeToMesh();
|
||||
|
||||
if( id || mainGeom->_is_nil() )
|
||||
if( id || !hasGeom )
|
||||
myDlg->SetEnabledCheck( false );
|
||||
else
|
||||
myDlg->SetEnabledCheck( true );
|
||||
|
@ -55,7 +55,7 @@ protected:
|
||||
virtual void startOperation();
|
||||
virtual void selectionDone();
|
||||
virtual SUIT_SelectionFilter* createFilter( const int ) const;
|
||||
MeshType ConsistMesh( const SMESH::SMESH_Mesh_var& ) const;
|
||||
MeshType ConsistMesh( const SMESH::SMESH_IDSource_var& ) const;
|
||||
|
||||
protected slots:
|
||||
virtual bool onApply();
|
||||
|
@ -3903,7 +3903,7 @@ Do you want to restore original submesh priority?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>MESH</source>
|
||||
<translation>Mesh</translation>
|
||||
<translation>Mesh or Sub-mesh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>RADIOBTN_1</source>
|
||||
@ -3913,6 +3913,10 @@ Do you want to restore original submesh priority?</translation>
|
||||
<source>RADIOBTN_2</source>
|
||||
<translation>Convert from quadratic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NON_CONFORM_WARNING</source>
|
||||
<translation>Warning: mesh can become non-conformal</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SMESHGUI_ConvToQuadOp</name>
|
||||
|
Loading…
Reference in New Issue
Block a user