浏览代码

Support custom range in ctkVTKThresholdWidget

Julien Finet 14 年之前
父节点
当前提交
0c809d6cf3
共有 1 个文件被更改,包括 28 次插入10 次删除
  1. 28 10
      Libs/Visualization/VTK/Widgets/ctkVTKThresholdWidget.cpp

+ 28 - 10
Libs/Visualization/VTK/Widgets/ctkVTKThresholdWidget.cpp

@@ -43,10 +43,13 @@ protected:
 public:
   ctkVTKThresholdWidgetPrivate(ctkVTKThresholdWidget& object);
   void setupUi(QWidget* widget);
+
   void setThreshold(double min, double max, double opacity);
+  void setRange(double min, double max);
   void guessThreshold(double& min, double& max, double& opacity);
   
   vtkPiecewiseFunction* PiecewiseFunction;
+  bool UserRange;
 };
 
 // ----------------------------------------------------------------------------
@@ -58,6 +61,7 @@ ctkVTKThresholdWidgetPrivate::ctkVTKThresholdWidgetPrivate(
   : q_ptr(&object)
 {
   this->PiecewiseFunction = 0;
+  this->UserRange = false;
 }
 
 // ----------------------------------------------------------------------------
@@ -123,6 +127,17 @@ void ctkVTKThresholdWidgetPrivate::guessThreshold(double& min, double& max, doub
 }
 
 // ----------------------------------------------------------------------------
+void ctkVTKThresholdWidgetPrivate::setRange(double min, double max)
+{
+  bool wasBlocking = this->ThresholdSliderWidget->blockSignals(true);
+  int decimals = qMax(0, -ctk::orderOfMagnitude(max - min) + 2);
+  this->ThresholdSliderWidget->setDecimals(decimals);
+  this->ThresholdSliderWidget->setSingleStep(pow(10., -decimals));
+  this->ThresholdSliderWidget->setRange(min, max);
+  this->ThresholdSliderWidget->blockSignals(wasBlocking);
+}
+
+// ----------------------------------------------------------------------------
 void ctkVTKThresholdWidgetPrivate::setThreshold(double min, double max, double opacity)
 {
   if (!this->PiecewiseFunction)
@@ -212,16 +227,23 @@ void ctkVTKThresholdWidget
 ::setPiecewiseFunction(vtkPiecewiseFunction* newFunction)
 {
   Q_D(ctkVTKThresholdWidget);
+  if (d->PiecewiseFunction == newFunction)
+    {
+    return;
+    }
   this->qvtkReconnect(d->PiecewiseFunction, newFunction, vtkCommand::ModifiedEvent,
                       this, SLOT(updateFromPiecewiseFunction()));
   d->PiecewiseFunction = newFunction;
   
-  double range[2] = {0., 1.};
-  if (d->PiecewiseFunction)
+  if (!d->UserRange)
     {
-    d->PiecewiseFunction->GetRange(range);
+    double range[2] = {0., 1.};
+    if (d->PiecewiseFunction)
+      {
+      d->PiecewiseFunction->GetRange(range);
+      }
+    d->setRange(range[0], range[1]);
     }
-  this->setRange(range[0], range[1]);
   if (d->PiecewiseFunction)
     {
     double min, max, value;
@@ -290,10 +312,6 @@ void ctkVTKThresholdWidget::range(double* range)const
 void ctkVTKThresholdWidget::setRange(double min, double max)
 {
   Q_D(ctkVTKThresholdWidget);
-  bool wasBlocking = d->ThresholdSliderWidget->blockSignals(true);
-  int decimals = qMax(0, -ctk::orderOfMagnitude(max - min) + 2);
-  d->ThresholdSliderWidget->setDecimals(decimals);
-  d->ThresholdSliderWidget->setSingleStep(pow(10., -decimals));
-  d->ThresholdSliderWidget->setRange(min, max);
-  d->ThresholdSliderWidget->blockSignals(wasBlocking);
+  d->UserRange = true;
+  d->setRange(min, max);
 }