From 1758d524e70758cc1aacc20c2a3394208d7ff93d Mon Sep 17 00:00:00 2001 From: rnv Date: Fri, 21 Jan 2011 14:01:49 +0000 Subject: [PATCH] Additional changes for the Point 2 of the "20948: EDF 1468 SMESH: Histogram of the quality controls" issue. --- src/OBJECT/SMESH_Actor.cxx | 17 +- src/OBJECT/SMESH_ActorUtils.cxx | 54 +++++ src/OBJECT/SMESH_ActorUtils.h | 12 + src/SMESHGUI/SMESHGUI.cxx | 228 +++++++++++------- src/SMESHGUI/SMESHGUI.h | 5 + .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 1 + src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 68 ++---- src/SMESHGUI/SMESHGUI_VTKUtils.h | 20 +- 8 files changed, 254 insertions(+), 151 deletions(-) diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 91d500283..3e4c1ad8a 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -533,6 +533,13 @@ SMESH_ActorDef::~SMESH_ActorDef() { if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<InvokeEvent( SMESH::DeleteActorEvent, NULL ); @@ -617,10 +624,6 @@ SMESH_ActorDef::~SMESH_ActorDef() myImplicitBoolean->Delete(); myTimeStamp->Delete(); -#ifndef DISABLE_PLOT2DVIEWER - if(my2dHistogram) - delete my2dHistogram; -#endif } @@ -1343,7 +1346,11 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ if(myIsCellsLabeled) myCellsLabels->VisibilityOn(); - } + } +#ifndef DISABLE_PLOT2DVIEWER + else + SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer); +#endif UpdateHighlight(); Modified(); } diff --git a/src/OBJECT/SMESH_ActorUtils.cxx b/src/OBJECT/SMESH_ActorUtils.cxx index 899e413ec..36e40e679 100644 --- a/src/OBJECT/SMESH_ActorUtils.cxx +++ b/src/OBJECT/SMESH_ActorUtils.cxx @@ -21,10 +21,19 @@ // #include "SMESH_ActorUtils.h" +#include "SMESH_Actor.h" #include "SUIT_Tools.h" #include "SUIT_Session.h" #include "SUIT_ResourceMgr.h" +#include "SalomeApp_Application.h" + +#ifndef DISABLE_PLOT2DVIEWER +#include +#include +#include +#endif + #include "utilities.h" @@ -126,4 +135,49 @@ namespace SMESH g = ig / 255.; b = ib / 255.; } + +#ifndef DISABLE_PLOT2DVIEWER + //======================================================================= + /** + Get histogram from the input actor + Repaint/Remove the histogram in/from each opened Plot2D Viewer + */ + //======================================================================= + void ProcessIn2DViewers( SMESH_Actor *theActor, Viewer2dActionType aType ) { + SalomeApp_Application* anApp = dynamic_cast(SUIT_Session::session()->activeApplication()); + + if(!anApp || !theActor) + return; + + SPlot2d_Histogram* aHistogram = 0; + + if(theActor->GetPlot2Histogram()) + if(aType == UpdateIn2dViewer) + aHistogram = theActor->UpdatePlot2Histogram(); + else + aHistogram = theActor->GetPlot2Histogram(); + else + return; + + ViewManagerList aViewManagerList; + anApp->viewManagers(SPlot2d_Viewer::Type(), aViewManagerList); + + aType = aHistogram->getPointList().empty() ? RemoveFrom2dViewer : aType; + + SUIT_ViewManager* aViewManager; + foreach( aViewManager, aViewManagerList ) { + if (Plot2d_ViewManager* aManager = dynamic_cast(aViewManager)) { + if (SPlot2d_Viewer* aViewer = dynamic_cast(aManager->getViewModel())) { + if (Plot2d_ViewFrame* aViewFrame = aViewer->getActiveViewFrame()) { + if(aType == UpdateIn2dViewer ) + aViewFrame->displayObject(aHistogram, true); + else if (aType == RemoveFrom2dViewer) + aViewFrame->eraseObject(aHistogram, true); + } + } + } + } + } +#endif //DISABLE_PLOT2DVIEWER + } diff --git a/src/OBJECT/SMESH_ActorUtils.h b/src/OBJECT/SMESH_ActorUtils.h index b1d14be2b..fec4ebdf7 100644 --- a/src/OBJECT/SMESH_ActorUtils.h +++ b/src/OBJECT/SMESH_ActorUtils.h @@ -28,6 +28,7 @@ #include class vtkUnstructuredGrid; +class SMESH_Actor; namespace SMESH { @@ -71,6 +72,17 @@ SMESHOBJECT_EXPORT WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName); + +#ifndef DISABLE_PLOT2DVIEWER + + typedef enum {UpdateIn2dViewer = 0, RemoveFrom2dViewer } Viewer2dActionType; + + SMESHOBJECT_EXPORT + void ProcessIn2DViewers( SMESH_Actor* theActor, Viewer2dActionType = UpdateIn2dViewer ); + +#endif + + } #endif diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 7ef1989b4..388dd9c71 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -89,6 +89,7 @@ #include #include #include +#include #include #include "SMESH_ControlsDef.hxx" @@ -1407,93 +1408,100 @@ return; SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); - SUIT_ViewManager* vm = anApp->activeViewManager(); - int nbSf = vm ? vm->getViewsCount() : 0; - SALOME_ListIteratorOfListIO It(selected); - - aStudyBuilder->NewCommand(); // There is a transaction - for( ; It.More(); It.Next()){ // loop on selected IO's - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()) { - _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); - - // disable removal of "SMESH" component object - if(aSO->FindAttribute(anAttr, "AttributeIOR")){ - anIOR = anAttr; - if ( engineIOR() == anIOR->Value().c_str() ) - continue; - } - //Check the referenced object - _PTR(SObject) aRefSObject; - if ( aSO && aSO->ReferencedObject( aRefSObject ) ) - aSO = aRefSObject; // Delete main Object instead of reference - - // put the whole hierarchy of sub-objects of the selected SO into a list and - // then treat them all starting from the deepest objects (at list back) - - std::list< _PTR(SObject) > listSO; - listSO.push_back( aSO ); - std::list< _PTR(SObject) >::iterator itSO = listSO.begin(); - for ( ; itSO != listSO.end(); ++itSO ) { - _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO ); - for (it->InitEx(false); it->More(); it->Next()) - listSO.push_back( it->Value() ); - } - - // treat SO's in the list starting from the back - - std::list< _PTR(SObject) >::reverse_iterator ritSO = listSO.rbegin(); - for ( ; ritSO != listSO.rend(); ++ritSO ) { - _PTR(SObject) SO = *ritSO; - if ( !SO ) continue; - std::string anEntry = SO->GetID(); - - /** Erase graphical object **/ - if(SO->FindAttribute(anAttr, "AttributeIOR") && vm ){ - QVector aViews = vm->getViews(); - for(int i = 0; i < nbSf; i++){ - SUIT_ViewWindow *sf = aViews[i]; - if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ - SMESH::RemoveActor(sf,anActor); - } - } - } - - /** Remove an object from data structures **/ - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO )); - if ( !aGroup->_is_nil() ) { // DELETE GROUP - SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh(); - aMesh->RemoveGroup( aGroup ); - } - else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - aMesh->RemoveSubMesh( aSubMesh ); + ViewManagerList aViewMenegers = anApp->viewManagers(); + ViewManagerList::const_iterator it = aViewMenegers.begin(); + for( ; it != aViewMenegers.end(); it++) { + + SUIT_ViewManager* vm = *it; + int nbSf = vm ? vm->getViewsCount() : 0; - _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh); - if (aMeshSO) - SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0); - } - else { - IObject = new SALOME_InteractiveObject - ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() ); - QString objType = CheckTypeObject(IObject); - if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS - SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); - aStudyBuilder->RemoveObjectWithChildren( SO ); - } - else {// default action: remove SObject from the study - // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH - //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy); - //op->start(); - aStudyBuilder->RemoveObjectWithChildren( SO ); - //op->finish(); - } - } - } /* listSO back loop */ - } /* IObject->hasEntry() */ - } /* more/next */ + SALOME_ListIteratorOfListIO It(selected); + + aStudyBuilder->NewCommand(); // There is a transaction + for( ; It.More(); It.Next()){ // loop on selected IO's + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()) { + _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); + + // disable removal of "SMESH" component object + if(aSO->FindAttribute(anAttr, "AttributeIOR")){ + anIOR = anAttr; + if ( engineIOR() == anIOR->Value().c_str() ) + continue; + } + //Check the referenced object + _PTR(SObject) aRefSObject; + if ( aSO && aSO->ReferencedObject( aRefSObject ) ) + aSO = aRefSObject; // Delete main Object instead of reference + + // put the whole hierarchy of sub-objects of the selected SO into a list and + // then treat them all starting from the deepest objects (at list back) + + std::list< _PTR(SObject) > listSO; + listSO.push_back( aSO ); + std::list< _PTR(SObject) >::iterator itSO = listSO.begin(); + for ( ; itSO != listSO.end(); ++itSO ) { + _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO ); + for (it->InitEx(false); it->More(); it->Next()) + listSO.push_back( it->Value() ); + } + + // treat SO's in the list starting from the back + + std::list< _PTR(SObject) >::reverse_iterator ritSO = listSO.rbegin(); + for ( ; ritSO != listSO.rend(); ++ritSO ) { + _PTR(SObject) SO = *ritSO; + if ( !SO ) continue; + std::string anEntry = SO->GetID(); + + /** Erase graphical object **/ + if(SO->FindAttribute(anAttr, "AttributeIOR") && vm ){ + QVector aViews = vm->getViews(); + for(int i = 0; i < nbSf; i++){ + SUIT_ViewWindow *sf = aViews[i]; + if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ + SMESH::RemoveActor(sf,anActor); + } + } + } + + /** Remove an object from data structures **/ + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO )); + if ( !aGroup->_is_nil() ) { // DELETE GROUP + SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh(); + aMesh->RemoveGroup( aGroup ); + } + else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + aMesh->RemoveSubMesh( aSubMesh ); + + _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh); + if (aMeshSO) + SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0); + } + else { + IObject = new SALOME_InteractiveObject + ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() ); + QString objType = CheckTypeObject(IObject); + if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS + SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); + aStudyBuilder->RemoveObjectWithChildren( SO ); + } + else {// default action: remove SObject from the study + // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH + //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy); + //op->start(); + aStudyBuilder->RemoveObjectWithChildren( SO ); + //op->finish(); + } + } + } /* listSO back loop */ + } /* IObject->hasEntry() */ + } /* more/next */ + } /* aViewMenegers list loop */ + aStudyBuilder->CommitCommand(); /* Clear any previous selection */ @@ -4131,6 +4139,16 @@ bool SMESHGUI::activateModule( SUIT_Study* study ) GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() ); updateObjBrowser(); // objects can be removed } + + // get all view currently opened in the study and connect their signals to + // the corresponding slots of the class. + SUIT_Desktop* aDesk = study->application()->desktop(); + if ( aDesk ) { + QList wndList = aDesk->windows(); + SUIT_ViewWindow* wnd; + foreach ( wnd, wndList ) + connectView( wnd ); + } return res; } @@ -4228,8 +4246,15 @@ void SMESHGUI::viewManagers( QStringList& list ) const void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr ) { - if ( dynamic_cast( mgr ) ) + if ( dynamic_cast( mgr ) ) { SMESH::UpdateSelectionProp( this ); + + QVector aViews = mgr->getViews(); + for(int i = 0; i < aViews.count() ; i++){ + SUIT_ViewWindow *sf = aViews[i]; + connectView( sf ); + } + } } void SMESHGUI::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) @@ -5677,3 +5702,34 @@ void SMESHGUI::onHypothesisEdit( int result ) SMESHGUI::Modified(); updateObjBrowser( true ); } + + +/*! + \brief Signal handler closing(SUIT_ViewWindow*) of a view + \param pview view being closed +*/ +void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) { +#ifndef DISABLE_PLOT2DVIEWER + //Crear all Plot2d Viewers if need. + SMESH::ClearPlot2Viewers(pview); +#endif +} + +/*! + \brief Connects or disconnects signals about activating and cloning view on the module slots + \param pview view which is connected/disconnected +*/ +void SMESHGUI::connectView( const SUIT_ViewWindow* pview ) { + if(!pview) + return; + + SUIT_ViewManager* viewMgr = pview->getViewManager(); + if ( viewMgr ) { + disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ), + this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) ); + + connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ), + this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) ); + } +} + diff --git a/src/SMESHGUI/SMESHGUI.h b/src/SMESHGUI/SMESHGUI.h index 7aa14367f..e2bb545c1 100644 --- a/src/SMESHGUI/SMESHGUI.h +++ b/src/SMESHGUI/SMESHGUI.h @@ -152,6 +152,8 @@ public slots: virtual bool deactivateModule( SUIT_Study* ); virtual bool activateModule( SUIT_Study* ); virtual void studyClosed( SUIT_Study* ); + void onViewClosed( SUIT_ViewWindow* ); + private slots: void OnGUIEvent(); @@ -197,6 +199,9 @@ private: const int pId, const QString& param ); + void connectView( const SUIT_ViewWindow* ); + + private : static SMESH::SMESH_Gen_var myComponentSMESH; QDialog* myActiveDialogBox; diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx index c566a3cf9..57d2fc16c 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx @@ -33,6 +33,7 @@ #include "SMESHGUI_Utils.h" #include +#include #include #include diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 184eb903c..8d9f55a31 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -57,12 +57,6 @@ #include #include -#ifndef DISABLE_PLOT2DVIEWER -#include -#include -#include -#endif - // SALOME KERNEL includes #include @@ -659,9 +653,6 @@ namespace SMESH VISUAL_OBJ_CONT.erase(aKey); } } -#ifndef DISABLE_PLOT2DVIEWER - ProcessIn2DViewers(theActor,RemoveFrom2dViewer); -#endif theActor->Delete(); vtkWnd->Repaint(); } @@ -1315,42 +1306,29 @@ namespace SMESH } #ifndef DISABLE_PLOT2DVIEWER - //======================================================================= - /** - Get histogram from the input actor - Repaint/Remove the histogram in/from each opened Plot2D Viewer - */ - //======================================================================= - void ProcessIn2DViewers( SMESH_Actor *theActor, Viewer2dActionType aType ) { - SalomeApp_Application* anApp = dynamic_cast(SUIT_Session::session()->activeApplication()); - - if(!anApp || !theActor) - return; + //================================================================================ + /*! + * \brief Find all SMESH_Actor's in the View Window. + * If actor constains Plot2d_Histogram object remove it from each Plot2d Viewer. + */ + //================================================================================ - SPlot2d_Histogram* aHistogram = 0; - if(theActor->GetPlot2Histogram()) - aHistogram = theActor->UpdatePlot2Histogram(); - else - return; - - ViewManagerList aViewManagerList; - anApp->viewManagers(SPlot2d_Viewer::Type(), aViewManagerList); - - aType = aHistogram->getPointList().empty() ? RemoveFrom2dViewer : aType; - - SUIT_ViewManager* aViewManager; - foreach( aViewManager, aViewManagerList ) { - if (Plot2d_ViewManager* aManager = dynamic_cast(aViewManager)) { - if (SPlot2d_Viewer* aViewer = dynamic_cast(aManager->getViewModel())) { - if (Plot2d_ViewFrame* aViewFrame = aViewer->getActiveViewFrame()) { - if(aType == UpdateIn2dViewer ) - aViewFrame->displayObject(aHistogram, true); - else if (aType == RemoveFrom2dViewer) - aViewFrame->eraseObject(aHistogram, true); - } - } - } - } + void ClearPlot2Viewers( SUIT_ViewWindow* theWindow ) { + if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWindow)){ + vtkRenderer *aRenderer = aViewWindow->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->hasIO() && anActor->GetPlot2Histogram() ){ + ProcessIn2DViewers(anActor,RemoveFrom2dViewer); + } + } + } + } } -#endif //DISABLE_PLOT2DVIEWER + +#endif + } // end of namespace SMESH diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.h b/src/SMESHGUI/SMESHGUI_VTKUtils.h index 6b49b44eb..084d1abe3 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.h +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.h @@ -40,11 +40,6 @@ #include #include -#ifndef DISABLE_PLOT2DVIEWER -class SPlot2d_Histogram; -#endif - - class TColStd_IndexedMapOfInteger; class SALOMEDSClient_Study; @@ -196,6 +191,11 @@ SMESHGUI_EXPORT SMESHGUI_EXPORT void SetControlsPrecision( const long ); +#ifndef DISABLE_PLOT2DVIEWER +SMESHGUI_EXPORT + void ClearPlot2Viewers( SUIT_ViewWindow* theWindow ); +#endif + //---------------------------------------------------------------------------- SMESHGUI_EXPORT bool ComputeClippingPlaneParameters( std::list theActorList, @@ -203,16 +203,6 @@ SMESHGUI_EXPORT vtkFloatingPointType theDist, vtkFloatingPointType theBounds[6], vtkFloatingPointType theOrigin[3] ); - -#ifndef DISABLE_PLOT2DVIEWER - - typedef enum {UpdateIn2dViewer = 0, RemoveFrom2dViewer } Viewer2dActionType; - - SMESHGUI_EXPORT - void ProcessIn2DViewers( SMESH_Actor* theActor, Viewer2dActionType = UpdateIn2dViewer ); - -#endif - }; #endif // SMESHGUI_VTKUTILS_H -- 2.39.2