Browse Source

ENH: Transfer Function - vertical gradient added and mask added

Nicolas Rannou 15 years ago
parent
commit
3fda11fca1

+ 2 - 4
Libs/Visualization/VTK/Core/ctkVTKCompositeFunction.cpp

@@ -215,7 +215,7 @@ ctkControlPoint* ctkVTKCompositeFunction::controlPoint(int index)const
     valuesCTF[5] >= 0. && valuesCTF[5] <= 1.);   // Sharpness
 
   double subPointsCTF[30];
-  double subPointsPWF[30];
+  double subPointsPWF[10];
   d->ColorTransferFunction->GetTable(cp->x(), valuesCTF[0], 10, subPointsCTF);
   d->PiecewiseFunction->GetTable(cp->x(), valuesCTF[0], 10, subPointsPWF);
   qreal interval = (valuesCTF[0] - cp->x()) / 9.;
@@ -226,9 +226,7 @@ ctkControlPoint* ctkVTKCompositeFunction::controlPoint(int index)const
 	  qreal green =  subPointsCTF[3*i+1];
 	  qreal blue =  subPointsCTF[3*i+2];
 	  qreal alpha = subPointsPWF[i];
-	  QColor compositeValue;
-	  compositeValue.setRgb(red*255, green*255, blue*255, alpha*255 );
-	  //compositeValue. (red, green, blue, alpha);
+	  QColor compositeValue = QColor::fromRgbF(red, green, blue, alpha );
     cp->SubPoints << ctkPoint(cp->x() + interval*i, compositeValue);
   }
   return cp;

+ 4 - 4
Libs/Visualization/VTK/Widgets/Testing/Cpp/ctkTransferFunctionWidgetTest4.cpp

@@ -46,10 +46,10 @@ int ctkTransferFunctionWidgetTest4(int argc, char * argv [] )
   vtkSmartPointer<vtkPiecewiseFunction> pwf =
     vtkSmartPointer<vtkPiecewiseFunction>::New();
   //
-  pwf->AddPoint(0., 0.1);
-  pwf->AddPoint(0.2,.2);
-  pwf->AddPoint(0.3, .5);
-  pwf->AddPoint(0.9, .5);
+  pwf->AddPoint(0., 0.3, .5, .5);
+  pwf->AddPoint(0.2,.2, .5, .5);
+  pwf->AddPoint(0.3, .5, .5, .5);
+  pwf->AddPoint(0.9, .5, .5, .5);
 
   vtkSmartPointer<vtkColorTransferFunction> ctf =
     vtkSmartPointer<vtkColorTransferFunction>::New();

+ 15 - 8
Libs/Widgets/ctkTransferFunctionControlPointsItem.cpp

