| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 | 
							- /*=========================================================================
 
-   Library:   CTK
 
-  
 
-   Copyright (c) 2010  Kitware Inc.
 
-   Licensed under the Apache License, Version 2.0 (the "License");
 
-   you may not use this file except in compliance with the License.
 
-   You may obtain a copy of the License at
 
-       http://www.commontk.org/LICENSE
 
-   Unless required by applicable law or agreed to in writing, software
 
-   distributed under the License is distributed on an "AS IS" BASIS,
 
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-   See the License for the specific language governing permissions and
 
-   limitations under the License.
 
-  
 
- =========================================================================*/
 
- /// Qt includes
 
- #include <QColor>
 
- #include <QDebug>
 
- #include <QLinearGradient>
 
- #include <QGraphicsSceneMouseEvent>
 
- #include <QPainter>
 
- #include <QtGlobal>
 
- #include <QVariant>
 
- /// CTK includes
 
- #include "ctkTransferFunction.h"
 
- #include "ctkTransferFunctionItem.h"
 
- //-----------------------------------------------------------------------------
 
- class ctkTransferFunctionItemPrivate : 
 
-   public ctkPrivate<ctkTransferFunctionItem>
 
- {
 
- public:
 
-   ctkTransferFunctionItemPrivate();
 
-   void init();
 
-   QRectF               Rect;
 
-   ctkTransferFunction* TransferFunction;
 
- };
 
- //-----------------------------------------------------------------------------
 
- ctkTransferFunctionItemPrivate::ctkTransferFunctionItemPrivate()
 
- {
 
-   this->TransferFunction = 0;
 
-   this->Rect = QRectF(0.,0.,1.,1.);
 
- }
 
- //-----------------------------------------------------------------------------
 
- void ctkTransferFunctionItemPrivate::init()
 
- {
 
-   //CTK_P(ctkTransferFunctionItem);
 
- }
 
- //-----------------------------------------------------------------------------
 
- ctkTransferFunctionItem::ctkTransferFunctionItem(QGraphicsItem* parentGraphicsItem)
 
-   :QGraphicsObject(parentGraphicsItem)
 
- {
 
-   CTK_INIT_PRIVATE(ctkTransferFunctionItem);
 
-   ctk_d()->init();
 
- }
 
- //-----------------------------------------------------------------------------
 
- ctkTransferFunctionItem::ctkTransferFunctionItem(
 
-   ctkTransferFunction* transferFunction, QGraphicsItem* parentItem)
 
-   :QGraphicsObject(parentItem)
 
- {
 
-   CTK_INIT_PRIVATE(ctkTransferFunctionItem);
 
-   ctk_d()->init();
 
-   this->setTransferFunction(transferFunction);
 
- }
 
- //-----------------------------------------------------------------------------
 
- ctkTransferFunctionItem::~ctkTransferFunctionItem()
 
- {
 
-   
 
- }
 
- //-----------------------------------------------------------------------------
 
- void ctkTransferFunctionItem::setTransferFunction(ctkTransferFunction* transferFunction)
 
- {
 
-   CTK_D(ctkTransferFunctionItem);
 
-   d->TransferFunction = transferFunction;
 
- }
 
- //-----------------------------------------------------------------------------
 
- ctkTransferFunction* ctkTransferFunctionItem::transferFunction() const
 
- {
 
-   CTK_D(const ctkTransferFunctionItem);
 
-   return d->TransferFunction;
 
- }
 
- //-----------------------------------------------------------------------------
 
- void ctkTransferFunctionItem::setRect(const QRectF& newRect)
 
- {
 
-   CTK_D(ctkTransferFunctionItem);
 
-   if (d->Rect == newRect)
 
-     {
 
-     return;
 
-     }
 
-   d->Rect = newRect;
 
-   this->update();
 
- }
 
- //-----------------------------------------------------------------------------
 
- QRectF ctkTransferFunctionItem::rect() const
 
- {
 
-   CTK_D(const ctkTransferFunctionItem);
 
-   return d->Rect;
 
- }
 
- //-----------------------------------------------------------------------------
 
- QRectF ctkTransferFunctionItem::boundingRect()const
 
- {
 
-   CTK_D(const ctkTransferFunctionItem);
 
-   return d->Rect;
 
- }
 
- //-----------------------------------------------------------------------------
 
- QList<ctkPoint> ctkTransferFunctionItem::bezierParams(
 
-   ctkControlPoint* start, ctkControlPoint* end) const
 
- {
 
-   Q_ASSERT(start);
 
-   Q_ASSERT(end);
 
-   QList<ctkPoint> points; 
 
-   
 
-   ctkBezierControlPoint* bezierCP = dynamic_cast<ctkBezierControlPoint*>(start);
 
-   if (!bezierCP)
 
-     {// just duplicate start and end into p1 and p2
 
-     points << start->P;
 
-     points << start->P;
 
-     points << end->P;
 
-     points << end->P;
 
-     return points;
 
-     }
 
-   
 
-   points << start->P;
 
-   points << bezierCP->P1;
 
-   points << bezierCP->P2;
 
-   points << end->P;
 
-   return points;
 
- }
 
- //-----------------------------------------------------------------------------
 
- QList<ctkPoint> ctkTransferFunctionItem::nonLinearPoints(
 
-   ctkControlPoint* start, ctkControlPoint* end) const
 
- {
 
-   Q_ASSERT(start);
 
-     
 
-   ctkNonLinearControlPoint* nonLinearCP = 
 
-     dynamic_cast<ctkNonLinearControlPoint*>(start);
 
-   if (!nonLinearCP)
 
-     {
 
-     QList<ctkPoint> points; 
 
-     points << start->P;
 
-     points << end->P;
 
-     return points;
 
-     }
 
-   return nonLinearCP->SubPoints;
 
- }
 
