X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_SymmetryDlg.cxx;h=254daaf7facd699358110b10d858ea0ac970cda8;hp=5f4b1e20667aace70103915098c0533a4342bc06;hb=b737ae98e6450e491ba13c6517858c279da77551;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx index 5f4b1e206..254daaf7f 100644 --- a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -52,8 +52,10 @@ #include #include #include +#include // SALOME KERNEL includes +#include #include // OCCT includes @@ -83,20 +85,15 @@ enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================= // class : SMESHGUI_SymmetryDlg() // purpose : //================================================================================= SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) - : SMESHGUI_PreviewDlg( theModule ), + : SMESHGUI_MultiPreviewDlg( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myFilterDlg(0), - mySelectedObject(SMESH::SMESH_IDSource::_nil()) + myFilterDlg(0) { QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SMESH_SYMMETRY_POINT"))); QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SMESH_SYMMETRY_AXIS"))); @@ -284,8 +281,8 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) mySMESHGUI->SetActiveDialogBox((QDialog*)this); // Costruction of the logical filter - SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); + SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (SMESH::MESHorSUBMESH); + SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (SMESH::GROUP); QList aListOfFilters; if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); @@ -300,7 +297,7 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) /* signals and slots connections */ connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); connect(GroupConstructors, SIGNAL(buttonClicked(int)), SLOT(ConstructorsClicked(int))); @@ -316,7 +313,7 @@ SMESHGUI_SymmetryDlg::SMESHGUI_SymmetryDlg( SMESHGUI* theModule ) connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); connect(LineEditElements, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); connect(CheckBoxMesh, SIGNAL(toggled(bool)), SLOT(onSelectMesh(bool))); connect(ActionGroup, SIGNAL(buttonClicked(int)), SLOT(onActionClicked(int))); @@ -355,6 +352,9 @@ SMESHGUI_SymmetryDlg::~SMESHGUI_SymmetryDlg() void SMESHGUI_SymmetryDlg::Init (bool ResetControls) { myBusy = false; + myMeshes.clear(); + myObjects.clear(); + myObjectsNames.clear(); myEditCurrentArgument = 0; LineEditElements->clear(); @@ -365,7 +365,6 @@ void SMESHGUI_SymmetryDlg::Init (bool ResetControls) buttonApply->setEnabled(false); myActor = 0; - myMesh = SMESH::SMESH_Mesh::_nil(); if (ResetControls) { SpinBox_X->SetValue(0.0); @@ -496,58 +495,83 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() QStringList anEntryList; try { SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - - myMesh->SetParameters(aParameters.join(":").toLatin1().constData()); switch ( actionButton ) { case MOVE_ELEMS_BUTTON: { if(CheckBoxMesh->isChecked()) - aMeshEditor->MirrorObject(mySelectedObject, aMirror, aMirrorType, false ); - else + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->MirrorObject(myObjects[i], aMirror, aMirrorType, false ); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, false ); - + } break; } case COPY_ELEMS_BUTTON: { SMESH::ListOfGroups_var groups; if ( makeGroups ) { if(CheckBoxMesh->isChecked()) - groups = aMeshEditor->MirrorObjectMakeGroups(mySelectedObject, aMirror, aMirrorType); - else + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + groups = aMeshEditor->MirrorObjectMakeGroups(myObjects[i], aMirror, aMirrorType); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); groups = aMeshEditor->MirrorMakeGroups(anElementsId, aMirror, aMirrorType); + } } else { if(CheckBoxMesh->isChecked()) - aMeshEditor->MirrorObject(mySelectedObject, aMirror, aMirrorType, true); - else + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + aMeshEditor->MirrorObject(myObjects[i], aMirror, aMirrorType, true); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, true); + } } break; } case MAKE_MESH_BUTTON: { SMESH::SMESH_Mesh_var mesh; if (CheckBoxMesh->isChecked()) - mesh = aMeshEditor->MirrorObjectMakeMesh(mySelectedObject, aMirror, aMirrorType, makeGroups, - LineEditNewMesh->text().toLatin1().data()); - else + for ( int i = 0; i < myObjects.count(); i++ ) { + QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) ); + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor(); + myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); + mesh = aMeshEditor->MirrorObjectMakeMesh(myObjects[i], aMirror, aMirrorType, makeGroups, + aName.toLatin1().data()); + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) + anEntryList.append( aSObject->GetID().c_str() ); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); + myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData()); mesh = aMeshEditor->MirrorMakeMesh(anElementsId, aMirror, aMirrorType, makeGroups, LineEditNewMesh->text().toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif + } } break; } } catch (...) { } - SMESH::UpdateView(); + for ( int i = 0; i < myObjects.count(); i++ ) { + SMESH_Actor* actor = SMESH::FindActorByObject( myObjects[i] ); + if ( actor ) SMESH::Update( actor->getIO(), true ); + } + if ( ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) || actionButton == MAKE_MESH_BUTTON ) { mySMESHGUI->updateObjBrowser(true); // new groups may appear @@ -557,7 +581,6 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() } Init(false); ConstructorsClicked(GetConstructorId()); - mySelectedObject = SMESH::SMESH_IDSource::_nil(); SelectionIntoArgument(); SMESHGUI::Modified(); @@ -573,14 +596,14 @@ void SMESHGUI_SymmetryDlg::ClickOnOk() { setIsApplyAndClose( true ); if( ClickOnApply() ) - ClickOnCancel(); + reject(); } //================================================================================= -// function : ClickOnCancel() +// function : reject() // purpose : //================================================================================= -void SMESHGUI_SymmetryDlg::ClickOnCancel() +void SMESHGUI_SymmetryDlg::reject() { disconnect(mySelectionMgr, 0, this, 0); mySelectionMgr->clearFilters(); @@ -592,7 +615,7 @@ void SMESHGUI_SymmetryDlg::ClickOnCancel() if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySMESHGUI->ResetState(); - reject(); + QDialog::reject(); } //================================================================================= @@ -683,6 +706,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() // clear myActor = 0; QString aString = ""; + onDisplaySimulation(false); myBusy = true; if (myEditCurrentArgument == (QWidget*)LineEditElements) { @@ -698,30 +722,53 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() // get selected mesh SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); + mySelectionMgr->selectedObjects(aList); int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::GetMeshByIO(IO); - if(myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByObject(myMesh); - if (!myActor) - myActor = SMESH::FindActorByEntry(IO->getEntry()); - if (!myActor && !CheckBoxMesh->isChecked()) + if (nbSel < 1) return; int aNbUnits = 0; if (myEditCurrentArgument == (QWidget*)LineEditElements) { myElementsId = ""; + myObjects.clear(); + myObjectsNames.clear(); + myMeshes.clear(); + + for ( SALOME_ListIteratorOfListIO it( aList ); it.More(); it.Next() ) { + Handle(SALOME_InteractiveObject) IO = it.Value(); + + SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( IO ); + if( aMesh->_is_nil() ) + return; + + myActor = SMESH::FindActorByObject( aMesh ); + if ( !myActor ) + myActor = SMESH::FindActorByEntry( IO->getEntry() ); + if ( !myActor && !CheckBoxMesh->isChecked() ) + return; + + if ( !SMESH::IObjectToInterface( IO )->_is_nil() ) { + if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() ) { + _PTR(SObject) obj = aStudy->FindObjectID( qPrintable( QString( IO->getEntry() ) ) ); + _PTR(GenericAttribute) anAttr; + if ( obj && obj->FindAttribute( anAttr, "AttributeName" ) ) { + _PTR(AttributeName) aNameAttr( anAttr ); + myObjects << SMESH::IObjectToInterface( IO ); + myObjectsNames << aNameAttr->Value().c_str(); + myMeshes << aMesh; + } + } + } + } // MakeGroups is available if there are groups and "Copy" - if ( myMesh->NbGroups() == 0 ) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + + if ( aNbGroups == 0 ) { MakeGroupsCheck->setChecked(false); MakeGroupsCheck->setEnabled(false); } @@ -731,10 +778,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() if (CheckBoxMesh->isChecked()) { SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - if (!SMESH::IObjectToInterface(IO)->_is_nil()) { //MESH - mySelectedObject = SMESH::IObjectToInterface(IO); - } - else + if ( myObjects.isEmpty() ) return; // get IDs from mesh /* @@ -778,7 +822,7 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() } */ } else { - aNbUnits = SMESH::GetNameOfSelectedElements( mySelector, IO, aString); + aNbUnits = SMESH::GetNameOfSelectedElements( mySelector, aList.First(), aString); myElementsId = aString; if (aNbUnits < 1) return; @@ -786,11 +830,21 @@ void SMESHGUI_SymmetryDlg::SelectionIntoArgument() myNbOkElements = true; } else { + Handle(SALOME_InteractiveObject) IO = aList.First(); + if ((SMESH::GetMeshByIO(IO))->_is_nil()) + return; + + SMESH_Actor* anActor = SMESH::FindActorByObject(SMESH::GetMeshByIO(IO)); + if (!anActor) + anActor = SMESH::FindActorByEntry(IO->getEntry()); + if (!anActor && !CheckBoxMesh->isChecked()) + return; + aNbUnits = SMESH::GetNameOfSelectedNodes(mySelector, IO, aString); if (aNbUnits != 1) return; - SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh(); + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); if (!aMesh) return; @@ -917,26 +971,6 @@ void SMESHGUI_SymmetryDlg::enterEvent (QEvent*) ActivateThisDialog(); } -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_SymmetryDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - ClickOnCancel(); -} - -//======================================================================= -// function : hideEvent() -// purpose : caused by ESC key -//======================================================================= -void SMESHGUI_SymmetryDlg::hideEvent (QHideEvent*) -{ - if (!isMinimized()) - ClickOnCancel(); -} - //======================================================================= //function : onSelectMesh //purpose : @@ -1022,6 +1056,10 @@ void SMESHGUI_SymmetryDlg::onVectorChanged() void SMESHGUI_SymmetryDlg::onActionClicked(int button) { + int aNbGroups = 0; + for ( int i = 0; i < myMeshes.count(); i++ ) + aNbGroups += myMeshes[i]->NbGroups(); + switch ( button ) { case MOVE_ELEMS_BUTTON: MakeGroupsCheck->setEnabled(false); @@ -1030,18 +1068,12 @@ void SMESHGUI_SymmetryDlg::onActionClicked(int button) case COPY_ELEMS_BUTTON: LineEditNewMesh->setEnabled(false); MakeGroupsCheck->setText( tr("SMESH_MAKE_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled(myMeshes.isEmpty() || aNbGroups > 0); break; case MAKE_MESH_BUTTON: LineEditNewMesh->setEnabled(true); MakeGroupsCheck->setText( tr("SMESH_COPY_GROUPS")); - if ( myMesh->_is_nil() || myMesh->NbGroups() > 0) - MakeGroupsCheck->setEnabled(true); - else - MakeGroupsCheck->setEnabled(false); + MakeGroupsCheck->setEnabled(myMeshes.isEmpty() || aNbGroups > 0); break; } setNewMeshName(); @@ -1056,13 +1088,13 @@ void SMESHGUI_SymmetryDlg::onActionClicked(int button) void SMESHGUI_SymmetryDlg::setNewMeshName() { LineEditNewMesh->setText(""); - if ( LineEditNewMesh->isEnabled() && !myMesh->_is_nil() ) { + if ( LineEditNewMesh->isEnabled() && !myMeshes.isEmpty() ) { QString name; if ( CheckBoxMesh->isChecked() ) { - name = LineEditElements->text(); + name = myObjects.count() > 1 ? "*" : LineEditElements->text(); } else { - _PTR(SObject) meshSO = SMESH::FindSObject( myMesh ); + _PTR(SObject) meshSO = SMESH::FindSObject( myMeshes[0] ); name = meshSO->GetName().c_str(); } if ( !name.isEmpty() ) @@ -1092,7 +1124,7 @@ void SMESHGUI_SymmetryDlg::keyPressEvent( QKeyEvent* e ) //================================================================================= void SMESHGUI_SymmetryDlg::setFilters() { - if(myMesh->_is_nil()) { + if(myMeshes.isEmpty()) { SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), tr("NO_MESH_SELECTED")); @@ -1102,7 +1134,7 @@ void SMESHGUI_SymmetryDlg::setFilters() myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, SMESH::ALL ); myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetMesh( myMeshes[0] ); myFilterDlg->SetSourceWg( LineEditElements ); myFilterDlg->show(); @@ -1159,14 +1191,19 @@ void SMESHGUI_SymmetryDlg::onDisplaySimulation( bool toDisplayPreview ) { bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON || ActionGroup->checkedId() == MAKE_MESH_BUTTON ); SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); + QList aMeshPreviewStruct; if(CheckBoxMesh->isChecked()) - aMeshEditor->MirrorObject(mySelectedObject, aMirror, aMirrorType, copy ); - else - aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, copy ); - - SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); - mySimulation->SetData(aMeshPreviewStruct._retn()); + for ( int i = 0; i < myMeshes.count(); i++ ) { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer(); + aMeshEditor->MirrorObject(myObjects[i], aMirror, aMirrorType, copy ); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + else { + SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer(); + aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, copy ); + aMeshPreviewStruct << aMeshEditor->GetPreviewData(); + } + setSimulationPreview(aMeshPreviewStruct); } catch (...) { hidePreview(); }