X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_VTKUtils.cxx;h=efc82df3d6272028d547ab4674113e5ed537c7b7;hb=519f45e49541ef86004a139b9dccc909927bc406;hp=baafa985c8de0f04391d5f0606fd94b9437eacae;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index baafa985c..efc82df3d 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 @@ -34,6 +34,8 @@ #include #include +#include "SMESH_NodeLabelActor.h" +#include "SMESH_CellLabelActor.h" #include #include @@ -610,14 +612,17 @@ namespace SMESH SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj )); if(!CORBA::is_nil(aGroup) && anActor) { - QColor c;int delta; - SMESH::GetColor( "SMESH", "fill_color", c, delta, "0,170,255|-100" ); + 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 )) { - aColor.R = (float)c.red() / 255.0; - aColor.G = (float)c.green() / 255.0; - aColor.B = (float)c.blue() / 255.0; + aColor.R = c.redF(); + aColor.G = c.greenF(); + aColor.B = c.blueF(); aGroup->SetColor( aColor ); } if( aGroup->GetType() == SMESH::NODE ) @@ -628,8 +633,10 @@ namespace SMESH 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, delta ); + anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, deltaF ); } } } @@ -944,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; + // + double 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(); + } + // + double 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) @@ -1241,21 +1323,21 @@ namespace SMESH //---------------------------------------------------------------------------- // internal function - void ComputeBoundsParam( vtkFloatingPointType theBounds[6], - vtkFloatingPointType theDirection[3], - vtkFloatingPointType theMinPnt[3], - vtkFloatingPointType& theMaxBoundPrj, - vtkFloatingPointType& theMinBoundPrj ) + void ComputeBoundsParam( double theBounds[6], + double theDirection[3], + double theMinPnt[3], + double& theMaxBoundPrj, + double& theMinBoundPrj ) { //Enlarge bounds in order to avoid conflicts of precision for(int i = 0; i < 6; i += 2){ static double EPS = 1.0E-3; - vtkFloatingPointType aDelta = (theBounds[i+1] - theBounds[i])*EPS; + double aDelta = (theBounds[i+1] - theBounds[i])*EPS; theBounds[i] -= aDelta; theBounds[i+1] += aDelta; } - vtkFloatingPointType aBoundPoints[8][3] = { {theBounds[0],theBounds[2],theBounds[4]}, + double aBoundPoints[8][3] = { {theBounds[0],theBounds[2],theBounds[4]}, {theBounds[1],theBounds[2],theBounds[4]}, {theBounds[0],theBounds[3],theBounds[4]}, {theBounds[1],theBounds[3],theBounds[4]}, @@ -1268,7 +1350,7 @@ namespace SMESH theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); theMinBoundPrj = theMaxBoundPrj; for(int i = 1; i < 8; i++){ - vtkFloatingPointType aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); + double aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); if(theMaxBoundPrj < aTmp){ theMaxBoundPrj = aTmp; aMaxId = i; @@ -1277,43 +1359,43 @@ namespace SMESH theMinBoundPrj = aTmp; } } - vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; + double *aMinPnt = aBoundPoints[aMaxId]; theMinPnt[0] = aMinPnt[0]; theMinPnt[1] = aMinPnt[1]; theMinPnt[2] = aMinPnt[2]; } // internal function - void DistanceToPosition( vtkFloatingPointType theBounds[6], - vtkFloatingPointType theDirection[3], - vtkFloatingPointType theDist, - vtkFloatingPointType thePos[3] ) + void DistanceToPosition( double theBounds[6], + double theDirection[3], + double theDist, + double thePos[3] ) { - vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + double aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theBounds,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - vtkFloatingPointType aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist; + double aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist; thePos[0] = aMinPnt[0]-theDirection[0]*aLength; thePos[1] = aMinPnt[1]-theDirection[1]*aLength; thePos[2] = aMinPnt[2]-theDirection[2]*aLength; } // internal function (currently unused, left just in case) - void PositionToDistance( vtkFloatingPointType theBounds[6], - vtkFloatingPointType theDirection[3], - vtkFloatingPointType thePos[3], - vtkFloatingPointType& theDist ) + void PositionToDistance( double theBounds[6], + double theDirection[3], + double thePos[3], + double& theDist ) { - vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + double aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theBounds,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - vtkFloatingPointType aPrj = vtkMath::Dot(theDirection,thePos); + double aPrj = vtkMath::Dot(theDirection,thePos); theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); } bool ComputeClippingPlaneParameters( std::list theActorList, - vtkFloatingPointType theNormal[3], - vtkFloatingPointType theDist, - vtkFloatingPointType theBounds[6], - vtkFloatingPointType theOrigin[3] ) + double theNormal[3], + double theDist, + double theBounds[6], + double theOrigin[3] ) { bool anIsOk = false; theBounds[0] = theBounds[2] = theBounds[4] = VTK_DOUBLE_MAX; @@ -1322,7 +1404,7 @@ namespace SMESH for( ; anIter != theActorList.end(); anIter++ ) { if( vtkActor* aVTKActor = *anIter ) { if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) { - vtkFloatingPointType aBounds[6]; + double aBounds[6]; anActor->GetUnstructuredGrid()->GetBounds( aBounds ); theBounds[0] = std::min( theBounds[0], aBounds[0] ); theBounds[1] = std::max( theBounds[1], aBounds[1] ); @@ -1337,7 +1419,7 @@ namespace SMESH if( !anIsOk ) return false; - + DistanceToPosition( theBounds, theNormal, theDist, theOrigin ); return true; }