@@ -119,7 +119,6 @@ void ctkTransferFunctionControlPointsItem::paint(
 //-----------------------------------------------------------------------------
 void ctkTransferFunctionControlPointsItem::mousePressEvent(QGraphicsSceneMouseEvent* e)
 {
-  qDebug() << "mouse press caught";
   CTK_D(ctkTransferFunctionControlPointsItem);
   QWidget* w = e->widget();
   ctkTransferFunctionWidget* view = qobject_cast<ctkTransferFunctionWidget*>(e->widget()->parentWidget());
@@ -162,21 +161,29 @@ void ctkTransferFunctionControlPointsItem::mouseMoveEvent(QGraphicsSceneMouseEve
     e->ignore();
     return;
     }
-  //qreal range[2];
-  //this->transferFunction()->range(range);
-  //qreal newPos = range[0] + e->pos().x() / (this->rect().width() / (range[1] - range[0]));
-  //newPos = qBound(range[0], newPos, range[1]);
+
   ctkTransferFunctionScene* tfScene = dynamic_cast<ctkTransferFunctionScene*>(this->scene());
   Q_ASSERT(tfScene);
   QPointF newPos = tfScene->mapPointFromScene(e->pos());
-  this->transferFunction()->setControlPointPos(d->SelectedPoint, newPos.x());
-  this->transferFunction()->setControlPointValue(d->SelectedPoint, newPos.y());
+
+  // Deal with borders
+  if(d->SelectedPoint == 0 || d->SelectedPoint == this->transferFunction()->count() )
+    {
+    qDebug() << "border" ;
+    }
+  else if( this->transferFunction()->controlPoint(d->SelectedPoint - 1)->x() < newPos.x() &&
+      this->transferFunction()->controlPoint(d->SelectedPoint + 1)->x() > newPos.x())
+    {
+    // update pos of the point
+    this->transferFunction()->setControlPointPos( d->SelectedPoint, newPos.x());
+    // update value of the point
+    this->transferFunction()->setControlPointValue( d->SelectedPoint, newPos.y());
+    }
 }
 
 //-----------------------------------------------------------------------------
 void ctkTransferFunctionControlPointsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* e)
 {
-  qDebug() << "mouse release caught";
   CTK_D(ctkTransferFunctionControlPointsItem);
   if (d->SelectedPoint < 0)
     {

+ 18 - 5
Libs/Widgets/ctkTransferFunctionGradientItem.cpp

@@ -32,10 +32,22 @@
 #include "ctkTransferFunctionGradientItem.h"
 #include "ctkTransferFunctionScene.h"
 
+class ctkTransferFunctionGradientItemPrivate:public ctkPrivate<ctkTransferFunctionGradientItem>
+{
+public:
+  ctkTransferFunctionGradientItemPrivate();
+  bool Mask;
+};
+
+ctkTransferFunctionGradientItemPrivate::ctkTransferFunctionGradientItemPrivate()
+{
+  this->Mask = true;
+}
 //-----------------------------------------------------------------------------
 ctkTransferFunctionGradientItem::ctkTransferFunctionGradientItem(QGraphicsItem* parentGraphicsItem)
   :ctkTransferFunctionItem(parentGraphicsItem)
 {
+  CTK_INIT_PRIVATE(ctkTransferFunctionGradientItem);
 }
 
 //-----------------------------------------------------------------------------
@@ -43,7 +55,6 @@ ctkTransferFunctionGradientItem::ctkTransferFunctionGradientItem(
   ctkTransferFunction* transferFunction, QGraphicsItem* parentItem)
   :ctkTransferFunctionItem(transferFunction, parentItem)
 {
- this->Mask = true;
 }
 
 //-----------------------------------------------------------------------------
@@ -58,9 +69,10 @@ void ctkTransferFunctionGradientItem::paint(
   ctkTransferFunctionScene* tfScene = dynamic_cast<ctkTransferFunctionScene*>(this->scene());
   Q_ASSERT(tfScene);
 
+  const QGradient& gradient = tfScene->gradient();
+
   if ( this->mask() )
     {
-    const QGradient& gradient = tfScene->gradient();
     const QPainterPath& curve = tfScene->curve();
     QPainterPath closedPath = curve;
     QRectF position = this->rect();
@@ -77,7 +89,6 @@ void ctkTransferFunctionGradientItem::paint(
     }
   else
     {
-    const QGradient& gradient = tfScene->gradient();
     painter->fillRect(this->rect(), gradient);
     }
 }
@@ -85,11 +96,13 @@ void ctkTransferFunctionGradientItem::paint(
 //-----------------------------------------------------------------------------
 bool ctkTransferFunctionGradientItem::mask() const
 {
-  return this->Mask;
+  CTK_D( const ctkTransferFunctionGradientItem );
+  return d->Mask;
 }
 
 //-----------------------------------------------------------------------------
 void ctkTransferFunctionGradientItem::setMask( bool mask )
 {
-  this->Mask = mask;
+  CTK_D( ctkTransferFunctionGradientItem );
+  d->Mask = mask;
 }

+ 4 - 2
Libs/Widgets/ctkTransferFunctionGradientItem.h

@@ -23,19 +23,21 @@
 
 /// Qt includes
 #include <QGraphicsObject>
+#include <QColor>
 
 /// CTK includes
 #include "CTKWidgetsExport.h"
 #include "ctkPimpl.h"
 #include "ctkTransferFunctionItem.h"
 
-//class ctkTransferFunctionGradientItemPrivate;
+class ctkTransferFunctionGradientItemPrivate;
 
 //-----------------------------------------------------------------------------
 class CTK_WIDGETS_EXPORT ctkTransferFunctionGradientItem: public ctkTransferFunctionItem
 {
   Q_OBJECT
   Q_PROPERTY(bool Mask READ mask WRITE setMask)
+
 public:
   ctkTransferFunctionGradientItem(QGraphicsItem* parent = 0);
   ctkTransferFunctionGradientItem(ctkTransferFunction* transferFunction, 
@@ -48,7 +50,7 @@ public:
   void setMask(bool mask);
 
 private:
-  bool Mask;
+  CTK_DECLARE_PRIVATE(ctkTransferFunctionGradientItem);
 };
 
 #endif

+ 29 - 2
Libs/Widgets/ctkTransferFunctionScene.cpp

@@ -47,11 +47,13 @@ public:
   qreal        RangeXOffSet;
   qreal        RangeYDiff;
   qreal        RangeYOffSet;
+  QColor       VerticalGradientColor;
 };
 
 ctkTransferFunctionScenePrivate::ctkTransferFunctionScenePrivate()
 {
   this->TransferFunction = 0;
+  this->VerticalGradientColor = QColor::fromRgbF(1., 0., 0., 1. );
 }
 
 //-----------------------------------------------------------------------------
@@ -234,9 +236,22 @@ void ctkTransferFunctionScene::computeGradient()
   qreal startPos = this->mapXToScene(this->posX(startCP->x()));
   qreal nextPos;
   
+  //
+  //if we have no colors in value (i.e. can't convert value to color)
+  if (! d->TransferFunction->value(0).canConvert<QColor>())
+    {
+    // create vertical gradient
+    d->Gradient = QLinearGradient(0., 0., 0., 1.);
+    // red
+    d->Gradient.setColorAt(0, d->VerticalGradientColor );
+    // to black
+    d->Gradient.setColorAt(1, QColor::fromRgbF(0., 0., 0., 1. ));
+    return;
+    }
+
+  // classic gradient if we have colors in value
   d->Gradient = QLinearGradient(0., 0., 1., 0.);
   d->Gradient.setColorAt(startPos, this->color(startCP));
-
   for(int i = 1; i < count; ++i)
     {
     nextCP = d->TransferFunction->controlPoint(i);
@@ -265,7 +280,7 @@ void ctkTransferFunctionScene::computeGradient()
         {
         d->Gradient.setColorAt(this->mapXToScene(this->posX(p)), this->color(p));
         }
-      nextPos = this->mapXToScene(this->posX(points[points.size() - 1])); 
+      nextPos = this->mapXToScene(this->posX(points[points.size() - 1]));
       }
     //qDebug() << i << points[0] << points[1] << points[2] << points[3];
     delete startCP;
@@ -439,3 +454,15 @@ qreal ctkTransferFunctionScene::mapYFromScene(qreal scenePosY)const
   CTK_D(const ctkTransferFunctionScene);
   return ((this->height() - scenePosY) / d->RangeYDiff) + d->RangeYOffSet ;
 }
+//-----------------------------------------------------------------------------
+QColor ctkTransferFunctionScene::verticalGradientColor() const
+{
+  CTK_D( const ctkTransferFunctionScene );
+  return d->VerticalGradientColor;
+}
+//-----------------------------------------------------------------------------
+void ctkTransferFunctionScene::setVerticalGradientColor( QColor verticalGradientColor )
+{
+  CTK_D( ctkTransferFunctionScene );
+  d->VerticalGradientColor = verticalGradientColor;
+}

+ 6 - 1
Libs/Widgets/ctkTransferFunctionScene.h

@@ -37,7 +37,9 @@ class ctkTransferFunctionScenePrivate;
 //-----------------------------------------------------------------------------
 class CTK_WIDGETS_EXPORT ctkTransferFunctionScene: public QGraphicsScene
 {
-  Q_OBJECT;
+  Q_OBJECT
+  Q_PROPERTY(QColor VerticalGradientColor READ verticalGradientColor WRITE setVerticalGradientColor)
+
 public:
   ctkTransferFunctionScene(QObject* parent = 0);
   ctkTransferFunctionScene(ctkTransferFunction* transferFunction, QObject* parent = 0);
@@ -78,6 +80,9 @@ public:
   void computeCurve();
   void computeGradient();
 
+  QColor verticalGradientColor()const;
+  void setVerticalGradientColor(QColor verticalGradientColor);
+
 protected slots:
   virtual void onTransferFunctionChanged();