- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
===========================================================================**/
+#include <QFileDialog>
+#include <QShortcut>
+
+#include <algorithm>
+
// vv
#include "vvToolProfile.h"
+#include "vvProgressDialog.h"
#include "vvSlicerManager.h"
#include "vvSlicer.h"
#include "vvToolInputSelectorWidget.h"
-// clitk
-#include "clitkProfileImageGenericFilter.h"
-
// vtk
+#include <vtkAxis.h>
#include <vtkImageActor.h>
#include <vtkCamera.h>
#include <vtkImageClip.h>
#include <vtkRenderWindow.h>
+#include <vtkChartXY.h>
+#include <vtkPlot.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>
+
+#ifdef Q_OS_OSX
+# include "vvOSXHelper.h"
+#endif
//------------------------------------------------------------------------------
// Create the tool and automagically (I like this word) insert it in
{
// GUI Initialization
Ui_vvToolProfile::setupUi(mToolWidget);
- //mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
+
+ 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()));
connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
- connect(mComputeProfileButton, SIGNAL(clicked()), this, SLOT(computeProfile()));
+ connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
// Initialize some widget
- //mThresholdSlider1->SetText("");
- //mThresholdSlider2->SetText("");
- //mFGSlider->SetText("Foreground value");
- //mBGSlider->SetText("Background value");
-
+ ProfileWidget->hide();
mPoint1 = NULL;
mPoint2 = NULL;
- point1Selected = false;
- point2Selected = false;
+ mPoint1Selected = false;
+ mPoint2Selected = false;
+
+ mView = vtkSmartPointer<vtkContextView>::New();
+ vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+ chart->SetAutoSize(false);
+ chart->SetRenderEmpty(true);
+ mView->GetScene()->AddItem(chart);
+ this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+ this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+ ProfileWidget->show();
+
+#ifdef Q_OS_OSX
+ disableGLHiDPI(ProfileWidget->winId());
+#endif
// Main filter
mFilter = clitk::ProfileImageGenericFilter::New();
//------------------------------------------------------------------------------
vvToolProfile::~vvToolProfile()
{
+ delete [] mPoint1;
+ delete [] mPoint2;
}
//------------------------------------------------------------------------------
void vvToolProfile::selectPoint1()
{
QString position = "";
- point1Selected = false;
+
if(mCurrentSlicerManager) {
- if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
- double *pos;
- int *index;
- pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
- index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+ if (mPoint1Selected) {
+ ProfileWidget->hide();
+ vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+ chart->SetAutoSize(false);
+ chart->SetRenderEmpty(true);
+ mView->GetScene()->ClearItems();
+ mView->GetScene()->AddItem(chart);
+ this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+ this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+ ProfileWidget->show();
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+ }
+
+ mPoint1Selected = false;
+
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ double *pos;
+ pos = new double [4];
+ pos[0] = pos[1] = pos[2] = pos[3] = 0;
- for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
- 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];
- }
- point1Selected = true;
+ int i(0);
+ while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+ pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+ ++i;
+ }
+ double posTransformed[3];
+ mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
+ i = 0;
+ while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+ pos[i] = posTransformed[i];
+ mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
+ pos[i] = mPoint1[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
+ position += QString::number(mPoint1[i],'f',0) + " ";
+ ++i;
}
+ if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+ pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+ mPoint1[3] = pos[3];
+ position += QString::number(mPoint1[3],'f',0) + " ";
+ }
+ mPoint1Selected = true;
+ mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
+ }
}
mPosPoint1Label->setText(position);
isPointsSelected();
+ mCurrentSlicerManager->Render();
}
//------------------------------------------------------------------------------
void vvToolProfile::selectPoint2()
{
QString position = "";
- point2Selected = false;
+
if(mCurrentSlicerManager) {
- if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
- double *pos;
- int *index;
- pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
- index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+ if (mPoint2Selected) {
+ ProfileWidget->hide();
+ vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+ chart->SetAutoSize(false);
+ chart->SetRenderEmpty(true);
+ mView->GetScene()->ClearItems();
+ mView->GetScene()->AddItem(chart);
+ this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+ this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+ ProfileWidget->show();
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+ }
+
+ mPoint2Selected = false;
+
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ double *pos;
+ pos = new double [4];
+ pos[0] = pos[1] = pos[2] = pos[3] = 0;;
- for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
- 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];
- }
- point2Selected = true;
+ int i(0);
+ while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+ pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+ ++i;
+ }
+ double posTransformed[3];
+ mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
+ i = 0;
+ while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
+ pos[i] = posTransformed[i];
+ mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
+ pos[i] = mPoint2[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
+ position += QString::number(mPoint2[i],'f',0) + " ";
+ ++i;
+ }
+ if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+ pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+ mPoint2[3] = pos[3];
+ position += QString::number(mPoint2[3],'f',0) + " ";
}
+ mPoint2Selected = true;
+ mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
+ mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
+ }
}
mPosPoint2Label->setText(position);
isPointsSelected();
+ mCurrentSlicerManager->Render();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
bool vvToolProfile::isPointsSelected()
{
- if (point1Selected && point2Selected)
- mComputeProfileButton->setEnabled(true);
- else
- mComputeProfileButton->setEnabled(false);
-
- return (point1Selected && point2Selected);
+ if (mPoint1Selected && mPoint2Selected) {
+ mSaveProfileButton->setEnabled(true);
+ computeProfile();
+ 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 {
+ 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
- clitk::ProfileImageGenericFilter::Pointer filter = clitk::ProfileImageGenericFilter::New();
- filter->SetInputVVImage(mCurrentImage);
- filter->SetArgsInfo(mArgsInfo);
- filter->Update();
+ mFilter->SetInputVVImage(mCurrentImage);
+ mFilter->SetArgsInfo(mArgsInfo);
+ mFilter->Update();
- QApplication::restoreOverrideCursor();
+ //Creation of the XY chart
+ vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
+ vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
+ vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
+ arrX = mFilter->GetArrayX();
+ arrY = mFilter->GetArrayY();
+ arrX->SetName("Distance (mm)");
+ arrY->SetName("Intensity");
+
+ table->AddColumn(arrX);
+ table->AddColumn(arrY);
+
+ mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
+ vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+ chart->SetAutoSize(true);
+ mView->GetScene()->ClearItems();
+ mView->GetScene()->AddItem(chart);
+ vtkPlot *line = chart->AddPlot(vtkChart::LINE);
+#if VTK_MAJOR_VERSION <= 5
+ line->SetInput(table, 0, 1);
+#else
+ line->SetInputData(table, 0, 1);
+#endif
+ line->SetColor(0, 255, 0, 255);
+ line->SetWidth(1.0);
+ chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
+ chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
+
+ this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+ this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+ ProfileWidget->show();
+
+ QApplication::restoreOverrideCursor();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolProfile::cancelPoints()
{
+ if (mPoint1Selected)
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+ if (mPoint2Selected)
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
+ ProfileWidget->hide();
+ vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
+ chart->SetAutoSize(false);
+ chart->SetRenderEmpty(true);
+ mView->GetScene()->ClearItems();
+ mView->GetScene()->AddItem(chart);
+ this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
+ this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
+ ProfileWidget->show();
+
QString position = "";
mPosPoint1Label->setText(position);
mPosPoint2Label->setText(position);
- point1Selected = false;
- point2Selected = false;
- mComputeProfileButton->setEnabled(false);
+ mPoint1Selected = false;
+ mPoint2Selected = false;
+ mSaveProfileButton->setEnabled(false);
isPointsSelected();
+ mCurrentSlicerManager->Render();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolProfile::InteractiveDisplayToggled(bool b)
+void vvToolProfile::RemoveVTKObjects()
{
- /*mInteractiveDisplayIsEnabled = b;
- if (!mInteractiveDisplayIsEnabled) {
- RemoveVTKObjects();
- } else {
- for(unsigned int i=0; i<mImageContour.size(); i++) {
- mImageContour[i]->ShowActors();
- if (mRadioButtonLowerThan->isChecked())
- mImageContourLower[i]->ShowActors();
+ if (mCurrentSlicerManager)
+ {
+ connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
+
+ for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
+ mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
}
- if (mCurrentSlicerManager)
- mCurrentSlicerManager->Render();
- }*/
-}
-//------------------------------------------------------------------------------
+ if (mPoint1Selected)
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
+ if (mPoint2Selected)
+ mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
-//------------------------------------------------------------------------------
-void vvToolProfile::RemoveVTKObjects()
-{
- for(unsigned int i=0; i<mImageContour.size(); i++) {
- mImageContour[i]->HideActors();
- mImageContourLower[i]->HideActors();
- }
- if (mCurrentSlicerManager)
mCurrentSlicerManager->Render();
+ }
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
bool vvToolProfile::close()
{
- // RemoveVTKObjects();
+ //RemoveVTKObjects();
+
return vvToolWidgetBase::close();
}
//------------------------------------------------------------------------------
{
// DD("vvToolProfile::reject");
RemoveVTKObjects();
- delete [] mPoint1;
- delete [] mPoint2;
return vvToolWidgetBase::reject();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolProfile::enableLowerThan(bool b)
-{
- /*if (!b) {
- mThresholdSlider1->resetMaximum();
- for(unsigned int i=0; i<mImageContour.size(); i++) {
- mImageContourLower[i]->HideActors();
- }
- mCurrentSlicerManager->Render();
- } else {
- valueChangedT1(mThresholdSlider1->GetValue());
- valueChangedT2(mThresholdSlider2->GetValue());
- for(unsigned int i=0; i<mImageContour.size(); i++) {
- mImageContourLower[i]->ShowActors();
- }
- mCurrentSlicerManager->Render();
- }*/
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvToolProfile::useFGBGtoggled(bool)
-{
- if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
- mCheckBoxUseBG->toggle();
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// void vvToolProfile::InputIsSelected(std::vector<vvSlicerManager *> & m) {
-// DD("vvToolProfile::InputIsSelected vector in Profile");
-// DD(m.size());
-// }
void vvToolProfile::InputIsSelected(vvSlicerManager * m)
{
mCurrentSlicerManager = m;
- mPoint1 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
- mPoint2 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
+ mPoint1 = new double[4];
+ mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
+ mPoint2 = new double[4];
+ mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
- mComputeProfileButton->setEnabled(false);
-
- // Specific for this gui
- //mThresholdSlider1->SetValue(0);
- //mThresholdSlider2->SetValue(0);
- //mThresholdSlider1->SetImage(mCurrentImage);
- //mThresholdSlider2->SetImage(mCurrentImage);
- //mFGSlider->SetImage(mCurrentImage);
- //mBGSlider->SetImage(mCurrentImage);
- // DD(mCurrentSlicerManager->GetFileName().c_str());
- // mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
- // mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
- // mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
- // mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
-
- // Output is uchar ...
- /*mFGSlider->SetMaximum(255);
- mFGSlider->SetMinimum(0);
- mBGSlider->SetMaximum(255);
- mBGSlider->SetMinimum(0);
-
- mFGSlider->SetValue(1);
- mBGSlider->SetValue(0);
- mFGSlider->SetSingleStep(1);
- mBGSlider->SetSingleStep(1);
-
- // VTK objects for interactive display
- for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
- mImageContour.push_back(vvImageContour::New());
- mImageContour[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
- mImageContour[i]->SetColor(1.0, 0.0, 0.0);
- mImageContour[i]->SetDepth(0); // to be in front of (whe used with ROI tool)
- mImageContourLower.push_back(vvImageContour::New());
- mImageContourLower[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
- mImageContourLower[i]->SetColor(0.0, 0.0, 1.0);
- mImageContourLower[i]->SetDepth(100); // to be in front of (whe used with ROI tool)
- }
- //valueChangedT1(mThresholdSlider1->GetValue());
-
- //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
- //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
-
- //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
- //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
+ mSaveProfileButton->setEnabled(false);
+ mTextFileName = "Profile.txt";
+ InitializeLine();
- //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int)));
-
- // connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
- InteractiveDisplayToggled(mInteractiveDisplayIsEnabled); */
-}
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// void vvToolProfile::LeftButtonReleaseEvent(int slicer) {
-// DD("LeftButtonReleaseEvent");
-// for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
-// if (i == slicer);
-// mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
-// }
-// }
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvToolProfile::UpdateOrientation(int slicer,int orientation)
-{
- Update(slicer);
+ disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
}
//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-void vvToolProfile::UpdateSlice(int slicer,int slices)
-{
- Update(slicer);
-}
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvToolProfile::Update(int slicer)
-{
- //if (!mInteractiveDisplayIsEnabled) return;
- if (!mCurrentSlicerManager) close();
- //mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
- //if (mRadioButtonLowerThan->isChecked())
- // mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
-}
-//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolProfile::GetArgsInfoFromGUI()
DD(good);
*/
cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
- //bool inverseBGandFG = false;
-
- //mArgsInfo.lower_given = 1;
- /*mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
- if (mRadioButtonLowerThan->isChecked()) {
- mArgsInfo.upper_given = 1;
- mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
- if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
- mArgsInfo.upper_given = 0;
- DD("TODO : lower thres greater than greater thres ! Ignoring ");
- }
- }
- mArgsInfo.fg_arg = mFGSlider->GetValue();
- mArgsInfo.bg_arg = mBGSlider->GetValue();
-
- if (inverseBGandFG) {
- mArgsInfo.fg_arg = mFGSlider->GetValue();
- mArgsInfo.bg_arg = mBGSlider->GetValue();
- }
- mArgsInfo.fg_given = 1;
- mArgsInfo.bg_given = 1;
-
- if (mCheckBoxUseBG->isChecked()) {
- if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
- else mArgsInfo.mode_arg = (char*)"BG";
- } else mArgsInfo.mode_arg = (char*)"FG";
-*/
mArgsInfo.verbose_flag = false;
mArgsInfo.point1_arg = mPoint1;
mArgsInfo.input_arg = new char;
mArgsInfo.output_arg = new char;
+
+
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolProfile::apply()
{
- if (!mCurrentSlicerManager) close();
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- GetArgsInfoFromGUI();
-
- // Main filter
- clitk::ProfileImageGenericFilter::Pointer filter =
- clitk::ProfileImageGenericFilter::New();
- filter->SetInputVVImage(mCurrentImage);
- filter->SetArgsInfo(mArgsInfo);
- filter->Update();
-
-
- // Output
- vvImage::Pointer output = filter->GetOutputVVImage();
- std::ostringstream osstream;
- osstream << "Profiled_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
- AddImage(output,osstream.str());
- QApplication::restoreOverrideCursor();
close();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolProfile::valueChangedT2(double v)
+void vvToolProfile::SaveAs()
{
- /*// DD("valueChangedT2");
- if (mRadioButtonLowerThan->isChecked()) {
- mThresholdSlider1->SetMaximum(v);
- if (!mInteractiveDisplayIsEnabled) return;
- for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
- mImageContourLower[i]->Update(v);
+ QStringList OutputListeFormat;
+ OutputListeFormat.clear();
+ OutputListeFormat.push_back(".txt");
+
+ QString Extensions = "AllFiles(*.*)";
+ for (int i = 0; i < OutputListeFormat.count(); i++) {
+ Extensions += ";;Text File ( *";
+ Extensions += OutputListeFormat[i];
+ Extensions += ")";
+ }
+ QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
+ if (!fileName.isEmpty()) {
+ std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
+ QString fileQFormat = fileformat.c_str();
+ if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ std::string action = "Saving";
+ vvProgressDialog progress("Saving "+fileName.toStdString());
+ qApp->processEvents();
+
+ if (!mCurrentSlicerManager || !isPointsSelected()) {
+ close();
+ return;
+ }
+
+ // Output
+ mTextFileName = fileName.toStdString();
+ if (fileQFormat.isEmpty())
+ mTextFileName += ".txt";
+ ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
+
+ if(!fileOpen) {
+ cerr << "Error during saving" << endl;
+ QApplication::restoreOverrideCursor();
+ close();
+ return;
+ }
+
+ mFilter->WriteOutput(mTextFileName.c_str());
+
+ fileOpen.close();
+ QApplication::restoreOverrideCursor();
+ } else {
+ QString error = fileformat.c_str();
+ error += " format unknown !!!\n";
+ QMessageBox::information(this,tr("Saving Problem"),error);
+ SaveAs();
}
- mCurrentSlicerManager->Render();
- }*/
+ }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolProfile::DeleteLine(int slicer)
+{
+ if (!mPoint1Selected && !mPoint2Selected)
+ return;
+
+ if(mCurrentSlicerManager) {
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
+ }
+ }
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolProfile::valueChangedT1(double v)
+void vvToolProfile::DisplayLine(int slicer)
{
- /*// DD("valueChangedT1");
- if (!mCurrentSlicerManager) close();
- mThresholdSlider2->SetMinimum(v);
- // int m1 = (int)lrint(v);
- if (!mInteractiveDisplayIsEnabled) return;
- for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
- mImageContour[i]->Update(v);
+ if (!mPoint1Selected && !mPoint2Selected)
+ return;
+
+ if(mCurrentSlicerManager) {
+ if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
+ double currentSlice = (mCurrentSlicerManager->GetSlicer(slicer)->GetSlice()*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] )/ mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()];
+ if (std::min(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) <= currentSlice && std::max(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) >= currentSlice) {
+ 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)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->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)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->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
+ mLineTransform = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
+ mLineTransform->SetInputData(mLinesPolyData);
+ mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse());
+ clipper->SetInputConnection(mLineTransform->GetOutputPort());
+#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]);
+ }
+ }
}
- mCurrentSlicerManager->Render();*/
}
//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+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);
+#if VTK_MAJOR_VERSION >= 8 || (VTK_MAJOR_VERSION == 7 && VTK_MINOR_VERSION >= 1)
+ colors->InsertNextTypedTuple(red);
+#else
+ colors->InsertNextTupleValue(red);
+#endif
+ 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;
+
+ int i(0);
+ while (i<3) {
+ pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
+ ++i;
+ }
+ if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
+ pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
+ } */
+
+ double p0[4], p1[4];
+ p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
+ p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
+ p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
+ p0[3] = mPoint1[3];
+
+ p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
+ p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
+ p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
+ p1[3] = mPoint2[3];
+
+ vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
+ pts->SetPoint(0,p0);
+ pts->SetPoint(1,p1);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+