X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Actor.cxx;h=23dee68601b29a83e4662531fdd0554d0d6258fa;hp=34c956b5ce12c4c9b589955d30cf82d49cf1e2d3;hb=8d297d6698f361d4f2dde723050bcfbaea050920;hpb=5c5e1f2368ca2b3388f657ae028b2a6b5ce8ae36 diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 34c956b5c..23dee6860 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -26,23 +26,24 @@ // Module : SMESH #include "SMESH_ActorDef.h" + +#include "SMDS_UnstructuredGrid.hxx" +#include "SMESH_ActorProps.h" #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 @@ -87,9 +88,6 @@ static int MYDEBUG = 0; static int MYDEBUG = 0; #endif -static int aLineWidthInc = 2; - - SMESH_ActorDef* SMESH_ActorDef::New(){ return new SMESH_ActorDef(); } @@ -117,12 +115,16 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, SMESH_ActorDef::SMESH_ActorDef() { if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<Delete(); // vtkSmartPointer! @@ -137,6 +139,9 @@ SMESH_ActorDef::SMESH_ActorDef() myIsFacesOriented = false; + int controlsIncrement = SMESH_ActorProps::props()->controlsIncrement(); + int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement(); + myControlsPrecision = -1; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); @@ -212,7 +217,7 @@ 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] ); @@ -236,6 +241,7 @@ SMESH_ActorDef::SMESH_ActorDef() anRGB[0] = 1 - anRGB[0]; anRGB[1] = 1 - anRGB[1]; anRGB[2] = 1 - anRGB[2]; + my2DExtProp->SetLineWidth(aLineWidth + controlsIncrement); my2DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); my2DExtActor = SMESH_DeviceActor::New(); @@ -255,7 +261,7 @@ SMESH_ActorDef::SMESH_ActorDef() 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] ); @@ -275,6 +281,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); @@ -285,6 +292,7 @@ SMESH_ActorDef::SMESH_ActorDef() anRGB[0] = 1 - anRGB[0]; anRGB[1] = 1 - anRGB[1]; anRGB[2] = 1 - anRGB[2]; + my3DExtProp->SetLineWidth(aLineWidth + controlsIncrement); my3DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); my3DExtActor = SMESH_DeviceActor::New(); @@ -306,6 +314,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); @@ -320,8 +329,12 @@ 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); @@ -335,7 +348,7 @@ SMESH_ActorDef::SMESH_ActorDef() my1DProp = vtkProperty::New(); my1DProp->DeepCopy(myEdgeProp); - my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); + my1DProp->SetLineWidth(aLineWidth + controlsIncrement); my1DProp->SetPointSize(aElem0DSize); my1DExtProp = vtkProperty::New(); @@ -344,9 +357,10 @@ SMESH_ActorDef::SMESH_ActorDef() anRGB[1] = 1 - anRGB[1]; anRGB[2] = 1 - anRGB[2]; my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc); + my1DExtProp->SetLineWidth(aLineWidth + controlsIncrement); my1DExtProp->SetPointSize(aElem0DSize); + // my1DExtActor is used to show filtered edges or links between nodes my1DExtActor = SMESH_DeviceActor::New(); my1DExtActor->SetUserMatrix(aMatrix); my1DExtActor->PickableOff(); @@ -369,7 +383,7 @@ 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); @@ -388,7 +402,7 @@ 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); @@ -461,6 +475,8 @@ SMESH_ActorDef::SMESH_ActorDef() //---------------------------------------------- myBaseActor->SetUserMatrix(aMatrix); + myBaseActor->SetStoreIDMapping(true); + myBaseActor->SetStoreClippingMapping(true); myBaseActor->SetStoreGemetryMapping(true); myBaseActor->GetProperty()->SetOpacity(0.0); myPickableActor = myBaseActor; @@ -472,7 +488,7 @@ SMESH_ActorDef::SMESH_ActorDef() 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(aElem0DSize); // ?? - myHighlightProp->SetLineWidth(aLineWidth); + myHighlightProp->SetLineWidth(aLineWidth + selectionIncrement); myHighlightProp->SetRepresentation(1); myOutLineProp = vtkProperty::New(); @@ -491,7 +507,7 @@ SMESH_ActorDef::SMESH_ActorDef() 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(aElem0DSize); // ?? - myPreselectProp->SetLineWidth(aLineWidth); + myPreselectProp->SetLineWidth(aLineWidth + selectionIncrement); myPreselectProp->SetRepresentation(1); myHighlitableActor = SMESH_DeviceActor::New(); @@ -791,12 +807,20 @@ bool SMESH_ActorDef::GetFacesOrientation3DVectors() } +void SMESH_ActorDef::SetControl(SMESH::Controls::FunctorPtr theFunctor) +{ + myFunctor = theFunctor; + if ( !theFunctor ) + SetControlMode( eNone, true ); + else + SetControlMode( eCustomControl, true ); +} + void SMESH_ActorDef::SetControlMode(eControl theMode) { SetControlMode(theMode,true); } - void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) { vtkLookupTable* lookupTable = static_cast(myScalarBarActor->GetLookupTable()); @@ -807,7 +831,8 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) if( !mgr ) return; - myControlMode = eNone; + //myControlMode = eNone; + myControlMode = theMode; theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); my0DActor->GetMapper()->SetScalarVisibility(false); @@ -830,11 +855,9 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) break; } case eLength2D: - { myFunctor.reset(new SMESH::Controls::Length2D()); myControlActor = my2DActor; break; - } case eFreeBorders: myFunctor.reset(new SMESH::Controls::FreeBorders()); myControlActor = my1DActor; @@ -944,6 +967,14 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) myControlActor = my3DActor; break; } + case eDeflection2D: + { + SMESH::Controls::Deflection2D* aControl = new SMESH::Controls::Deflection2D(); + aControl->SetPrecision( myControlsPrecision ); + myFunctor.reset( aControl ); + myControlActor = my2DActor; + break; + } case eBareBorderVolume: { myFunctor.reset(new SMESH::Controls::BareBorderVolume()); @@ -986,15 +1017,27 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) myControlActor = myNodeActor; break; } + case eCustomControl: + { + if ( !myFunctor ) + return; + switch ( myFunctor->GetType() ) { + case SMDSAbs_Node : myControlActor = myNodeActor; break; + case SMDSAbs_Edge : myControlActor = my1DActor; break; + case SMDSAbs_Face : myControlActor = my2DActor; break; + case SMDSAbs_Volume : myControlActor = my3DActor; break; + default : return; + } + break; + } default: return; } - vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); + int aNbCells = myFunctor ? myVisualObj->GetNbEntities( myFunctor->GetType() ) : 0; bool aShowOnlyScalarBarTitle = false; if(aNbCells) { - myControlMode = theMode; + //myControlMode = theMode; switch(myControlMode){ case eFreeNodes: case eCoincidentNodes: @@ -1050,25 +1093,13 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) 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; @@ -1078,7 +1109,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) } QString aTitle = QString(myScalarBarActor->GetTitle()); aTitle.replace(QRegExp("(:\\s).*"),"\\1"+ QString::number(GetNumberControlEntities())); - myScalarBarActor->SetTitle(aTitle.toLatin1().constData()); + myScalarBarActor->SetTitle(aTitle.toUtf8().constData()); } else { @@ -1100,7 +1131,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) if (isLogarithmic && range[0] > 1e-07 && range[1] > 1e-07) lookupTable->SetScale(VTK_SCALE_LOG10); - Update(); + //Update(); } int SMESH_ActorDef::GetNumberControlEntities() @@ -1134,6 +1165,11 @@ int SMESH_ActorDef::GetNumberControlEntities() 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); @@ -1274,7 +1310,9 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, double* SMESH_ActorDef::GetBounds() { - return myNodeActor->GetBounds(); + if ( GetNumberOfClippingPlanes() + myPlaneCollection->GetNumberOfItems() > 0 ) + return myNodeActor->GetBounds(); + return myVisualObj->GetUnstructuredGrid()->GetPoints()->GetBounds(); } @@ -1424,6 +1462,10 @@ double* SMESH_ActorDef::GetNodeCoord(int theObjID) return myPickableActor->GetNodeCoord(theObjID); } +int SMESH_ActorDef::GetNodeVtkId(int theObjID) +{ + return myPickableActor->GetNodeVtkId(theObjID); +} int SMESH_ActorDef::GetElemObjId(int theVtkID) { @@ -1465,8 +1507,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) myScalarBarActor->VisibilityOff(); - if(GetVisibility()){ - if(theIsUpdateRepersentation) + if ( GetVisibility() ) { + if ( theIsUpdateRepersentation ) SetRepresentation(GetRepresentation()); if(myControlMode != eNone) { @@ -1475,9 +1517,15 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) 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: @@ -1491,45 +1539,37 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) case eCoincidentElems3D: my3DExtActor->VisibilityOn(); break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->VisibilityOn(); - break; default:; } - if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) + 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(myEntityMode & eEdges && GetRepresentation() != ePoint){ - my1DActor->VisibilityOn(); - } - - if(myEntityMode & eFaces && GetRepresentation() != ePoint){ - my2DActor->VisibilityOn(); - } - - if(myEntityMode & eVolumes && GetRepresentation() != ePoint){ - my3DActor->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(myNodeActor->GetPointsLabeled()){ + if(myNodeActor->GetPointsLabeled()) { + myNodeActor->UpdateLabels(); myNodeActor->VisibilityOn(); } - if(my0DActor) my0DActor->UpdateLabels(); @@ -1556,30 +1596,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; } @@ -1600,100 +1640,129 @@ 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); - } + VTKViewer_ExtractUnstructuredGrid* aFilter = myBaseActor->GetExtractUnstructuredGrid(); + VTKViewer_ExtractUnstructuredGrid* aHltFilter = myHighlitableActor->GetExtractUnstructuredGrid(); + aFilter->ClearRegisteredCellsWithType(); + aHltFilter->ClearRegisteredCellsWithType(); + + 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); - if (myEntityMode & eEdges) { - if (MYDEBUG) MESSAGE("EDGES"); - aFilter->RegisterCellsWithType(VTK_LINE); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); + if (myEntityMode & e0DElements) { + aFilter->RegisterCellsWithType(VTK_VERTEX); + aHltFilter->RegisterCellsWithType(VTK_VERTEX); + } - aHightFilter->RegisterCellsWithType(VTK_LINE); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); - } + if (myEntityMode & eBallElem) { + aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); + } - if (myEntityMode & eFaces) { - if (MYDEBUG) MESSAGE("FACES"); - 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); - - aHightFilter->RegisterCellsWithType(VTK_TRIANGLE); - aHightFilter->RegisterCellsWithType(VTK_QUAD); - aHightFilter->RegisterCellsWithType(VTK_POLYGON); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD); - aHightFilter->RegisterCellsWithType(VTK_QUADRATIC_POLYGON); - aHightFilter->RegisterCellsWithType(VTK_BIQUADRATIC_QUAD); - aHightFilter->RegisterCellsWithType(VTK_BIQUADRATIC_TRIANGLE); - } + if (myEntityMode & eEdges) { + aFilter->RegisterCellsWithType(VTK_LINE); + aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); - 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_PYRAMID); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_WEDGE); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - aFilter->RegisterCellsWithType(VTK_POLYHEDRON); - - 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); - aHightFilter->RegisterCellsWithType(VTK_POLYHEDRON); + 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; @@ -1727,8 +1796,6 @@ void SMESH_ActorDef::SetRepresentation (int theMode) } 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); @@ -1736,7 +1803,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; @@ -1754,54 +1820,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); + my2DExtActor->SetRepresentation(aReperesent); - my3DActor->SetProperty(aPropVN); - my3DActor->SetBackfaceProperty(aPropVR); - my3DActor->SetRepresentation(aReperesent); + my3DActor->SetProperty(aPropVN); + my3DActor->SetBackfaceProperty(aPropVR); + my3DActor->SetRepresentation(aReperesent); + my0DActor->SetRepresentation(aReperesent); + myBallActor->SetRepresentation(aReperesent); - my1DExtActor->SetVisibility(false); - my2DExtActor->SetVisibility(false); - my3DExtActor->SetVisibility(false); - - my0DActor->SetRepresentation(aReperesent); - myBallActor->SetRepresentation(aReperesent); - - switch ( myControlMode ) { - case eLength: - case eMultiConnection: - aProp = aBackProp = my1DProp; - if(myRepresentation != ePoint) - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - default:; - } + switch ( myControlMode ) { + case eLength: + case eMultiConnection: + aProp = aBackProp = my1DProp; + if ( myRepresentation != ePoint ) + aReperesent = SMESH_DeviceActor::eInsideframe; + break; + default:; + } - if(aQuadraticMode == SMESH_Actor::eLines) - my1DActor->SetQuadraticArcMode(false); - else if(aQuadraticMode == SMESH_Actor::eArcs) - my1DActor->SetQuadraticArcMode(true); + 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); + 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()); @@ -1863,11 +1925,30 @@ 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) { @@ -1891,11 +1972,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; } @@ -1903,20 +1984,20 @@ 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(); + vtkMTimeType aTime = myTimeStamp->GetMTime(); + vtkMTimeType anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); + vtkMTimeType aClippingTime = myImplicitBoolean->GetMTime(); if(anObjTime > aTime || aClippingTime > aTime) Update(); } @@ -1926,6 +2007,8 @@ 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(); @@ -1955,9 +2038,9 @@ void SMESH_ActorDef::Update() SetFacesOriented(myIsFacesOriented); } - if(myVisualObj->GetEntitiesFlag()) { - myEntityMode |= myVisualObj->GetEntitiesState(); - } + // if(myVisualObj->GetEntitiesFlag()) { IPAL53915 + // myEntityMode |= myVisualObj->GetEntitiesState(); + // } SetEntityMode(GetEntityMode()); SetVisibility(GetVisibility()); @@ -2117,29 +2200,19 @@ void SMESH_ActorDef::GetBallColor(double& r,double& g,double& b) ::GetColor(myBallProp,r,g,b); } -void SMESH_ActorDef::SetHighlightColor(double r,double g,double b) -{ - myHighlightProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetHighlightColor(double& r,double& g,double& b) -{ - ::GetColor(myHighlightProp,r,g,b); -} - -void SMESH_ActorDef::SetPreHighlightColor(double r,double g,double b) -{ - myPreselectProp->SetColor(r,g,b); +void SMESH_ActorDef::UpdateSelectionProps() +{ + QColor selectionColor = SMESH_ActorProps::props()->selectionColor(); + QColor highlightColor = SMESH_ActorProps::props()->highlightColor(); + int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement(); + double width = GetLineWidth(); + myHighlightProp->SetColor(selectionColor.redF(), selectionColor.greenF(), selectionColor.blueF()); + myHighlightProp->SetLineWidth(width + selectionIncrement); + myPreselectProp->SetColor(highlightColor.redF(), highlightColor.greenF(), highlightColor.blueF()); + myPreselectProp->SetLineWidth(width + selectionIncrement); Modified(); } -void SMESH_ActorDef::GetPreHighlightColor(double& r,double& g,double& b) -{ - ::GetColor(myPreselectProp,r,g,b); -} - - double SMESH_ActorDef::GetLineWidth() { return myEdgeProp->GetLineWidth(); @@ -2148,15 +2221,17 @@ double SMESH_ActorDef::GetLineWidth() void SMESH_ActorDef::SetLineWidth(double theVal) { + int controlsIncrement = SMESH_ActorProps::props()->controlsIncrement(); + int selectionIncrement = SMESH_ActorProps::props()->selectionIncrement(); + myEdgeProp->SetLineWidth(theVal); - my1DProp->SetLineWidth(theVal + aLineWidthInc); - my1DExtProp->SetLineWidth(theVal + aLineWidthInc); - my2DExtProp->SetLineWidth(theVal + aLineWidthInc); - my3DExtProp->SetLineWidth(theVal + aLineWidthInc); - myOutLineProp->SetLineWidth(theVal); - myHighlightProp->SetLineWidth(theVal); - myPreselectProp->SetLineWidth(theVal); + my1DProp->SetLineWidth(theVal + controlsIncrement); + my1DExtProp->SetLineWidth(theVal + controlsIncrement); + my2DExtProp->SetLineWidth(theVal + controlsIncrement); + my3DExtProp->SetLineWidth(theVal + controlsIncrement); + myHighlightProp->SetLineWidth(theVal + selectionIncrement); + myPreselectProp->SetLineWidth(theVal + selectionIncrement); Modified(); } @@ -2297,6 +2372,11 @@ void SMESH_ActorDef::SetOpenGLClippingPlane() myHighlitableActor->SetPlaneCollection( myPlaneCollection ); myHighlitableActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); + if ( !mySelector || !mySelector->IsSelectionEnabled() ) + { + myBaseActor->SetUnstructuredGrid( NULL ); + //myHighlitableActor->SetUnstructuredGrid( NULL ); + } my1DActor->SetPlaneCollection( myPlaneCollection ); my1DActor->SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());