#include <vtkImplicitBoolean.h>
#include <vtkImplicitFunctionCollection.h>
+#include <vtkThreshold.h>
+#include <vtkPassThrough.h>
+
#include "utilities.h"
my3DActor->GetMapper()->SetScalarVisibility(false);
myBallActor->GetMapper()->SetScalarVisibility(false);
myScalarBarActor->SetVisibility(false);
+ ClipThreshold(false);
+ SetWireframeOff(false);
bool anIsScalarVisible = theMode > eNone;
case SMESH_DeviceActor::eSurface:
case SMESH_DeviceActor::eWireframe:
{
+ anIsVisible = !IsWireframeOff();
+
if(myIsHighlighted) {
myHighlitableActor->SetProperty(myHighlightProp);
}else if(myIsPreselected){
}
+// 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<vtkThreshold> threshold = vtkSmartPointer<vtkThreshold>::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 =
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,
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; }
int myRepresentationCache;
bool myIsEntityModeCache;
bool myIsPointsVisible;
+ bool myIsClipThresholdOn = false;
+ bool myIsWireframeOff = false;
bool myIsShrinkable;
bool myIsShrunk;
#include <QtxColorButton.h>
+#include "utilities.h"
+
// Qt includes
#include <QButtonGroup>
#include <QCheckBox>
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 );
myLookupTable->SetRange( aMin, aMax );
myLookupTable->SetNumberOfTableValues(myColorsSpin->value());
+ applyThreshold(aMin, aMax);
+
+ applyWireframeOff();
bool scaleChanged = (myLogarithmicCheck->isChecked() != (myLookupTable->GetScale() == VTK_SCALE_LOG10));
if (scaleChanged)
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 );
//=================================================================================================
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);
+ }
}
//=================================================================================================
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());
+}
class QtxColorButton;
class LightApp_SelectionMgr;
+class vtkLookupTable;
+
class SMESHGUI_EXPORT SMESHGUI_Preferences_ScalarBarDlg : public QDialog
{
Q_OBJECT
const double );
void initScalarBarFromResources();
+protected:
+ void applyThreshold(double min, double max);
+ void applyWireframeOff();
+
protected slots:
virtual void reject();
QLineEdit* myMinEdit;
QLineEdit* myMaxEdit;
QCheckBox* myLogarithmicCheck;
+ QCheckBox* myThresholdCheck;
+ QCheckBox* myWireframeOffCheck;
QGroupBox* myFontGrp;
QtxColorButton* myTitleColorBtn;
<source>SMESH_LOGARITHMIC_SCALARBAR</source>
<translation>Logarithmic</translation>
</message>
+ <message>
+ <source>SMESH_TRESHOLD_SCALARBAR</source>
+ <translation>Threshold</translation>
+ </message>
+ <message>
+ <source>SMESH_WIREFRAME_OFF_SCALARBAR</source>
+ <translation>Wireframe Off</translation>
+ </message>
<message>
<source>SMESH_MAKE_GROUPS</source>
<translation>Generate groups</translation>
<source>SMESH_LOGARITHMIC_SCALARBAR</source>
<translation>Logarithmique</translation>
</message>
+ <message>
+ <source>SMESH_TRESHOLD_SCALARBAR</source>
+ <translation>Seuil</translation>
+ </message>
+ <message>
+ <source>SMESH_WIREFRAME_OFF_SCALARBAR</source>
+ <translation>Filaire désactivé</translation>
+ </message>
<message>
<source>SMESH_MAKE_GROUPS</source>
<translation>Générer les groupes</translation>
<source>SMESH_LOGARITHMIC_SCALARBAR</source>
<translation>対数</translation>
</message>
+ <message>
+ <source>SMESH_TRESHOLD_SCALARBAR</source>
+ <translation>しきい値</translation>
+ </message>
+ <message>
+ <source>SMESH_WIREFRAME_OFF_SCALARBAR</source>
+ <translation>ワイヤーフレーム オフ</translation>
+ </message>
<message>
<source>SMESH_MAKE_GROUPS</source>
<translation>グループを生成します。</translation>