X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Actor.cxx;h=5c64804eca223a049966f2fa596578f2818f5c12;hp=2fcd2a67c600b0efbddeabafa12e77c9c70773f6;hb=refs%2Ftags%2FV9_7_0b1;hpb=2e5f78b7d298f01eda6768a5e7427f60b09a0691 diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 2fcd2a67c..5c64804ec 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 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 @@ -28,6 +28,7 @@ #include "SMESH_ActorDef.h" #include "SMDS_UnstructuredGrid.hxx" +#include "SMESH_ActorProps.h" #include "SMESH_ActorUtils.h" #include "SMESH_CellLabelActor.h" #include "SMESH_ControlsDef.hxx" @@ -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(); } @@ -126,6 +124,7 @@ SMESH_ActorDef::SMESH_ActorDef() myIsPointsVisible = false; myIsEntityModeCache = false; + myRepresentationCache = 0; myHighlightActor = SMESH_SVTKActor::New(); myHighlightActor->Delete(); // vtkSmartPointer! @@ -140,17 +139,20 @@ SMESH_ActorDef::SMESH_ActorDef() myIsFacesOriented = false; + float controlsIncrement = (float) SMESH_ActorProps::props()->controlsIncrement(); + float selectionIncrement = (float) SMESH_ActorProps::props()->selectionIncrement(); + myControlsPrecision = -1; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) myControlsPrecision = mgr->integerValue( "SMESH", "controls_precision", -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); + float aElem0DSize = (float) SMESH::GetFloat("SMESH:elem0d_size",5); + float aBallElemSize = (float) SMESH::GetFloat("SMESH:ball_elem_size",10); + float aBallElemScale = (float) SMESH::GetFloat("SMESH:ball_elem_scale",1.0); + float aLineWidth = (float) SMESH::GetFloat("SMESH:element_width",1); + float aOutlineWidth = (float) SMESH::GetFloat("SMESH:outline_width",1); SMESH::LabelFont aFamilyNd = SMESH::FntTimes; bool aBoldNd = true; @@ -239,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(); @@ -278,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); @@ -288,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(); @@ -309,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); @@ -342,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(); @@ -351,7 +357,7 @@ 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 @@ -482,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(); @@ -501,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(); @@ -726,6 +732,7 @@ void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) if(myBallActor) myBallActor->SetCellsLabeled(theIsCellsLabeled); + SetRepresentation(GetRepresentation()); myTimeStamp->Modified(); } @@ -801,12 +808,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()); @@ -841,11 +856,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; @@ -955,6 +968,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()); @@ -997,11 +1018,24 @@ 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; } - int aNbCells = myFunctor ? myVisualObj->GetNbEntities( myFunctor->GetType() ) : 0; + smIdType aNbCells = myFunctor ? myVisualObj->GetNbEntities( myFunctor->GetType() ) : 0; bool aShowOnlyScalarBarTitle = false; if(aNbCells) { //myControlMode = theMode; @@ -1076,7 +1110,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 { @@ -1101,7 +1135,7 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) //Update(); } -int SMESH_ActorDef::GetNumberControlEntities() +smIdType SMESH_ActorDef::GetNumberControlEntities() { SMESH_DeviceActor* anAct = NULL; switch(myControlMode){ @@ -1127,7 +1161,7 @@ int SMESH_ActorDef::GetNumberControlEntities() break; default:; } - return (anAct) ? anAct->GetUnstructuredGrid()->GetNumberOfCells() : -1; + return anAct ? anAct->GetUnstructuredGrid()->GetNumberOfCells() : -1; } void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer) @@ -1419,23 +1453,27 @@ void SMESH_ActorDef::UnShrink() } -int SMESH_ActorDef::GetNodeObjId(int theVtkID) +vtkIdType SMESH_ActorDef::GetNodeObjId(vtkIdType theVtkID) { return myPickableActor->GetNodeObjId(theVtkID); } -double* SMESH_ActorDef::GetNodeCoord(int theObjID) +double* SMESH_ActorDef::GetNodeCoord(vtkIdType theObjID) { return myPickableActor->GetNodeCoord(theObjID); } +vtkIdType SMESH_ActorDef::GetNodeVtkId(vtkIdType theObjID) +{ + return myPickableActor->GetNodeVtkId(theObjID); +} -int SMESH_ActorDef::GetElemObjId(int theVtkID) +vtkIdType SMESH_ActorDef::GetElemObjId(vtkIdType theVtkID) { return myPickableActor->GetElemObjId(theVtkID); } -vtkCell* SMESH_ActorDef::GetElemCell(int theObjID) +vtkCell* SMESH_ActorDef::GetElemCell(vtkIdType theObjID) { return myPickableActor->GetElemCell(theObjID); } @@ -1470,8 +1508,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) myScalarBarActor->VisibilityOff(); - if(GetVisibility()){ - if(theIsUpdateRepersentation) + if ( GetVisibility() ) { + if ( theIsUpdateRepersentation ) SetRepresentation(GetRepresentation()); if(myControlMode != eNone) { @@ -1508,7 +1546,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) myScalarBarActor->VisibilityOn(); } - myPickableActor->VisibilityOn(); + if ( GetPickable( )) + myPickableActor->VisibilityOn(); if ( GetRepresentation() != ePoint ) { @@ -1518,7 +1557,8 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) if(myEntityMode & eBallElem ){ myBallActor->VisibilityOn(); } - if(myEntityMode & eEdges && GetCellsLabeled() ){ // my1DActor shows labels only + if(myEntityMode & eEdges && ( GetCellsLabeled() || // my1DActor shows labels only + ( myControlActor == my1DActor && myControlMode != eNone ))){ my1DActor->VisibilityOn(); } if(myEntityMode & eFaces ){ @@ -1559,30 +1599,30 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) void SMESH_ActorDef::SetEntityMode(unsigned int theMode) { - myEntityState = eAllEntity; // entities present in my object + 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; } @@ -1603,111 +1643,42 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) theMode |= eVolumes; } - myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState); - - myEntityMode = theMode; // entities to show + // rnv : Fix volume selection on Display Entity + //myBaseActor->myGeomFilter->SetInside(myEntityMode != anObjectEntities); - VTKViewer_ExtractUnstructuredGrid* aFilter = myBaseActor->GetExtractUnstructuredGrid(); - aFilter->ClearRegisteredCellsWithType(); - VTKViewer_ExtractUnstructuredGrid* aHightFilter = myHighlitableActor->GetExtractUnstructuredGrid(); - aHightFilter->ClearRegisteredCellsWithType(); - - bool isPassAll = - (( myEntityMode & e0DElements || myVisualObj->GetNbEntities(SMDSAbs_0DElement) == 0 ) && - ( myEntityMode & eBallElem || myVisualObj->GetNbEntities(SMDSAbs_Ball) == 0 ) && - ( myEntityMode & eEdges || myVisualObj->GetNbEntities(SMDSAbs_Edge) == 0 ) && - ( myEntityMode & eFaces || myVisualObj->GetNbEntities(SMDSAbs_Face) == 0 ) && - ( myEntityMode & eVolumes || myVisualObj->GetNbEntities(SMDSAbs_Volume) == 0 )); - if ( isPassAll && myEntityMode ) + if ( anObjectEntities == 0 && myRepresentation != ePoint ) // no elements, show nodes { - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); - aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); + myRepresentationCache = GetRepresentation(); + SetRepresentation( ePoint ); } - else - { - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - if (myEntityMode & e0DElements) { - aFilter->RegisterCellsWithType(VTK_VERTEX); - aHightFilter->RegisterCellsWithType(VTK_VERTEX); - } - - if (myEntityMode & eBallElem) { - aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); - } - - if (myEntityMode & eEdges) { - aFilter->RegisterCellsWithType(VTK_LINE); - aFilter->RegisterCellsWithType(VTK_QUADRATIC_EDGE); - - aHightFilter->RegisterCellsWithType(VTK_LINE); - aHightFilter->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); - - 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 & 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_CONVEX_POINT_SET); - aFilter->RegisterCellsWithType(VTK_POLYHEDRON); + if ( myEntityMode != theMode ) + { + myEntityMode = theMode; // entities to show - 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); - } + // Set cell types to extract + UpdateFilter(); } - if ( GetVisibility() ) - 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 aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); - int aNb0Ds = myVisualObj->GetNbEntities(SMDSAbs_0DElement); - int aNbBalls = myVisualObj->GetNbEntities(SMDSAbs_Ball); + smIdType aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); + smIdType aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); + smIdType aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); + smIdType aNb0Ds = myVisualObj->GetNbEntities(SMDSAbs_0DElement); + smIdType 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; @@ -1743,7 +1714,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode) myPickableActor = myBaseActor; vtkProperty *aProp = NULL, *aBackProp = NULL; vtkProperty *aPropVN = NULL, *aPropVR = NULL; - SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); + SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::eNoneRepr; SMESH_Actor::EQuadratic2DRepresentation aQuadraticMode = GetQuadratic2DRepresentation(); switch (myRepresentation) { case ePoint: @@ -1789,7 +1760,13 @@ void SMESH_ActorDef::SetRepresentation (int theMode) case eLength: case eMultiConnection: aProp = aBackProp = my1DProp; - if(myRepresentation != ePoint) + if ( myRepresentation != ePoint ) + aReperesent = SMESH_DeviceActor::eInsideframe; + break; + case eCustomControl: + if ( myControlActor == my1DActor ) + aProp = aBackProp = my1DProp; + if ( myRepresentation != ePoint ) aReperesent = SMESH_DeviceActor::eInsideframe; break; default:; @@ -1938,7 +1915,7 @@ int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp) } -void SMESH_ActorDef::Render(vtkRenderer *ren) +void SMESH_ActorDef::Render(vtkRenderer* /*ren*/) { vtkMTimeType aTime = myTimeStamp->GetMTime(); vtkMTimeType anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); @@ -2145,29 +2122,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(); + float selectionIncrement = (float) SMESH_ActorProps::props()->selectionIncrement(); + float width = (float) 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(); @@ -2176,15 +2143,17 @@ double SMESH_ActorDef::GetLineWidth() void SMESH_ActorDef::SetLineWidth(double theVal) { - myEdgeProp->SetLineWidth(theVal); + float controlsIncrement = (float) SMESH_ActorProps::props()->controlsIncrement(); + float selectionIncrement = (float) SMESH_ActorProps::props()->selectionIncrement(); + + myEdgeProp->SetLineWidth((float) 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((float) theVal + controlsIncrement); + my1DExtProp ->SetLineWidth((float) theVal + controlsIncrement); + my2DExtProp ->SetLineWidth((float) theVal + controlsIncrement); + my3DExtProp ->SetLineWidth((float) theVal + controlsIncrement); + myHighlightProp->SetLineWidth((float) theVal + selectionIncrement); + myPreselectProp->SetLineWidth((float) theVal + selectionIncrement); Modified(); } @@ -2195,21 +2164,21 @@ double SMESH_ActorDef::GetOutlineWidth() void SMESH_ActorDef::SetOutlineWidth(double theVal) { - myOutLineProp->SetLineWidth(theVal); + myOutLineProp->SetLineWidth((float) theVal); Modified(); } void SMESH_ActorDef::Set0DSize(double theVal) { - my0DProp->SetPointSize(theVal); - myHighlightProp->SetPointSize(theVal); - myPreselectProp->SetPointSize(theVal); + my0DProp ->SetPointSize((float) theVal); + myHighlightProp->SetPointSize((float) theVal); + myPreselectProp->SetPointSize((float) theVal); if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) { - aCustom->Set0DSize(theVal); + aCustom->Set0DSize((float) theVal); } if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) { - aCustom->Set0DSize(theVal); + aCustom->Set0DSize((float) theVal); } Modified(); @@ -2222,13 +2191,13 @@ double SMESH_ActorDef::Get0DSize() void SMESH_ActorDef::SetBallSize(double theVal) { - myBallProp->SetPointSize(theVal); + myBallProp->SetPointSize((float) theVal); if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) { - aCustom->SetBallSize(theVal); + aCustom->SetBallSize((float) theVal); } if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) { - aCustom->SetBallSize(theVal); + aCustom->SetBallSize((float) theVal); } Modified(); @@ -2257,7 +2226,7 @@ void SMESH_ActorDef::SetBallScale( double theVal ) Modified(); } -int SMESH_ActorDef::GetObjDimension( const int theObjId ) +int SMESH_ActorDef::GetObjDimension( const vtkIdType theObjId ) { return myVisualObj->GetElemDimension( theObjId ); } @@ -2525,9 +2494,9 @@ void SMESH_ActorDef::UpdateDistribution() std::vector nbEvents; std::vector funValues; SMESH_VisualObjDef::TEntityList elems; - if ( ! dynamic_cast(myVisualObj.get())) - dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); - std::vector elemIds; elemIds.reserve( elems.size() ); + if ( dynamic_cast(myVisualObj.get())) + dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); + 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()); @@ -2582,6 +2551,115 @@ void SMESH_ActorDef::SetMarkerTexture( int theMarkerId, VTK::MarkerTexture theMa myMarkerTexture = theMarkerTexture; // for deferred update of myHighlightActor } +void SMESH_ActorDef::UpdateFilter() +{ + unsigned int anObjectEntities = eAllEntity; // entities present in my object + + if(!myVisualObj->GetNbEntities(SMDSAbs_0DElement)) { + anObjectEntities &= ~e0DElements; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Ball)) { + anObjectEntities &= ~eBallElem; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)) { + anObjectEntities &= ~eEdges; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Face)) { + anObjectEntities &= ~eFaces; + } + + if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)) { + anObjectEntities &= ~eVolumes; + } + + 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 & e0DElements) { + aFilter->RegisterCellsWithType(VTK_VERTEX); + aHltFilter->RegisterCellsWithType(VTK_VERTEX); + } + + if (myEntityMode & eBallElem) { + aFilter->RegisterCellsWithType(VTK_POLY_VERTEX); + } + 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()); +} + #ifndef DISABLE_PLOT2DVIEWER SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() { @@ -2602,9 +2680,9 @@ SPlot2d_Histogram* SMESH_ActorDef::UpdatePlot2Histogram() std::vector nbEvents; std::vector funValues; SMESH_VisualObjDef::TEntityList elems; - if ( ! dynamic_cast(myVisualObj.get())) - dynamic_cast(myVisualObj.get())->GetEntities( fun->GetType(), elems ); - std::vector elemIds; + 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());