00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkPiecewiseFunctionCanvas.h"
00019
00020 #include <QPainter>
00021 #include <QLineEdit>
00022
00023 QmitkPiecewiseFunctionCanvas::QmitkPiecewiseFunctionCanvas(QWidget * parent,
00024 Qt::WindowFlags f) :
00025 QmitkTransferFunctionCanvas(parent, f), m_PiecewiseFunction(0)
00026 {
00027
00028 setContentsMargins(1,1,1,1);
00029 }
00030
00031 void QmitkPiecewiseFunctionCanvas::SetTitle(std::string title)
00032 {
00033 m_Title=title;
00034 }
00035
00036 void QmitkPiecewiseFunctionCanvas::paintEvent(QPaintEvent*)
00037 {
00038 QPainter painter(this);
00039
00040 if( ! this->isEnabled() )
00041 {
00042 painter.setPen(Qt::gray);
00043 painter.drawRect(0, 0, contentsRect().width()+1, contentsRect().height()+1);
00044 return;
00045 }
00046
00047 PaintHistogram(painter);
00048
00049 if (m_Title.size()>0)
00050 {
00051 painter.setPen(Qt::black);
00052 painter.drawText(QPoint(11,21),QString( m_Title.c_str() ));
00053 painter.setPen(Qt::white);
00054 painter.drawText(QPoint(10,20),QString( m_Title.c_str() ));
00055 }
00056
00057 {
00058 QString qs_min = QString::number( m_Min );
00059 QString qs_max = QString::number( m_Max );
00060
00061 QRect qr_min = painter.fontMetrics().boundingRect( qs_min );
00062 QRect qr_max = painter.fontMetrics().boundingRect( qs_max );
00063
00064 int y,x;
00065
00066 y=this->contentsRect().height()-qr_min.height()+5;
00067 x=10;
00068
00069 painter.setPen(Qt::black);
00070 painter.drawText(QPoint(x+1,y+1),qs_min);
00071 painter.setPen(Qt::white);
00072 painter.drawText(QPoint(x ,y ),qs_min);
00073
00074 y=this->contentsRect().height()-qr_max.height()+5;
00075 x=this->contentsRect().width()-qr_max.width()-6;
00076
00077 painter.setPen(Qt::black);
00078 painter.drawText(QPoint(x,y+1),qs_max);
00079 painter.setPen(Qt::white);
00080 painter.drawText(QPoint(x,y ),qs_max);
00081 }
00082
00083 painter.setPen(Qt::gray);
00084
00085 QRect contentsRect = this->contentsRect();
00086 painter.drawRect(0, 0, contentsRect.width()+1, contentsRect.height()+1);
00087 if (m_PiecewiseFunction)
00088 {
00089 vtkFloatingPointType* dp = m_PiecewiseFunction->GetDataPointer();
00090
00091
00092
00093 painter.setPen(Qt::black);
00094
00095 for (int i = -1; i < m_PiecewiseFunction->GetSize(); i++)
00096 {
00097 std::pair<int,int> left;
00098 std::pair<int,int> right;
00099
00100 if(i < 0)
00101 left = this->FunctionToCanvas(std::make_pair(-32768, dp[0 * 2 + 1]));
00102 else
00103 left = this->FunctionToCanvas(std::make_pair(dp[i * 2], dp[i * 2 + 1]));
00104
00105 if(i+1 >= m_PiecewiseFunction->GetSize())
00106 right = this->FunctionToCanvas(std::make_pair(32768, dp[(i ) * 2 + 1]));
00107 else
00108 right = this->FunctionToCanvas(std::make_pair(dp[(i+1) * 2], dp[(i+1) * 2 + 1]));
00109
00110 painter.drawLine(left.first, left.second, right.first, right.second);
00111 }
00112
00113
00114
00115 for (int i = 0; i < m_PiecewiseFunction->GetSize(); i++)
00116 {
00117 std::pair<int,int> point = this->FunctionToCanvas(std::make_pair(
00118 dp[i * 2], dp[i * 2 + 1]));
00119
00120 if (i == m_GrabbedHandle)
00121 {
00122 painter.setBrush(QBrush(Qt::red));
00123 if (m_LineEditAvailable)
00124 {
00125 m_XEdit->setText(QString::number(GetFunctionX(m_GrabbedHandle)));
00126 m_YEdit->setText(QString::number(GetFunctionY(m_GrabbedHandle)));
00127 }
00128 }
00129 else
00130 {
00131 painter.setBrush(QBrush(Qt::green));
00132 }
00133 painter.drawEllipse(point.first - 4, point.second - 4, 8, 8);
00134 }
00135
00136 painter.setBrush(Qt::NoBrush);
00137 }
00138 }
00139
00140 int QmitkPiecewiseFunctionCanvas::GetNearHandle(int x, int y,
00141 unsigned int maxSquaredDistance)
00142 {
00143 vtkFloatingPointType* dp = m_PiecewiseFunction->GetDataPointer();
00144 for (int i = 0; i < m_PiecewiseFunction->GetSize(); i++)
00145 {
00146 std::pair<int,int> point = this->FunctionToCanvas(std::make_pair(dp[i * 2],
00147 dp[i * 2 + 1]));
00148 if ((unsigned int) ((point.first - x) * (point.first - x) + (point.second
00149 - y) * (point.second - y)) <= maxSquaredDistance)
00150 {
00151 return i;
00152
00153 }
00154 }
00155 return -1;
00156 }
00157
00158 void QmitkPiecewiseFunctionCanvas::MoveFunctionPoint(int index,
00159 std::pair<vtkFloatingPointType,vtkFloatingPointType> pos)
00160 {
00161 RemoveFunctionPoint(GetFunctionX(index));
00162 AddFunctionPoint(pos.first, pos.second);
00163
00164 }