Просмотр исходного кода

Synchronize the ranges in ctkVTKVolumePropertyWidget

Julien Finet лет назад: 13
Родитель
Сommit
50e832a1e5

+ 36 - 6
Libs/Visualization/VTK/Widgets/ctkVTKScalarsToColorsWidget.cpp

@@ -100,9 +100,14 @@ void ctkVTKScalarsToColorsWidgetPrivate::setupUi(QWidget* widget)
   this->OpacityLabel->setVisible(false);
   this->OpacitySpinBox->setVisible(false);
   QObject::connect(this->XRangeSlider, SIGNAL(valuesChanged(double, double)),
-                   q, SLOT(onXRangeChanged(double, double)));
+                   q, SLOT(setXRange(double, double)));
   QObject::connect(this->YRangeSlider, SIGNAL(valuesChanged(double, double)),
-                   q, SLOT(onYRangeChanged(double, double)));
+                   q, SLOT(setYRange(double, double)));
+  QObject::connect(this->XRangeSlider, SIGNAL(valuesChanged(double, double)),
+                   q, SIGNAL(axesModified()));
+  QObject::connect(this->YRangeSlider, SIGNAL(valuesChanged(double, double)),
+                   q, SIGNAL(axesModified()));
+
   q->qvtkConnect(this->View->chart()->GetAxis(0),vtkCommand::ModifiedEvent,
                     q, SLOT(onAxesModified()));
   q->qvtkConnect(this->View->chart()->GetAxis(1),vtkCommand::ModifiedEvent,
@@ -395,26 +400,49 @@ void ctkVTKScalarsToColorsWidget::onSharpnessChanged(double sharpness)
   d->CurrentControlPointsItem->SetControlPoint(d->PointIdSpinBox->value(), point);
 }
 
+
+// ----------------------------------------------------------------------------
+void ctkVTKScalarsToColorsWidget::xRange(double* range)const
+{
+  Q_D(const ctkVTKScalarsToColorsWidget);
+  vtkAxis* xAxis = d->CurrentControlPointsItem ?
+    d->CurrentControlPointsItem->GetXAxis() : d->View->chart()->GetAxis(vtkAxis::BOTTOM);
+  Q_ASSERT(xAxis);
+  range[0] = xAxis->GetMinimum();
+  range[1] = xAxis->GetMaximum();
+}
+
 // ----------------------------------------------------------------------------
-void ctkVTKScalarsToColorsWidget::onXRangeChanged(double min, double max)
+void ctkVTKScalarsToColorsWidget::setXRange(double min, double max)
 {
   Q_D(ctkVTKScalarsToColorsWidget);
   vtkAxis* xAxis = d->CurrentControlPointsItem ?
     d->CurrentControlPointsItem->GetXAxis() : d->View->chart()->GetAxis(vtkAxis::BOTTOM);
   Q_ASSERT(xAxis);
-  xAxis->SetRange(min, max);
   d->View->scene()->SetDirty(true);
+  xAxis->SetRange(min, max);
+}
+
+// ----------------------------------------------------------------------------
+void ctkVTKScalarsToColorsWidget::yRange(double* range)const
+{
+  Q_D(const ctkVTKScalarsToColorsWidget);
+  vtkAxis* yAxis = d->CurrentControlPointsItem ?
+    d->CurrentControlPointsItem->GetYAxis() : d->View->chart()->GetAxis(vtkAxis::LEFT);
+  Q_ASSERT(yAxis);
+  range[0] = yAxis->GetMinimum();
+  range[1] = yAxis->GetMaximum();
 }
 
 // ----------------------------------------------------------------------------
-void ctkVTKScalarsToColorsWidget::onYRangeChanged(double min, double max)
+void ctkVTKScalarsToColorsWidget::setYRange(double min, double max)
 {
   Q_D(ctkVTKScalarsToColorsWidget);
   vtkAxis* yAxis = d->CurrentControlPointsItem ?
     d->CurrentControlPointsItem->GetYAxis() : d->View->chart()->GetAxis(vtkAxis::LEFT);
   Q_ASSERT(yAxis);
-  yAxis->SetRange(min, max);
   d->View->scene()->SetDirty(true);
+  yAxis->SetRange(min, max);
 }
 
 // ----------------------------------------------------------------------------
@@ -429,4 +457,6 @@ void ctkVTKScalarsToColorsWidget::onAxesModified()
     d->CurrentControlPointsItem->GetYAxis() : d->View->chart()->GetAxis(vtkAxis::LEFT);
   Q_ASSERT(yAxis);
   d->YRangeSlider->setValues(yAxis->GetMinimum(), yAxis->GetMaximum());
