X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Actor.cxx;h=49d838bac3d47d7efb04ad0f9d7404b28692f3af;hp=5d80d26fa2418db47018d602e5df36ef3354ffae;hb=0635c9fc80f67d1e5dc0e94ec85f487286a92070;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 5d80d26fa..49d838bac 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -1,41 +1,41 @@ -// SMESH OBJECT : interactive object for SMESH visualization +// Copyright (C) 2007-2008 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 +// +// 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. // -// Copyright (C) 2003 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 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 -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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 // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// SMESH OBJECT : interactive object for SMESH visualization // File : SMESH_Actor.cxx // Author : Nicolas REJNERI // Module : SMESH -// $Header$ -#include "SMESH_Actor.h" +#include "SMESH_ActorDef.h" #include "SMESH_ActorUtils.h" #include "SMESH_DeviceActor.h" -#include "SALOME_ExtractUnstructuredGrid.h" +#include "SMESH_ControlsDef.hxx" +#include "VTKViewer_ExtractUnstructuredGrid.h" +#include "SALOME_InteractiveObject.hxx" -#include "QAD_Config.h" -#include "utilities.h" -#include +#include "SUIT_Session.h" +#include "SUIT_ResourceMgr.h" +#include #include #include #include @@ -68,21 +68,22 @@ #include #include #include +#include + +#include "utilities.h" #ifdef _DEBUG_ -static int MYDEBUG = 0; -static int MYDEBUGWITHFILES = 0; +static int MYDEBUG = 1; #else static int MYDEBUG = 0; -static int MYDEBUGWITHFILES = 0; #endif static int aLineWidthInc = 2; static int aPointSizeInc = 2; -SMESH_Actor* SMESH_Actor::New(){ - return new SMESH_Actor(); +SMESH_ActorDef* SMESH_ActorDef::New(){ + return new SMESH_ActorDef(); } @@ -91,17 +92,20 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, const char* theName, int theIsClear) { - SMESH_Actor* anActor = SMESH_Actor::New(); + SMESH_ActorDef* anActor = SMESH_ActorDef::New(); if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){ anActor->Delete(); anActor = NULL; } + if( anActor ) + anActor->UpdateScalarBar(); return anActor; } -SMESH_Actor::SMESH_Actor(){ - if(MYDEBUG) MESSAGE("SMESH_Actor"); +SMESH_ActorDef::SMESH_ActorDef() +{ + if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<resourceMgr(); + + if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) + myControlsPrecision = mgr->integerValue( "SMESH", "controls_precision", -1); + + vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3); + vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); - SALOME_ExtractUnstructuredGrid* aFilter = NULL; + VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; //Definition 2D and 3D divices of the actor //----------------------------------------- - float anRGB[3] = {1,1,1}; + vtkFloatingPointType anRGB[3] = {1,1,1}; mySurfaceProp = vtkProperty::New(); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsFillColorRed", 0)/255.; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsFillColorGreen", 170)/255.; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsFillColorBlue", 255)/255.; - mySurfaceProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); + mySurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); myBackSurfaceProp = vtkProperty::New(); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsBackFaceColorRed", 0)/255.; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsBackFaceColorGreen", 0)/255.; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsBackFaceColorBlue", 255)/255.; - myBackSurfaceProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) ); + myBackSurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); my2DActor = SMESH_DeviceActor::New(); my2DActor->SetUserMatrix(aMatrix); - my2DActor->SetStoreMapping(true); my2DActor->PickableOff(); my2DActor->SetProperty(mySurfaceProp); my2DActor->SetBackfaceProperty(myBackSurfaceProp); my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my2DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_POLYGON); + aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + + my2DExtProp = vtkProperty::New(); + my2DExtProp->DeepCopy(mySurfaceProp); + SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); + anRGB[0] = 1 - anRGB[0]; + anRGB[1] = 1 - anRGB[1]; + anRGB[2] = 1 - anRGB[2]; + my2DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + + my2DExtActor = SMESH_DeviceActor::New(); + my2DExtActor->SetUserMatrix(aMatrix); + my2DExtActor->PickableOff(); + my2DExtActor->SetProperty(my2DExtProp); + my2DExtActor->SetBackfaceProperty(my2DExtProp); + my2DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); + aFilter = my2DExtActor->GetExtractUnstructuredGrid(); aFilter->RegisterCellsWithType(VTK_TRIANGLE); aFilter->RegisterCellsWithType(VTK_POLYGON); aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); my3DActor = SMESH_DeviceActor::New(); my3DActor->SetUserMatrix(aMatrix); - my3DActor->SetStoreMapping(true); my3DActor->PickableOff(); my3DActor->SetProperty(mySurfaceProp); my3DActor->SetBackfaceProperty(myBackSurfaceProp); my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my3DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_TETRA); aFilter->RegisterCellsWithType(VTK_VOXEL); aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); aFilter->RegisterCellsWithType(VTK_WEDGE); aFilter->RegisterCellsWithType(VTK_PYRAMID); - + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); //Definition 1D divice of the actor //--------------------------------- @@ -168,28 +198,26 @@ SMESH_Actor::SMESH_Actor(){ myEdgeProp->SetAmbient(1.0); myEdgeProp->SetDiffuse(0.0); myEdgeProp->SetSpecular(0.0); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsOutlineColorRed", 0)/255.; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsOutlineColorGreen", 170)/255.; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsOutlineColorBlue", 255)/255.; + SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myEdgeProp->SetLineWidth(aLineWidth); my1DActor = SMESH_DeviceActor::New(); my1DActor->SetUserMatrix(aMatrix); - my1DActor->SetStoreMapping(true); my1DActor->PickableOff(); my1DActor->SetHighlited(true); my1DActor->SetProperty(myEdgeProp); my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my1DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_LINE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); my1DProp = vtkProperty::New(); my1DProp->DeepCopy(myEdgeProp); my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); my1DProp->SetPointSize(aPointSize); - + my1DExtProp = vtkProperty::New(); my1DExtProp->DeepCopy(myEdgeProp); anRGB[0] = 1 - anRGB[0]; @@ -201,54 +229,69 @@ SMESH_Actor::SMESH_Actor(){ my1DExtActor = SMESH_DeviceActor::New(); my1DExtActor->SetUserMatrix(aMatrix); - my1DExtActor->SetStoreMapping(true); my1DExtActor->PickableOff(); my1DExtActor->SetHighlited(true); my1DExtActor->SetVisibility(false); my1DExtActor->SetProperty(my1DExtProp); my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); aFilter = my1DExtActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_LINE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); //Definition 0D divice of the actor //--------------------------------- myNodeProp = vtkProperty::New(); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsNodeColorRed",255)/255.; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsNodeColorGreen",0)/255.; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsNodeColorBlue",0)/255.; + SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) ); myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myNodeProp->SetPointSize(aPointSize); myNodeActor = SMESH_DeviceActor::New(); myNodeActor->SetUserMatrix(aMatrix); - myNodeActor->SetStoreMapping(true); + myNodeActor->SetStoreClippingMapping(true); myNodeActor->PickableOff(); myNodeActor->SetVisibility(false); myNodeActor->SetProperty(myNodeProp); myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); aFilter = myNodeActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfExtraction(SALOME_ExtractUnstructuredGrid::ePoints); - + aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + + myNodeExtProp = vtkProperty::New(); + myNodeExtProp->DeepCopy(myNodeProp); + anRGB[0] = 1 - anRGB[0]; + anRGB[1] = 1 - anRGB[1]; + anRGB[2] = 1 - anRGB[2]; + myNodeExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + myNodeExtProp->SetPointSize(aPointSize); + + myNodeExtActor = SMESH_DeviceActor::New(); + myNodeExtActor->SetUserMatrix(aMatrix); + myNodeExtActor->SetStoreClippingMapping(true); + myNodeExtActor->PickableOff(); + myNodeExtActor->SetHighlited(true); + myNodeExtActor->SetVisibility(false); + myNodeExtActor->SetProperty(myNodeExtProp); + myNodeExtActor->SetRepresentation(SMESH_DeviceActor::ePoint); + aFilter = myNodeExtActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + aFilter->RegisterCellsWithType(VTK_VERTEX); //Definition of Pickable and Highlitable engines //---------------------------------------------- myBaseActor = SMESH_DeviceActor::New(); myBaseActor->SetUserMatrix(aMatrix); - myBaseActor->SetStoreMapping(true); + myBaseActor->SetStoreGemetryMapping(true); myBaseActor->GetProperty()->SetOpacity(0.0); myPickableActor = myBaseActor; - + myHighlightProp = vtkProperty::New(); myHighlightProp->SetAmbient(1.0); myHighlightProp->SetDiffuse(0.0); myHighlightProp->SetSpecular(0.0); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsSelectColorRed", 255)/255.; // 1; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsSelectColorGreen", 255)/255.; // 1; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsSelectColorBlue", 255)/255.; // 1; + SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) ); myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myHighlightProp->SetPointSize(aPointSize); myHighlightProp->SetRepresentation(1); @@ -257,35 +300,20 @@ SMESH_Actor::SMESH_Actor(){ myPreselectProp->SetAmbient(1.0); myPreselectProp->SetDiffuse(0.0); myPreselectProp->SetSpecular(0.0); - anRGB[0] = SMESH::GetFloat("SMESH:SettingsPreSelectColorRed", 0)/255.; // 0; - anRGB[1] = SMESH::GetFloat("SMESH:SettingsPreSelectColorGreen", 255)/255.; // 1; - anRGB[2] = SMESH::GetFloat("SMESH:SettingsPreSelectColorBlue", 255)/255.; // 1; + SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) ); myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myPreselectProp->SetPointSize(aPointSize); myPreselectProp->SetRepresentation(1); myHighlitableActor = SMESH_DeviceActor::New(); myHighlitableActor->SetUserMatrix(aMatrix); - myHighlitableActor->SetStoreMapping(false); myHighlitableActor->PickableOff(); myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - myNodeHighlitableActor = SMESH_DeviceActor::New(); - myNodeHighlitableActor->SetUserMatrix(aMatrix); - myNodeHighlitableActor->SetStoreMapping(false); - myNodeHighlitableActor->PickableOff(); - myNodeHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint); - aFilter = myNodeHighlitableActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfExtraction(SALOME_ExtractUnstructuredGrid::ePoints); - - - SetShrinkFactor(SMESH::GetFloat("SMESH:SettingsShrinkCoeff", 75)/100.); - myName = ""; myIO = NULL; - myColorMode = eNone; - my1DColorMode = e1DNone; + myControlMode = eNone; myControlActor = my2DActor; //Definition of myScalarBarActor @@ -299,117 +327,14 @@ SMESH_Actor::SMESH_Actor(){ myScalarBarActor->SetVisibility(false); myScalarBarActor->SetLookupTable(myLookupTable); - vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New(); - - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleColor" ) ) { - QStringList aTColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleColor" ), false ); - aScalarBarTitleProp->SetColor( ( aTColor.count() > 0 ? aTColor[0].toInt()/255. : 1.0 ), - ( aTColor.count() > 1 ? aTColor[1].toInt()/255. : 1.0 ), - ( aTColor.count() > 2 ? aTColor[2].toInt()/255. : 1.0 ) ); - } - else - aScalarBarTitleProp->SetColor( 1.0, 1.0, 1.0 ); - - aScalarBarTitleProp->SetFontFamilyToArial(); - if( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleFont" ) ){ - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Arial" ) - aScalarBarTitleProp->SetFontFamilyToArial(); - else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Courier" ) - aScalarBarTitleProp->SetFontFamilyToCourier(); - else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Times" ) - aScalarBarTitleProp->SetFontFamilyToTimes(); - } - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleBold" ) == "true" ) - aScalarBarTitleProp->BoldOn(); - else - aScalarBarTitleProp->BoldOff(); - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleItalic" ) == "true" ) - aScalarBarTitleProp->ItalicOn(); - else - aScalarBarTitleProp->ItalicOff(); - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleShadow" ) == "true" ) - aScalarBarTitleProp->ShadowOn(); - else - aScalarBarTitleProp->ShadowOff(); - - myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp ); - aScalarBarTitleProp->Delete(); - - vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New(); - - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelColor" ) ) { - QStringList aTColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelColor" ), false ); - aScalarBarLabelProp->SetColor( ( aTColor.count() > 0 ? aTColor[0].toInt()/255. : 1.0 ), - ( aTColor.count() > 1 ? aTColor[1].toInt()/255. : 1.0 ), - ( aTColor.count() > 2 ? aTColor[2].toInt()/255. : 1.0 ) ); - } - else - aScalarBarLabelProp->SetColor( 1.0, 1.0, 1.0 ); - - aScalarBarLabelProp->SetFontFamilyToArial(); - if( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelFont" ) ){ - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Arial" ) - aScalarBarLabelProp->SetFontFamilyToArial(); - else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Courier" ) - aScalarBarLabelProp->SetFontFamilyToCourier(); - else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Times" ) - aScalarBarLabelProp->SetFontFamilyToTimes(); - } - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelBold" ) == "true" ) - aScalarBarLabelProp->BoldOn(); - else - aScalarBarLabelProp->BoldOff(); - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelItalic" ) == "true" ) - aScalarBarLabelProp->ItalicOn(); - else - aScalarBarLabelProp->ItalicOff(); - - if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelShadow" ) == "true" ) - aScalarBarLabelProp->ShadowOn(); - else - aScalarBarLabelProp->ShadowOff(); - - myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp ); - aScalarBarLabelProp->Delete(); - - if ( QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ) - myScalarBarActor->SetOrientationToHorizontal(); - else - myScalarBarActor->SetOrientationToVertical(); - - float aXVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.20 : 0.01; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarXPosition" ) ) - aXVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarXPosition" ).toFloat(); - float aYVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.01 : 0.1; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarYPosition" ) ) - aYVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarYPosition" ).toFloat(); - myScalarBarActor->SetPosition( aXVal, aYVal ); - - float aWVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.60 : 0.10; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarWidth" ) ) - aWVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarWidth" ).toFloat(); - myScalarBarActor->SetWidth( aWVal ); - - float aHVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.12 : 0.80; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarHeight" ) ) - aHVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarHeight" ).toFloat(); - myScalarBarActor->SetHeight( aHVal ); - - int anIntVal = 5; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfLabels" ) ) - anIntVal = QAD_CONFIG->getSetting("SMESH:ScalarBarNbOfLabels").toInt(); - myScalarBarActor->SetNumberOfLabels(anIntVal == 0? 5: anIntVal); - - anIntVal = 64; - if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfColors" ) ) - anIntVal = QAD_CONFIG->getSetting("SMESH:ScalarBarNbOfColors").toInt(); - myScalarBarActor->SetMaximumNumberOfColors(anIntVal == 0? 64: anIntVal); + //Fix for Bug 13314: + //Incorrect "Min value" in Scalar Bar in Mesh: + // myScalarBarActor->SetLabelFormat("%.4g"); + // changes was commented because of regression bug IPAL 19981 + mgr = SUIT_Session::session()->resourceMgr(); + if( !mgr ) + return; //Definition of points numbering pipeline //--------------------------------------- @@ -418,7 +343,7 @@ SMESH_Actor::SMESH_Actor(){ myPtsMaskPoints = vtkMaskPoints::New(); myPtsMaskPoints->SetInput(myPointsNumDataSet); myPtsMaskPoints->SetOnRatio(1); - + myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); myPtsSelectVisiblePoints->SelectInvisibleOff(); @@ -438,7 +363,9 @@ SMESH_Actor::SMESH_Actor(){ aPtsTextProp->SetShadow(0); myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); aPtsTextProp->Delete(); - + + myEntityMode = eAllEntity; + myIsPointsLabeled = false; myPointLabels = vtkActor2D::New(); @@ -491,8 +418,9 @@ SMESH_Actor::SMESH_Actor(){ } -SMESH_Actor::~SMESH_Actor(){ - if(MYDEBUG) MESSAGE("~SMESH_Actor"); +SMESH_ActorDef::~SMESH_ActorDef() +{ + if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<Delete(); myLookupTable->Delete(); @@ -505,7 +433,8 @@ SMESH_Actor::~SMESH_Actor(){ myPreselectProp->Delete(); myNodeProp->Delete(); - + myNodeExtProp->Delete(); + my1DProp->Delete(); my1DActor->Delete(); @@ -513,26 +442,31 @@ SMESH_Actor::~SMESH_Actor(){ my1DExtActor->Delete(); my2DActor->Delete(); + my2DExtProp->Delete(); + my2DExtActor->Delete(); my3DActor->Delete(); myNodeActor->Delete(); myBaseActor->Delete(); + myNodeExtActor->Delete(); + myHighlitableActor->Delete(); - myNodeHighlitableActor->Delete(); - //Deleting of pints numbering pipeline //--------------------------------------- myPointsNumDataSet->Delete(); - myPtsLabeledDataMapper->RemoveAllInputs(); + // commented: porting to vtk 5.0 + // myPtsLabeledDataMapper->RemoveAllInputs(); myPtsLabeledDataMapper->Delete(); - myPtsSelectVisiblePoints->UnRegisterAllOutputs(); + // commented: porting to vtk 5.0 + // myPtsSelectVisiblePoints->UnRegisterAllOutputs(); myPtsSelectVisiblePoints->Delete(); - myPtsMaskPoints->UnRegisterAllOutputs(); + // commented: porting to vtk 5.0 + // myPtsMaskPoints->UnRegisterAllOutputs(); myPtsMaskPoints->Delete(); myPointLabels->Delete(); @@ -545,13 +479,16 @@ SMESH_Actor::~SMESH_Actor(){ myClsLabeledDataMapper->RemoveAllInputs(); myClsLabeledDataMapper->Delete(); - myClsSelectVisiblePoints->UnRegisterAllOutputs(); + // commented: porting to vtk 5.0 + // myClsSelectVisiblePoints->UnRegisterAllOutputs(); myClsSelectVisiblePoints->Delete(); - myClsMaskPoints->UnRegisterAllOutputs(); + // commented: porting to vtk 5.0 + // myClsMaskPoints->UnRegisterAllOutputs(); myClsMaskPoints->Delete(); - myCellCenters->UnRegisterAllOutputs(); + // commented: porting to vtk 5.0 + // myCellCenters->UnRegisterAllOutputs(); myCellCenters->Delete(); myCellsLabels->Delete(); @@ -562,7 +499,7 @@ SMESH_Actor::~SMESH_Actor(){ } -void SMESH_Actor::SetPointsLabeled( bool theIsPointsLabeled ) +void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) { vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints(); @@ -597,7 +534,8 @@ void SMESH_Actor::SetPointsLabeled( bool theIsPointsLabeled ) } -void SMESH_Actor::SetCellsLabeled(bool theIsCellsLabeled){ +void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) +{ vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); if(myIsCellsLabeled){ @@ -620,9 +558,41 @@ void SMESH_Actor::SetCellsLabeled(bool theIsCellsLabeled){ } -void SMESH_Actor::SetControlMode(eControl theMode){ - myColorMode = eNone; - my1DColorMode = e1DNone; +void SMESH_ActorDef::SetFacesOriented(bool theIsFacesOriented) +{ + myIsFacesOriented = theIsFacesOriented; + + my2DActor->SetFacesOriented(theIsFacesOriented); + my3DActor->SetFacesOriented(theIsFacesOriented); + + myTimeStamp->Modified(); +} + +bool SMESH_ActorDef::GetFacesOriented() +{ + return myIsFacesOriented; +} + + +void +SMESH_ActorDef:: +SetControlMode(eControl theMode) +{ + SetControlMode(theMode,true); +} + + +void +SMESH_ActorDef:: +SetControlMode(eControl theMode, + bool theCheckEntityMode) +{ + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + if( !mgr ) + return; + + myControlMode = eNone; + theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); my1DActor->GetMapper()->SetScalarVisibility(false); my2DActor->GetMapper()->SetScalarVisibility(false); @@ -634,7 +604,7 @@ void SMESH_Actor::SetControlMode(eControl theMode){ if(anIsScalarVisible){ SMESH::Controls::FunctorPtr aFunctor; switch(theMode){ - case eLengthEdges: + case eLength: { SMESH::Controls::Length* aControl = new SMESH::Controls::Length(); aControl->SetPrecision( myControlsPrecision ); @@ -642,6 +612,12 @@ void SMESH_Actor::SetControlMode(eControl theMode){ myControlActor = my1DActor; break; } + case eLength2D: + { + aFunctor.reset(new SMESH::Controls::Length2D()); + myControlActor = my2DActor; + break; + } case eFreeBorders: aFunctor.reset(new SMESH::Controls::FreeBorders()); myControlActor = my1DActor; @@ -650,10 +626,22 @@ void SMESH_Actor::SetControlMode(eControl theMode){ aFunctor.reset(new SMESH::Controls::FreeEdges()); myControlActor = my2DActor; break; + case eFreeNodes: + aFunctor.reset(new SMESH::Controls::FreeNodes()); + myControlActor = myNodeActor; + break; + case eFreeFaces: + aFunctor.reset(new SMESH::Controls::FreeFaces()); + myControlActor = my2DActor; + break; case eMultiConnection: aFunctor.reset(new SMESH::Controls::MultiConnection()); myControlActor = my1DActor; break; + case eMultiConnection2D: + aFunctor.reset(new SMESH::Controls::MultiConnection2D()); + myControlActor = my2DActor; + break; case eArea: { SMESH::Controls::Area* aControl = new SMESH::Controls::Area(); @@ -678,6 +666,22 @@ void SMESH_Actor::SetControlMode(eControl theMode){ myControlActor = my2DActor; break; } + case eAspectRatio3D: + { + SMESH::Controls::AspectRatio3D* aControl = new SMESH::Controls::AspectRatio3D(); + aControl->SetPrecision( myControlsPrecision ); + aFunctor.reset( aControl ); + myControlActor = my3DActor; + break; + } + case eVolume3D: + { + SMESH::Controls::Volume* aControl = new SMESH::Controls::Volume(); + aControl->SetPrecision( myControlsPrecision ); + aFunctor.reset( aControl ); + myControlActor = my3DActor; + break; + } case eMinimumAngle: { SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle(); @@ -709,17 +713,50 @@ void SMESH_Actor::SetControlMode(eControl theMode){ vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); vtkIdType aNbCells = aGrid->GetNumberOfCells(); if(aNbCells){ - myColorMode = theMode; - if(theMode == eFreeBorders || theMode == eFreeEdges){ - my1DColorMode = e1DHighlited; - my1DExtActor->SetExtControlMode(aFunctor,myControlActor); - }else{ - if(myControlActor == my1DActor) - my1DColorMode = e1DColored; + myControlMode = theMode; + switch(myControlMode){ + case eFreeNodes: + myNodeExtActor->SetExtControlMode(aFunctor); + break; + case eFreeEdges: + case eFreeBorders: + my1DExtActor->SetExtControlMode(aFunctor); + break; + case eFreeFaces: + my2DExtActor->SetExtControlMode(aFunctor); + break; + case eLength2D: + case eMultiConnection2D: + my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable); + break; + default: myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable); } } + + if(theCheckEntityMode){ + if(myControlActor == my1DActor) + SetEntityMode(eEdges); + else if(myControlActor == my2DActor){ + switch(myControlMode){ + case eLength2D: + case eFreeEdges: + case eFreeFaces: + case eMultiConnection2D: + //SetEntityMode(eEdges); + SetEntityMode(eFaces); + break; + default: + SetEntityMode(eFaces); + } + }else if(myControlActor == my3DActor) + SetEntityMode(eVolumes); + } + + }else if(theCheckEntityMode){ + myEntityMode = eAllEntity; } + SetRepresentation(GetRepresentation()); myTimeStamp->Modified(); @@ -727,21 +764,23 @@ void SMESH_Actor::SetControlMode(eControl theMode){ } -void SMESH_Actor::AddToRender(vtkRenderer* theRenderer){ +void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ SALOME_Actor::AddToRender(theRenderer); theRenderer->AddActor(myNodeActor); theRenderer->AddActor(myBaseActor); + + theRenderer->AddActor(myNodeExtActor); - theRenderer->AddActor(my3DActor); - theRenderer->AddActor(my2DActor); + my3DActor->AddToRender(theRenderer); + my2DActor->AddToRender(theRenderer); + my2DExtActor->AddToRender(theRenderer); theRenderer->AddActor(my1DActor); theRenderer->AddActor(my1DExtActor); theRenderer->AddActor(myHighlitableActor); - theRenderer->AddActor(myNodeHighlitableActor); - + theRenderer->AddActor2D(myScalarBarActor); myPtsSelectVisiblePoints->SetRenderer(theRenderer); @@ -751,20 +790,22 @@ void SMESH_Actor::AddToRender(vtkRenderer* theRenderer){ theRenderer->AddActor2D(myCellsLabels); } -void SMESH_Actor::RemoveFromRender(vtkRenderer* theRenderer){ +void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ SALOME_Actor::RemoveFromRender(theRenderer); theRenderer->RemoveActor(myNodeActor); theRenderer->RemoveActor(myBaseActor); + theRenderer->RemoveActor(myNodeExtActor); + theRenderer->RemoveActor(myHighlitableActor); - theRenderer->RemoveActor(myNodeHighlitableActor); theRenderer->RemoveActor(my1DActor); theRenderer->RemoveActor(my1DExtActor); - theRenderer->RemoveActor(my2DActor); - theRenderer->RemoveActor(my3DActor); + my2DActor->RemoveFromRender(theRenderer); + my2DExtActor->RemoveFromRender(theRenderer); + my3DActor->RemoveFromRender(theRenderer); theRenderer->RemoveActor(myScalarBarActor); theRenderer->RemoveActor(myPointLabels); @@ -772,65 +813,65 @@ void SMESH_Actor::RemoveFromRender(vtkRenderer* theRenderer){ } -bool SMESH_Actor::Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) +bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, + const char* theEntry, + const char* theName, + int theIsClear) { Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName); setIO(anIO); setName(theName); myVisualObj = theVisualObj; - myNodeActor->myVisualObj = myVisualObj; - myBaseActor->myVisualObj = myVisualObj; - - myHighlitableActor->myVisualObj = myVisualObj; - myNodeHighlitableActor->myVisualObj = myVisualObj; - - my1DActor->myVisualObj = myVisualObj; - my1DExtActor->myVisualObj = myVisualObj; - - my2DActor->myVisualObj = myVisualObj; - my3DActor->myVisualObj = myVisualObj; - myVisualObj->Update(theIsClear); myNodeActor->Init(myVisualObj,myImplicitBoolean); myBaseActor->Init(myVisualObj,myImplicitBoolean); - + myHighlitableActor->Init(myVisualObj,myImplicitBoolean); - myNodeHighlitableActor->Init(myVisualObj,myImplicitBoolean); + + myNodeExtActor->Init(myVisualObj,myImplicitBoolean); my1DActor->Init(myVisualObj,myImplicitBoolean); my1DExtActor->Init(myVisualObj,myImplicitBoolean); my2DActor->Init(myVisualObj,myImplicitBoolean); + my2DExtActor->Init(myVisualObj,myImplicitBoolean); my3DActor->Init(myVisualObj,myImplicitBoolean); my1DActor->GetMapper()->SetLookupTable(myLookupTable); + my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); + my2DActor->GetMapper()->SetLookupTable(myLookupTable); + my2DExtActor->GetMapper()->SetLookupTable(myLookupTable); my3DActor->GetMapper()->SetLookupTable(myLookupTable); - float aFactor, aUnits; + vtkFloatingPointType aFactor, aUnits; my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); + my2DExtActor->SetPolygonOffsetParameters(aFactor,aUnits*0.5); + + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + if( !mgr ) + return false; //SetIsShrunkable(theGrid->GetNumberOfCells() > 10); SetIsShrunkable(true); - - QString aMode = QAD_CONFIG->getSetting("SMESH:DisplayMode"); + + SetShrinkFactor( SMESH::GetFloat( "SMESH:shrink_coeff", 75 ) / 100. ); + + int aMode = mgr->integerValue( "SMESH", "display_mode" ); SetRepresentation(-1); - if(aMode.compare("Wireframe") == 0){ + + if(aMode == 0){ SetRepresentation(eEdge); - }else if(aMode.compare("Shading") == 0){ + }else if(aMode == 1){ SetRepresentation(eSurface); - }else if(aMode.compare("Nodes") == 0){ + }else if(aMode == 2){ SetRepresentation(ePoint); } - - aMode = QAD_CONFIG->getSetting("SMESH:Shrink"); - if(aMode == "yes"){ + + if(aMode == 3){ SetShrink(); } @@ -840,54 +881,58 @@ bool SMESH_Actor::Init(TVisualObjPtr theVisualObj, } -float* SMESH_Actor::GetBounds(){ +vtkFloatingPointType* SMESH_ActorDef::GetBounds(){ return myNodeActor->GetBounds(); } -vtkDataSet* SMESH_Actor::GetInput(){ +vtkDataSet* SMESH_ActorDef::GetInput(){ return GetUnstructuredGrid(); } -void SMESH_Actor::SetTransform(SALOME_Transform* theTransform){ +void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ + Superclass::SetTransform(theTransform); + myNodeActor->SetTransform(theTransform); myBaseActor->SetTransform(theTransform); - + myHighlitableActor->SetTransform(theTransform); - myNodeHighlitableActor->SetTransform(theTransform); + + myNodeExtActor->SetTransform(theTransform); my1DActor->SetTransform(theTransform); my1DExtActor->SetTransform(theTransform); my2DActor->SetTransform(theTransform); + my2DExtActor->SetTransform(theTransform); my3DActor->SetTransform(theTransform); Modified(); } -void SMESH_Actor::SetMapper(vtkMapper* theMapper){ +void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){ vtkLODActor::SetMapper(theMapper); } -void SMESH_Actor::ShallowCopy(vtkProp *prop){ +void SMESH_ActorDef::ShallowCopy(vtkProp *prop){ SALOME_Actor::ShallowCopy(prop); } -vtkMapper* SMESH_Actor::GetMapper(){ +vtkMapper* SMESH_ActorDef::GetMapper(){ return myPickableActor->GetMapper(); } -vtkUnstructuredGrid* SMESH_Actor::GetUnstructuredGrid(){ +vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ return myVisualObj->GetUnstructuredGrid(); } -bool SMESH_Actor::IsInfinitive(){ +bool SMESH_ActorDef::IsInfinitive(){ vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); aDataSet->Update(); myIsInfinite = aDataSet->GetNumberOfCells() == 0 || @@ -897,28 +942,31 @@ bool SMESH_Actor::IsInfinitive(){ } -void SMESH_Actor::SetIsShrunkable(bool theShrunkable){ +void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){ + if ( myIsShrinkable == theShrunkable ) + return; myIsShrinkable = theShrunkable; Modified(); } -float SMESH_Actor::GetShrinkFactor(){ +vtkFloatingPointType SMESH_ActorDef::GetShrinkFactor(){ return myBaseActor->GetShrinkFactor(); } -void SMESH_Actor::SetShrinkFactor(float theValue){ +void SMESH_ActorDef::SetShrinkFactor(vtkFloatingPointType theValue){ myBaseActor->SetShrinkFactor(theValue); my1DActor->SetShrinkFactor(theValue); my1DExtActor->SetShrinkFactor(theValue); my2DActor->SetShrinkFactor(theValue); + my2DExtActor->SetShrinkFactor(theValue); my3DActor->SetShrinkFactor(theValue); Modified(); } -void SMESH_Actor::SetShrink(){ +void SMESH_ActorDef::SetShrink(){ if(!myIsShrinkable) return; myBaseActor->SetShrink(); @@ -927,13 +975,14 @@ void SMESH_Actor::SetShrink(){ my1DExtActor->SetShrink(); my2DActor->SetShrink(); + my2DExtActor->SetShrink(); my3DActor->SetShrink(); myIsShrunk = true; Modified(); } -void SMESH_Actor::UnShrink(){ +void SMESH_ActorDef::UnShrink(){ if(!myIsShrunk) return; myBaseActor->UnShrink(); @@ -942,6 +991,7 @@ void SMESH_Actor::UnShrink(){ my1DExtActor->UnShrink(); my2DActor->UnShrink(); + my2DExtActor->UnShrink(); my3DActor->UnShrink(); myIsShrunk = false; @@ -949,74 +999,177 @@ void SMESH_Actor::UnShrink(){ } -int SMESH_Actor::GetNodeObjId(int theVtkID){ +int SMESH_ActorDef::GetNodeObjId(int theVtkID){ return myPickableActor->GetNodeObjId(theVtkID); } -float* SMESH_Actor::GetNodeCoord(int theObjID){ +vtkFloatingPointType* SMESH_ActorDef::GetNodeCoord(int theObjID){ return myPickableActor->GetNodeCoord(theObjID); } -int SMESH_Actor::GetElemObjId(int theVtkID){ +int SMESH_ActorDef::GetElemObjId(int theVtkID){ return myPickableActor->GetElemObjId(theVtkID); } -vtkCell* SMESH_Actor::GetElemCell(int theObjID){ +vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){ return myPickableActor->GetElemCell(theObjID); } -void SMESH_Actor::SetVisibility(int theMode){ +void SMESH_ActorDef::SetVisibility(int theMode){ SetVisibility(theMode,true); } -void SMESH_Actor::SetVisibility(int theMode, bool theIsUpdateRepersentation){ +void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ SALOME_Actor::SetVisibility(theMode); + + myNodeActor->VisibilityOff(); + myBaseActor->VisibilityOff(); + + myNodeExtActor->VisibilityOff(); + + my1DActor->VisibilityOff(); + my1DExtActor->VisibilityOff(); + + my2DActor->VisibilityOff(); + my2DExtActor->VisibilityOff(); + my3DActor->VisibilityOff(); + + myScalarBarActor->VisibilityOff(); + myPointLabels->VisibilityOff(); + myCellsLabels->VisibilityOff(); + if(GetVisibility()){ if(theIsUpdateRepersentation) SetRepresentation(GetRepresentation()); - - if(myColorMode != eNone){ - if(my1DColorMode == e1DHighlited) + + if(myControlMode != eNone){ + switch(myControlMode){ + case eFreeNodes: + myNodeExtActor->VisibilityOn(); + break; + case eFreeEdges: + case eFreeBorders: + my1DExtActor->VisibilityOn(); + break; + case eFreeFaces: + my2DExtActor->VisibilityOn(); + break; + case eLength2D: + case eMultiConnection2D: my1DExtActor->VisibilityOn(); - else if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) - myScalarBarActor->VisibilityOn(); + default: + if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) + myScalarBarActor->VisibilityOn(); + } } if(myRepresentation != ePoint) myPickableActor->VisibilityOn(); + else { + myNodeActor->VisibilityOn(); + } - my1DActor->VisibilityOn(); + if(myEntityMode & eEdges){ + my1DActor->VisibilityOn(); + } + + if(myEntityMode & eFaces){ + my2DActor->VisibilityOn(); + } + + if(myEntityMode & eVolumes){ + my3DActor->VisibilityOn(); + } + + if(myIsPointsLabeled){ + myPointLabels->VisibilityOn(); + myNodeActor->VisibilityOn(); + } - my2DActor->VisibilityOn(); - my3DActor->VisibilityOn(); + if(myIsCellsLabeled) + myCellsLabels->VisibilityOn(); + } + UpdateHighlight(); + Modified(); +} - if(myIsPointsLabeled) myPointLabels->VisibilityOn(); - if(myIsCellsLabeled) myCellsLabels->VisibilityOn(); - }else{ - myNodeActor->VisibilityOff(); - myBaseActor->VisibilityOff(); - my1DActor->VisibilityOff(); - my1DExtActor->VisibilityOff(); +void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ + myEntityState = eAllEntity; - my2DActor->VisibilityOff(); - my3DActor->VisibilityOff(); + if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){ + myEntityState &= ~eEdges; + theMode &= ~eEdges; + } - myScalarBarActor->VisibilityOff(); - myPointLabels->VisibilityOff(); - myCellsLabels->VisibilityOff(); + if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){ + myEntityState &= ~eFaces; + theMode &= ~eFaces; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){ + myEntityState &= ~eVolumes; + theMode &= ~eVolumes; + } + + if(!theMode){ + if(myVisualObj->GetNbEntities(SMDSAbs_Edge)) + theMode |= eEdges; + + if(myVisualObj->GetNbEntities(SMDSAbs_Face)) + theMode |= eFaces; + + if(myVisualObj->GetNbEntities(SMDSAbs_Volume)) + theMode |= eVolumes; } - Modified(); -} + myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState); -void SMESH_Actor::SetRepresentation(int theMode){ - int aNbEdges = myVisualObj->GetNbEntities(SMESH::EDGE); - int aNbFaces = myVisualObj->GetNbEntities(SMESH::FACE); - int aNbVolumes = myVisualObj->GetNbEntities(SMESH::VOLUME); + myEntityMode = theMode; + VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; + aFilter = myBaseActor->GetExtractUnstructuredGrid(); + aFilter->ClearRegisteredCellsWithType(); + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + + if(myEntityMode & eEdges){ + if (MYDEBUG) MESSAGE("EDGES"); + aFilter->RegisterCellsWithType(VTK_LINE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); + } + + if(myEntityMode & eFaces){ + if (MYDEBUG) MESSAGE("FACES"); + aFilter->RegisterCellsWithType(VTK_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_POLYGON); + aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + } + + if(myEntityMode & eVolumes){ + if (MYDEBUG) MESSAGE("VOLUMES"); + aFilter->RegisterCellsWithType(VTK_TETRA); + aFilter->RegisterCellsWithType(VTK_VOXEL); + aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_WEDGE); + aFilter->RegisterCellsWithType(VTK_PYRAMID); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); + } + aFilter->Update(); + if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells()); + SetVisibility(GetVisibility(),false); +} + +void SMESH_ActorDef::SetRepresentation(int theMode){ + int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); + int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); + int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); if(theMode < 0){ myRepresentation = eSurface; if(!aNbFaces && !aNbVolumes && aNbEdges){ @@ -1050,13 +1203,14 @@ void SMESH_Actor::SetRepresentation(int theMode){ myPickableActor = myBaseActor; myNodeActor->SetVisibility(false); + myNodeExtActor->SetVisibility(false); vtkProperty *aProp = NULL, *aBackProp = NULL; SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); switch(myRepresentation){ - case ePoint: + case ePoint: myPickableActor = myNodeActor; myNodeActor->SetVisibility(true); - + aProp = aBackProp = myNodeProp; aReperesent = SMESH_DeviceActor::ePoint; break; @@ -1074,21 +1228,23 @@ void SMESH_Actor::SetRepresentation(int theMode){ my2DActor->SetProperty(aProp); my2DActor->SetBackfaceProperty(aBackProp); my2DActor->SetRepresentation(aReperesent); + + my2DExtActor->SetRepresentation(aReperesent); my3DActor->SetProperty(aProp); my3DActor->SetBackfaceProperty(aBackProp); my3DActor->SetRepresentation(aReperesent); my1DExtActor->SetVisibility(false); - switch(my1DColorMode){ - case e1DColored: + my2DExtActor->SetVisibility(false); + + switch(myControlMode){ + case eLength: + case eMultiConnection: aProp = aBackProp = my1DProp; if(myRepresentation != ePoint) aReperesent = SMESH_DeviceActor::eInsideframe; break; - case e1DHighlited: - my1DExtActor->SetVisibility(true); - break; } my1DActor->SetProperty(aProp); @@ -1099,7 +1255,6 @@ void SMESH_Actor::SetRepresentation(int theMode){ if(myIsPointsVisible) myPickableActor = myNodeActor; - if(GetPointRepresentation()) myNodeActor->SetVisibility(true); @@ -1111,60 +1266,66 @@ void SMESH_Actor::SetRepresentation(int theMode){ } -void SMESH_Actor::SetPointRepresentation(bool theIsPointsVisible){ +void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ + if ( myIsPointsVisible == theIsPointsVisible ) + return; myIsPointsVisible = theIsPointsVisible; SetRepresentation(GetRepresentation()); } -bool SMESH_Actor::GetPointRepresentation(){ +bool SMESH_ActorDef::GetPointRepresentation(){ return myIsPointsVisible || myIsPointsLabeled; } -void SMESH_Actor::UpdateHighlight(){ +void SMESH_ActorDef::UpdateHighlight(){ myHighlitableActor->SetVisibility(false); myHighlitableActor->SetHighlited(false); - myNodeHighlitableActor->SetVisibility(false); - myNodeHighlitableActor->SetHighlited(false); - if(myIsHighlighted){ myHighlitableActor->SetProperty(myHighlightProp); }else if(myIsPreselected){ myHighlitableActor->SetProperty(myPreselectProp); } - bool isVisible = GetVisibility(); + bool anIsVisible = GetVisibility(); if(myIsHighlighted || myIsPreselected){ if(GetUnstructuredGrid()->GetNumberOfCells()){ + myHighlitableActor->SetHighlited(anIsVisible); + myHighlitableActor->SetVisibility(anIsVisible); + myHighlitableActor->GetExtractUnstructuredGrid()-> + SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells); myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - myHighlitableActor->SetVisibility(isVisible); - myHighlitableActor->SetHighlited(isVisible); - } - if(myRepresentation == ePoint || GetPointRepresentation()){ - myNodeHighlitableActor->SetProperty(myHighlitableActor->GetProperty()); - myNodeHighlitableActor->SetVisibility(isVisible); - myNodeHighlitableActor->SetHighlited(isVisible); + }else if(myRepresentation == ePoint || GetPointRepresentation()){ + myHighlitableActor->SetHighlited(anIsVisible); + myHighlitableActor->GetExtractUnstructuredGrid()-> + SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + myHighlitableActor->SetVisibility(anIsVisible); + myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint); } } } -void SMESH_Actor::highlight(bool theHighlight){ +void SMESH_ActorDef::highlight(bool theHighlight){ + if ( myIsHighlighted == theHighlight ) + return; myIsHighlighted = theHighlight; UpdateHighlight(); } -void SMESH_Actor::SetPreSelected(bool thePreselect){ +void SMESH_ActorDef::SetPreSelected(bool thePreselect){ + if ( myIsPreselected == thePreselect ) + return; myIsPreselected = thePreselect; UpdateHighlight(); } // From vtkFollower -int SMESH_Actor::RenderOpaqueGeometry(vtkViewport *vp) +int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp) { if (myPickableActor->GetIsOpaque()) { @@ -1176,7 +1337,7 @@ int SMESH_Actor::RenderOpaqueGeometry(vtkViewport *vp) } -int SMESH_Actor::RenderTranslucentGeometry(vtkViewport *vp) +int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp) { if (!myPickableActor->GetIsOpaque()) { @@ -1188,57 +1349,57 @@ int SMESH_Actor::RenderTranslucentGeometry(vtkViewport *vp) } -void SMESH_Actor::Render(vtkRenderer *ren){ - unsigned long mTime = myTimeStamp->GetMTime(); +void SMESH_ActorDef::Render(vtkRenderer *ren){ + unsigned long aTime = myTimeStamp->GetMTime(); unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - if(anObjTime > mTime) + unsigned long aClippingTime = myImplicitBoolean->GetMTime(); + if(anObjTime > aTime || aClippingTime > aTime) Update(); } -void SMESH_Actor::Update(){ - SetVisibility(GetVisibility()); - unsigned long int anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - unsigned long int aClippingTime = myImplicitBoolean->GetMTime(); - unsigned long int aTime = myTimeStamp->GetMTime(); - if(MYDEBUG) MESSAGE("SMESH_Actor::Update"); +void SMESH_ActorDef::Update(){ + if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update"); if(GetControlMode() != eNone) { - if(anObjTime > aTime || aClippingTime > aTime){ - SetControlMode(GetControlMode()); - SetVisibility(GetVisibility()); - } + unsigned long aTime = myTimeStamp->GetMTime(); + unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); + if (anObjTime > aTime) + SetControlMode(GetControlMode(),false); } if(myIsPointsLabeled){ - if(anObjTime > aTime || aClippingTime > aTime) - SetPointsLabeled(myIsPointsLabeled); + SetPointsLabeled(myIsPointsLabeled); } if(myIsCellsLabeled){ - if(anObjTime > aTime || aClippingTime > aTime) - SetCellsLabeled(myIsCellsLabeled); + SetCellsLabeled(myIsCellsLabeled); } - + if(myIsFacesOriented){ + SetFacesOriented(myIsFacesOriented); + } + SetEntityMode(GetEntityMode()); + SetVisibility(GetVisibility()); + myTimeStamp->Modified(); Modified(); } -void SMESH_Actor::ReleaseGraphicsResources(vtkWindow *renWin){ +void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){ SALOME_Actor::ReleaseGraphicsResources(renWin); myPickableActor->ReleaseGraphicsResources(renWin); } -static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){ - float* aColor = theProperty->GetColor(); +static void GetColor(vtkProperty *theProperty, vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ + vtkFloatingPointType* aColor = theProperty->GetColor(); r = aColor[0]; g = aColor[1]; b = aColor[2]; } -void SMESH_Actor::SetOpacity(float theValue){ +void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){ mySurfaceProp->SetOpacity(theValue); myBackSurfaceProp->SetOpacity(theValue); myEdgeProp->SetOpacity(theValue); @@ -1248,74 +1409,76 @@ void SMESH_Actor::SetOpacity(float theValue){ } -float SMESH_Actor::GetOpacity(){ +vtkFloatingPointType SMESH_ActorDef::GetOpacity(){ return mySurfaceProp->GetOpacity(); } -void SMESH_Actor::SetSufaceColor(float r,float g,float b){ +void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ mySurfaceProp->SetColor(r,g,b); Modified(); } -void SMESH_Actor::GetSufaceColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(mySurfaceProp,r,g,b); + my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b); } -void SMESH_Actor::SetBackSufaceColor(float r,float g,float b){ +void SMESH_ActorDef::SetBackSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myBackSurfaceProp->SetColor(r,g,b); Modified(); } -void SMESH_Actor::GetBackSufaceColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetBackSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myBackSurfaceProp,r,g,b); } -void SMESH_Actor::SetEdgeColor(float r,float g,float b){ +void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myEdgeProp->SetColor(r,g,b); my1DProp->SetColor(r,g,b); my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b); Modified(); } -void SMESH_Actor::GetEdgeColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myEdgeProp,r,g,b); } -void SMESH_Actor::SetNodeColor(float r,float g,float b){ +void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myNodeProp->SetColor(r,g,b); + myNodeExtProp->SetColor(1.0-r,1.0-g,1.0-b); Modified(); } -void SMESH_Actor::GetNodeColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetNodeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myNodeProp,r,g,b); } -void SMESH_Actor::SetHighlightColor(float r,float g,float b){ +void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myHighlightProp->SetColor(r,g,b); Modified(); } -void SMESH_Actor::GetHighlightColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myHighlightProp,r,g,b); } -void SMESH_Actor::SetPreHighlightColor(float r,float g,float b){ +void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ myPreselectProp->SetColor(r,g,b); Modified(); } -void SMESH_Actor::GetPreHighlightColor(float& r,float& g,float& b){ +void SMESH_ActorDef::GetPreHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ ::GetColor(myPreselectProp,r,g,b); } -float SMESH_Actor::GetLineWidth(){ +vtkFloatingPointType SMESH_ActorDef::GetLineWidth(){ return myEdgeProp->GetLineWidth(); } -void SMESH_Actor::SetLineWidth(float theVal){ +void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){ myEdgeProp->SetLineWidth(theVal); my1DProp->SetLineWidth(theVal + aLineWidthInc); @@ -1325,8 +1488,9 @@ void SMESH_Actor::SetLineWidth(float theVal){ } -void SMESH_Actor::SetNodeSize(float theVal){ +void SMESH_ActorDef::SetNodeSize(vtkFloatingPointType theVal){ myNodeProp->SetPointSize(theVal); + myNodeExtProp->SetPointSize(theVal); myHighlightProp->SetPointSize(theVal); myPreselectProp->SetPointSize(theVal); @@ -1336,37 +1500,97 @@ void SMESH_Actor::SetNodeSize(float theVal){ Modified(); } -float SMESH_Actor::GetNodeSize(){ +vtkFloatingPointType SMESH_ActorDef::GetNodeSize(){ return myNodeProp->GetPointSize(); } -int SMESH_Actor::GetObjDimension( const int theObjId ) +int SMESH_ActorDef::GetObjDimension( const int theObjId ) { return myVisualObj->GetElemDimension( theObjId ); } +bool +SMESH_ActorDef:: +IsImplicitFunctionUsed() const +{ + return myBaseActor->IsImplicitFunctionUsed(); +} + +void +SMESH_ActorDef:: +SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) +{ + myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + + myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + + myNodeExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + + my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + + my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + my2DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); + my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); +} + +vtkIdType +SMESH_ActorDef:: +AddClippingPlane(vtkPlane* thePlane) +{ + if(thePlane){ + myImplicitBoolean->GetFunction()->AddItem(thePlane); + myCippingPlaneCont.push_back(thePlane); + if(!IsImplicitFunctionUsed()) + SetImplicitFunctionUsed(true); + } + return myCippingPlaneCont.size(); +} + +void +SMESH_ActorDef:: +RemoveAllClippingPlanes() +{ + myImplicitBoolean->GetFunction()->RemoveAllItems(); + myImplicitBoolean->GetFunction()->Modified(); // VTK bug + myCippingPlaneCont.clear(); + SetImplicitFunctionUsed(false); +} -vtkImplicitBoolean* SMESH_Actor::GetPlaneContainer(){ - return myImplicitBoolean; +vtkIdType +SMESH_ActorDef:: +GetNumberOfClippingPlanes() +{ + return myCippingPlaneCont.size(); +} + +vtkPlane* +SMESH_ActorDef:: +GetClippingPlane(vtkIdType theID) +{ + if(theID >= myCippingPlaneCont.size()) + return NULL; + return myCippingPlaneCont[theID].Get(); } static void ComputeBoundsParam(vtkDataSet* theDataSet, - float theDirection[3], float theMinPnt[3], - float& theMaxBoundPrj, float& theMinBoundPrj) + vtkFloatingPointType theDirection[3], vtkFloatingPointType theMinPnt[3], + vtkFloatingPointType& theMaxBoundPrj, vtkFloatingPointType& theMinBoundPrj) { - float aBounds[6]; + vtkFloatingPointType aBounds[6]; theDataSet->GetBounds(aBounds); //Enlarge bounds in order to avoid conflicts of precision for(int i = 0; i < 6; i += 2){ static double EPS = 1.0E-3; - float aDelta = (aBounds[i+1] - aBounds[i])*EPS; + vtkFloatingPointType aDelta = (aBounds[i+1] - aBounds[i])*EPS; aBounds[i] -= aDelta; aBounds[i+1] += aDelta; } - float aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]}, + vtkFloatingPointType aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]}, {aBounds[1],aBounds[2],aBounds[4]}, {aBounds[0],aBounds[3],aBounds[4]}, {aBounds[1],aBounds[3],aBounds[4]}, @@ -1379,7 +1603,7 @@ static void ComputeBoundsParam(vtkDataSet* theDataSet, theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); theMinBoundPrj = theMaxBoundPrj; for(int i = 1; i < 8; i++){ - float aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); + vtkFloatingPointType aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); if(theMaxBoundPrj < aTmp){ theMaxBoundPrj = aTmp; aMaxId = i; @@ -1389,7 +1613,7 @@ static void ComputeBoundsParam(vtkDataSet* theDataSet, aMinId = i; } } - float *aMinPnt = aBoundPoints[aMaxId]; + vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; theMinPnt[0] = aMinPnt[0]; theMinPnt[1] = aMinPnt[1]; theMinPnt[2] = aMinPnt[2]; @@ -1397,11 +1621,11 @@ static void ComputeBoundsParam(vtkDataSet* theDataSet, static void DistanceToPosition(vtkDataSet* theDataSet, - float theDirection[3], float theDist, float thePos[3]) + vtkFloatingPointType theDirection[3], vtkFloatingPointType theDist, vtkFloatingPointType thePos[3]) { - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist; + vtkFloatingPointType 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; @@ -1409,30 +1633,145 @@ static void DistanceToPosition(vtkDataSet* theDataSet, static void PositionToDistance(vtkDataSet* theDataSet, - float theDirection[3], float thePos[3], float& theDist) + vtkFloatingPointType theDirection[3], vtkFloatingPointType thePos[3], vtkFloatingPointType& theDist) { - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aPrj = vtkMath::Dot(theDirection,thePos); + vtkFloatingPointType aPrj = vtkMath::Dot(theDirection,thePos); theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); } -void SMESH_Actor::SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) +void SMESH_ActorDef::SetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType theDist, vtkPlane* thePlane) { thePlane->SetNormal(theDir); - float anOrigin[3]; + vtkFloatingPointType anOrigin[3]; ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin); thePlane->SetOrigin(anOrigin); - Update(); } -void SMESH_Actor::GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) +void SMESH_ActorDef::GetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType& theDist, vtkPlane* thePlane) { thePlane->GetNormal(theDir); - float anOrigin[3]; + vtkFloatingPointType anOrigin[3]; thePlane->GetOrigin(anOrigin); ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist); } + +void SMESH_ActorDef::UpdateScalarBar() +{ + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + if( !mgr ) + return; + + vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New(); + + QColor aTColor = mgr->colorValue( "SMESH", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); + aScalarBarTitleProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); + + aScalarBarTitleProp->SetFontFamilyToArial(); + + if ( mgr->hasValue( "SMESH", "scalar_bar_title_font" ) ) + { + QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" ); + if ( f.family() == "Arial" ) + aScalarBarTitleProp->SetFontFamilyToArial(); + else if ( f.family() == "Courier" ) + aScalarBarTitleProp->SetFontFamilyToCourier(); + else if ( f.family() == "Times" ) + aScalarBarTitleProp->SetFontFamilyToTimes(); + + if ( f.bold() ) + aScalarBarTitleProp->BoldOn(); + else + aScalarBarTitleProp->BoldOff(); + + if ( f.italic() ) + aScalarBarTitleProp->ItalicOn(); + else + aScalarBarTitleProp->ItalicOff(); + + if ( f.overline() ) + aScalarBarTitleProp->ShadowOn(); + else + aScalarBarTitleProp->ShadowOff(); + } + + myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp ); + aScalarBarTitleProp->Delete(); + + vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New(); + + aTColor = mgr->colorValue( "SMESH", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); + aScalarBarLabelProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); + + aScalarBarLabelProp->SetFontFamilyToArial(); + if( mgr->hasValue( "SMESH", "scalar_bar_label_font" ) ) + { + QFont f = mgr->fontValue( "SMESH", "scalar_bar_label_font" ); + if( f.family() == "Arial" ) + aScalarBarLabelProp->SetFontFamilyToArial(); + else if( f.family() == "Courier" ) + aScalarBarLabelProp->SetFontFamilyToCourier(); + else if( f.family() == "Times" ) + aScalarBarLabelProp->SetFontFamilyToTimes(); + + if ( f.bold() ) + aScalarBarLabelProp->BoldOn(); + else + aScalarBarLabelProp->BoldOff(); + + if ( f.italic() ) + aScalarBarLabelProp->ItalicOn(); + else + aScalarBarLabelProp->ItalicOff(); + + if( f.overline() ) + aScalarBarLabelProp->ShadowOn(); + else + aScalarBarLabelProp->ShadowOff(); + } + + myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp ); + aScalarBarLabelProp->Delete(); + + bool horiz = ( mgr->integerValue( "SMESH", "scalar_bar_orientation" ) == 1 ); + QString name = QString( "scalar_bar_%1_" ).arg( horiz ? "horizontal" : "vertical" ); + if( horiz ) + myScalarBarActor->SetOrientationToHorizontal(); + else + myScalarBarActor->SetOrientationToVertical(); + + + vtkFloatingPointType aXVal = horiz ? 0.20 : 0.01; + if( mgr->hasValue( "SMESH", name + "x" ) ) + aXVal = mgr->doubleValue( "SMESH", name + "x", aXVal ); + + vtkFloatingPointType aYVal = horiz ? 0.01 : 0.1; + if( mgr->hasValue( "SMESH", name + "y" ) ) + aYVal = mgr->doubleValue( "SMESH", name + "y", aYVal ); + myScalarBarActor->SetPosition( aXVal, aYVal ); + + vtkFloatingPointType aWVal = horiz ? 0.60 : 0.10; + if( mgr->hasValue( "SMESH", name + "width" ) ) + aWVal = mgr->doubleValue( "SMESH", name + "width", aWVal ); + myScalarBarActor->SetWidth( aWVal ); + + vtkFloatingPointType aHVal = horiz ? 0.12 : 0.80; + if( mgr->hasValue( "SMESH", name + "height" ) ) + aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal ); + myScalarBarActor->SetHeight( aHVal ); + + int anIntVal = 5; + if( mgr->hasValue( "SMESH", "scalar_bar_num_labels" ) ) + anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_labels", anIntVal ); + myScalarBarActor->SetNumberOfLabels( anIntVal == 0 ? 5: anIntVal ); + + anIntVal = 64; + if( mgr->hasValue( "SMESH", "scalar_bar_num_colors" ) ) + anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_colors", anIntVal ); + myScalarBarActor->SetMaximumNumberOfColors( anIntVal == 0 ? 64 : anIntVal ); + +}