From 426c37e4f6bce7d94cd64410912e711d1616b05d Mon Sep 17 00:00:00 2001 From: Konstantin Leontev Date: Wed, 19 Apr 2023 16:53:41 +0100 Subject: [PATCH] [bos #32736][CEA] Threshold of criteria. Added Threshold and Wireframe Off checkbox to the Scalar Bar Properties dialog. --- src/OBJECT/SMESH_Actor.cxx | 50 +++++++++++++++ src/OBJECT/SMESH_Actor.h | 4 ++ src/OBJECT/SMESH_ActorDef.h | 6 ++ .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 64 +++++++++++++++++-- .../SMESHGUI_Preferences_ScalarBarDlg.h | 8 +++ src/SMESHGUI/SMESH_msg_en.ts | 8 +++ src/SMESHGUI/SMESH_msg_fr.ts | 8 +++ src/SMESHGUI/SMESH_msg_ja.ts | 8 +++ 8 files changed, 151 insertions(+), 5 deletions(-) diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index e61144f6b..d9e47586c 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -80,6 +80,9 @@ #include #include +#include +#include + #include "utilities.h" @@ -838,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; @@ -1821,6 +1826,8 @@ void SMESH_ActorDef::UpdateHighlight() case SMESH_DeviceActor::eSurface: case SMESH_DeviceActor::eWireframe: { + anIsVisible = !IsWireframeOff(); + if(myIsHighlighted) { myHighlitableActor->SetProperty(myHighlightProp); }else if(myIsPreselected){ @@ -2487,6 +2494,49 @@ void SMESH_ActorDef::UpdateScalarBar() } +// Hides the cells beyond threshold if isThresholdOn == true. +void SMESH_ActorDef::ClipThreshold(bool isThresholdOn, double min /*= 0.0*/, double max /*= 0.0*/) +{ + 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(myControlActor->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(); + myControlActor->myPassFilter[0]->SetInputConnection(port); + } + else + { + // Restore the filters' chain + myControlActor->SetImplicitFunctionUsed(myControlActor->myIsImplicitFunctionUsed); + } +} + +// Hides the wireframe if isWireframeOff == true. +void SMESH_ActorDef::SetWireframeOff(bool isWireframeOff) +{ + myIsWireframeOff = isWireframeOff; + + UpdateHighlight(); +} + void SMESH_ActorDef::UpdateDistribution() { if(SMESH::Controls::NumericalFunctor* fun = diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index ac9fd48cd..aa1c67625 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -166,6 +166,10 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor virtual void UpdateScalarBar() = 0; virtual void UpdateDistribution() = 0; + virtual void ClipThreshold(bool isThresholdOn, double min = 0.0, double max = 0.0) = 0; + virtual bool IsClipThresholdOn() const = 0; + virtual void SetWireframeOff(bool isWireframeOff) = 0; + virtual bool IsWireframeOff() const = 0; virtual void SetPointsFontProperties( SMESH::LabelFont family, int size, bool bold, bool italic, bool shadow, diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h index 757b47a19..98c229d85 100644 --- a/src/OBJECT/SMESH_ActorDef.h +++ b/src/OBJECT/SMESH_ActorDef.h @@ -226,6 +226,10 @@ class SMESH_ActorDef : public SMESH_Actor virtual void UpdateScalarBar(); virtual void UpdateDistribution(); + virtual void ClipThreshold(bool isThresholdOn, double min = 0.0, double max = 0.0); + virtual bool IsClipThresholdOn() const { return myIsClipThresholdOn; } + virtual void SetWireframeOff(bool isWireframeOff); + virtual bool IsWireframeOff() const { return myIsWireframeOff; } #ifndef DISABLE_PLOT2DVIEWER virtual SPlot2d_Histogram* GetPlot2Histogram() { return my2dHistogram; } @@ -300,6 +304,8 @@ class SMESH_ActorDef : public SMESH_Actor int myRepresentationCache; bool myIsEntityModeCache; bool myIsPointsVisible; + bool myIsClipThresholdOn = false; + bool myIsWireframeOff = false; bool myIsShrinkable; bool myIsShrunk; diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx index ce5e3462c..76752d62d 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx @@ -50,6 +50,8 @@ #include +#include "utilities.h" + // Qt includes #include #include @@ -146,11 +148,21 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myLogarithmicCheck->setText(tr("SMESH_LOGARITHMIC_SCALARBAR")); myLogarithmicCheck->setChecked(false); + myThresholdCheck = new QCheckBox (myRangeGrp); + myThresholdCheck->setText(tr("SMESH_TRESHOLD_SCALARBAR")); + myThresholdCheck->setChecked(false); + + myWireframeOffCheck = new QCheckBox (myRangeGrp); + myWireframeOffCheck->setText(tr("SMESH_WIREFRAME_OFF_SCALARBAR")); + myWireframeOffCheck->setChecked(false); + myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MIN" ), myRangeGrp ), 0, 0, 1, 1 ); myRangeGrpLayout->addWidget( myMinEdit, 0, 1, 1, 1 ); myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MAX" ), myRangeGrp ), 0, 2, 1, 1 ); myRangeGrpLayout->addWidget( myMaxEdit, 0, 3, 1, 1 ); - myRangeGrpLayout->addWidget( myLogarithmicCheck, 1, 0, 1, 4 ); + myRangeGrpLayout->addWidget( myLogarithmicCheck, 1, 0, 1, 1 ); + myRangeGrpLayout->addWidget( myThresholdCheck, 1, 1, 1, 1 ); + myRangeGrpLayout->addWidget( myWireframeOffCheck, 1, 2, 1, 1 ); aTopLayout->addWidget( myRangeGrp ); @@ -564,6 +576,9 @@ bool SMESHGUI_Preferences_ScalarBarDlg::onApply() myLookupTable->SetRange( aMin, aMax ); myLookupTable->SetNumberOfTableValues(myColorsSpin->value()); + applyThreshold(aMin, aMax); + + applyWireframeOff(); bool scaleChanged = (myLogarithmicCheck->isChecked() != (myLookupTable->GetScale() == VTK_SCALE_LOG10)); if (scaleChanged) @@ -656,8 +671,15 @@ void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() myLogarithmicCheck->setChecked(aLookupTable->GetScale() == VTK_SCALE_LOG10); //myLogarithmicCheck->setEnabled(range[0] > 1e-07 && range[1] > 1e-07); myLogarithmicCheck->setEnabled(range[0] != range[1]); + + myThresholdCheck->setChecked(myActor->IsClipThresholdOn()); + applyThreshold(range[0], range[1]); + + myWireframeOffCheck->setChecked(myActor->IsWireframeOff()); } + applyWireframeOff(); + vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); double aTColor[3]; aTitleTextPrp->GetColor( aTColor ); @@ -736,11 +758,19 @@ void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() //================================================================================================= void SMESHGUI_Preferences_ScalarBarDlg::onMinMaxChanged() { - double aMin = myMinEdit->text().toDouble(); - double aMax = myMaxEdit->text().toDouble(); - bool isLogarithmicEnabled = (aMin > 1e-07 && aMax > 1e-07); - myLogarithmicCheck->setChecked(isLogarithmicEnabled); + // Check if the min-max range is valid. + const double aMin = myMinEdit->text().toDouble(); + const double aMax = myMaxEdit->text().toDouble(); + const bool isLogarithmicEnabled = aMin > 1e-07 && aMax > 1e-07; // TODO: is it right validation? + + // The checkbox should be enabled only when the range is valid for it myLogarithmicCheck->setEnabled(isLogarithmicEnabled); + + // Change checkbox only if the range is not valid. Otherwise it's on the user decision. + if (!isLogarithmicEnabled) + { + myLogarithmicCheck->setChecked(isLogarithmicEnabled); + } } //================================================================================================= @@ -873,3 +903,27 @@ void SMESHGUI_Preferences_ScalarBarDlg::initScalarBarFromResources() DEF_VER_H = mgr->doubleValue("SMESH", name.arg( "height" )); } } + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::applyThreshold() + * + * Hides and shows elements beyond the given min - max range by threshold filter inside the actor. + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::applyThreshold(double min, double max) +{ + myActor->ClipThreshold(myThresholdCheck->isChecked(), min, max); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::applyWireframeOff() + * + * Hides and shows edges' lines. + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::applyWireframeOff() +{ + myActor->SetWireframeOff(myWireframeOffCheck->isChecked()); +} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h index 297f84ee4..08b600cb6 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h @@ -50,6 +50,8 @@ class SalomeApp_IntSpinBox; class QtxColorButton; class LightApp_SelectionMgr; +class vtkLookupTable; + class SMESHGUI_EXPORT SMESHGUI_Preferences_ScalarBarDlg : public QDialog { Q_OBJECT @@ -70,6 +72,10 @@ public: const double ); void initScalarBarFromResources(); +protected: + void applyThreshold(double min, double max); + void applyWireframeOff(); + protected slots: virtual void reject(); @@ -97,6 +103,8 @@ private: QLineEdit* myMinEdit; QLineEdit* myMaxEdit; QCheckBox* myLogarithmicCheck; + QCheckBox* myThresholdCheck; + QCheckBox* myWireframeOffCheck; QGroupBox* myFontGrp; QtxColorButton* myTitleColorBtn; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index a627143da..fb04b585c 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -2224,6 +2224,14 @@ Check algorithm documentation for supported geometry SMESH_LOGARITHMIC_SCALARBAR Logarithmic + + SMESH_TRESHOLD_SCALARBAR + Threshold + + + SMESH_WIREFRAME_OFF_SCALARBAR + Wireframe Off + SMESH_MAKE_GROUPS Generate groups diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 726b2633b..7fe5b7096 100644 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -2222,6 +2222,14 @@ Référez-vous à la documentation sur l'algorithme et la géométrie supportée SMESH_LOGARITHMIC_SCALARBAR Logarithmique + + SMESH_TRESHOLD_SCALARBAR + Seuil + + + SMESH_WIREFRAME_OFF_SCALARBAR + Filaire désactivé + SMESH_MAKE_GROUPS Générer les groupes diff --git a/src/SMESHGUI/SMESH_msg_ja.ts b/src/SMESHGUI/SMESH_msg_ja.ts index 369b86a57..01277cbd8 100644 --- a/src/SMESHGUI/SMESH_msg_ja.ts +++ b/src/SMESHGUI/SMESH_msg_ja.ts @@ -1979,6 +1979,14 @@ SMESH_LOGARITHMIC_SCALARBAR 対数 + + SMESH_TRESHOLD_SCALARBAR + しきい値 + + + SMESH_WIREFRAME_OFF_SCALARBAR + ワイヤーフレーム オフ + SMESH_MAKE_GROUPS グループを生成します。 -- 2.30.2