+    d->View->scene()->SetDirty(true);
+  //emit this->axesModified();
 }

+ 8 - 2
Libs/Visualization/VTK/Widgets/ctkVTKScalarsToColorsWidget.h

@@ -56,10 +56,18 @@ public:
   
   bool editColors()const;
   void setEditColors(bool edit);
+  
+  void xRange(double* range)const;
+  void yRange(double* range)const;
 
 public slots:
   void setCurrentControlPointsItem(vtkControlPointsItem* item);
   void setCurrentPoint(int pointId);
+  void setXRange(double min, double max);
+  void setYRange(double min, double max);
+
+signals:
+  void axesModified();
 
 protected slots:
   void onPlotAdded(vtkPlot*);
@@ -71,8 +79,6 @@ protected slots:
   void onOpacityChanged(double opacity);
   void onMidPointChanged(double midPoint);
   void onSharpnessChanged(double sharpness);
-  void onXRangeChanged(double min, double max);
-  void onYRangeChanged(double min, double max);
   void onAxesModified();
 protected:
   QScopedPointer<ctkVTKScalarsToColorsWidgetPrivate> d_ptr;

+ 37 - 0
Libs/Visualization/VTK/Widgets/ctkVTKVolumePropertyWidget.cpp

@@ -89,6 +89,13 @@ void ctkVTKVolumePropertyWidgetPrivate::setupUi(QWidget* widget)
   this->GradientWidget->view()->addPiecewiseFunction(0);
   this->ScalarOpacityThresholdWidget->setVisible(false);
 
+  QObject::connect(this->ScalarOpacityWidget, SIGNAL(axesModified()),
+                   q, SLOT(onAxesModified()), Qt::QueuedConnection);
+  QObject::connect(this->ScalarColorWidget, SIGNAL(axesModified()),
+                   q, SLOT(onAxesModified()), Qt::QueuedConnection);
+  QObject::connect(this->GradientWidget, SIGNAL(axesModified()),
+                   q, SLOT(onAxesModified()), Qt::QueuedConnection);
+
   this->GradientGroupBox->setCollapsed(true);
   this->AdvancedGroupBox->setCollapsed(true);
   
@@ -317,3 +324,33 @@ void ctkVTKVolumePropertyWidget::setUseThresholdSlider(bool enable)
   d->ScalarOpacityWidget->setVisible(!enable);
   this->updateFromVolumeProperty();
 }
+
+// ----------------------------------------------------------------------------
+void ctkVTKVolumePropertyWidget::onAxesModified()
+{
+  Q_D(ctkVTKVolumePropertyWidget);
+  //return;
+  ctkVTKScalarsToColorsWidget* senderWidget =
+    qobject_cast<ctkVTKScalarsToColorsWidget*>(this->sender());
+  
+  double xRange[2] = {0.,0.};
+  senderWidget->xRange(xRange);
+  if (senderWidget != d->ScalarOpacityWidget)
+    {
+    bool wasBlocking = d->ScalarOpacityWidget->blockSignals(true);
+    d->ScalarOpacityWidget->setXRange(xRange[0], xRange[1]);
+    d->ScalarOpacityWidget->blockSignals(wasBlocking);
+    }
+  if (senderWidget != d->ScalarColorWidget)
+    {
+    bool wasBlocking = d->ScalarColorWidget->blockSignals(true);
+    d->ScalarColorWidget->setXRange(xRange[0], xRange[1]);
+    d->ScalarColorWidget->blockSignals(wasBlocking);
+    }
+  if (senderWidget != d->GradientWidget)
+    {
+    bool wasBlocking = d->GradientWidget->blockSignals(true);
+    d->GradientWidget->setXRange(xRange[0], xRange[1]);
+    d->GradientWidget->blockSignals(wasBlocking);
+    }
+}

+ 4 - 0
Libs/Visualization/VTK/Widgets/ctkVTKVolumePropertyWidget.h

@@ -63,6 +63,10 @@ protected slots:
   void setDiffuse(double value);
   void setSpecular(double value);
   void setSpecularPower(double value);
+  
+  /// Called whenever a view (opacity, colors or gradient) has one of its axis
+  /// modified. It synchronize all the views to see the same.
+  void onAxesModified();
 
 protected:
   QScopedPointer<ctkVTKVolumePropertyWidgetPrivate> d_ptr;