X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_VTKUtils.cxx;h=4c9ac89fe9049c29ff1374ff2e0b923c0eae4c7f;hb=ed191931f2fdad3eec02fdd6cb9967c1d2158fcc;hp=184eb903cb05f34e53a23b96a6d746761d2155fb;hpb=18e0bef9d9707917ea1b354d83830c9e2bedf1a3;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 184eb903c..4c9ac89fe 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -1,23 +1,23 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 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 +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // SMESH SMESHGUI : GUI for SMESH component @@ -57,12 +57,6 @@ #include #include -#ifndef DISABLE_PLOT2DVIEWER -#include -#include -#include -#endif - // SALOME KERNEL includes #include @@ -109,21 +103,41 @@ namespace SMESH */ //================================================================================ - void RemoveVisualObjectWithActors( const char* theEntry ) + void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews ) { - SalomeApp_Application* app = dynamic_cast - ( SUIT_Session::session()->activeApplication() ); - SUIT_ViewManager* aViewManager = - app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0; - if ( aViewManager ) { + SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); + if(!app) + return; + SalomeApp_Study* aStudy = dynamic_cast(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 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); @@ -134,6 +148,9 @@ namespace SMESH } VISUAL_OBJ_CONT.erase(aKey); } + + if(actorRemoved) + aStudy->setVisibilityState(theEntry, Qtx::HiddenState); } //================================================================================ /*! @@ -356,34 +373,31 @@ namespace SMESH 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=" < 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(); + } } } @@ -594,16 +608,16 @@ namespace SMESH } SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj )); - if(!CORBA::is_nil(aGroup)) + if(!CORBA::is_nil(aGroup) && anActor) { + QColor c;int delta; + SMESH::GetColor( "SMESH", "fill_color", c, delta, "0,170,255|-100" ); SALOMEDS::Color aColor = aGroup->GetColor(); - if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) ) + if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 )) { - int r = 0, g = 0, b = 0; - SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) ); - aColor.R = (float)r / 255.0; - aColor.G = (float)g / 255.0; - aColor.B = (float)b / 255.0; + aColor.R = (float)c.red() / 255.0; + aColor.G = (float)c.green() / 255.0; + aColor.B = (float)c.blue() / 255.0; aGroup->SetColor( aColor ); } if( aGroup->GetType() == SMESH::NODE ) @@ -613,7 +627,7 @@ namespace SMESH else if( aGroup->GetType() == SMESH::ELEM0D ) anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); else - anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); + anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); } } } @@ -659,9 +673,6 @@ namespace SMESH VISUAL_OBJ_CONT.erase(aKey); } } -#ifndef DISABLE_PLOT2DVIEWER - ProcessIn2DViewers(theActor,RemoveFrom2dViewer); -#endif theActor->Delete(); vtkWnd->Repaint(); } @@ -695,6 +706,15 @@ namespace SMESH if (!aViewWnd) return OK; + SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd); + if (!vtkWnd) + return OK; + + SalomeApp_Study* aStudy = dynamic_cast( vtkWnd->getViewManager()->study() ); + + if (!aStudy) + return OK; + { OK = true; vtkRenderer *aRenderer = aViewWnd->getRenderer(); @@ -708,6 +728,13 @@ namespace SMESH if (SMESH_Actor *anActor = dynamic_cast(anAct)) { 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; @@ -721,6 +748,7 @@ namespace SMESH anActor->SetVisibility(false); } } + aStudy->setVisibilityStateForAll(Qtx::HiddenState); } default: { if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { @@ -728,12 +756,15 @@ namespace SMESH case eDisplay: case eDisplayOnly: //MESSAGE("--- display " << anActor); + anActor->Update(); anActor->SetVisibility(true); if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); + aStudy->setVisibilityState(theEntry, Qtx::ShownState); break; case eErase: //MESSAGE("--- erase " << anActor); anActor->SetVisibility(false); + aStudy->setVisibilityState(theEntry, Qtx::HiddenState); break; } } else { @@ -752,6 +783,7 @@ namespace SMESH 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 { @@ -864,16 +896,11 @@ namespace SMESH aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ), aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); - int SW = mgr->integerValue( "SMESH", "selection_width", 5 ), - PW = mgr->integerValue( "SMESH", "highlight_width", 5 ); - - // adjust highlight_width to the width of mesh entities int aElem0DSize = mgr->integerValue("SMESH", "elem0d_size", 5); int aLineWidth = mgr->integerValue("SMESH", "element_width", 1); int maxSize = aElem0DSize; if (aElem0DSize > maxSize) maxSize = aElem0DSize; if (aLineWidth > maxSize) maxSize = aLineWidth; - if (PW < maxSize + 2) PW = maxSize + 2; double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), @@ -885,16 +912,14 @@ namespace SMESH // mesh element selection aVtkView->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255., - aSelColor.blue()/255., - SW ); + aSelColor.blue()/255.); // tolerances aVtkView->SetSelectionTolerance(SP1, SP2, SP3); // pre-selection aVtkView->SetPreselectionProp(aPreColor.red()/255., aPreColor.green()/255., - aPreColor.blue()/255., - PW); + aPreColor.blue()/255.); // update actors vtkRenderer* aRenderer = aVtkView->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); @@ -1235,7 +1260,7 @@ namespace SMESH {theBounds[0],theBounds[3],theBounds[5]}, {theBounds[1],theBounds[3],theBounds[5]}}; - int aMaxId = 0, aMinId = aMaxId; + int aMaxId = 0; theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); theMinBoundPrj = theMaxBoundPrj; for(int i = 1; i < 8; i++){ @@ -1246,7 +1271,6 @@ namespace SMESH } if(theMinBoundPrj > aTmp){ theMinBoundPrj = aTmp; - aMinId = i; } } vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; @@ -1315,42 +1339,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