X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Actor.cxx;h=48ad71c59cebebd0e143981c170ac47fb84ebb44;hp=1463f03fe5d96aebeeddd5550a01377c3a6db7cb;hb=30ce546b0c5099ad1112929e2db94810e683e54b;hpb=f5016d85b7b4b88623723027a1585c6414c4dc66 diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 1463f03fe..48ad71c59 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -6,7 +6,7 @@ // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -24,25 +24,25 @@ // File : SMESH_Actor.cxx // Author : Nicolas REJNERI // Module : SMESH -// + #include "SMESH_ActorDef.h" + +#include "SMDS_UnstructuredGrid.hxx" #include "SMESH_ActorUtils.h" +#include "SMESH_CellLabelActor.h" +#include "SMESH_ControlsDef.hxx" #include "SMESH_DeviceActor.h" #include "SMESH_NodeLabelActor.h" -#include "SMESH_CellLabelActor.h" #include "SMESH_ObjectDef.h" -#include "SMESH_ControlsDef.hxx" -#include "SMDS_UnstructuredGrid.hxx" -#include "SMESH_ScalarBarActor.h" -#include "VTKViewer_ExtractUnstructuredGrid.h" -#include "VTKViewer_FramedTextActor.h" -#include "SALOME_InteractiveObject.hxx" #include "SMESH_SVTKActor.h" - -#include "SUIT_Session.h" -#include "SUIT_ResourceMgr.h" +#include "SMESH_ScalarBarActor.h" #include +#include +#include +#include +#include +#include #ifndef DISABLE_PLOT2DVIEWER #include @@ -75,20 +75,16 @@ #include #include +#include #include #include -#include -#if !defined(VTK_XVERSION) -#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION) -#endif - #include "utilities.h" #ifdef _DEBUG_ -static int MYDEBUG = 1; +static int MYDEBUG = 0; #else -static int MYDEBUG = 1; +static int MYDEBUG = 0; #endif static int aLineWidthInc = 2; @@ -99,8 +95,8 @@ SMESH_ActorDef* SMESH_ActorDef::New(){ } -SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, - const char* theEntry, +SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, + const char* theEntry, const char* theName, int theIsClear) { @@ -120,18 +116,24 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, SMESH_ActorDef::SMESH_ActorDef() { - if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<Delete(); // vtkSmartPointer! myHighlightActor->Initialize(); myPreHighlightActor = SMESH_SVTKActor::New(); + myPreHighlightActor->Delete(); myPreHighlightActor->Initialize(); myIsShrinkable = false; @@ -145,17 +147,54 @@ SMESH_ActorDef::SMESH_ActorDef() if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) myControlsPrecision = mgr->integerValue( "SMESH", "controls_precision", -1); - vtkFloatingPointType aElem0DSize = SMESH::GetFloat("SMESH:elem0d_size",5); - vtkFloatingPointType aBallElemSize = SMESH::GetFloat("SMESH:ball_elem_size",10); - vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); - vtkFloatingPointType aOutlineWidth = SMESH::GetFloat("SMESH:outline_width",1); + double aElem0DSize = SMESH::GetFloat("SMESH:elem0d_size",5); + double aBallElemSize = SMESH::GetFloat("SMESH:ball_elem_size",10); + double aBallElemScale = SMESH::GetFloat("SMESH:ball_elem_scale",1.0); + double aLineWidth = SMESH::GetFloat("SMESH:element_width",1); + double aOutlineWidth = SMESH::GetFloat("SMESH:outline_width",1); + + SMESH::LabelFont aFamilyNd = SMESH::FntTimes; + bool aBoldNd = true; + bool anItalicNd = false; + bool aShadowNd = false; + int aSizeNd = 10; + 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 anRGBNd[3] = {1,1,1}; + SMESH::GetColor( "SMESH", "numbering_node_color", anRGBNd[0], anRGBNd[1], anRGBNd[2], QColor( 255, 255, 255 ) ); + + SMESH::LabelFont aFamilyEl = SMESH::FntTimes; + bool aBoldEl = true; + bool anItalicEl = false; + bool aShadowEl = false; + int aSizeEl = 12; + 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(); + } + double anRGBEl[3] = {0,1,0}; + SMESH::GetColor( "SMESH", "numbering_elem_color", anRGBEl[0], anRGBEl[1], anRGBEl[2], QColor( 0, 255, 0 ) ); vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; //Definition 2D and 3D devices of the actor //----------------------------------------- - vtkFloatingPointType anRGB[3] = {1,1,1}; + double anRGB[3] = {1,1,1}; mySurfaceProp = vtkProperty::New(); QColor ffc, bfc; int delta; @@ -177,20 +216,23 @@ SMESH_ActorDef::SMESH_ActorDef() myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); my2DActor = SMESH_CellLabelActor::New(); - my2DActor->SetStoreGemetryMapping(true); + my2DActor->SetStoreClippingMapping(true); my2DActor->SetUserMatrix(aMatrix); my2DActor->PickableOff(); + my2DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my2DActor->SetProperty(mySurfaceProp); my2DActor->SetBackfaceProperty(myBackSurfaceProp); my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my2DActor->GetExtractUnstructuredGrid(); aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_POLYGON); aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON); aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE); my2DExtProp = vtkProperty::New(); my2DExtProp->DeepCopy(mySurfaceProp); @@ -208,16 +250,19 @@ SMESH_ActorDef::SMESH_ActorDef() my2DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); aFilter = my2DExtActor->GetExtractUnstructuredGrid(); aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_POLYGON); aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON); aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE); my3DActor = SMESH_CellLabelActor::New(); - my3DActor->SetStoreGemetryMapping(true); + my3DActor->SetStoreClippingMapping(true); my3DActor->SetUserMatrix(aMatrix); my3DActor->PickableOff(); + my3DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my3DActor->SetProperty(myNormalVProp); my3DActor->SetBackfaceProperty(myReversedVProp); my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); @@ -234,12 +279,10 @@ SMESH_ActorDef::SMESH_ActorDef() aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); -//#ifdef VTK_HAVE_POLYHEDRON - MESSAGE("RegisterCellsWithType(VTK_POLYHEDRON)"); aFilter->RegisterCellsWithType(VTK_POLYHEDRON); -//#endif my3DExtProp = vtkProperty::New(); my3DExtProp->DeepCopy(myNormalVProp); @@ -268,6 +311,7 @@ SMESH_ActorDef::SMESH_ActorDef() aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE); aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); aFilter->RegisterCellsWithType(VTK_POLYHEDRON); @@ -282,11 +326,16 @@ SMESH_ActorDef::SMESH_ActorDef() myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); myEdgeProp->SetLineWidth(aLineWidth); + // my1DActor is used to + // - show numbers + // - show controls on all edges (eg Length) + // since edges are shown by myHighlitableActor my1DActor = SMESH_CellLabelActor::New(); - my1DActor->SetStoreGemetryMapping(true); + my1DActor->SetStoreClippingMapping(true); my1DActor->SetUserMatrix(aMatrix); my1DActor->PickableOff(); my1DActor->SetHighlited(true); + my1DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my1DActor->SetProperty(myEdgeProp); my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my1DActor->GetExtractUnstructuredGrid(); @@ -298,7 +347,7 @@ SMESH_ActorDef::SMESH_ActorDef() my1DProp->DeepCopy(myEdgeProp); my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); my1DProp->SetPointSize(aElem0DSize); - + my1DExtProp = vtkProperty::New(); my1DExtProp->DeepCopy(myEdgeProp); anRGB[0] = 1 - anRGB[0]; @@ -308,6 +357,7 @@ SMESH_ActorDef::SMESH_ActorDef() my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc); my1DExtProp->SetPointSize(aElem0DSize); + // my1DExtActor is used to show filtered edges or links between nodes my1DExtActor = SMESH_DeviceActor::New(); my1DExtActor->SetUserMatrix(aMatrix); my1DExtActor->PickableOff(); @@ -330,16 +380,16 @@ SMESH_ActorDef::SMESH_ActorDef() my0DActor = SMESH_CellLabelActor::New(); my0DActor->SetUserMatrix(aMatrix); - my0DActor->SetStoreGemetryMapping(true); + my0DActor->SetStoreClippingMapping(true); my0DActor->PickableOff(); + my0DActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); my0DActor->SetVisibility(false); my0DActor->SetProperty(my0DProp); my0DActor->SetRepresentation(SMESH_DeviceActor::eSurface); aFilter = my0DActor->GetExtractUnstructuredGrid(); - //aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_VERTEX); - + //Definition 0D device of the actor (ball elements) //----------------------------------------------- myBallProp = vtkProperty::New(); @@ -349,15 +399,17 @@ SMESH_ActorDef::SMESH_ActorDef() myBallActor = SMESH_CellLabelActor::New(); myBallActor->SetUserMatrix(aMatrix); - myBallActor->SetStoreGemetryMapping(true); + myBallActor->SetStoreClippingMapping(true); myBallActor->PickableOff(); + myBallActor->SetFontProperties( aFamilyEl, aSizeEl, aBoldEl, anItalicEl, aShadowEl, anRGBEl[0], anRGBEl[1], anRGBEl[2] ); myBallActor->SetVisibility(false); myBallActor->SetProperty(myBallProp); myBallActor->SetRepresentation(SMESH_DeviceActor::eSurface); + myBallActor->SetBallEnabled(true); aFilter = myBallActor->GetExtractUnstructuredGrid(); aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); - + //my0DExtProp = vtkProperty::New(); //my0DExtProp->DeepCopy(my0DProp); //anRGB[0] = 1 - anRGB[0]; @@ -391,11 +443,12 @@ SMESH_ActorDef::SMESH_ActorDef() myNodeActor->SetStoreClippingMapping(true); myNodeActor->PickableOff(); myNodeActor->SetVisibility(false); + myNodeActor->SetFontProperties( aFamilyNd, aSizeNd, aBoldNd, anItalicNd, aShadowNd, anRGBNd[0], anRGBNd[1], anRGBNd[2] ); myNodeActor->SetProperty(myNodeProp); myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); aFilter = myNodeActor->GetExtractUnstructuredGrid(); aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - + myNodeExtProp = vtkProperty::New(); myNodeExtProp->DeepCopy(myNodeProp); anRGB[0] = 1 - anRGB[0]; @@ -419,10 +472,12 @@ SMESH_ActorDef::SMESH_ActorDef() //---------------------------------------------- myBaseActor->SetUserMatrix(aMatrix); + myBaseActor->SetStoreIDMapping(true); + myBaseActor->SetStoreClippingMapping(true); myBaseActor->SetStoreGemetryMapping(true); myBaseActor->GetProperty()->SetOpacity(0.0); myPickableActor = myBaseActor; - + myHighlightProp = vtkProperty::New(); myHighlightProp->SetAmbient(1.0); myHighlightProp->SetDiffuse(0.0); @@ -433,11 +488,6 @@ SMESH_ActorDef::SMESH_ActorDef() myHighlightProp->SetLineWidth(aLineWidth); myHighlightProp->SetRepresentation(1); - myBallHighlightProp = vtkProperty::New(); - myBallHighlightProp->DeepCopy(myHighlightProp); - myBallHighlightProp->SetPointSize(aBallElemSize); - - myOutLineProp = vtkProperty::New(); myOutLineProp->SetAmbient(1.0); myOutLineProp->SetDiffuse(0.0); @@ -457,10 +507,6 @@ SMESH_ActorDef::SMESH_ActorDef() myPreselectProp->SetLineWidth(aLineWidth); myPreselectProp->SetRepresentation(1); - myBallPreselectProp = vtkProperty::New(); - myBallPreselectProp->DeepCopy(myPreselectProp); - myBallPreselectProp->SetPointSize(aBallElemSize); - myHighlitableActor = SMESH_DeviceActor::New(); myHighlitableActor->SetUserMatrix(aMatrix); myHighlitableActor->PickableOff(); @@ -478,7 +524,7 @@ SMESH_ActorDef::SMESH_ActorDef() //Definition of myScalarBarActor //------------------------------ myLookupTable = vtkLookupTable::New(); - //Fix for Bug PAL5195 - SMESH764: + //Fix for Bug PAL5195 - SMESH764: //Controls - Aspect Ratio: incorrect colors of the best and worst values myLookupTable->SetHueRange(0.667,0.0); @@ -497,11 +543,13 @@ SMESH_ActorDef::SMESH_ActorDef() myEntityMode = eAllEntity; myEntityModeCache = eAllEntity; - + // Clipping planes myImplicitBoolean = vtkImplicitBoolean::New(); myImplicitBoolean->SetOperationTypeToIntersection(); - + + myPlaneCollection = vtkPlaneCollection::New(); + //Quadratic 2D elements representation //----------------------------------------------------------------------------- int aQuadratic2DMode = mgr->integerValue( "SMESH", "quadratic_mode", 0); @@ -515,11 +563,11 @@ SMESH_ActorDef::SMESH_ActorDef() my2DActor->SetQuadraticArcMode(true); my1DActor->SetQuadraticArcMode(true); } - + int aQuadraticAngle = mgr->integerValue( "SMESH", "max_angle", 2); myHighlitableActor->SetQuadraticArcAngle(aQuadraticAngle); my2DActor->SetQuadraticArcAngle(aQuadraticAngle); - + // Set colors of the name actor SMESH::GetColor( "SMESH", "default_grp_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); myNameActor->SetBackgroundColor(anRGB[0], anRGB[1], anRGB[2]); @@ -531,6 +579,7 @@ SMESH_ActorDef::SMESH_ActorDef() #endif SetBallSize(aBallElemSize); + SetBallScale(aBallElemScale); Set0DSize(aElem0DSize); } @@ -539,12 +588,9 @@ SMESH_ActorDef::~SMESH_ActorDef() { if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<Delete(); myScalarBarActor->Delete(); myLookupTable->Delete(); @@ -553,47 +599,51 @@ SMESH_ActorDef::~SMESH_ActorDef() myBackSurfaceProp->Delete(); myNormalVProp->Delete(); myReversedVProp->Delete(); - myOutLineProp->Delete(); - myEdgeProp->Delete(); - myHighlightProp->Delete(); - myPreselectProp->Delete(); - myNodeProp->Delete(); - myNodeExtProp->Delete(); - - my0DProp->Delete(); - my0DActor->Delete(); - myBallActor->Delete(); - //my0DExtProp->Delete(); - //my0DExtActor->Delete(); - - my1DProp->Delete(); - my1DActor->Delete(); + myNodeActor->Delete(); + myBaseActor->Delete(); + //myPickableActor->Delete(); myPickableActor == myBaseActor - my1DExtProp->Delete(); - my1DExtActor->Delete(); + myHighlightProp->Delete(); + myOutLineProp->Delete(); + myPreselectProp->Delete(); + + myHighlitableActor->Delete(); - my2DActor->Delete(); my2DExtProp->Delete(); + my3DExtProp->Delete(); + my2DActor->Delete(); my2DExtActor->Delete(); my3DActor->Delete(); - my3DExtProp->Delete(); my3DExtActor->Delete(); + // myControlActor->Delete(); myControlActor == my2DActor - myNodeActor->Delete(); - myBaseActor->Delete(); + myNodeExtProp->Delete(); + myNodeExtActor->Delete(); - myNodeExtActor->Delete(); - myHighlitableActor->Delete(); + my1DProp->Delete(); + my1DActor->Delete(); + my1DExtProp->Delete(); + my1DExtActor->Delete(); + + my0DProp->Delete(); + my0DActor->Delete(); + myBallProp->Delete(); + myBallActor->Delete(); + //my0DExtProp->Delete(); + //my0DExtActor->Delete(); myImplicitBoolean->Delete(); + myPlaneCollection->Delete(); - myTimeStamp->Delete(); - myBallHighlightProp->Delete(); - myBallPreselectProp->Delete(); - +#ifndef DISABLE_PLOT2DVIEWER + if(my2dHistogram) { + SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer); + delete my2dHistogram; + } +#endif } void SMESH_ActorDef::Delete() @@ -609,7 +659,7 @@ void SMESH_ActorDef::Delete() } void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) -{ +{ if(myNodeActor) { myNodeActor->SetPointsLabeled(theIsPointsLabeled); SetRepresentation(GetRepresentation()); @@ -617,7 +667,48 @@ void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) } } -bool SMESH_ActorDef::GetPointsLabeled() { +void SMESH_ActorDef::SetPointsFontProperties( SMESH::LabelFont theFamily, int theSize, + bool theBold, bool theItalic, bool theShadow, + double r, double g, double b ) +{ + if(myNodeActor) { + myNodeActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + SetRepresentation( GetRepresentation() ); + myTimeStamp->Modified(); + } +} + +void SMESH_ActorDef::SetCellsFontProperties( SMESH::LabelFont theFamily, int theSize, + bool theBold, bool theItalic, bool theShadow, + double r, double g, double b ) +{ + if(my3DActor) { + my3DActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + } + if(my2DActor) { + my2DActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + SetRepresentation( GetRepresentation() ); + myTimeStamp->Modified(); + } + if(my1DActor) { + my1DActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + SetRepresentation( GetRepresentation() ); + myTimeStamp->Modified(); + } + if(my0DActor) { + my0DActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + SetRepresentation( GetRepresentation() ); + myTimeStamp->Modified(); + } + if(myBallActor) { + myBallActor->SetFontProperties( theFamily, theSize, theBold, theItalic, theShadow, r, g, b ); + SetRepresentation( GetRepresentation() ); + myTimeStamp->Modified(); + } +} + +bool SMESH_ActorDef::GetPointsLabeled() +{ return myNodeActor && myNodeActor->GetPointsLabeled(); } @@ -634,15 +725,16 @@ void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) if(my0DActor) my0DActor->SetCellsLabeled(theIsCellsLabeled); - + if(myBallActor) myBallActor->SetCellsLabeled(theIsCellsLabeled); - + myTimeStamp->Modified(); } -bool SMESH_ActorDef::GetCellsLabeled() { +bool SMESH_ActorDef::GetCellsLabeled() +{ bool result = false; if(my3DActor) result = result || my3DActor->GetCellsLabeled(); @@ -678,24 +770,24 @@ bool SMESH_ActorDef::GetFacesOriented() return myIsFacesOriented; } -void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) +void SMESH_ActorDef::SetFacesOrientationColor(double r,double g,double b) { my2DActor->SetFacesOrientationColor( r, g, b ); my3DActor->SetFacesOrientationColor( r, g, b ); } -void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) +void SMESH_ActorDef::GetFacesOrientationColor(double& r,double& g,double& b) { my3DActor->GetFacesOrientationColor( r, g, b ); } -void SMESH_ActorDef::SetFacesOrientationScale(vtkFloatingPointType theScale) +void SMESH_ActorDef::SetFacesOrientationScale(double theScale) { my2DActor->SetFacesOrientationScale( theScale ); my3DActor->SetFacesOrientationScale( theScale ); } -vtkFloatingPointType SMESH_ActorDef::GetFacesOrientationScale() +double SMESH_ActorDef::GetFacesOrientationScale() { return my3DActor->GetFacesOrientationScale(); } @@ -712,24 +804,24 @@ bool SMESH_ActorDef::GetFacesOrientation3DVectors() } -void -SMESH_ActorDef:: -SetControlMode(eControl theMode) +void SMESH_ActorDef::SetControlMode(eControl theMode) { SetControlMode(theMode,true); } -void -SMESH_ActorDef:: -SetControlMode(eControl theMode, - bool theCheckEntityMode) +void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) { - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + lookupTable->SetScale(VTK_SCALE_LINEAR); + + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); if( !mgr ) return; - myControlMode = eNone; + //myControlMode = eNone; + myControlMode = theMode; theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); my0DActor->GetMapper()->SetScalarVisibility(false); @@ -902,34 +994,44 @@ SetControlMode(eControl theMode, myControlActor = my2DActor; break; } + case eNodeConnectivityNb: + { + myFunctor.reset( new SMESH::Controls::NodeConnectivityNumber() ); + myControlActor = myNodeActor; + break; + } default: return; } - vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - if(aNbCells){ - myControlMode = theMode; + int aNbCells = myFunctor ? myVisualObj->GetNbEntities( myFunctor->GetType() ) : 0; + bool aShowOnlyScalarBarTitle = false; + if(aNbCells) { + //myControlMode = theMode; switch(myControlMode){ case eFreeNodes: case eCoincidentNodes: myNodeExtActor->SetExtControlMode(myFunctor); + aShowOnlyScalarBarTitle = true; break; case eFreeEdges: case eFreeBorders: case eCoincidentElems1D: my1DExtActor->SetExtControlMode(myFunctor); + aShowOnlyScalarBarTitle = true; break; case eFreeFaces: case eBareBorderFace: case eOverConstrainedFace: case eCoincidentElems2D: my2DExtActor->SetExtControlMode(myFunctor); + aShowOnlyScalarBarTitle = true; break; case eBareBorderVolume: case eOverConstrainedVolume: case eCoincidentElems3D: my3DExtActor->SetExtControlMode(myFunctor); + aShowOnlyScalarBarTitle = true; break; case eLength2D: case eMultiConnection2D: @@ -940,43 +1042,44 @@ SetControlMode(eControl theMode, myControlActor->SetControlMode(myFunctor,myScalarBarActor,myLookupTable); UpdateDistribution(); } + myScalarBarActor->SetTitleOnlyVisibility(aShowOnlyScalarBarTitle); } if(theCheckEntityMode) { + // if(myControlActor == myNodeActor) { + // if ( myControlMode == eNodeConnectivityNb ) { + // if (!myIsEntityModeCache){ + // myEntityModeCache = GetEntityMode(); + // myIsEntityModeCache=true; + // } + // SetEntityMode(0); + // } + // } if(myControlActor == my1DActor) { if (!myIsEntityModeCache){ myEntityModeCache = GetEntityMode(); myIsEntityModeCache=true; - } + } SetEntityMode(eEdges); } else if(myControlActor == my2DActor) { - switch(myControlMode) { - case eLength2D: - case eFreeEdges: - case eFreeFaces: - case eMultiConnection2D: - if (!myIsEntityModeCache){ - myEntityModeCache = GetEntityMode(); - myIsEntityModeCache=true; - } - SetEntityMode(eFaces); - break; - default: - if (!myIsEntityModeCache){ - myEntityModeCache = GetEntityMode(); - myIsEntityModeCache=true; - } - SetEntityMode(eFaces); + if (!myIsEntityModeCache){ + myEntityModeCache = GetEntityMode(); + myIsEntityModeCache=true; } - }else if(myControlActor == my3DActor) { + SetEntityMode(eFaces); + } + else if(myControlActor == my3DActor) { if (!myIsEntityModeCache){ myEntityModeCache = GetEntityMode(); myIsEntityModeCache=true; - } + } SetEntityMode(eVolumes); } } + QString aTitle = QString(myScalarBarActor->GetTitle()); + aTitle.replace(QRegExp("(:\\s).*"),"\\1"+ QString::number(GetNumberControlEntities())); + myScalarBarActor->SetTitle(aTitle.toLatin1().constData()); } else { @@ -991,15 +1094,53 @@ SetControlMode(eControl theMode, myTimeStamp->Modified(); Modified(); - Update(); -} + lookupTable = static_cast(myScalarBarActor->GetLookupTable()); + double * range = lookupTable->GetRange(); + + if (isLogarithmic && range[0] > 1e-07 && range[1] > 1e-07) + lookupTable->SetScale(VTK_SCALE_LOG10); -void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ - - //myHighlightActor->AddToRender(theRenderer); + //Update(); +} + +int SMESH_ActorDef::GetNumberControlEntities() +{ + SMESH_DeviceActor* anAct = NULL; + switch(myControlMode){ + case eFreeNodes: + case eCoincidentNodes: + anAct = myNodeExtActor; + break; + case eFreeEdges: + case eFreeBorders: + case eCoincidentElems1D: + anAct = my1DExtActor; + break; + case eFreeFaces: + case eBareBorderFace: + case eOverConstrainedFace: + case eCoincidentElems2D: + anAct = my2DExtActor; + break; + case eBareBorderVolume: + case eOverConstrainedVolume: + case eCoincidentElems3D: + anAct = my3DExtActor; + break; + default:; + } + return (anAct) ? anAct->GetUnstructuredGrid()->GetNumberOfCells() : -1; +} - theRenderer->AddActor(myBaseActor); +void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer) +{ + if ( !mySelector || !mySelector->IsSelectionEnabled() ) + { + myBaseActor->SetUnstructuredGrid( NULL ); + //myHighlitableActor->SetUnstructuredGrid( NULL ); + } + theRenderer->AddActor(myBaseActor); theRenderer->AddActor(myNodeExtActor); theRenderer->AddActor(my1DExtActor); @@ -1011,10 +1152,9 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ my1DActor ->AddToRender(theRenderer); my0DActor ->AddToRender(theRenderer); myBallActor ->AddToRender(theRenderer); - //theRenderer->AddActor(my0DExtActor); theRenderer->AddActor(myHighlitableActor); - + theRenderer->AddActor2D(myScalarBarActor); // the superclass' method should be called at the end @@ -1022,7 +1162,8 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ SALOME_Actor::AddToRender(theRenderer); } -void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ +void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer) +{ SALOME_Actor::RemoveFromRender(theRenderer); theRenderer->RemoveActor(myBaseActor); @@ -1048,10 +1189,10 @@ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ } -bool SMESH_ActorDef::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); @@ -1060,29 +1201,32 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, myVisualObj = theVisualObj; myVisualObj->Update(theIsClear); + SMESH_SVTKActor::SafeDownCast(myHighlightActor)->SetVisualObject(myVisualObj); + SMESH_SVTKActor::SafeDownCast(myPreHighlightActor)->SetVisualObject(myVisualObj); + myNodeActor->Init(myVisualObj,myImplicitBoolean); myBaseActor->Init(myVisualObj,myImplicitBoolean); myHighlitableActor->Init(myVisualObj,myImplicitBoolean); myNodeExtActor->Init(myVisualObj,myImplicitBoolean); - + my0DActor->Init(myVisualObj,myImplicitBoolean); myBallActor->Init(myVisualObj,myImplicitBoolean); //my0DExtActor->Init(myVisualObj,myImplicitBoolean); - + my1DActor->Init(myVisualObj,myImplicitBoolean); my1DExtActor->Init(myVisualObj,myImplicitBoolean); - + my2DActor->Init(myVisualObj,myImplicitBoolean); my2DExtActor->Init(myVisualObj,myImplicitBoolean); my3DActor->Init(myVisualObj,myImplicitBoolean); my3DExtActor->Init(myVisualObj,myImplicitBoolean); - + my0DActor->GetMapper()->SetLookupTable(myLookupTable); myBallActor->GetMapper()->SetLookupTable(myLookupTable); //my0DExtActor->GetMapper()->SetLookupTable(myLookupTable); - + my1DActor->GetMapper()->SetLookupTable(myLookupTable); my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); @@ -1091,7 +1235,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, my3DActor->GetMapper()->SetLookupTable(myLookupTable); my3DExtActor->GetMapper()->SetLookupTable(myLookupTable); - vtkFloatingPointType aFactor, aUnits; + double aFactor, aUnits; my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); my2DExtActor->SetPolygonOffsetParameters(aFactor,aUnits*0.5); @@ -1108,7 +1252,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, int aMode = mgr->integerValue( "SMESH", "display_mode" ); SetRepresentation(-1); - + if(aMode == 0){ SetRepresentation(eEdge); }else if(aMode == 1){ @@ -1116,7 +1260,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, }else if(aMode == 2){ SetRepresentation(ePoint); } - + if(aMode == 3){ SetShrink(); } @@ -1134,22 +1278,27 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, } -vtkFloatingPointType* SMESH_ActorDef::GetBounds(){ - return myNodeActor->GetBounds(); +double* SMESH_ActorDef::GetBounds() +{ + if ( GetNumberOfClippingPlanes() + myPlaneCollection->GetNumberOfItems() > 0 ) + return myNodeActor->GetBounds(); + return myVisualObj->GetUnstructuredGrid()->GetPoints()->GetBounds(); } -vtkDataSet* SMESH_ActorDef::GetInput(){ +vtkDataSet* SMESH_ActorDef::GetInput() +{ return GetUnstructuredGrid(); } -void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ +void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform) +{ Superclass::SetTransform(theTransform); myNodeActor->SetTransform(theTransform); myBaseActor->SetTransform(theTransform); - + myHighlitableActor->SetTransform(theTransform); myNodeExtActor->SetTransform(theTransform); @@ -1170,48 +1319,55 @@ void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ } -void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){ +void SMESH_ActorDef::SetMapper(vtkMapper* theMapper) +{ vtkLODActor::SetMapper(theMapper); } -void SMESH_ActorDef::ShallowCopy(vtkProp *prop){ +void SMESH_ActorDef::ShallowCopy(vtkProp *prop) +{ SALOME_Actor::ShallowCopy(prop); } -vtkMapper* SMESH_ActorDef::GetMapper(){ +vtkMapper* SMESH_ActorDef::GetMapper() +{ return myPickableActor->GetMapper(); } -vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ +vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid() +{ return myVisualObj->GetUnstructuredGrid(); } -bool SMESH_ActorDef::IsInfinitive(){ +bool SMESH_ActorDef::IsInfinitive() +{ vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); - aDataSet->Update(); myIsInfinite = aDataSet->GetNumberOfCells() == 0 || - ( aDataSet->GetNumberOfCells() == 1 && + ( aDataSet->GetNumberOfCells() == 1 && aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX ); return SALOME_Actor::IsInfinitive(); } -void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){ +void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable) +{ if ( myIsShrinkable == theShrunkable ) return; myIsShrinkable = theShrunkable; Modified(); } -vtkFloatingPointType SMESH_ActorDef::GetShrinkFactor(){ +double SMESH_ActorDef::GetShrinkFactor() +{ return myBaseActor->GetShrinkFactor(); } -void SMESH_ActorDef::SetShrinkFactor(vtkFloatingPointType theValue){ +void SMESH_ActorDef::SetShrinkFactor(double theValue) +{ myBaseActor->SetShrinkFactor(theValue); my1DActor->SetShrinkFactor(theValue); @@ -1227,7 +1383,8 @@ void SMESH_ActorDef::SetShrinkFactor(vtkFloatingPointType theValue){ Modified(); } -void SMESH_ActorDef::SetShrink(){ +void SMESH_ActorDef::SetShrink() +{ if(!myIsShrinkable) return; myBaseActor->SetShrink(); @@ -1245,7 +1402,8 @@ void SMESH_ActorDef::SetShrink(){ Modified(); } -void SMESH_ActorDef::UnShrink(){ +void SMESH_ActorDef::UnShrink() +{ if(!myIsShrunk) return; myBaseActor->UnShrink(); @@ -1264,35 +1422,41 @@ void SMESH_ActorDef::UnShrink(){ } -int SMESH_ActorDef::GetNodeObjId(int theVtkID){ +int SMESH_ActorDef::GetNodeObjId(int theVtkID) +{ return myPickableActor->GetNodeObjId(theVtkID); } -vtkFloatingPointType* SMESH_ActorDef::GetNodeCoord(int theObjID){ +double* SMESH_ActorDef::GetNodeCoord(int theObjID) +{ return myPickableActor->GetNodeCoord(theObjID); } -int SMESH_ActorDef::GetElemObjId(int theVtkID){ +int SMESH_ActorDef::GetElemObjId(int theVtkID) +{ return myPickableActor->GetElemObjId(theVtkID); } -vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){ +vtkCell* SMESH_ActorDef::GetElemCell(int theObjID) +{ return myPickableActor->GetElemCell(theObjID); } -void SMESH_ActorDef::SetVisibility(int theMode){ +void SMESH_ActorDef::SetVisibility(int theMode) +{ SetVisibility(theMode,true); } -void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ +void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) +{ SALOME_Actor::SetVisibility(theMode); myNodeActor->VisibilityOff(); myBaseActor->VisibilityOff(); - + myNodeExtActor->VisibilityOff(); my0DActor->VisibilityOff(); @@ -1301,27 +1465,33 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ my1DActor->VisibilityOff(); my1DExtActor->VisibilityOff(); - + my2DActor->VisibilityOff(); my2DExtActor->VisibilityOff(); my3DActor->VisibilityOff(); my3DExtActor->VisibilityOff(); - + myScalarBarActor->VisibilityOff(); - - if(GetVisibility()){ - if(theIsUpdateRepersentation) + + if ( GetVisibility() ) { + if ( theIsUpdateRepersentation ) SetRepresentation(GetRepresentation()); - - if(myControlMode != eNone){ - switch(myControlMode){ + + if(myControlMode != eNone) { + switch(myControlMode) { case eFreeNodes: case eCoincidentNodes: myNodeExtActor->VisibilityOn(); break; + case eLength: + case eMultiConnection: + my1DActor->VisibilityOn(); + break; case eFreeEdges: case eFreeBorders: case eCoincidentElems1D: + case eLength2D: + case eMultiConnection2D: my1DExtActor->VisibilityOn(); break; case eFreeFaces: @@ -1335,59 +1505,52 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ case eCoincidentElems3D: my3DExtActor->VisibilityOn(); break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->VisibilityOn(); - default: - if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) - myScalarBarActor->VisibilityOn(); + default:; } + if ( myFunctor && myVisualObj->GetNbEntities( myFunctor->GetType() )) + myScalarBarActor->VisibilityOn(); } - if(myRepresentation != ePoint) - myPickableActor->VisibilityOn(); - else { - myNodeActor->VisibilityOn(); - } + myPickableActor->VisibilityOn(); - if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){ - my0DActor->VisibilityOn(); - } - if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){ - myBallActor->VisibilityOn(); + if ( GetRepresentation() != ePoint ) + { + if(myEntityMode & e0DElements ){ + my0DActor->VisibilityOn(); + } + if(myEntityMode & eBallElem ){ + myBallActor->VisibilityOn(); + } + if(myEntityMode & eEdges && GetCellsLabeled() ){ // my1DActor shows labels only + my1DActor->VisibilityOn(); + } + if(myEntityMode & eFaces ){ + my2DActor->VisibilityOn(); + } + if(myEntityMode & eVolumes ){ + my3DActor->VisibilityOn(); + } } - if(myEntityMode & eEdges && GetRepresentation() != ePoint){ - my1DActor->VisibilityOn(); - } - - if(myEntityMode & eFaces && GetRepresentation() != ePoint){ - my2DActor->VisibilityOn(); - } - - if(myEntityMode & eVolumes && GetRepresentation() != ePoint){ - my3DActor->VisibilityOn(); - } - - if(myNodeActor->GetPointsLabeled()){ + if(myNodeActor->GetPointsLabeled()) { + myNodeActor->UpdateLabels(); myNodeActor->VisibilityOn(); } - if(my0DActor) my0DActor->UpdateLabels(); - + if(myBallActor) myBallActor->UpdateLabels(); - + if(my1DActor) my1DActor->UpdateLabels(); - + if(my2DActor) my2DActor->UpdateLabels(); - + if(my3DActor) - my3DActor->UpdateLabels(); - } + my3DActor->UpdateLabels(); + } #ifndef DISABLE_PLOT2DVIEWER else SMESH::ProcessIn2DViewers(this,SMESH::RemoveFrom2dViewer); @@ -1399,30 +1562,30 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) { - myEntityState = eAllEntity; + unsigned int anObjectEntities = eAllEntity; // entities present in my object if(!myVisualObj->GetNbEntities(SMDSAbs_0DElement)) { - myEntityState &= ~e0DElements; + anObjectEntities &= ~e0DElements; theMode &= ~e0DElements; } if(!myVisualObj->GetNbEntities(SMDSAbs_Ball)) { - myEntityState &= ~eBallElem; + anObjectEntities &= ~eBallElem; theMode &= ~eBallElem; } if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)) { - myEntityState &= ~eEdges; + anObjectEntities &= ~eEdges; theMode &= ~eEdges; } if(!myVisualObj->GetNbEntities(SMDSAbs_Face)) { - myEntityState &= ~eFaces; + anObjectEntities &= ~eFaces; theMode &= ~eFaces; } if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)) { - myEntityState &= ~eVolumes; + anObjectEntities &= ~eVolumes; theMode &= ~eVolumes; } @@ -1443,106 +1606,135 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) theMode |= eVolumes; } - myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState); + myBaseActor->myGeomFilter->SetInside(myEntityMode != anObjectEntities); - myEntityMode = theMode; - VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - aFilter = myBaseActor->GetExtractUnstructuredGrid(); - aFilter->ClearRegisteredCellsWithType(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + if ( anObjectEntities == 0 && myRepresentation != ePoint ) // no elements, show nodes + { + myRepresentationCache = GetRepresentation(); + SetRepresentation( ePoint ); + } - VTKViewer_ExtractUnstructuredGrid* aHightFilter = myHighlitableActor->GetExtractUnstructuredGrid(); - aHightFilter->ClearRegisteredCellsWithType(); - aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + if ( myEntityMode != theMode ) + { + myEntityMode = theMode; // entities to show - if (myEntityMode & e0DElements) { - if (MYDEBUG) MESSAGE("0D ELEMENTS"); - aFilter->RegisterCellsWithType(VTK_VERTEX); - aHightFilter->RegisterCellsWithType(VTK_VERTEX); - } + // Set cell types to extract - if (myEntityMode & eBallElem) { - aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); - aHightFilter->RegisterCellsWithType(VTK_POLY_VERTEX); - } + VTKViewer_ExtractUnstructuredGrid* aFilter = myBaseActor->GetExtractUnstructuredGrid(); + VTKViewer_ExtractUnstructuredGrid* aHltFilter = myHighlitableActor->GetExtractUnstructuredGrid(); + aFilter->ClearRegisteredCellsWithType(); + aHltFilter->ClearRegisteredCellsWithType(); - if (myEntityMode & eEdges) { - if (MYDEBUG) MESSAGE("EDGES"); - aFilter->RegisterCellsWithType(VTK_LINE); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); + bool isPassAll = ( myEntityMode == anObjectEntities && myEntityMode ); + if ( isPassAll ) + { + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); + aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); + } + else + { + aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + aHltFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aHightFilter->RegisterCellsWithType(VTK_LINE); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); - } + if (myEntityMode & e0DElements) { + aFilter->RegisterCellsWithType(VTK_VERTEX); + aHltFilter->RegisterCellsWithType(VTK_VERTEX); + } - 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); - aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); - - aHightFilter->RegisterCellsWithType(VTK_TRIANGLE); - aHightFilter->RegisterCellsWithType(VTK_POLYGON); - aHightFilter->RegisterCellsWithType(VTK_QUAD); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); - aHightFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); - } + if (myEntityMode & eBallElem) { + aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); + } - 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_HEXAGONAL_PRISM); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); -//#ifdef VTK_HAVE_POLYHEDRON - aFilter->RegisterCellsWithType(VTK_POLYHEDRON); -//#endif - - aHightFilter->RegisterCellsWithType(VTK_TETRA); - aHightFilter->RegisterCellsWithType(VTK_VOXEL); - aHightFilter->RegisterCellsWithType(VTK_HEXAHEDRON); - aHightFilter->RegisterCellsWithType(VTK_WEDGE); - aHightFilter->RegisterCellsWithType(VTK_PYRAMID); - aHightFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); - aHightFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); - aHightFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); -//#ifdef VTK_HAVE_POLYHEDRON - aHightFilter->RegisterCellsWithType(VTK_POLYHEDRON); -//#endif + if (myEntityMode & eEdges) { + aFilter->RegisterCellsWithType(VTK_LINE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); + + aHltFilter->RegisterCellsWithType(VTK_LINE); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); + } + + if (myEntityMode & eFaces) { + aFilter->RegisterCellsWithType(VTK_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_QUAD); + aFilter->RegisterCellsWithType(VTK_POLYGON); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE); + + aHltFilter->RegisterCellsWithType(VTK_TRIANGLE); + aHltFilter->RegisterCellsWithType(VTK_QUAD); + aHltFilter->RegisterCellsWithType(VTK_POLYGON); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON); + aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); + aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE); + } + + if (myEntityMode & eVolumes) { + aFilter->RegisterCellsWithType(VTK_TETRA); + aFilter->RegisterCellsWithType(VTK_VOXEL); + aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_WEDGE); + aFilter->RegisterCellsWithType(VTK_PYRAMID); + aFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE); + aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); + aFilter->RegisterCellsWithType(VTK_POLYHEDRON); + + aHltFilter->RegisterCellsWithType(VTK_TETRA); + aHltFilter->RegisterCellsWithType(VTK_VOXEL); + aHltFilter->RegisterCellsWithType(VTK_HEXAHEDRON); + aHltFilter->RegisterCellsWithType(VTK_WEDGE); + aHltFilter->RegisterCellsWithType(VTK_PYRAMID); + aHltFilter->RegisterCellsWithType(VTK_HEXAGONAL_PRISM); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_TETRA); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_HEXAHEDRON); + aHltFilter->RegisterCellsWithType(VTK_TRIQUADRATIC_HEXAHEDRON); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); + aHltFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUADRATIC_WEDGE); + aHltFilter->RegisterCellsWithType(VTK_QUADRATIC_PYRAMID); + aHltFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); + aHltFilter->RegisterCellsWithType(VTK_POLYHEDRON); + } + } + if ( GetVisibility() ) + aFilter->Update(); + if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells()); } - aFilter->Update(); - if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells()); - SetVisibility(GetVisibility(),false); + + SetVisibility( GetVisibility(), myRepresentationCache != 0 ); } void SMESH_ActorDef::SetRepresentation (int theMode) -{ - int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); - int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); +{ + int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); + int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); - int aNb0Ds = myVisualObj->GetNbEntities(SMDSAbs_0DElement); - int aNbBalls = myVisualObj->GetNbEntities(SMDSAbs_Ball); + int aNb0Ds = myVisualObj->GetNbEntities(SMDSAbs_0DElement); + int aNbBalls = myVisualObj->GetNbEntities(SMDSAbs_Ball); + + if ( myRepresentationCache && aNbEdges + aNbFaces + aNbVolumes + aNb0Ds + aNbBalls ) + { + theMode = myRepresentationCache; + if ( theMode == eSurface && aNbFaces + aNbVolumes == 0 ) + theMode = eEdge; + else + myRepresentationCache = 0; + } if (theMode < 0) { myRepresentation = eSurface; - if (!aNbFaces && !aNbVolumes && aNbEdges) { + if (!aNbFaces && !aNbVolumes && !aNbBalls && aNbEdges) { myRepresentation = eEdge; - } else if (!aNbFaces && !aNbVolumes && !aNbEdges) { + } else if (!aNbFaces && !aNbVolumes && !aNbEdges && !aNbBalls) { myRepresentation = ePoint; } } else { @@ -1553,7 +1745,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) case eSurface: if (!aNbFaces && !aNbVolumes && !aNb0Ds && !aNbBalls) return; break; - } + } myRepresentation = theMode; } @@ -1566,12 +1758,10 @@ void SMESH_ActorDef::SetRepresentation (int theMode) myIsShrunk = true; } else { SetShrink(); - } + } } myPickableActor = myBaseActor; - myNodeActor->SetVisibility(false); - myNodeExtActor->SetVisibility(false); vtkProperty *aProp = NULL, *aBackProp = NULL; vtkProperty *aPropVN = NULL, *aPropVR = NULL; SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); @@ -1579,7 +1769,6 @@ void SMESH_ActorDef::SetRepresentation (int theMode) switch (myRepresentation) { case ePoint: myPickableActor = myNodeActor; - myNodeActor->SetVisibility(true); aQuadraticMode = SMESH_Actor::eLines; aProp = aBackProp = aPropVN = aPropVR = myNodeProp; aReperesent = SMESH_DeviceActor::ePoint; @@ -1597,57 +1786,50 @@ void SMESH_ActorDef::SetRepresentation (int theMode) break; } - my2DActor->SetProperty(aProp); - my2DActor->SetBackfaceProperty(aBackProp); - my2DActor->SetRepresentation(aReperesent); + if ( myRepresentation != ePoint ) + { + my2DActor->SetProperty(aProp); + my2DActor->SetBackfaceProperty(aBackProp); + my2DActor->SetRepresentation(aReperesent); - if(aQuadraticMode == SMESH_Actor::eLines) - my2DActor->SetQuadraticArcMode(false); - else if(aQuadraticMode == SMESH_Actor::eArcs) - my2DActor->SetQuadraticArcMode(true); + if(aQuadraticMode == SMESH_Actor::eLines) + my2DActor->SetQuadraticArcMode(false); + else if(aQuadraticMode == SMESH_Actor::eArcs) + my2DActor->SetQuadraticArcMode(true); - my2DExtActor->SetRepresentation(aReperesent); - - my3DActor->SetProperty(aPropVN); - my3DActor->SetBackfaceProperty(aPropVR); - my3DActor->SetRepresentation(aReperesent); + my2DExtActor->SetRepresentation(aReperesent); - //my0DExtActor->SetVisibility(false); - my1DExtActor->SetVisibility(false); - my2DExtActor->SetVisibility(false); - my3DExtActor->SetVisibility(false); + my3DActor->SetProperty(aPropVN); + my3DActor->SetBackfaceProperty(aPropVR); + my3DActor->SetRepresentation(aReperesent); - // ??? - //my0DActor->SetProperty(aProp); - //my0DActor->SetBackfaceProperty(aBackProp); - my0DActor->SetRepresentation(aReperesent); - myBallActor->SetRepresentation(aReperesent); - //my0DExtActor->SetRepresentation(aReperesent); + my0DActor->SetRepresentation(aReperesent); + myBallActor->SetRepresentation(aReperesent); - switch(myControlMode){ - case eLength: - case eMultiConnection: - aProp = aBackProp = my1DProp; - if(myRepresentation != ePoint) - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - } - - if(aQuadraticMode == SMESH_Actor::eLines) - my1DActor->SetQuadraticArcMode(false); - else if(aQuadraticMode == SMESH_Actor::eArcs) - my1DActor->SetQuadraticArcMode(true); + switch ( myControlMode ) { + case eLength: + case eMultiConnection: + aProp = aBackProp = my1DProp; + if ( myRepresentation != ePoint ) + aReperesent = SMESH_DeviceActor::eInsideframe; + break; + default:; + } - my1DActor->SetProperty(aProp); - my1DActor->SetBackfaceProperty(aBackProp); - my1DActor->SetRepresentation(aReperesent); + if(aQuadraticMode == SMESH_Actor::eLines) + my1DActor->SetQuadraticArcMode(false); + else if(aQuadraticMode == SMESH_Actor::eArcs) + my1DActor->SetQuadraticArcMode(true); + + my1DActor->SetProperty(aProp); + my1DActor->SetBackfaceProperty(aBackProp); + my1DActor->SetRepresentation(aReperesent); - my1DExtActor->SetRepresentation(aReperesent); + my1DExtActor->SetRepresentation(aReperesent); + } if(myIsPointsVisible) myPickableActor = myNodeActor; - if(GetPointRepresentation()) - myNodeActor->SetVisibility(true); SetMapper(myPickableActor->GetMapper()); @@ -1657,22 +1839,24 @@ void SMESH_ActorDef::SetRepresentation (int theMode) } -void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ +void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible) +{ if ( myIsPointsVisible == theIsPointsVisible ) return; myIsPointsVisible = theIsPointsVisible; SetRepresentation(GetRepresentation()); } -bool SMESH_ActorDef::GetPointRepresentation(){ +bool SMESH_ActorDef::GetPointRepresentation() +{ return myIsPointsVisible || myNodeActor->GetPointsLabeled(); } -void SMESH_ActorDef::UpdateHighlight(){ +void SMESH_ActorDef::UpdateHighlight() +{ myHighlitableActor->SetHighlited(false); myHighlitableActor->SetVisibility(false); - bool anIsVisible = GetVisibility(); switch(myRepresentation){ @@ -1681,13 +1865,10 @@ void SMESH_ActorDef::UpdateHighlight(){ { if(myIsHighlighted) { myHighlitableActor->SetProperty(myHighlightProp); - myBallActor->SetProperty(myBallHighlightProp); }else if(myIsPreselected){ myHighlitableActor->SetProperty(myPreselectProp); - myBallActor->SetProperty(myBallPreselectProp); } else if(anIsVisible){ - myBallActor->SetProperty(myBallProp); - (myRepresentation == eSurface) ? + (myRepresentation == eSurface) ? myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp); } if(GetUnstructuredGrid()->GetNumberOfCells()) { @@ -1710,13 +1891,33 @@ void SMESH_ActorDef::UpdateHighlight(){ } myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); myNodeActor->GetExtractUnstructuredGrid()->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + myNodeActor->GetProperty()->Modified(); break; } } } +void SMESH_ActorDef::EnableSelection( bool enable ) +{ + // selection in the Viewer enabled/disabled + if ( enable && ! myBaseActor->myExtractUnstructuredGrid->GetInput() ) + { + myBaseActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + //myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + myBaseActor->myExtractUnstructuredGrid->Update(); + //myHighlitableActor->myExtractUnstructuredGrid->Update(); + } + if ( !enable && myBaseActor->myExtractUnstructuredGrid->GetInput() ) + { + myBaseActor->SetUnstructuredGrid( NULL ); + //myHighlitableActor->SetUnstructuredGrid( NULL ); + myBaseActor->myExtractUnstructuredGrid->Update(); + //myHighlitableActor->myExtractUnstructuredGrid->Update(); + } +} -void SMESH_ActorDef::highlight(bool theHighlight){ +void SMESH_ActorDef::highlight(bool theHighlight) +{ if ( myIsHighlighted == theHighlight ) return; myIsHighlighted = theHighlight; @@ -1724,10 +1925,11 @@ void SMESH_ActorDef::highlight(bool theHighlight){ } -void SMESH_ActorDef::SetPreSelected(bool thePreselect){ +void SMESH_ActorDef::SetPreSelected(bool thePreselect) +{ if ( myIsPreselected == thePreselect ) return; - myIsPreselected = thePreselect; + myIsPreselected = thePreselect; UpdateHighlight(); } @@ -1736,11 +1938,11 @@ void SMESH_ActorDef::SetPreSelected(bool thePreselect){ int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp) { if (myPickableActor->GetIsOpaque()) - { + { vtkRenderer *ren = static_cast(vp); this->Render(ren); return 1; - } + } return 0; } @@ -1748,27 +1950,31 @@ int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp) int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp) { if (!myPickableActor->GetIsOpaque()) - { + { vtkRenderer *ren = static_cast(vp); this->Render(ren); return 1; - } + } return 0; } -void SMESH_ActorDef::Render(vtkRenderer *ren){ - unsigned long aTime = myTimeStamp->GetMTime(); - unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - unsigned long aClippingTime = myImplicitBoolean->GetMTime(); +void SMESH_ActorDef::Render(vtkRenderer *ren) +{ + vtkMTimeType aTime = myTimeStamp->GetMTime(); + vtkMTimeType anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); + vtkMTimeType aClippingTime = myImplicitBoolean->GetMTime(); if(anObjTime > aTime || aClippingTime > aTime) Update(); } -void SMESH_ActorDef::Update(){ +void SMESH_ActorDef::Update() +{ if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update"); + myVisualObj->Update(); + if(GetControlMode() != eNone) { unsigned long aTime = myTimeStamp->GetMTime(); unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); @@ -1781,51 +1987,54 @@ void SMESH_ActorDef::Update(){ if(my0DActor) my0DActor->UpdateLabels(); - + if(myBallActor) myBallActor->UpdateLabels(); - + if(my1DActor) my1DActor->UpdateLabels(); - + if(my2DActor) my2DActor->UpdateLabels(); if(my3DActor) my3DActor->UpdateLabels(); - + if(myIsFacesOriented){ SetFacesOriented(myIsFacesOriented); } - - if(myVisualObj->GetEntitiesFlag()) { - myEntityMode |= myVisualObj->GetEntitiesState(); - } - + + // if(myVisualObj->GetEntitiesFlag()) { IPAL53915 + // myEntityMode |= myVisualObj->GetEntitiesState(); + // } + SetEntityMode(GetEntityMode()); SetVisibility(GetVisibility()); - + myTimeStamp->Modified(); Modified(); } -void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){ +void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin) +{ SALOME_Actor::ReleaseGraphicsResources(renWin); myPickableActor->ReleaseGraphicsResources(renWin); } -static void GetColor(vtkProperty *theProperty, vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ - vtkFloatingPointType* aColor = theProperty->GetColor(); +static void GetColor(vtkProperty *theProperty, double& r,double& g,double& b) +{ + double* aColor = theProperty->GetColor(); r = aColor[0]; g = aColor[1]; b = aColor[2]; } -void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){ +void SMESH_ActorDef::SetOpacity(double theValue) +{ mySurfaceProp->SetOpacity(theValue); myBackSurfaceProp->SetOpacity(theValue); myNormalVProp->SetOpacity(theValue); @@ -1840,48 +2049,54 @@ void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){ } -vtkFloatingPointType SMESH_ActorDef::GetOpacity(){ +double SMESH_ActorDef::GetOpacity() +{ return mySurfaceProp->GetOpacity(); } -void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){ +void SMESH_ActorDef::SetSufaceColor(double r,double g,double b, int delta) +{ mySurfaceProp->SetColor(r,g,b); my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Face ) myNameActor->SetBackgroundColor(r,g,b); - + myDeltaBrightness = delta; QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta); myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); Modified(); } -void SMESH_ActorDef::GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){ +void SMESH_ActorDef::GetSufaceColor(double& r,double& g,double& b, int& delta) +{ ::GetColor(mySurfaceProp,r,g,b); delta = myDeltaBrightness; } -void SMESH_ActorDef::SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){ +void SMESH_ActorDef::SetVolumeColor(double r,double g,double b, int delta) +{ myNormalVProp->SetColor(r,g,b); my3DExtProp->SetColor(1.0-r,1.0-g,1.0-b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Volume ) myNameActor->SetBackgroundColor(r,g,b); - + myDeltaVBrightness = delta; QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta); myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. ); Modified(); } -void SMESH_ActorDef::GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){ +void SMESH_ActorDef::GetVolumeColor(double& r,double& g,double& b, int& delta) +{ ::GetColor(myNormalVProp,r,g,b); delta = myDeltaVBrightness; } -void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetEdgeColor(double r,double g,double b) +{ myEdgeProp->SetColor(r,g,b); my1DProp->SetColor(r,g,b); my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b); @@ -1891,21 +2106,25 @@ void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g, Modified(); } -void SMESH_ActorDef::GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetEdgeColor(double& r,double& g,double& b) +{ ::GetColor(myEdgeProp,r,g,b); } -void SMESH_ActorDef::SetOutlineColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetOutlineColor(double r,double g,double b) +{ myOutLineProp->SetColor(r,g,b); Modified(); } -void SMESH_ActorDef::GetOutlineColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetOutlineColor(double& r,double& g,double& b) +{ ::GetColor(myOutLineProp,r,g,b); } -void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetNodeColor(double r,double g,double b) +{ myNodeProp->SetColor(r,g,b); myNodeExtProp->SetColor(1.0-r,1.0-g,1.0-b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) @@ -1914,11 +2133,13 @@ void SMESH_ActorDef::SetNodeColor(vtkFloatingPointType r,vtkFloatingPointType g, Modified(); } -void SMESH_ActorDef::GetNodeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetNodeColor(double& r,double& g,double& b) +{ ::GetColor(myNodeProp,r,g,b); } -void SMESH_ActorDef::Set0DColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::Set0DColor(double r,double g,double b) +{ my0DProp->SetColor(r,g,b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_0DElement ) @@ -1926,11 +2147,13 @@ void SMESH_ActorDef::Set0DColor(vtkFloatingPointType r,vtkFloatingPointType g,vt Modified(); } -void SMESH_ActorDef::Get0DColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::Get0DColor(double& r,double& g,double& b) +{ ::GetColor(my0DProp,r,g,b); } -void SMESH_ActorDef::SetBallColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetBallColor(double r,double g,double b) +{ myBallProp->SetColor(r,g,b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Ball ) @@ -1938,41 +2161,46 @@ void SMESH_ActorDef::SetBallColor(vtkFloatingPointType r,vtkFloatingPointType g, Modified(); } -void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetBallColor(double& r,double& g,double& b) +{ ::GetColor(myBallProp,r,g,b); } -void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetHighlightColor(double r,double g,double b) +{ myHighlightProp->SetColor(r,g,b); - myBallHighlightProp->SetColor(r,g,b); Modified(); } -void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetHighlightColor(double& r,double& g,double& b) +{ ::GetColor(myHighlightProp,r,g,b); } -void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ +void SMESH_ActorDef::SetPreHighlightColor(double r,double g,double b) +{ myPreselectProp->SetColor(r,g,b); - myBallPreselectProp->SetColor(r,g,b); Modified(); } -void SMESH_ActorDef::GetPreHighlightColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b){ +void SMESH_ActorDef::GetPreHighlightColor(double& r,double& g,double& b) +{ ::GetColor(myPreselectProp,r,g,b); } -vtkFloatingPointType SMESH_ActorDef::GetLineWidth(){ +double SMESH_ActorDef::GetLineWidth() +{ return myEdgeProp->GetLineWidth(); } -void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){ +void SMESH_ActorDef::SetLineWidth(double theVal) +{ myEdgeProp->SetLineWidth(theVal); my1DProp->SetLineWidth(theVal + aLineWidthInc); - my1DExtProp->SetLineWidth(theVal + aLineWidthInc); + my1DExtProp->SetLineWidth(theVal + aLineWidthInc); my2DExtProp->SetLineWidth(theVal + aLineWidthInc); my3DExtProp->SetLineWidth(theVal + aLineWidthInc); myOutLineProp->SetLineWidth(theVal); @@ -1981,18 +2209,19 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){ Modified(); } -vtkFloatingPointType SMESH_ActorDef::GetOutlineWidth() +double SMESH_ActorDef::GetOutlineWidth() { return myOutLineProp->GetLineWidth(); } -void SMESH_ActorDef::SetOutlineWidth(vtkFloatingPointType theVal) +void SMESH_ActorDef::SetOutlineWidth(double theVal) { myOutLineProp->SetLineWidth(theVal); Modified(); } -void SMESH_ActorDef::Set0DSize(vtkFloatingPointType theVal){ +void SMESH_ActorDef::Set0DSize(double theVal) +{ my0DProp->SetPointSize(theVal); myHighlightProp->SetPointSize(theVal); myPreselectProp->SetPointSize(theVal); @@ -2007,14 +2236,15 @@ void SMESH_ActorDef::Set0DSize(vtkFloatingPointType theVal){ Modified(); } -vtkFloatingPointType SMESH_ActorDef::Get0DSize(){ +double SMESH_ActorDef::Get0DSize() +{ return my0DProp->GetPointSize(); } -void SMESH_ActorDef::SetBallSize(vtkFloatingPointType theVal){ +void SMESH_ActorDef::SetBallSize(double theVal) +{ myBallProp->SetPointSize(theVal); - myBallHighlightProp->SetPointSize(theVal); - myBallPreselectProp->SetPointSize(theVal); + if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) { aCustom->SetBallSize(theVal); } @@ -2025,24 +2255,40 @@ void SMESH_ActorDef::SetBallSize(vtkFloatingPointType theVal){ Modified(); } -vtkFloatingPointType SMESH_ActorDef::GetBallSize(){ +double SMESH_ActorDef::GetBallSize() +{ return myBallProp->GetPointSize(); } +double SMESH_ActorDef::GetBallScale() +{ + return myBallActor->GetBallScale(); +} + +void SMESH_ActorDef::SetBallScale( double theVal ) +{ + myBallActor->SetBallScale( theVal ); + if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) { + aCustom->SetBallScale(theVal); + } + if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) { + aCustom->SetBallScale(theVal); + } + + Modified(); +} + int SMESH_ActorDef::GetObjDimension( const int theObjId ) { return myVisualObj->GetElemDimension( theObjId ); } -bool -SMESH_ActorDef:: -IsImplicitFunctionUsed() const +bool SMESH_ActorDef::IsImplicitFunctionUsed() const { return myBaseActor->IsImplicitFunctionUsed(); } -void -SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) +void SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) { myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); @@ -2064,8 +2310,7 @@ SMESH_ActorDef::SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) my3DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); } -vtkIdType -SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) +vtkIdType SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) { if(thePlane){ myImplicitBoolean->GetFunction()->AddItem(thePlane); @@ -2077,10 +2322,71 @@ SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane) return myCippingPlaneCont.size(); } -void -SMESH_ActorDef:: -RemoveAllClippingPlanes() +void SMESH_ActorDef::AddOpenGLClippingPlane(vtkPlane* thePlane) +{ + if(thePlane) + myPlaneCollection->AddItem( thePlane ); +} + +void SMESH_ActorDef::SetOpenGLClippingPlane() +{ + // before use this method you must add clipping planes using method + // SMESH_ActorDef::AddOpenGLClippingPlane(vtkPlane* thePlane) + if( !myPlaneCollection->GetNumberOfItems() ) + return; + + // It is necessary to set plane collection for each mapper of actor + // and update current inputs of mapper + myNodeActor->SetPlaneCollection( myPlaneCollection ); + myNodeActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + myBaseActor->SetPlaneCollection( myPlaneCollection ); + myBaseActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + myHighlitableActor->SetPlaneCollection( myPlaneCollection ); + myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + if ( !mySelector || !mySelector->IsSelectionEnabled() ) + { + myBaseActor->SetUnstructuredGrid( NULL ); + //myHighlitableActor->SetUnstructuredGrid( NULL ); + } + my1DActor->SetPlaneCollection( myPlaneCollection ); + my1DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my2DActor->SetPlaneCollection( myPlaneCollection ); + my2DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + myNodeExtActor->SetPlaneCollection( myPlaneCollection ); + myNodeExtActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my0DActor->SetPlaneCollection( myPlaneCollection ); + my0DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + myBallActor->SetPlaneCollection( myPlaneCollection ); + myBallActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my1DExtActor->SetPlaneCollection( myPlaneCollection ); + my1DExtActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my2DExtActor->SetPlaneCollection( myPlaneCollection ); + my2DExtActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my3DActor->SetPlaneCollection( myPlaneCollection ); + my3DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + my3DExtActor->SetPlaneCollection( myPlaneCollection ); + my3DExtActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + + if(IsShrunk()) + SetShrink(); + else + Modified(); +} + +void SMESH_ActorDef::RemoveAllClippingPlanes() { + myPlaneCollection->RemoveAllItems(); myImplicitBoolean->GetFunction()->RemoveAllItems(); myImplicitBoolean->GetFunction()->Modified(); // VTK bug myCippingPlaneCont.clear(); @@ -2088,18 +2394,14 @@ RemoveAllClippingPlanes() myNodeActor->UpdateLabels(); } -vtkIdType -SMESH_ActorDef:: -GetNumberOfClippingPlanes() +vtkIdType SMESH_ActorDef::GetNumberOfClippingPlanes() { return myCippingPlaneCont.size(); } -vtkPlane* -SMESH_ActorDef:: -GetClippingPlane(vtkIdType theID) +vtkPlane* SMESH_ActorDef::GetClippingPlane(vtkIdType theID) { - if(theID >= myCippingPlaneCont.size()) + if ( theID >= (vtkIdType)myCippingPlaneCont.size() ) return NULL; return myCippingPlaneCont[theID].Get(); } @@ -2189,21 +2491,21 @@ void SMESH_ActorDef::UpdateScalarBar() myScalarBarActor->SetOrientationToVertical(); - vtkFloatingPointType aXVal = horiz ? 0.20 : 0.01; + double 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; + double 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; + double 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; + double aHVal = horiz ? 0.12 : 0.80; if( mgr->hasValue( "SMESH", name + "height" ) ) aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal ); myScalarBarActor->SetHeight( aHVal ); @@ -2223,7 +2525,7 @@ void SMESH_ActorDef::UpdateScalarBar() int coloringType = mgr->integerValue("SMESH", "distribution_coloring_type", 0); myScalarBarActor->SetDistributionColoringType(coloringType); - + QColor distributionColor = mgr->colorValue("SMESH", "distribution_color", QColor(255, 255, 255)); double rgb[3]; @@ -2232,7 +2534,7 @@ void SMESH_ActorDef::UpdateScalarBar() rgb[2]= distributionColor.blue()/255.; myScalarBarActor->SetDistributionColor(rgb); - + } void SMESH_ActorDef::UpdateDistribution() @@ -2246,12 +2548,13 @@ void SMESH_ActorDef::UpdateDistribution() SMESH_VisualObjDef::TEntityList elems; if ( ! dynamic_cast(myVisualObj.get())) dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); - std::vector elemIds; + std::vector elemIds; elemIds.reserve( elems.size() ); for ( SMESH_VisualObjDef::TEntityList::iterator e = elems.begin(); e != elems.end(); ++e) elemIds.push_back( (*e)->GetID()); vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); double * range = lookupTable->GetRange(); - fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range, isLogarithmic); myScalarBarActor->SetDistribution(nbEvents); } } @@ -2301,21 +2604,21 @@ void SMESH_ActorDef::SetMarkerTexture( int theMarkerId, VTK::MarkerTexture theMa } #ifndef DISABLE_PLOT2DVIEWER -SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { - +SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() +{ if(my2dHistogram) my2dHistogram->clearAllPoints(); - + if(SMESH::Controls::NumericalFunctor* fun = dynamic_cast(myFunctor.get())) { - + if(!my2dHistogram) { my2dHistogram = new SPlot2d_Histogram(); Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(getIO()->getEntry(),"SMESH",getName()); my2dHistogram->setIO(anIO); } - + int nbIntervals = myScalarBarActor->GetMaximumNumberOfColors(); std::vector nbEvents; std::vector funValues; @@ -2323,22 +2626,23 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { if ( ! dynamic_cast(myVisualObj.get())) dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); std::vector elemIds; - + for ( SMESH_VisualObjDef::TEntityList::iterator e = elems.begin(); e != elems.end(); ++e) elemIds.push_back( (*e)->GetID()); vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); double * range = lookupTable->GetRange(); - fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range); + bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; + fun->GetHistogram(nbIntervals, nbEvents, funValues, elemIds, range, isLogarithmic); - for ( int i = 0; i < std::min( nbEvents.size(), funValues.size() -1 ); i++ ) + for ( size_t i = 0; i < std::min( nbEvents.size(), funValues.size() -1 ); i++ ) my2dHistogram->addPoint(funValues[i] + (funValues[i+1] - funValues[i])/2.0, static_cast(nbEvents[i])); if(funValues.size() >= 2) my2dHistogram->setWidth((funValues[1] - funValues[0]) * 0.8) ; } - + //Color of the histogram if(myScalarBarActor->GetDistributionColoringType() == SMESH_MULTICOLOR_TYPE) my2dHistogram->setAutoAssign(true); @@ -2349,7 +2653,7 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { my2dHistogram->setColor(aColor); } - + return my2dHistogram; } #endif