X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_GroupDlg.cxx;h=7b9f4974f9ad6f7d6a569f1c207dfe5423c7f8f9;hp=9445167a443eb3c3f132d9bf5233b30585c821e1;hb=ad3cb4c93852dbc834d7075c087bbc749197454b;hpb=bbca2cb797c37bb7695d3f35490bcd328fbddd4e diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx index 9445167a4..7b9f4974f 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -128,8 +128,8 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ), myIsBusy( false ), myNameChanged( false ), - myIsApplyAndClose( false ), - myNbChangesOfContents(0) + myNbChangesOfContents(0), + myIsApplyAndClose( false ) { initDialog( true ); if ( !theMesh->_is_nil() ) @@ -192,7 +192,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create) QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", tr( "ICON_SELECT" ) ) ); setWindowTitle( create ? tr( "SMESH_CREATE_GROUP_TITLE" ) : tr( "SMESH_EDIT_GROUP_TITLE" ) ); - myHelpFileName = create ? "creating_groups_page.html" : "editing_groups_page.html"; + myHelpFileName = create ? "creating_groups.html" : "editing_groups.html"; setSizeGripEnabled( true); @@ -444,7 +444,6 @@ void SMESHGUI_GroupDlg::initDialog( bool create) /* Init selection */ mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); SalomeApp_Study* aStudy = dynamic_cast( mySMESHGUI->application()->activeStudy() ); mySelectionMode = grpNoSelection; @@ -462,7 +461,8 @@ void SMESHGUI_GroupDlg::initDialog( bool create) connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); connect(mySMESHGUI, SIGNAL(SignalVisibilityChanged()), this, SLOT(onVisibilityChanged())); - + connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), this, SLOT(onOpenView())); + connect(mySMESHGUI, SIGNAL(SignalCloseView()), this, SLOT(onCloseView())); rb1->setChecked(true); // VSR !!! onGrpTypeChanged(0); // VSR!!! @@ -611,6 +611,8 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup, case SMESH::EDGE: aType = grpEdgeSelection; break; case SMESH::FACE: aType = grpFaceSelection; break; case SMESH::VOLUME: aType = grpVolumeSelection; break; + case SMESH::ALL: + case SMESH::NB_ELEMENT_TYPES: break; } myTypeGroup->button(aType)->setChecked(true); @@ -933,7 +935,7 @@ bool SMESHGUI_GroupDlg::onApply() QStringList anEntryList; SMESH::SMESH_GroupBase_var resultGroup; - bool isCreation, isConversion = false; + bool isCreation = false, isConversion = false; SUIT_OverrideCursor wc; @@ -1074,7 +1076,7 @@ bool SMESHGUI_GroupDlg::onApply() // check and add all selected GEOM objects: they must be // a sub-shapes of the main GEOM and must be of one type TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; - for ( int i =0; i < myGeomObjects->length(); i++) { + for ( int i =0; i < (int)myGeomObjects->length(); i++) { TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)myGeomObjects[i]->GetShapeType(); if (i == 0) aGroupType = aSubShapeType; @@ -1116,14 +1118,14 @@ bool SMESHGUI_GroupDlg::onApply() { if ( myFilter->_is_nil() ) return false; - if (CORBA::is_nil(myGroupOnFilter)) { // creation + if (CORBA::is_nil(myGroupOnFilter)) // creation + { if (myMesh->_is_nil()) return false; myGroupOnFilter = myMesh->CreateGroupFromFilter(aType, SMESH::toUtf8(myName->text()), myFilter); - resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnFilter ); isCreation = true; } @@ -1137,7 +1139,7 @@ bool SMESHGUI_GroupDlg::onApply() anIsOk = true; } - if( anIsOk ) + if ( anIsOk ) { SALOMEDS::Color aColor = getGroupColor(); resultGroup->SetColor(aColor); @@ -1195,9 +1197,12 @@ bool SMESHGUI_GroupDlg::onApply() anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); break; break; } - // update a visible group accoding to a changed contents + // update a visible group according to a changed contents if ( !isConversion && anActor->GetVisibility() ) + { SMESH::Update( anIO, true ); + SMESH::RepaintCurrentView(); + } } } } @@ -1326,6 +1331,10 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() // any visible actor of group or submesh of myMesh SetAppropriateActor(); + setDefaultGroupColor(); + if (myName->text().isEmpty()) + setDefaultName(); + aString = aList.First()->getName(); myMeshGroupLine->setText(aString); myMeshGroupLine->home( false ); @@ -1417,8 +1426,8 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() aGroupMainShape = aGeomGroup; aGroupMainShape->Register(); } - _PTR(SObject) aGroupMainShapeSO = - aStudy->FindObjectID(aGroupMainShape->GetStudyEntry()); + CORBA::String_var entry = aGroupMainShape->GetStudyEntry(); + _PTR(SObject) aGroupMainShapeSO = aStudy->FindObjectID( entry.in() ); _PTR(SObject) anObj, aRef; bool isRefOrSubShape = false; @@ -1442,10 +1451,10 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() myGeomObjects->length(i); if ( i == 0 ) - { - myIsBusy = false; - return; - } + { + myIsBusy = false; + return; + } aNbSel = i; } @@ -1599,6 +1608,8 @@ void SMESHGUI_GroupDlg::onSelectAll() mySortBtn->setEnabled ( !noElemsModif ); mySelectBox->setEnabled ( !noElemsModif ); myAllowElemsModif->setEnabled( !mySelectAll->isChecked() ); + if ( noElemsModif ) mySMESHGUI->ResetState(); + else mySMESHGUI->SetState(800); int selMode = mySelectionMode; mySelectionMode = grpNoSelection; @@ -1762,10 +1773,10 @@ void SMESHGUI_GroupDlg::setFilters() myFilterDlg->SetEnabled( /*setInViewer=*/isStandalone, /*diffSources=*/isStandalone ); myFilterDlg->SetMesh( myMesh ); + myFilterDlg->SetGroup( myGroupOnFilter ); myFilterDlg->SetSelection(); myFilterDlg->SetSourceWg( myElements, false ); - myFilterDlg->show(); } @@ -1801,6 +1812,10 @@ void SMESHGUI_GroupDlg::onFilterAccepted() mesh = myGroupOnFilter->GetMesh(); } myFilter->SetMesh( mesh ); + + // highlight ids if selection changed in the Viewer (IPAL52924) + myCurrentLineEdit = 0; + onObjectSelectionChanged(); } updateButtons(); @@ -1819,6 +1834,8 @@ void SMESHGUI_GroupDlg::onAdd() if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return; + SUIT_OverrideCursor wc; + myIsBusy = true; int sizeBefore = myElements->count(); @@ -2129,15 +2146,13 @@ void SMESHGUI_GroupDlg::onRemove() } } else if (myCurrentLineEdit == myGroupLine) { - Standard_Boolean aRes; - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); SALOME_ListIO aList; mySelectionMgr->selectedObjects( aList ); SALOME_ListIteratorOfListIO anIt (aList); for ( ; anIt.More(); anIt.Next()) { SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(anIt.Value()); - if (aRes && !aGroup->_is_nil()) { + if (!aGroup->_is_nil()) { // check if mesh is the same if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { SMESH::long_array_var anElements = aGroup->GetListOfID(); @@ -2241,6 +2256,32 @@ void SMESHGUI_GroupDlg::reject() if ( myFilterDlg ) myFilterDlg->UnRegisterFilters(); } +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_GroupDlg::onOpenView() +{ + if ( mySelector ) { + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + mySMESHGUI->EmitSignalDeactivateDialog(); + setEnabled(true); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_GroupDlg::onCloseView() +{ + onDeactivate(); + mySelector = 0; +} + //================================================================================= // function : onHelp() // purpose : @@ -2249,25 +2290,27 @@ void SMESHGUI_GroupDlg::onHelp() { LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); if (app) - app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString( "" ), myHelpFileName); - else { - QString platform; + { + app->onHelpContextModule + ( mySMESHGUI ? app->moduleName( mySMESHGUI->moduleName() ) : QString(""), myHelpFileName ); + } + else + { #ifdef WIN32 - platform = "winapplication"; + QString platform = "winapplication"; #else - platform = "application"; + QString platform = "application"; #endif SUIT_MessageBox::warning(this, tr( "WRN_WARNING" ), tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). - arg(app->resourceMgr()->stringValue( "ExternalBrowser", - platform)). + arg(app->resourceMgr()->stringValue( "ExternalBrowser", platform)). arg(myHelpFileName)); } } //================================================================================= // function : SMESHGUI_GroupDlg::onDeactivate -// purpose : SLOT called when dialog must be deativated +// purpose : SLOT called when dialog must be deactivated //================================================================================= void SMESHGUI_GroupDlg::onDeactivate() { @@ -2282,13 +2325,17 @@ void SMESHGUI_GroupDlg::onDeactivate() void SMESHGUI_GroupDlg::enterEvent (QEvent*) { if (!isEnabled()) { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); + if ( aViewWindow && !mySelector) { + mySelector = aViewWindow->GetSelector(); + } mySMESHGUI->EmitSignalDeactivateDialog(); setEnabled(true); mySelectionMode = grpNoSelection; setSelectionMode(myTypeId); - //mySMESHGUI->SetActiveDialogBox((QDialog*)this); mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); + if ( mySelectBox->isEnabled() ) mySMESHGUI->SetState(800); + else mySMESHGUI->ResetState(); } } @@ -2303,16 +2350,16 @@ void SMESHGUI_GroupDlg::keyPressEvent( QKeyEvent* e ) return; if ( e->key() == Qt::Key_F1 ) - { - e->accept(); - onHelp(); - } + { + e->accept(); + onHelp(); + } } //================================================================================ /*! * \brief Enable showing of the popup when Geometry selection btn is clicked - * \param enable - true to enable + * \param enable - true to enable */ //================================================================================ @@ -2348,17 +2395,17 @@ void SMESHGUI_GroupDlg::updateGeomPopup() void SMESHGUI_GroupDlg::onGeomSelectionButton(bool isBtnOn) { if ( myGeomPopup && isBtnOn ) - { - myCurrentLineEdit = myGeomGroupLine; - QAction* a = myGeomPopup->exec( QCursor::pos() ); - if (!a || myActions[a] == DIRECT_GEOM_INDEX) - setSelectionMode(grpGeomSelection); - } + { + myCurrentLineEdit = myGeomGroupLine; + QAction* a = myGeomPopup->exec( QCursor::pos() ); + if (!a || myActions[a] == DIRECT_GEOM_INDEX) + setSelectionMode(grpGeomSelection); + } else if (!isBtnOn) - { - myCurrentLineEdit = 0; - setSelectionMode(grpAllSelection); - } + { + myCurrentLineEdit = 0; + setSelectionMode(grpAllSelection); + } } //================================================================================= @@ -2369,26 +2416,26 @@ void SMESHGUI_GroupDlg::onGeomPopup( QAction* a ) { int index = myActions[a]; if ( index == GEOM_BY_MESH_INDEX ) - { - mySelectionMode = grpNoSelection; - if ( !myShapeByMeshOp ) { - myShapeByMeshOp = new SMESHGUI_ShapeByMeshOp(true); - connect(myShapeByMeshOp, SIGNAL(committed(SUIT_Operation*)), - SLOT(onPublishShapeByMeshDlg(SUIT_Operation*))); - connect(myShapeByMeshOp, SIGNAL(aborted(SUIT_Operation*)), - SLOT(onCloseShapeByMeshDlg(SUIT_Operation*))); - } - // set mesh object to SMESHGUI_ShapeByMeshOp and start it - if ( !myMesh->_is_nil() ) { - myIsBusy = true; - hide(); // stop processing selection - myIsBusy = false; - myShapeByMeshOp->setModule( mySMESHGUI ); - myShapeByMeshOp->setStudy( 0 ); // it's really necessary - myShapeByMeshOp->SetMesh( myMesh ); - myShapeByMeshOp->start(); - } + { + mySelectionMode = grpNoSelection; + if ( !myShapeByMeshOp ) { + myShapeByMeshOp = new SMESHGUI_ShapeByMeshOp(true); + connect(myShapeByMeshOp, SIGNAL(committed(SUIT_Operation*)), + SLOT(onPublishShapeByMeshDlg(SUIT_Operation*))); + connect(myShapeByMeshOp, SIGNAL(aborted(SUIT_Operation*)), + SLOT(onCloseShapeByMeshDlg(SUIT_Operation*))); + } + // set mesh object to SMESHGUI_ShapeByMeshOp and start it + if ( !myMesh->_is_nil() ) { + myIsBusy = true; + hide(); // stop processing selection + myIsBusy = false; + myShapeByMeshOp->setModule( mySMESHGUI ); + myShapeByMeshOp->setStudy( 0 ); // it's really necessary + myShapeByMeshOp->SetMesh( myMesh ); + myShapeByMeshOp->start(); } + } } //================================================================================ @@ -2406,9 +2453,9 @@ void SMESHGUI_GroupDlg::onPublishShapeByMeshDlg(SUIT_Operation* op) GEOM::GEOM_Object_var aGeomVar = myShapeByMeshOp->GetShape(); if ( !aGeomVar->_is_nil() ) { - QString ID = aGeomVar->GetStudyEntry(); - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - if ( _PTR(SObject) aGeomSO = aStudy->FindObjectID( ID.toLatin1().data() )) { + CORBA::String_var ID = aGeomVar->GetStudyEntry(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + if ( _PTR(SObject) aGeomSO = aStudy->FindObjectID( ID.in() )) { SALOME_ListIO anIOList; Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject ( aGeomSO->GetID().c_str(), "SMESH", aGeomSO->GetName().c_str() ); @@ -2429,10 +2476,10 @@ void SMESHGUI_GroupDlg::onPublishShapeByMeshDlg(SUIT_Operation* op) void SMESHGUI_GroupDlg::onCloseShapeByMeshDlg(SUIT_Operation* op) { if ( myShapeByMeshOp == op ) - { - show(); - setSelectionMode(grpGeomSelection); - } + { + show(); + setSelectionMode(grpGeomSelection); + } } //================================================================================= @@ -2533,7 +2580,7 @@ void SMESHGUI_GroupDlg::setDefaultGroupColor() // function : SetAppropriateActor() // purpose : Find more appropriate of visible actors, set it to myActor, allow picking // NPAL19389: create a group with a selection in another group. -// if mesh actor is not visible - find any first visible group or submesh +// if mesh actor is not visible - find any first visible group or sub-mesh //================================================================================= bool SMESHGUI_GroupDlg::SetAppropriateActor() { @@ -2544,21 +2591,23 @@ bool SMESHGUI_GroupDlg::SetAppropriateActor() SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView(); - if (myGeomGroupBtn->isChecked()) { // try current group on geometry actor - if (!isActor) { - if (!myGroupOnGeom->_is_nil()) { - SMESH_Actor* anActor = SMESH::FindActorByObject(myGroupOnGeom); - if (anActor && anActor->hasIO()) - { - isActor = true; - if (aViewWindow && !aViewWindow->isVisible(anActor->getIO())) - isActor = false; - else - myActorsList.append(anActor); - } - } + if (myGrpTypeGroup->checkedId() > 0) { // try current group on geometry actor + SMESH_Actor* anActor = 0; + if (!myGroupOnGeom->_is_nil()) + anActor = SMESH::FindActorByObject(myGroupOnGeom); + if (!myGroupOnFilter->_is_nil()) + anActor = SMESH::FindActorByObject(myGroupOnFilter); + if (anActor && anActor->hasIO()) + { + isActor = true; + if (aViewWindow && !aViewWindow->isVisible(anActor->getIO())) + isActor = false; + else + myActorsList.append(anActor); } - } else { + return anActor; + } + else { // try mesh actor SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); if (anActor && anActor->hasIO()) { @@ -2568,42 +2617,50 @@ bool SMESHGUI_GroupDlg::SetAppropriateActor() else myActorsList.append(anActor); } - + // try group actor + SMESH_Actor* aGroupActor = 0; if (!isActor && !myGroup->_is_nil()) { - SMESH_Actor* anActor = SMESH::FindActorByObject(myGroup); - if (anActor && anActor->hasIO()) - myActorsList.append(anActor); + aGroupActor = SMESH::FindActorByObject(myGroup); + if (aGroupActor && aGroupActor->hasIO()) + myActorsList.append(aGroupActor); } - - // try any visible actor of group or submesh of current mesh + + // try any visible actor of group or sub-mesh of current mesh if (aViewWindow) { // mesh entry _PTR(SObject) aSObject = SMESH::FindSObject(myMesh); if (aSObject) { CORBA::String_var meshEntry = aSObject->GetID().c_str(); int len = strlen(meshEntry); - + // iterate on all actors in current view window, search for // any visible actor, that belongs to group or submesh of current mesh VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); int nbItems = aCollection->GetNumberOfItems(); for (int i=0; i(aCollection->GetItemAsObject(i)); - if (anActor && anActor->hasIO()) { - Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); - if (aViewWindow->isVisible(anIO)) { - if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0 && !myActorsList.contains(anActor) ) - myActorsList.append(anActor); - } + { + SMESH_Actor *anActor = dynamic_cast(aCollection->GetItemAsObject(i)); + if (anActor && anActor->hasIO()) { + Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); + if (aViewWindow->isVisible(anIO)) { + if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0 && !myActorsList.contains(anActor) ) + myActorsList.append(anActor); } } + } } } + + // Show a standalone group if nothing else is visible (IPAL52227) + if ( myActorsList.count() == 1 && + myActorsList[0] == aGroupActor && + aViewWindow && !aViewWindow->isVisible(aGroupActor->getIO())) + SMESH::UpdateView( aViewWindow, SMESH::eDisplay, aGroupActor->getIO()->getEntry() ); } - + + if (myActorsList.count() > 0) { QListIterator it( myActorsList ); while ( it.hasNext() ) { @@ -2612,10 +2669,10 @@ bool SMESHGUI_GroupDlg::SetAppropriateActor() anActor->SetPickable(true); } } - + return ( isActor || (myActorsList.count() > 0) ); } - + //======================================================================= //function : setShowEntityMode //purpose : make shown only entity corresponding to my type