===========================================================================**/
#include <QFileDialog>
+#include <QShortcut>
+
+#include <algorithm>
// vv
#include "vvToolProfile.h"
#include <vtkRendererCollection.h>
#include <vtkRenderer.h>
+#include <vtkLine.h>
+#include <vtkCellArray.h>
+#include <vtkCellData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkBox.h>
+#include <vtkInformation.h>
+
//------------------------------------------------------------------------------
// Create the tool and automagically (I like this word) insert it in
// the main window menu.
{
// GUI Initialization
Ui_vvToolProfile::setupUi(mToolWidget);
+
+ QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
+ shortcutPoint1->setContext(Qt::ApplicationShortcut);
+ QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
+ QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
+ shortcutPoint2->setContext(Qt::ApplicationShortcut);
+ QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
// Connect signals & slots
connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
//------------------------------------------------------------------------------
vvToolProfile::~vvToolProfile()
{
- connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
+ delete [] mPoint1;
+ delete [] mPoint2;
}
//------------------------------------------------------------------------------
{
QString position = "";
+ if(mCurrentSlicerManager) {
if (mPoint1Selected) {
ProfileWidget->hide();
vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
}
mPoint1Selected = false;
- if(mCurrentSlicerManager) {
+
if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
double *pos;
- int *index;
pos = new double [4];
pos[0] = pos[1] = pos[2] = pos[3] = 0;
- index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
int i(0);
while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
- index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
position += QString::number(pos[i],'f',1) + " ";
- mPoint1[i] = index[i];
+ mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
++i;
}
if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
- index[3] = (int)pos[3];
position += QString::number(pos[3],'f',1) + " ";
- mPoint1[3] = index[3];
+ mPoint1[3] = round(pos[3]);
}
mPoint1Selected = true;
mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
{
QString position = "";
+ if(mCurrentSlicerManager) {
if (mPoint2Selected) {
ProfileWidget->hide();
vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
}
mPoint2Selected = false;
- if(mCurrentSlicerManager) {
if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
double *pos;
- int *index;
pos = new double [4];
pos[0] = pos[1] = pos[2] = pos[3] = 0;;
- index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
int i(0);
while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
- index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
position += QString::number(pos[i],'f',1) + " ";
- mPoint2[i] = index[i];
+ mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
++i;
}
if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
- index[3] = (int)pos[3];
position += QString::number(pos[3],'f',1) + " ";
- mPoint2[3] = index[3];
+ mPoint2[3] = round(pos[3]);
}
mPoint2Selected = true;
mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
if (mPoint1Selected && mPoint2Selected) {
mSaveProfileButton->setEnabled(true);
computeProfile();
- //DisplayLine();
+ SetPoints();
+ for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+ DisplayLine(i);
+ connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
+ connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
+ }
+ mCurrentSlicerManager->Render();
}
- else
+ else {
mSaveProfileButton->setEnabled(false);
-
+ for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+ disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
+ disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
+ mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
+ }
+
+ }
return (mPoint1Selected && mPoint2Selected);
}
//------------------------------------------------------------------------------
void vvToolProfile::computeProfile()
{
if (!mCurrentSlicerManager) close();
-
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
GetArgsInfoFromGUI();
ProfileWidget->hide();
-
+
// Main filter
mFilter->SetInputVVImage(mCurrentImage);
mFilter->SetArgsInfo(mArgsInfo);
mFilter->Update();
- //mImageLine = mFilter->GetOutputVVImage();
+ //Creation of the XY chart
vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
arrY = mFilter->GetArrayY();
arrX->SetName("Distance (mm)");
arrY->SetName("Intensity");
+
table->AddColumn(arrX);
table->AddColumn(arrY);
//------------------------------------------------------------------------------
void vvToolProfile::RemoveVTKObjects()
{
+ for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+ mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
+ }
+
if (mPoint1Selected)
mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
if (mPoint2Selected)
if (mCurrentSlicerManager)
mCurrentSlicerManager->Render();
-
- delete [] mPoint1;
- delete [] mPoint2;
}
//------------------------------------------------------------------------------
bool vvToolProfile::close()
{
//RemoveVTKObjects();
+
+ connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
return vvToolWidgetBase::close();
}
//------------------------------------------------------------------------------
mSaveProfileButton->setEnabled(false);
mTextFileName = "Profile.txt";
- mImageLine = vvImage::New();
+ InitializeLine();
disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
}
mArgsInfo.input_arg = new char;
mArgsInfo.output_arg = new char;
+
+
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolProfile::apply()
{
- reject();
+ close();
}
//------------------------------------------------------------------------------
fileOpen << endl;
while (i<arrX->GetNumberOfTuples()) {
- fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
+ fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
coords->GetTuple(i, tuple);
for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
//------------------------------------------------------------------------------
-void vvToolProfile::DisplayLine()
+void vvToolProfile::DeleteLine(int slicer)
+{
+ if (!mPoint1Selected && !mPoint2Selected)
+ return;
+
+ if(mCurrentSlicerManager) {
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolProfile::DisplayLine(int slicer)
{
if (!mPoint1Selected && !mPoint2Selected)
return;
if(mCurrentSlicerManager) {
if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
- double *pos;
+ if (std::min(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) <= mCurrentSlicerManager->GetSlicer(slicer)->GetSlice() && std::max(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) >= mCurrentSlicerManager->GetSlicer(slicer)->GetSlice()) {
+ vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
+ double extent[6];
+ for (int j=0; j<6; ++j) {
+ extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
+ }
+ extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2 ]-fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
+ extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2+1 ]+fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
+ clippingBox->SetBounds(extent);
+
+ vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
+ clipper->SetClipFunction(clippingBox);
+#if VTK_MAJOR_VERSION <= 5
+ clipper->SetInput(mLinesPolyData);
+#else
+ clipper->SetInputData(mLinesPolyData);
+#endif
+ clipper->InsideOutOff();
+ clipper->Update();
+ vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+#if VTK_MAJOR_VERSION <= 5
+ lineMapper->SetInput(clipper->GetOutput());
+#else
+ lineMapper->SetInputData(clipper->GetOutput());
+#endif
+
+ mLineActors[slicer]->SetMapper(lineMapper);
+ mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
+
+ mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
+ }
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolProfile::InitializeLine()
+{
+ if(mCurrentSlicerManager) {
+
+ mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
+
+ vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
+ double pos[4];
+ pos[0] = pos[1] = pos[2] = pos[3] = 0;
+ pts->InsertNextPoint(pos);
+ pts->InsertNextPoint(pos);
+ mLinesPolyData->SetPoints(pts);
+
+ vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
+ vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
+ line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
+ line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
+ lines->InsertNextCell(line);
+ mLinesPolyData->SetLines(lines);
+
+ unsigned char red[3] = { 255, 0, 0 };
+ vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
+ colors->SetNumberOfComponents(3);
+ colors->InsertNextTupleValue(red);
+ mLinesPolyData->GetCellData()->SetScalars(colors);
+
+ for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+ mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolProfile::SetPoints()
+{
+ if (!mPoint1Selected && !mPoint2Selected)
+ return;
+
+ if(mCurrentSlicerManager) {
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ /*double *pos;
pos = new double [4];
pos[0] = pos[1] = pos[2] = pos[3] = 0;
}
if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
- }
+ } */
- /*double p0[4];
- if (mPoint1Selected) {
- p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
- p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
- p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
- p0[3] = mPoint1[3];
- }
- else {
- p0[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
- p0[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
- p0[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
- p0[3] = mPoint2[3];
- }
- vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
- pts->InsertNextPoint(p0);
- pts->InsertNextPoint(pos);
-
- vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
- linesPolyData->SetPoints(pts);
-
- vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
- line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the Origin in linesPolyData's points
- line->GetPointIds()->SetId(1, 1); // the second 1 is the index of P0 in linesPolyData's points
-
- vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
- lines->InsertNextCell(line);
-
- linesPolyData->SetLines(lines);
-
- unsigned char red[3] = { 255, 0, 0 };
-
- vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
- colors->SetNumberOfComponents(3);
- colors->InsertNextTupleValue(red);
-
- linesPolyData->GetCellData()->SetScalars(colors);
-
-
- vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
-#if VTK_MAJOR_VERSION <= 5
- lineMapper->SetInput(linesPolyData);
-#else
- lineMapper->SetInputData(linesPolyData);
-#endif
- vtkSmartPointer<vtkActor> lineActor = vtkSmartPointer<vtkActor>::New();
- lineActor->SetMapper(lineMapper);
- lineActor->GetProperty()->SetOpacity(0.995); //in order to get VTK to turn on the alpha-blending in OpenGL
-
- for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
- mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->AddActor(lineActor);
- }*/
-
- mOverlayActors.clear();
- for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
- mOverlayActors.push_back(vvBinaryImageOverlayActor::New());
- mOverlayActors[i]->SetImage(mImageLine, 0);
- mOverlayActors[i]->SetColor(1,0,0);
- mOverlayActors[i]->SetOpacity(0.995); //in order to get VTK to turn on the alpha-blending in OpenGL
- mOverlayActors[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
- mOverlayActors[i]->Initialize(true);
- mOverlayActors[i]->SetDepth(1);
- mOverlayActors[i]->ShowActors();
- mOverlayActors[i]->UpdateSlice(i, mCurrentSlicerManager->GetSlicer(i)->GetSlice(), false);
- }
- }
+ double p0[4], p1[4];
+ p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
+ p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
+ p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
+ p0[3] = mPoint1[3];
+
+ p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
+ p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
+ p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
+ p1[3] = mPoint2[3];
+
+ vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
+ pts->SetPoint(0,p0);
+ pts->SetPoint(1,p1);
+ }
}
- mCurrentSlicerManager->Render();
}
//------------------------------------------------------------------------------
+