X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_Make2DFrom3DOp.cxx;h=48fa3f75bb20eb6f6646c6b0f475783c8479a04a;hb=790c5cfa903e3b809e6bd5b7aefed48d17f15dc5;hp=4ffc3f09e4d30b02b8d701cd048eca79b95b0e7a;hpb=d8f644ca3d4ce62f2ef41d4aacb52f5bb1221df3;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx index 4ffc3f09e..48fa3f75b 100644 --- a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx +++ b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx @@ -28,12 +28,17 @@ #include "SMESH_LogicalFilter.hxx" // SALOME GUI includes +#include +#include #include -#include -#include +#include #include #include #include +#include +#include +#include +#include // IDL includes #include @@ -46,6 +51,7 @@ #include #include #include +#include #define SPACING 6 #define MARGIN 11 @@ -56,15 +62,11 @@ */ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) - : SMESHGUI_Dialog( parent, false, true, OK | Apply | Close | Help ) + : SMESHGUI_Dialog( parent, false, true, OK | Apply | Close | Help ) { // title setWindowTitle( tr("CAPTION") ); - // mesh - setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) ); - createObject( tr( "MESH" ), mainFrame(), Mesh ); - // mode QGroupBox* aModeGrp = new QGroupBox( tr( "MODE" ), mainFrame() ); QHBoxLayout* aModeGrpLayout = new QHBoxLayout( aModeGrp ); @@ -77,6 +79,12 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) aModeGrpLayout->addWidget( my1dFrom2dRB ); aModeGrpLayout->addWidget( my1dFrom3dRB ); + // Groups of mesh faces + setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) ); + createObject( tr( "Groups" ), mainFrame(), Groups ); + setNameIndication( Groups, ListOfNames ); + objectWg( Groups, Btn )->hide(); + // target QGroupBox* aTargetGrp = new QGroupBox( tr( "TARGET" ), mainFrame() ); QGridLayout* aTargetGrpLayout = new QGridLayout( aTargetGrp ); @@ -86,12 +94,10 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) myNewMeshRB = new QRadioButton( tr( "NEW_MESH" ), aTargetGrp ); myMeshName = new QLineEdit( aTargetGrp ); myCopyCheck = new QCheckBox( tr( "COPY_SRC" ), aTargetGrp ); - myMissingCheck = new QCheckBox( tr( "MISSING_ONLY" ), aTargetGrp ); aTargetGrpLayout->addWidget( myThisMeshRB, 0, 0 ); aTargetGrpLayout->addWidget( myNewMeshRB, 1, 0 ); aTargetGrpLayout->addWidget( myMeshName, 1, 1 ); aTargetGrpLayout->addWidget( myCopyCheck, 2, 0 ); - aTargetGrpLayout->addWidget( myMissingCheck, 2, 1 ); myGroupCheck = new QCheckBox( tr( "CREATE_GROUP" ), mainFrame() ); myGroupName = new QLineEdit( mainFrame() ); @@ -99,10 +105,9 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) QGridLayout* aDlgLay = new QGridLayout( mainFrame() ); aDlgLay->setMargin( 0 ); aDlgLay->setSpacing( SPACING ); - aDlgLay->addWidget( objectWg( Mesh, Label ), 0, 0 ); - aDlgLay->addWidget( objectWg( Mesh, Btn ), 0, 1 ); - aDlgLay->addWidget( objectWg( Mesh, Control ), 0, 2 ); - aDlgLay->addWidget( aModeGrp, 1, 0, 1, 3 ); + aDlgLay->addWidget( aModeGrp, 0, 0, 1, 3 ); + aDlgLay->addWidget( objectWg( Groups, Label ), 1, 0 ); + aDlgLay->addWidget( objectWg( Groups, Control ), 1, 1 ); aDlgLay->addWidget( aTargetGrp, 2, 0, 1, 3 ); aDlgLay->addWidget( myGroupCheck, 3, 0 ); aDlgLay->addWidget( myGroupName, 3, 1, 1, 2 ); @@ -115,7 +120,6 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) // init dlg my2dFrom3dRB->setChecked( true ); myThisMeshRB->setChecked( true ); - myMissingCheck->setChecked( true ); onTargetChanged(); onGroupChecked(); } @@ -169,16 +173,10 @@ bool SMESHGUI_Make2DFrom3DDlg::copySource() const return myCopyCheck->isChecked(); } -bool SMESHGUI_Make2DFrom3DDlg::copyMissingOnly() const -{ - return myMissingCheck->isChecked(); -} - void SMESHGUI_Make2DFrom3DDlg::onTargetChanged() { myMeshName->setEnabled( myNewMeshRB->isChecked() ); myCopyCheck->setEnabled( myNewMeshRB->isChecked() ); - myMissingCheck->setEnabled( myNewMeshRB->isChecked() ); } void SMESHGUI_Make2DFrom3DDlg::onGroupChecked() @@ -212,33 +210,61 @@ void SMESHGUI_Make2DFrom3DOp::startOperation() if( !myDlg ) myDlg = new SMESHGUI_Make2DFrom3DDlg( desktop() ); - mySrc = SMESH::SMESH_IDSource::_nil(); - myHelpFileName = "make_2dmesh_from_3d_page.html"; SMESHGUI_SelectionOp::startOperation(); - myDlg->activateObject( SMESHGUI_Make2DFrom3DDlg::Mesh ); myDlg->setNewMeshName( SMESH::UniqueName( "Mesh_1" ) ); myDlg->setGroupName( SMESH::UniqueName( "Group" ) ); myDlg->show(); - selectionDone(); + connect( myDlg->my2dFrom3dRB, SIGNAL( toggled(bool) ), this, SLOT( onModeChanged() ) ); + connect( myDlg->my1dFrom2dRB, SIGNAL( toggled(bool) ), this, SLOT( onModeChanged() ) ); + connect( myDlg->my1dFrom3dRB, SIGNAL( toggled(bool) ), this, SLOT( onModeChanged() ) ); + + onModeChanged(); +} + +void SMESHGUI_Make2DFrom3DOp::onModeChanged() +{ + QRadioButton* b = dynamic_cast( sender()); + if ( b && !b->isChecked() ) + return; + + // enable "2D groups" field + bool enableGroups = ( myDlg->mode() == SMESH::BND_1DFROM3D ); + myDlg->setObjectEnabled( SMESHGUI_Make2DFrom3DDlg::Groups, enableGroups ); + ((QToolButton*) myDlg->objectWg( SMESHGUI_Make2DFrom3DDlg::Groups, + SMESHGUI_Make2DFrom3DDlg::Btn ))->setChecked( enableGroups ); + + // install filter + int id = enableGroups ? SMESHGUI_Make2DFrom3DDlg::Groups : SMESHGUI_Make2DFrom3DDlg::Mesh; + onDeactivateObject( id ); + onActivateObject( id ); } void SMESHGUI_Make2DFrom3DOp::selectionDone() { + mySrcMesh = SMESH::SMESH_Mesh::_nil(); + myDlg->clearSelection( SMESHGUI_Make2DFrom3DDlg::Groups ); + if ( !dlg() ) return; + if ( dlg()->isVisible() ) { try { QStringList names, ids; LightApp_Dialog::TypesList types; selected( names, types, ids ); - if ( names.count() == 1 ) - myDlg->selectObject( names, types, ids ); - else - myDlg->clearSelection(); + myDlg->selectObject( names, types, ids ); + + SALOME_ListIO sel; selectionMgr()->selectedObjects( sel, SVTK_Viewer::Type() ); + if ( !sel.IsEmpty() ) + { + SMESH::SMESH_IDSource_var IS = SMESH::IObjectToInterface(sel.First()); + if(!CORBA::is_nil(IS)) + mySrcMesh = IS->GetMesh(); + } } catch ( const SALOME::SALOME_Exception& S_ex ) { SalomeApp_Tools::QtCatchCorbaException( S_ex ); @@ -250,13 +276,8 @@ void SMESHGUI_Make2DFrom3DOp::selectionDone() SUIT_SelectionFilter* SMESHGUI_Make2DFrom3DOp::createFilter( const int theId ) const { - SUIT_SelectionFilter* f = 0; - if ( theId == SMESHGUI_Make2DFrom3DDlg::Mesh ) { - QList filters; - filters.append( new SMESH_TypeFilter( MESHorSUBMESH ) ); - filters.append( new SMESH_TypeFilter( GROUP ) ); - f = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); - } + MeshObjectType type = ( theId == SMESHGUI_Make2DFrom3DDlg::Groups ? GROUP_FACE : MESH ); + SUIT_SelectionFilter* f = new SMESH_TypeFilter( type ); return f; } @@ -264,36 +285,43 @@ bool SMESHGUI_Make2DFrom3DOp::isValid( QString& msg ) const { if ( !dlg() ) return false; - // check if any source data is selected - QString entry = myDlg->selectedObject( SMESHGUI_Make2DFrom3DDlg::Mesh ); - SMESH::SMESH_IDSource_var obj; - _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entry.toLatin1().constData() ); - if ( sobj ) - obj = SMESH::SObjectToInterface( sobj ); - - if ( obj->_is_nil() ) { + // check if a mesh is selected + if ( mySrcMesh->_is_nil() ) + { msg = tr( "SMESH_ERR_NO_INPUT_MESH" ); return false; } - - // check if source contains elements of required type + // check if groups are selected SMESH::Bnd_Dimension mode = myDlg->mode(); - SMESH::array_of_ElementType_var types = obj->GetTypes(); - - bool has3d = false; - bool has2d = false; - for ( int i = 0; i < types->length(); i++ ) { - if ( types[i] == SMESH::VOLUME ) has3d = true; - else if ( types[i] == SMESH::FACE ) has2d = true; + if ( mode == SMESH::BND_1DFROM3D ) + { + SMESH::SMESH_GroupBase_var grp; + QStringList entries; + dlg()->selectedObject( SMESHGUI_Make2DFrom3DDlg::Groups, entries ); + if ( !entries.isEmpty() ) + { + _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entries[0].toLatin1().constData() ); + if ( sobj ) + grp = SMESH::SObjectToInterface( sobj ); + } + if ( grp->_is_nil() ) { + msg = tr( "SMESH_ERR_NO_INPUT_GROUP" ); + return false; + } } + else + { + // check if mesh contains elements of required type + SMESH::Bnd_Dimension mode = myDlg->mode(); - if ( ( mode == SMESH::BND_2DFROM3D || mode == SMESH::BND_1DFROM3D ) && !has3d ) { - msg = tr( "SMESH_ERR_NO_3D_ELEMENTS" ); - return false; - } - else if ( mode == SMESH::BND_1DFROM2D && !has2d ) { - msg = tr( "SMESH_ERR_NO_2D_ELEMENTS" ); - return false; + if ( mode == SMESH::BND_2DFROM3D && mySrcMesh->NbVolumes() == 0 ) { + msg = tr( "SMESH_ERR_NO_3D_ELEMENTS" ); + return false; + } + else if ( mode == SMESH::BND_1DFROM2D && mySrcMesh->NbFaces() == 0 ) { + msg = tr( "SMESH_ERR_NO_2D_ELEMENTS" ); + return false; + } } // check if new mesh name is specified @@ -311,52 +339,51 @@ bool SMESHGUI_Make2DFrom3DOp::isValid( QString& msg ) const return true; } -bool SMESHGUI_Make2DFrom3DOp::compute2DMesh() +bool SMESHGUI_Make2DFrom3DOp::compute2DMesh( QStringList& theEntryList ) { SUIT_OverrideCursor wc; bool ok = false; try { - QString entry = myDlg->selectedObject( SMESHGUI_Make2DFrom3DDlg::Mesh ); - _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entry.toLatin1().constData() ); - SMESH::SMESH_IDSource_var obj = SMESH::SObjectToInterface( sobj ); - + QStringList entries; + dlg()->selectedObject( SMESHGUI_Make2DFrom3DDlg::Groups, entries ); + SMESH::ListOfIDSources_var groups = new SMESH::ListOfIDSources; + groups->length( entries.count() ); + for ( int i = 0; i < entries.count(); ++i ) + { + _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entries[i].toLatin1().constData() ); + SMESH::SMESH_IDSource_var grp = SMESH::SObjectToInterface( sobj ); + groups[i] = grp; + } SMESH::Bnd_Dimension mode = myDlg->mode(); QString meshName = myDlg->needNewMesh() ? myDlg->getNewMeshName() : QString(); QString groupName = myDlg->needGroup() ? myDlg->getGroupName() : QString(); - bool copySrc = myDlg->copySource(); - bool copyAll = !myDlg->copyMissingOnly(); - - SMESH::SMESH_Mesh_var srcMesh = SMESH::SMESH_Mesh::_narrow( obj ); - if ( CORBA::is_nil( srcMesh ) ) { - SMESH::SMESH_subMesh_var subMesh = SMESH::SMESH_subMesh::_narrow( obj ); - if ( !CORBA::is_nil( subMesh ) ) - srcMesh = subMesh->GetFather(); - } - if ( CORBA::is_nil( srcMesh ) ) { - SMESH::SMESH_GroupBase_var grp = SMESH::SMESH_GroupBase::_narrow( obj ); - if ( !CORBA::is_nil( grp ) ) - srcMesh = grp->GetMesh(); - } + bool copyAll = myDlg->copySource(); - if ( !CORBA::is_nil( srcMesh ) ) { - SMESH::SMESH_MeshEditor_var aMeshEditor = srcMesh->GetMeshEditor(); + if ( !CORBA::is_nil( mySrcMesh ) ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = mySrcMesh->GetMeshEditor(); SMESH::SMESH_Group_var newGrp; - SMESH::SMESH_Mesh_var mesh = aMeshEditor->MakeBoundaryMesh( obj.in(), - mode, - groupName.toLatin1().constData(), - meshName.toLatin1().constData(), - copySrc, - copyAll, - newGrp.out() ); - if ( !mesh->_is_nil() ) { + SMESH::SMESH_Mesh_var newMesh; + CORBA::Long nbAdded = aMeshEditor->MakeBoundaryElements( mode, + groupName.toLatin1().constData(), + meshName.toLatin1().constData(), + copyAll, + groups, + newMesh.out(), + newGrp.out() ); + SUIT_MessageBox::information( myDlg, + tr("SMESH_INFORMATION"), + tr("NB_ADDED").arg( nbAdded )); + if ( !newMesh->_is_nil() ) { + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( newMesh ) ) + theEntryList.append( aSObject->GetID().c_str() ); #ifdef WITHGENERICOBJ - mesh->Destroy(); + newMesh->UnRegister(); #endif } if ( !newGrp->_is_nil() ) { #ifdef WITHGENERICOBJ - newGrp->Destroy(); + newGrp->UnRegister(); #endif } ok = true; @@ -380,9 +407,10 @@ bool SMESHGUI_Make2DFrom3DOp::onApply() return false; } + QStringList anEntryList; bool res = false; try { - res = compute2DMesh(); + res = compute2DMesh( anEntryList ); } catch ( const SALOME::SALOME_Exception& S_ex ) { SalomeApp_Tools::QtCatchCorbaException( S_ex ); @@ -393,6 +421,9 @@ bool SMESHGUI_Make2DFrom3DOp::onApply() if ( res ) { SMESHGUI::Modified(); update( UF_ObjBrowser | UF_Model ); + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList, isApplyAndClose() ); myDlg->setNewMeshName( SMESH::UniqueName( "Mesh_1" ) ); myDlg->setGroupName( SMESH::UniqueName( "Group" ) ); }