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=1d0400ce20925081a17606289449d298f477c36b;hb=HEAD;hpb=fa95110a3b64cb8323176103200e3dd17f0ed67e diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 1d0400ce2..2799e4494 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -80,6 +80,9 @@ #include #include +#include +#include + #include "utilities.h" @@ -120,6 +123,7 @@ SMESH_ActorDef::SMESH_ActorDef() myIsPointsVisible = false; myIsEntityModeCache = false; myRepresentationCache = 0; + objectEntitiesCache = 0; myHighlightActor = SMESH_SVTKActor::New(); myHighlightActor->Delete(); // vtkSmartPointer! @@ -837,6 +841,8 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) my3DActor->GetMapper()->SetScalarVisibility(false); myBallActor->GetMapper()->SetScalarVisibility(false); myScalarBarActor->SetVisibility(false); + ClipThreshold(false); + SetWireframeOff(false); bool anIsScalarVisible = theMode > eNone; @@ -947,6 +953,14 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) myControlActor = my3DActor; break; } + case eScaledJacobian: + { + SMESH::Controls::ScaledJacobian* aControl = new SMESH::Controls::ScaledJacobian(); + aControl->SetPrecision( myControlsPrecision ); + myFunctor.reset( aControl ); + myControlActor = my3DActor; + break; + } case eMaxElementLength2D: { SMESH::Controls::MaxElementLength2D* aControl = new SMESH::Controls::MaxElementLength2D(); @@ -999,6 +1013,14 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) myControlActor = my2DActor; break; } + case eWarping3D: + { + SMESH::Controls::Warping3D* aControl = new SMESH::Controls::Warping3D(); + aControl->SetPrecision(myControlsPrecision); + myFunctor.reset(aControl); + myControlActor = my3DActor; + break; + } case eSkew: { SMESH::Controls::Skew* aControl = new SMESH::Controls::Skew(); @@ -1064,6 +1086,10 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) my1DExtActor->SetExtControlMode(myFunctor,myScalarBarActor,myLookupTable); UpdateDistribution(); break; + case eWarping3D: + my2DExtActor->SetExtControlMode(myFunctor, myScalarBarActor, myLookupTable); + UpdateDistribution(); + break; default: myControlActor->SetControlMode(myFunctor,myScalarBarActor,myLookupTable); UpdateDistribution(); @@ -1106,7 +1132,6 @@ void SMESH_ActorDef::SetControlMode( eControl theMode, bool theCheckEntityMode ) QString aTitle = QString(myScalarBarActor->GetTitle()); aTitle.replace(QRegExp("(:\\s).*"),"\\1"+ QString::number(GetNumberControlEntities())); myScalarBarActor->SetTitle(aTitle.toUtf8().constData()); - } else { if(theCheckEntityMode){ @@ -1502,12 +1527,14 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) my3DExtActor->VisibilityOff(); myScalarBarActor->VisibilityOff(); + if ( GetVisibility() ) { if ( theIsUpdateRepersentation ) SetRepresentation(GetRepresentation()); - - if(myControlMode != eNone) { + + // Avoid calling VisibilityOn of ExtActor after editing hypothesis. Use the same criteria than scalarBarActor + if( myControlMode != eNone && myFunctor && myVisualObj->GetNbEntities( myFunctor->GetType() ) ) { switch(myControlMode) { case eFreeNodes: case eCoincidentNodes: @@ -1528,6 +1555,7 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) case eBareBorderFace: case eOverConstrainedFace: case eCoincidentElems2D: + case eWarping3D: my2DExtActor->VisibilityOn(); break; case eBareBorderVolume: @@ -1537,14 +1565,14 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation) break; default:; } - if ( myFunctor && myVisualObj->GetNbEntities( myFunctor->GetType() )) - myScalarBarActor->VisibilityOn(); - } + myScalarBarActor->VisibilityOn(); + } if ( GetPickable( )) myPickableActor->VisibilityOn(); - if ( GetRepresentation() != ePoint ) + if ( GetRepresentation() != ePoint && + !(IsClipThresholdOn() && GetActorForThreshold() != myControlActor)) // Avoid calling VisibilityOn if for display result of Threshold Criteria need only ExtActor { if(myEntityMode & e0DElements ){ my0DActor->VisibilityOn(); @@ -1647,6 +1675,12 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) SetRepresentation( ePoint ); } + if ( anObjectEntities != 0 && objectEntitiesCache == 0 ) + { + objectEntitiesCache = anObjectEntities; + SetRepresentation( eSurface ); + } + if ( myEntityMode != theMode ) { myEntityMode = theMode; // entities to show @@ -1814,6 +1848,8 @@ void SMESH_ActorDef::UpdateHighlight() case SMESH_DeviceActor::eSurface: case SMESH_DeviceActor::eWireframe: { + anIsVisible = anIsVisible && !IsWireframeOff(); + if(myIsHighlighted) { myHighlitableActor->SetProperty(myHighlightProp); }else if(myIsPreselected){ @@ -2480,6 +2516,71 @@ void SMESH_ActorDef::UpdateScalarBar() } +// Get Actor for Threshold criteria compute +SMESH_DeviceActor* SMESH_ActorDef::GetActorForThreshold() +{ + switch (myControlMode) { + case eLength2D: + return my1DExtActor; + case eWarping3D: + return my2DExtActor; + default:; + return myControlActor; + } +} + +// Hides the cells beyond threshold if isThresholdOn == true. +void SMESH_ActorDef::ClipThreshold(bool isThresholdOn,double min /*= 0.0*/, double max /*= 0.0*/) +{ + SMESH_DeviceActor* anActor = GetActorForThreshold(); + if (anActor != myControlActor) + myControlActor->VisibilityOff(); + + myIsClipThresholdOn = isThresholdOn; + if (isThresholdOn) + { + // Initialize the filter + vtkSmartPointer threshold = vtkSmartPointer::New(); + + // We have set scalar data with SMESH_DeviceActor::SetControlMode() call as vtkDataSetAttributes::SCALARS. + // So, we don't need to pass an array name in SetInputArrayToProcess(). + threshold->SetInputConnection(anActor->myMergeFilter->GetOutputPort()); + threshold->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, vtkDataSetAttributes::SCALARS); + + // Set range + threshold->SetThresholdFunction(vtkThreshold::THRESHOLD_BETWEEN); + threshold->SetLowerThreshold(min); + threshold->SetUpperThreshold(max); + + // Debug output + threshold->Update(); + SCRUTE(threshold->GetOutput()->GetNumberOfCells()); + + // Add to the filters' chain + vtkAlgorithmOutput* port = threshold->GetOutputPort(); + anActor->myPassFilter[0]->SetInputConnection(port); + } + else + { + // Restore the filters' chain + anActor->SetImplicitFunctionUsed(anActor->myIsImplicitFunctionUsed); + // Restore Actor filters when after Controls, which not use ExtACtor was called Controls, which use ExtActor + // For avoid artifact's + if (anActor != myControlActor) + myControlActor->SetImplicitFunctionUsed(myControlActor->myIsImplicitFunctionUsed); + + myControlActor->VisibilityOn(); + } +} + +// Hides the wireframe if isWireframeOff == true. +void SMESH_ActorDef::SetWireframeOff(bool isWireframeOff) +{ + myIsWireframeOff = isWireframeOff; + + UpdateHighlight(); +} + void SMESH_ActorDef::UpdateDistribution() { if(SMESH::Controls::NumericalFunctor* fun =