X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_Make2DFrom3DOp.cxx;h=8cdc5b0ec3968c2a0f4d7b39e89bc7b1cfcbe425;hb=c210844f50ba69334f8cdeb10737cff30bfb2927;hp=4ffc3f09e4d30b02b8d701cd048eca79b95b0e7a;hpb=d8f644ca3d4ce62f2ef41d4aacb52f5bb1221df3;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx index 4ffc3f09e..8cdc5b0ec 100644 --- a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx +++ b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx @@ -1,20 +1,20 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 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 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. +// 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 +// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // File : SMESHGUI_Make2DFrom3D.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) @@ -26,14 +26,22 @@ #include "SMESHGUI_MeshUtils.h" #include "SMESH_TypeFilter.hxx" #include "SMESH_LogicalFilter.hxx" +#include "SMESHGUI_VTKUtils.h" +#include "SMESH_Actor.h" // SALOME GUI includes +#include +#include #include -#include -#include +#include #include #include #include +#include +#include +//#include +#include +#include // IDL includes #include @@ -46,6 +54,9 @@ #include #include #include +#include + +#include #define SPACING 6 #define MARGIN 11 @@ -56,15 +67,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 ); @@ -72,10 +79,22 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) aModeGrpLayout->setSpacing( SPACING ); my2dFrom3dRB = new QRadioButton( tr( "2D_FROM_3D" ), aModeGrp ); my1dFrom2dRB = new QRadioButton( tr( "1D_FROM_2D" ), aModeGrp ); - my1dFrom3dRB = new QRadioButton( tr( "1D_FROM_3D" ), aModeGrp ); + //my1dFrom3dRB = new QRadioButton( tr( "1D_FROM_3D" ), aModeGrp ); aModeGrpLayout->addWidget( my2dFrom3dRB ); aModeGrpLayout->addWidget( my1dFrom2dRB ); - aModeGrpLayout->addWidget( my1dFrom3dRB ); + //aModeGrpLayout->addWidget( my1dFrom3dRB ); + +// // Groups of mesh faces +// setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) ); +// createObject( tr( "Groups" ), mainFrame(), Groups ); +// setNameIndication( Groups, ListOfNames ); +// objectWg( Groups, Btn )->hide(); + + // Mesh or Groups + //setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) ); + createObject( tr( "Groups" ), mainFrame(), MeshOrGroups ); + setNameIndication( MeshOrGroups, ListOfNames ); + objectWg( MeshOrGroups, Btn )->hide(); // target QGroupBox* aTargetGrp = new QGroupBox( tr( "TARGET" ), mainFrame() ); @@ -86,12 +105,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 +116,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( MeshOrGroups, Label ), 1, 0 ); + aDlgLay->addWidget( objectWg( MeshOrGroups, Control ), 1, 1 ); aDlgLay->addWidget( aTargetGrp, 2, 0, 1, 3 ); aDlgLay->addWidget( myGroupCheck, 3, 0 ); aDlgLay->addWidget( myGroupName, 3, 1, 1, 2 ); @@ -115,7 +131,6 @@ SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) // init dlg my2dFrom3dRB->setChecked( true ); myThisMeshRB->setChecked( true ); - myMissingCheck->setChecked( true ); onTargetChanged(); onGroupChecked(); } @@ -149,6 +164,21 @@ void SMESHGUI_Make2DFrom3DDlg::setNewMeshName( const QString& name ) myMeshName->setText( name ); } +void SMESHGUI_Make2DFrom3DDlg::setNewMeshEnabled( bool enable ) +{ + if ( !enable ) + myThisMeshRB->setChecked( true ); + + myNewMeshRB->setEnabled( enable ); + + onTargetChanged(); +} + +bool SMESHGUI_Make2DFrom3DDlg::getNewMeshEnabled() const +{ + return myNewMeshRB->isEnabled(); +} + bool SMESHGUI_Make2DFrom3DDlg::needGroup() const { return myGroupCheck->isChecked(); @@ -169,16 +199,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() @@ -192,7 +216,9 @@ void SMESHGUI_Make2DFrom3DDlg::onGroupChecked() */ SMESHGUI_Make2DFrom3DOp::SMESHGUI_Make2DFrom3DOp() - : SMESHGUI_SelectionOp() + : SMESHGUI_SelectionOp(), + myMeshFilter(MESH), + myGroupFilter(GROUP) { } @@ -212,33 +238,76 @@ 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(); + 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(); + + myDlg->activateObject( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups ); selectionDone(); } +//================================================================================ +/*! + * \brief Set filter corresponding to dimension + */ +//================================================================================ + +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( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups ); +// onActivateObject ( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups ); +// selectionDone(); +} + void SMESHGUI_Make2DFrom3DOp::selectionDone() { + myDlg->clearSelection( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups ); + mySrcMesh = SMESH::SMESH_Mesh::_nil(); + 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(); + for ( int i = 0; i < names.count(); ++i ) + names[i] = names[i].trimmed(); + myDlg->selectObject( names, types, ids ); + + // enable/desable "new mesh" button + bool isMesh = true; + for ( int i = 0; i < ids.count() && isMesh; ++i ) + { + _PTR(SObject) sobj = + SMESHGUI::activeStudy()->studyDS()->FindObjectID( ids[i].toLatin1().constData() ); + mySrcMesh = SMESH::SObjectToInterface( sobj ); + isMesh = !mySrcMesh->_is_nil(); + } + myDlg->setNewMeshEnabled( isMesh ); } catch ( const SALOME::SALOME_Exception& S_ex ) { SalomeApp_Tools::QtCatchCorbaException( S_ex ); @@ -250,13 +319,13 @@ 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 ); - } + SMESHGUI_Make2DFrom3DOp* me = (SMESHGUI_Make2DFrom3DOp*) this; + + QList subFilters; + subFilters.append( & me->myMeshFilter ); + subFilters.append( & me->myGroupFilter ); + + SUIT_SelectionFilter* f = new SMESH_LogicalFilter( subFilters, SMESH_LogicalFilter::LO_OR ); return f; } @@ -264,34 +333,59 @@ 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 ( !myDlg->hasSelection( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups )) + { msg = tr( "SMESH_ERR_NO_INPUT_MESH" ); return false; } - - // check if source contains elements of required type + QStringList entries; + dlg()->selectedObject( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups, entries ); + const bool isMeshSelected = ( !mySrcMesh->_is_nil() ); + if ( isMeshSelected ) + { + // only one mesh is allowed + if ( entries.size() > 1 ) { + msg = tr( "SMESH_TOO_MANY_MESHES" ); + return false; + } + } + else + { + // check if only groups are selected + for ( int i = 0; i < entries.count(); ++i ) + { + SMESH::SMESH_GroupBase_var grp; + if ( _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entries[i].toLatin1().constData() )) + grp = SMESH::SObjectToInterface( sobj ); + if ( grp->_is_nil() ) { + msg = tr( "SMESH_NOT_ONLY_GROUPS" ); + return false; + } + } + } + // check if the selected objects contains elements of required type + bool hasFaces = false, hasVolumes = false; 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; + for ( int i = 0; i < entries.count(); ++i ) + { + SMESH::SMESH_IDSource_var idSource; + if ( _PTR(SObject) sobj = SMESHGUI::activeStudy()->studyDS()->FindObjectID( entries[i].toLatin1().constData() )) + idSource = SMESH::SObjectToInterface( sobj ); + if ( !idSource->_is_nil() ) { + SMESH::array_of_ElementType_var types = idSource->GetTypes(); + for ( int j = 0; j < types->length(); ++j ) + if ( types[j] == SMESH::VOLUME ) + hasVolumes = true; + else if ( types[j] == SMESH::FACE ) + hasFaces = true; + } } - - if ( ( mode == SMESH::BND_2DFROM3D || mode == SMESH::BND_1DFROM3D ) && !has3d ) { + if ( mode == SMESH::BND_2DFROM3D && !hasVolumes ) { msg = tr( "SMESH_ERR_NO_3D_ELEMENTS" ); return false; } - else if ( mode == SMESH::BND_1DFROM2D && !has2d ) { + else if ( mode == SMESH::BND_1DFROM2D && !hasFaces ) { msg = tr( "SMESH_ERR_NO_2D_ELEMENTS" ); return false; } @@ -307,59 +401,86 @@ bool SMESHGUI_Make2DFrom3DOp::isValid( QString& msg ) const msg = tr( "SMESH_ERR_GRP_NAME_NOT_SPECIFIED" ); return false; } - + 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 ); - 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(); + QString meshName = myDlg->needNewMesh() ? myDlg->getNewMeshName() : QString(); + QString groupName = myDlg->needGroup() ? myDlg->getGroupName() : QString(); + bool copyAll = myDlg->copySource(); + + QStringList entries; + dlg()->selectedObject( SMESHGUI_Make2DFrom3DDlg::MeshOrGroups, entries ); + SMESH::ListOfIDSources_var groups = new SMESH::ListOfIDSources; + QString wrongGroups = ""; + + if ( mySrcMesh->_is_nil() ) // get selected groups, find groups of wrong type + { + int nbGroups = 0; + int goodType = ( mode == SMESH::BND_2DFROM3D ? SMESH::VOLUME : SMESH::FACE ); + 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 ); + SMESH::array_of_ElementType_var types = grp->GetTypes(); + if ( types->length() < 1 || types[0] != goodType ) + { + if ( !wrongGroups.isEmpty() ) + wrongGroups += ", "; + wrongGroups += sobj->GetName().c_str(); + } + else + { + groups[ nbGroups++ ] = grp; + } + } + groups->length( nbGroups ); + mySrcMesh = groups[0]->GetMesh(); } - 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() ); + QString msg = tr("NB_ADDED").arg( nbAdded ); + if ( !wrongGroups.isEmpty() ) + msg += ".\n" + tr("WRONG_GROUPS").arg( wrongGroups ); + SUIT_MessageBox::information( myDlg, tr("SMESH_INFORMATION"), msg); + + 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; + + for ( int i = 0; i < entries.count(); ++i ) + if ( SMESH_Actor* actor = SMESH::FindActorByEntry( entries[i].toLatin1().constData() )) + SMESH::Update(actor->getIO(),actor->GetVisibility()); + SMESH::RepaintCurrentView(); } } catch ( ... ) { @@ -380,9 +501,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 +515,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" ) ); }