#include "SMESHGUI.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_Filter.h"
+#include "SMESH_ControlsDef.hxx"
#include <SMESH_Actor.h>
#include <SMESH_ActorUtils.h>
*/
//================================================================================
- void RemoveVisualObjectWithActors( const char* theEntry )
+ void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews )
{
- SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
- ( SUIT_Session::session()->activeApplication() );
- SUIT_ViewManager* aViewManager =
- app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0;
- if ( aViewManager ) {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+ if(!app)
+ return;
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+ if(!aStudy)
+ return;
+ ViewManagerList aList;
+
+ if(fromAllViews) {
+ app->viewManagers(SVTK_Viewer::Type() , aList);
+ } else {
+ SUIT_ViewManager* aVM = app->getViewManager(SVTK_Viewer::Type(), true);
+ if(aVM)
+ aList.append(aVM);
+ }
+ bool actorRemoved = false;
+ ViewManagerList::ConstIterator it = aList.begin();
+ SUIT_ViewManager* aViewManager = 0;
+ for( ; it!=aList.end();it++) {
+ aViewManager = *it;
QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
for ( int iV = 0; iV < views.count(); ++iV ) {
if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
- if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV]))
+ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
vtkWnd->RemoveActor(actor);
+ actorRemoved = true;
+ }
actor->Delete();
}
}
+ }
+
+ if (aViewManager ) {
int aStudyId = aViewManager->study()->id();
TVisualObjCont::key_type aKey(aStudyId,theEntry);
TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey);
}
VISUAL_OBJ_CONT.erase(aKey);
}
+
+ if(actorRemoved)
+ aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
}
//================================================================================
/*!
#endif
//MESSAGE("GetVisualObj");
if (nulData)
- objModified = aVisualObj->NulData();
+ objModified = aVisualObj->NulData();
else
objModified = aVisualObj->Update();
}
if ( objModified ) {
// PAL16631. Mesurements showed that to show aVisualObj in SHADING(default) mode,
- // ~10 times more memory is used than it occupies.
+ // ~5 times more memory is used than it occupies.
// Warn the user if there is less free memory than 30 sizes of a grid
// TODO: estimate memory usage in other modes and take current mode into account
int freeMB = SMDS_Mesh::CheckMemory(true);
int usedMB = aVisualObj->GetUnstructuredGrid()->GetActualMemorySize() / 1024;
- if ( freeMB > 0 && usedMB * 30 > freeMB ) {
-#ifdef _DEBUG_
- MESSAGE ( "SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB
- << ", usedMB=" << usedMB );
-#endif
-// bool continu = false;
-// if ( usedMB * 10 > freeMB )
-// // even dont try to show
-// SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
-// QObject::tr("SMESH_NO_MESH_VISUALIZATION"));
-// else
-// // there is a chance to succeed
-// continu = SUIT_MessageBox::warning
-// (SMESHGUI::desktop(),
-// QObject::tr("SMESH_WRN_WARNING"),
-// QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
-// SUIT_MessageBox::Yes | SUIT_MessageBox::No,
-// SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes;
-// if ( !continu ) {
-// // remove the corresponding actors from all views
-// RemoveVisualObjectWithActors( theEntry );
-// aVisualObj.reset();
-// }
+ MESSAGE("SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB << ", usedMB=" <<usedMB);
+ if ( freeMB > 0 && usedMB * 5 > freeMB ) {
+ bool continu = false;
+ if ( usedMB * 3 > freeMB )
+ // even dont try to show
+ SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_NO_MESH_VISUALIZATION"));
+ else
+ // there is a chance to succeed
+ continu = SUIT_MessageBox::warning
+ (SMESHGUI::desktop(),
+ QObject::tr("SMESH_WRN_WARNING"),
+ QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"),
+ SUIT_MessageBox::Yes | SUIT_MessageBox::No,
+ SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes;
+ if ( !continu ) {
+ // remove the corresponding actors from all views
+ RemoveVisualObjectWithActors( theEntry );
+ aVisualObj.reset();
+ }
}
}
}
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj ));
- if(!CORBA::is_nil(aGroup))
+ if(!CORBA::is_nil(aGroup) && anActor)
{
SALOMEDS::Color aColor = aGroup->GetColor();
if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) )
void RemoveActor( SUIT_ViewWindow *theWnd, SMESH_Actor* theActor){
if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd)){
- MESSAGE("RemoveActor " << theActor);
+ MESSAGE("RemoveActor " << theActor);
vtkWnd->RemoveActor(theActor);
if(theActor->hasIO()){
Handle(SALOME_InteractiveObject) anIO = theActor->getIO();
bool UpdateView(SUIT_ViewWindow *theWnd, EDisplaing theAction, const char* theEntry)
{
- //MESSAGE("UpdateView");
+ //MESSAGE("UpdateView");
bool OK = false;
SVTK_ViewWindow* aViewWnd = GetVtkViewWindow(theWnd);
if (!aViewWnd)
return OK;
+ SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd);
+ if (!vtkWnd)
+ return OK;
+
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( vtkWnd->getViewManager()->study() );
+
+ if (!aStudy)
+ return OK;
+
{
OK = true;
vtkRenderer *aRenderer = aViewWnd->getRenderer();
case eDisplayAll: {
while (vtkActor *anAct = aCollection->GetNextActor()) {
if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) {
- MESSAGE("--- display " << anActor);
+ MESSAGE("--- display " << anActor);
anActor->SetVisibility(true);
+
+ if(anActor->hasIO()){
+ Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
+ if(anIO->hasEntry()){
+ aStudy->setVisibilityState(anIO->getEntry(), Qtx::ShownState);
+ }
+ }
}
}
break;
}
case eDisplayOnly:
case eEraseAll: {
- //MESSAGE("---case eDisplayOnly");
+ //MESSAGE("---case eDisplayOnly");
while (vtkActor *anAct = aCollection->GetNextActor()) {
if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) {
- //MESSAGE("--- erase " << anActor);
+ //MESSAGE("--- erase " << anActor);
anActor->SetVisibility(false);
}
}
+ aStudy->setVisibilityStateForAll(Qtx::HiddenState);
}
default: {
if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
switch (theAction) {
case eDisplay:
case eDisplayOnly:
- //MESSAGE("--- display " << anActor);
+ //MESSAGE("--- display " << anActor);
+ anActor->Update();
anActor->SetVisibility(true);
if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
+ aStudy->setVisibilityState(theEntry, Qtx::ShownState);
break;
case eErase:
- //MESSAGE("--- erase " << anActor);
+ //MESSAGE("--- erase " << anActor);
anActor->SetVisibility(false);
+ aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
break;
}
} else {
case eDisplay:
case eDisplayOnly:
{
- //MESSAGE("---");
+ //MESSAGE("---");
SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(theWnd->getViewManager()->study());
_PTR(Study) aDocument = aStudy->studyDS();
// Pass non-visual objects (hypotheses, etc.), return true in this case
if ((anActor = CreateActor(aDocument,theEntry,true))) {
bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
DisplayActor(theWnd,anActor);
+ aStudy->setVisibilityState(theEntry, Qtx::ShownState);
// FitAll(); - PAL16770(Display of a group performs an automatic fit all)
if (needFitAll) FitAll();
} else {
bool UpdateView(EDisplaing theAction, const char* theEntry){
- //MESSAGE("UpdateView");
+ //MESSAGE("UpdateView");
SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( GetActiveStudy() );
SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( aStudy->application() );
SUIT_ViewWindow *aWnd = app->activeViewManager()->getActiveView();
bool Update(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay)
{
- MESSAGE("Update");
+ MESSAGE("Update");
_PTR(Study) aStudy = GetActiveStudyDocument();
CORBA::Long anId = aStudy->StudyId();
if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry())) {
bool UpdateNulData(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay)
{
- MESSAGE("UpdateNulData");
+ MESSAGE("UpdateNulData");
_PTR(Study) aStudy = GetActiveStudyDocument();
CORBA::Long anId = aStudy->StudyId();
if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry(), true)) {
DistanceToPosition( theBounds, theNormal, theDist, theOrigin );
return true;
}
+
+#ifndef DISABLE_PLOT2DVIEWER
+ //================================================================================
+ /*!
+ * \brief Find all SMESH_Actor's in the View Window.
+ * If actor constains Plot2d_Histogram object remove it from each Plot2d Viewer.
+ */
+ //================================================================================
+
+ 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
+
} // end of namespace SMESH