From: eap Date: Wed, 16 Mar 2011 15:41:27 +0000 (+0000) Subject: 0020978: EDF 1475 SMESH: Convert linear to quadratic on a submesh X-Git-Tag: Start_BR_19998_21191~21 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d992d85973a627445c091bd3f6df766b4990b282;p=modules%2Fsmesh.git 0020978: EDF 1475 SMESH: Convert linear to quadratic on a submesh --- diff --git a/doc/salome/gui/SMESH/images/convert.png b/doc/salome/gui/SMESH/images/convert.png index 4a71cac99..2ebbedc3a 100644 Binary files a/doc/salome/gui/SMESH/images/convert.png and b/doc/salome/gui/SMESH/images/convert.png differ diff --git a/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc b/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc index 5409f487e..dd1b71e44 100644 --- a/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc +++ b/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc @@ -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. To produce a conversion:
    +
  1. Select a mesh or a sub-mesh in the Object Browser or in the +Viewer.
  2. From the Modification menu choose the Convert to/from Quadratic Mesh item, or click "Convert to/from quadratic" button in the toolbar. @@ -20,11 +26,18 @@ The following dialog box will appear: \image html convert.png
  3. -
  4. In this dialog box you should select: +
  5. In this dialog box you should specify:
      -
    • if you wish to convert standard mesh to quadratic or quadratic to standard;
    • -
    • if you wish to place medium nodes of the quadratic mesh on the geometry (meshed object).
    • +
    • 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.
    • + +
    • 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).
    \image html image156.gif diff --git a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc index fe0da8e61..1dd65bfa1 100644 --- a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc @@ -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 */ diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 7cd7de1ec..18e7669cb 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -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 ); diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.cxx index 684a561b5..161a5f696 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.cxx @@ -36,6 +36,7 @@ #include #include #include +#include #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("%1").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 ) diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.h b/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.h index 59099246d..9c46953f5 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.h +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadDlg.h @@ -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 diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx index 5b8777753..d9cf28486 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx @@ -30,8 +30,9 @@ #include "SMESHGUI.h" #include "SMESHGUI_ConvToQuadDlg.h" #include "SMESHGUI_Utils.h" +#include "SMDSAbs_ElementType.hxx" -#include +#include "SMESH_TypeFilter.hxx" // SALOME GUI includes #include @@ -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( pMesh ); + SMESH::SMESH_IDSource_var idSource = + SMESH::SObjectToInterface( 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( 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( pMesh ); + SMESH::SMESH_Mesh_var mesh; + SMESH::SMESH_IDSource_var idSource = + SMESH::SObjectToInterface( 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; - - 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); - - 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; + 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 ] ); + + bool hasLin = ( nbElemOfType[SMDSEntity_Edge ] || + nbElemOfType[SMDSEntity_Triangle ] || + nbElemOfType[SMDSEntity_Quadrangle] || + nbElemOfType[SMDSEntity_Tetra ] || + nbElemOfType[SMDSEntity_Hexa ] || + nbElemOfType[SMDSEntity_Pyramid ] || + nbElemOfType[SMDSEntity_Penta ] ); + + 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( pMesh ); + SMESH::SMESH_IDSource_var idSource = + SMESH::SObjectToInterface( 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 ); diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h index f4f13e72c..26f59819c 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h @@ -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(); diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index d6e8ce582..3dcdc8ae9 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -3903,7 +3903,7 @@ Do you want to restore original submesh priority? MESH - Mesh + Mesh or Sub-mesh RADIOBTN_1 @@ -3913,6 +3913,10 @@ Do you want to restore original submesh priority? RADIOBTN_2 Convert from quadratic + + NON_CONFORM_WARNING + Warning: mesh can become non-conformal + SMESHGUI_ConvToQuadOp