X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_VTKUtils.cxx;h=229d7f809518fb67cbb493a59ff6cddc8be115f5;hb=577906c7b0205411b4cb816d1cefaf7d62a01d4c;hp=450aca68d574750dd2338a4f3ecfee207965a26b;hpb=daa2cf53970e196bfe3c82cfde426f1ccc43e630;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 450aca68d..229d7f809 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-2012 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 @@ -30,9 +30,12 @@ #include "SMESHGUI.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_Filter.h" +#include "SMESH_ControlsDef.hxx" #include #include +#include "SMESH_NodeLabelActor.h" +#include "SMESH_CellLabelActor.h" #include #include @@ -102,21 +105,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); @@ -127,6 +150,9 @@ namespace SMESH } VISUAL_OBJ_CONT.erase(aKey); } + + if(actorRemoved) + aStudy->setVisibilityState(theEntry, Qtx::HiddenState); } //================================================================================ /*! @@ -349,34 +375,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(); + } } } @@ -587,16 +610,19 @@ 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 deltaF, deltaV; + SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" ); + SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" ); + c = SMESH::GetColor( "SMESH", "default_grp_color", c ); 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 = c.redF(); + aColor.G = c.greenF(); + aColor.B = c.blueF(); aGroup->SetColor( aColor ); } if( aGroup->GetType() == SMESH::NODE ) @@ -605,8 +631,12 @@ namespace SMESH anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); else if( aGroup->GetType() == SMESH::ELEM0D ) anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); + else if( aGroup->GetType() == SMESH::BALL ) + anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); + else if( aGroup->GetType() == SMESH::VOLUME ) + anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, deltaV ); else - anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); + anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, deltaF ); } } } @@ -685,6 +715,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(); @@ -698,6 +737,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; @@ -711,6 +757,7 @@ namespace SMESH anActor->SetVisibility(false); } } + aStudy->setVisibilityStateForAll(Qtx::HiddenState); } default: { if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { @@ -718,12 +765,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 { @@ -742,6 +792,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 { @@ -854,16 +905,13 @@ 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 aBallSize = mgr->integerValue("SMESH", "ball_elem_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; + if (aBallSize > maxSize) maxSize = aBallSize; double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), @@ -875,16 +923,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()); @@ -905,6 +951,81 @@ namespace SMESH } + void UpdateFontProp( SMESHGUI* theModule ) + { + if ( !theModule ) return; + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( theModule->application() ); + if ( !app ) return; + + SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( theModule ); + if ( !mgr ) return; + // + vtkFloatingPointType anRGBNd[3] = {1,1,1}; + SMESH::GetColor( "SMESH", "numbering_node_color", anRGBNd[0], anRGBNd[1], anRGBNd[2], QColor( 255, 255, 255 ) ); + int aSizeNd = 10; + SMESH::LabelFont aFamilyNd = SMESH::FntTimes; + bool aBoldNd = true; + bool anItalicNd = false; + bool aShadowNd = false; + + if ( mgr->hasValue( "SMESH", "numbering_node_font" ) ) { + QFont f = mgr->fontValue( "SMESH", "numbering_node_font" ); + if ( f.family() == "Arial" ) aFamilyNd = SMESH::FntArial; + else if ( f.family() == "Courier" ) aFamilyNd = SMESH::FntCourier; + else if ( f.family() == "Times" ) aFamilyNd = SMESH::FntTimes; + aBoldNd = f.bold(); + anItalicNd = f.italic(); + aShadowNd = f.overline(); + aSizeNd = f.pointSize(); + } + // + vtkFloatingPointType anRGBEl[3] = {0,1,0}; + SMESH::GetColor( "SMESH", "numbering_elem_color", anRGBEl[0], anRGBEl[1], anRGBEl[2], QColor( 0, 255, 0 ) ); + int aSizeEl = 12; + SMESH::LabelFont aFamilyEl = SMESH::FntTimes; + bool aBoldEl = true; + bool anItalicEl = false; + bool aShadowEl = false; + + if ( mgr->hasValue( "SMESH", "numbering_elem_font" ) ) { + QFont f = mgr->fontValue( "SMESH", "numbering_elem_font" ); + + if ( f.family() == "Arial" ) aFamilyEl = SMESH::FntArial; + else if ( f.family() == "Courier" ) aFamilyEl = SMESH::FntCourier; + else if ( f.family() == "Times" ) aFamilyEl = SMESH::FntTimes; + aBoldEl = f.bold(); + anItalicEl = f.italic(); + aShadowEl = f.overline(); + aSizeEl = f.pointSize(); + } + // + ViewManagerList vmList; + app->viewManagers( SVTK_Viewer::Type(), vmList ); + foreach ( SUIT_ViewManager* vm, vmList ) { + QVector views = vm->getViews(); + foreach ( SUIT_ViewWindow* vw, views ) { + // update VTK viewer properties + if ( SVTK_ViewWindow* aVtkView = GetVtkViewWindow( vw ) ) { + // update actors + vtkRenderer* aRenderer = aVtkView->getRenderer(); + VTK::ActorCollectionCopy aCopy( aRenderer->GetActors() ); + vtkActorCollection* aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while ( vtkActor* anAct = aCollection->GetNextActor() ) { + if ( SMESH_NodeLabelActor* anActor = dynamic_cast< SMESH_NodeLabelActor* >( anAct ) ) { + anActor->SetFontProperties( aFamilyNd, aSizeNd, aBoldNd, anItalicNd, aShadowNd, anRGBNd[0], anRGBNd[1], anRGBNd[2] ); + } + else if ( SMESH_CellLabelActor* anActor = dynamic_cast< SMESH_CellLabelActor* >( anAct ) ) { + anActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); + } + } + aVtkView->Repaint( false ); + } + } + } + } + //---------------------------------------------------------------------------- SVTK_Selector* GetSelector(SUIT_ViewWindow *theWindow) @@ -1225,7 +1346,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++){ @@ -1236,7 +1357,6 @@ namespace SMESH } if(theMinBoundPrj > aTmp){ theMinBoundPrj = aTmp; - aMinId = i; } } vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; @@ -1299,8 +1419,35 @@ namespace SMESH if( !anIsOk ) return false; - + 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(anAct)){ + if(anActor->hasIO() && anActor->GetPlot2Histogram() ){ + ProcessIn2DViewers(anActor,RemoveFrom2dViewer); + } + } + } + } + } + +#endif + } // end of namespace SMESH