- //-----------------------------------------------------------------------------
 
- qreal ctkTransferFunctionItem::y(const QVariant& v) const
 
- { 
 
-   Q_ASSERT(v.canConvert<qreal>() || v.canConvert<QColor>());
 
-   if (v.canConvert<QColor>())
 
-     {
 
-     return v.value<QColor>().alphaF();
 
-     }
 
-   return v.toReal();
 
- }
 
- //-----------------------------------------------------------------------------
 
- QColor ctkTransferFunctionItem::color(const QVariant& v) const
 
- { 
 
-   //Q_ASSERT(v.canConvert<QColor>());
 
-   if (v.canConvert<QColor>())
 
-     {
 
-     return v.value<QColor>();
 
-     }
 
-   else
 
-     {
 
-     //black background
 
-     QColor defaultColor(0., 0., 0.);
 
-     return defaultColor;
 
-     }
 
-   return QColor();
 
- }
 
- //-----------------------------------------------------------------------------
 
- qreal ctkTransferFunctionItem::rangeXDiff()
 
- {
 
-   // pointer to private class
 
-   CTK_D(ctkTransferFunctionItem);
 
-   qreal rangeX[2];
 
-   d->TransferFunction->range(rangeX);
 
-   return this->rect().width() / (rangeX[1] - rangeX[0]);
 
- }
 
- //-----------------------------------------------------------------------------
 
- qreal ctkTransferFunctionItem::rangeXOffSet()
 
- {
 
-   // pointer to private class
 
-   CTK_D(ctkTransferFunctionItem);
 
-   qreal rangeX[2];
 
-   d->TransferFunction->range(rangeX);
 
-   return rangeX[0];
 
- }
 
- //-----------------------------------------------------------------------------
 
- qreal ctkTransferFunctionItem::rangeYDiff()
 
- {
 
-   // pointer to private class
 
-   CTK_D(ctkTransferFunctionItem);
 
-   QVariant rangeY[2];
 
-   rangeY[0] = d->TransferFunction->minValue();
 
-   rangeY[1] = d->TransferFunction->maxValue();
 
-   qreal rangeYDiff = this->rect().height();
 
-   if (rangeY[0].canConvert<qreal>())
 
-     {
 
-     if (rangeY[1].toReal() == rangeY[0].toReal())
 
-       {
 
-       rangeYDiff /= rangeY[0].toReal();
 
-       return rangeYDiff;
 
-       }
 
-     else
 
-       {
 
-       rangeYDiff /= rangeY[1].toReal() - rangeY[0].toReal();
 
-       return rangeYDiff;
 
-       }
 
-     }
 
-     else if (rangeY[0].canConvert<QColor>())
 
-       {
 
-       if ( rangeY[1].value<QColor>().alphaF() == rangeY[0].value<QColor>().alphaF())
 
-         {
 
-         rangeYDiff /= rangeY[0].value<QColor>().alphaF();
 
-         return rangeYDiff;
 
-         }
 
-       else
 
-         {
 
-         rangeYDiff /= rangeY[1].value<QColor>().alphaF() - rangeY[0].value<QColor>().alphaF();
 
-         return rangeYDiff;
 
-         }
 
-       }
 
-     else
 
-       {
 
-       Q_ASSERT(rangeY[0].canConvert<qreal>() ||
 
-       rangeY[0].canConvert<QColor>());
 
-       }
 
-   return rangeYDiff;
 
- }
 
- //-----------------------------------------------------------------------------
 
- qreal ctkTransferFunctionItem::rangeYOffSet()
 
- {
 
-   // pointer to private class
 
-   CTK_D(ctkTransferFunctionItem);
 
-   QVariant rangeY[2];
 
-   rangeY[0] = d->TransferFunction->minValue();
 
-   rangeY[1] = d->TransferFunction->maxValue();
 
-   if (rangeY[0].canConvert<qreal>())
 
-     {
 
-     if (rangeY[1].toReal() == rangeY[0].toReal())
 
-       {
 
-       return 0.;
 
-       }
 
-     else
 
-       {
 
-       return rangeY[0].toReal();
 
-       }
 
-     }
 
-   else if (rangeY[0].canConvert<QColor>())
 
-     {
 
-     if ( rangeY[1].value<QColor>().alphaF() == rangeY[0].value<QColor>().alphaF())
 
-       {
 
-       return 0.;
 
-       }
 
-     else
 
-       {
 
-       return rangeY[0].value<QColor>().alphaF();
 
-       }
 
-     }
 
-   else
 
-     {
 
-     Q_ASSERT(rangeY[0].canConvert<qreal>() ||
 
-         rangeY[0].canConvert<QColor>());
 
-     }
 
-   return 0;
 
- }
 
- //-----------------------------------------------------------------------------
 
- QPointF ctkTransferFunctionItem::transferFunction2ScreenCoordinates( qreal x, qreal y)
 
- {
 
-   QPointF screenCoordinates((x - this->rangeXOffSet() ) * this->rangeXDiff(),
 
-       this->rect().height() - (y - this->rangeYOffSet() ) * this->rangeYDiff() );
 
-   return screenCoordinates;
 
- }
 
- //-----------------------------------------------------------------------------
 
- QPointF ctkTransferFunctionItem::screen2TransferFunctionCoordinates( qreal x, qreal y)
 
- {
 
-   QPointF transferFunctionCoordinates((x / this->rangeXDiff() ) + this->rangeXOffSet(),
 
-       ( - y + this->rect().height() )/this->rangeYDiff() + this->rangeYOffSet());
 
-   return transferFunctionCoordinates;
 
- }
 
 
  |