Additional changes for the Point 2 of the "20948: EDF 1468 SMESH: Histogram of the quality controls" issue.

This commit is contained in:
rnv 2011-01-21 14:01:49 +00:00
parent ddc98ff4c0
commit 1758d524e7
8 changed files with 254 additions and 151 deletions

View File

@ -533,6 +533,13 @@ SMESH_ActorDef::~SMESH_ActorDef()
{
if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<<this);
#ifndef DISABLE_PLOT2DVIEWER
if(my2dHistogram) {
SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer);
delete my2dHistogram;
}
#endif
// caught by SMESHGUI::ProcessEvents() static method
this->InvokeEvent( SMESH::DeleteActorEvent, NULL );
@ -617,10 +624,6 @@ SMESH_ActorDef::~SMESH_ActorDef()
myImplicitBoolean->Delete();
myTimeStamp->Delete();
#ifndef DISABLE_PLOT2DVIEWER
if(my2dHistogram)
delete my2dHistogram;
#endif
}
@ -1344,6 +1347,10 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
if(myIsCellsLabeled)
myCellsLabels->VisibilityOn();
}
#ifndef DISABLE_PLOT2DVIEWER
else
SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer);
#endif
UpdateHighlight();
Modified();
}

View File

@ -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 <SPlot2d_ViewModel.h>
#include <SPlot2d_Histogram.h>
#include <Plot2d_ViewManager.h>
#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<SalomeApp_Application*>(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<Plot2d_ViewManager*>(aViewManager)) {
if (SPlot2d_Viewer* aViewer = dynamic_cast<SPlot2d_Viewer*>(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
}

View File

@ -28,6 +28,7 @@
#include <QColor>
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

View File

@ -89,6 +89,7 @@
#include <SMESH_Client.hxx>
#include <SMESH_Actor.h>
#include <SMESH_ScalarBarActor.h>
#include <SMESH_ActorUtils.h>
#include <SMESH_TypeFilter.hxx>
#include "SMESH_ControlsDef.hxx"
@ -1407,93 +1408,100 @@
return;
SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
SUIT_ViewManager* vm = anApp->activeViewManager();
int nbSf = vm ? vm->getViewsCount() : 0;
SALOME_ListIteratorOfListIO It(selected);
ViewManagerList aViewMenegers = anApp->viewManagers();
ViewManagerList::const_iterator it = aViewMenegers.begin();
for( ; it != aViewMenegers.end(); it++) {
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());
SUIT_ViewManager* vm = *it;
int nbSf = vm ? vm->getViewsCount() : 0;
// 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
SALOME_ListIteratorOfListIO It(selected);
// 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)
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());
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() );
}
// 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
// treat SO's in the list starting from the back
// 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) >::reverse_iterator ritSO = listSO.rbegin();
for ( ; ritSO != listSO.rend(); ++ritSO ) {
_PTR(SObject) SO = *ritSO;
if ( !SO ) continue;
std::string anEntry = SO->GetID();
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() );
}
/** Erase graphical object **/
if(SO->FindAttribute(anAttr, "AttributeIOR") && vm ){
QVector<SUIT_ViewWindow*> 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);
}
}
}
// treat SO's in the list starting from the back
/** 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 );
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<SUIT_ViewWindow*> 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 */
_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 */
aStudyBuilder->CommitCommand();
/* Clear any previous selection */
@ -4132,6 +4140,16 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
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<SUIT_ViewWindow*> 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<SVTK_ViewManager*>( mgr ) )
if ( dynamic_cast<SVTK_ViewManager*>( mgr ) ) {
SMESH::UpdateSelectionProp( this );
QVector<SUIT_ViewWindow*> 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* ) ) );
}
}

View File

@ -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;

View File

@ -33,6 +33,7 @@
#include "SMESHGUI_Utils.h"
#include <SMESH_Actor.h>
#include <SMESH_ActorUtils.h>
#include <SMESH_ScalarBarActor.h>
#include <SMESH_ControlsDef.hxx>

View File

@ -57,12 +57,6 @@
#include <SalomeApp_Application.h>
#include <SalomeApp_Study.h>
#ifndef DISABLE_PLOT2DVIEWER
#include <SPlot2d_ViewModel.h>
#include <SPlot2d_Histogram.h>
#include <Plot2d_ViewManager.h>
#endif
// SALOME KERNEL includes
#include <utilities.h>
@ -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<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
//================================================================================
/*!
* \brief Find all SMESH_Actor's in the View Window.
* If actor constains Plot2d_Histogram object remove it from each Plot2d Viewer.
*/
//================================================================================
if(!anApp || !theActor)
return;
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<Plot2d_ViewManager*>(aViewManager)) {
if (SPlot2d_Viewer* aViewer = dynamic_cast<SPlot2d_Viewer*>(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<SMESH_Actor*>(anAct)){
if(anActor->hasIO() && anActor->GetPlot2Histogram() ){
ProcessIn2DViewers(anActor,RemoveFrom2dViewer);
}
}
}
}
}
#endif //DISABLE_PLOT2DVIEWER
#endif
} // end of namespace SMESH

View File

@ -40,11 +40,6 @@
#include <SALOME_InteractiveObject.hxx>
#include <VTKViewer_Filter.h>
#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<vtkActor*> 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