1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
20 #include "vvWipeImage.h"
22 #include "vvMainWindow.h"
25 #include "clitkCropImage_ggo.h"
26 #include "clitkCropImageGenericFilter.h"
27 #include "clitkExceptionObject.h"
32 #include <QApplication>
33 #include <QMessageBox>
34 #include <QSignalMapper>
35 #include <QFileDialog>
38 #include <vtkVersion.h>
39 #include <vtkStreamingDemandDrivenPipeline.h>
40 #include <vtkInformation.h>
41 #include <vtkImageData.h>
42 #include <vtkSmartPointer.h>
45 #include <extensions.h>
48 #define COLUMN_UL_VIEW 1
49 #define COLUMN_UR_VIEW 2
50 #define COLUMN_DL_VIEW 3
51 #define COLUMN_DR_VIEW 4
52 #define COLUMN_CLOSE_IMAGE 5
53 #define COLUMN_RELOAD_IMAGE 6
54 #define COLUMN_IMAGE_NAME 7
56 //------------------------------------------------------------------------------
57 vvWipeImage::vvWipeImage():
60 vtkSmartPointer<vtkImageRectilinearWipe> mWipe = vtkSmartPointer<vtkImageRectilinearWipe>::New();
62 mWipe->SetPosition(256,256);
64 //------------------------------------------------------------------------------
67 //------------------------------------------------------------------------------
68 vvWipeImage::~vvWipeImage()
71 //------------------------------------------------------------------------------
73 void vvWipeImage::Initialize(QString inputPathName, std::vector<vvSlicerManager*> slicerManagers)
75 mInputPathName = inputPathName;
76 mSlicerManagers = slicerManagers;
79 //------------------------------------------------------------------------------
80 void vvWipeImage::setInputImage(int number, vvImage::Pointer image)
82 if (image->GetVTKImages().size()) {
84 mWipe->SetInputData(number, mImage->GetVTKImages()[0]); //[0] pour du 4D ?
87 //------------------------------------------------------------------------------
91 //------------------------------------------------------------------------------
92 void vvWipeImage::crossPointerChanged()
94 mWipe->SetPosition(256,256);
97 //------------------------------------------------------------------------------
100 //------------------------------------------------------------------------------
101 void vvWipeImage::UpdateWipe()
105 //------------------------------------------------------------------------------
108 //------------------------------------------------------------------------------
109 void vvWipeImage::selectWipeImage(int index, QTreeWidget* DataTree)
112 QString Extensions = EXTENSIONS;
113 Extensions += ";;All Files (*)";
114 QStringList files = QFileDialog::getOpenFileNames(NULL,tr("Load Wipe image"),mInputPathName,Extensions);
118 std::vector<std::string> vecFileNames;
119 for (int i = 0; i < files.size(); i++) {
120 vecFileNames.push_back(files[i].toStdString());
123 AddWipeImage(index,vecFileNames,vvImageReader::IMAGE, DataTree);
125 //------------------------------------------------------------------------------
127 void vvWipeImage::AddWipeImage(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type, QTreeWidget* DataTree)
129 QString file(fileNames[0].c_str());
130 if (QFile::exists(file))
132 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
133 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
134 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
135 reader->SetFileName(fileNames[0].c_str());
136 reader->ReadImageInformation();
137 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
138 int dimension = reader->GetNumberOfDimensions();
139 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
140 vvProgressDialog progress("Opening " + file.toStdString());
141 qApp->processEvents();
143 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
144 // if (mSlicerManagers[index]->SetOverlay(fileNames,dimension, component,type)) {
145 //create an item in the tree with good settings
146 QTreeWidgetItem *item = new QTreeWidgetItem();
147 item->setData(0,Qt::UserRole,file.toStdString().c_str());
148 item->setData(1,Qt::UserRole,tr("wipe"));
149 QFileInfo fileinfo(file); //Do not show the path
150 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
151 item->setToolTip(COLUMN_IMAGE_NAME, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("wipe").c_str());
152 qApp->processEvents();
153 #if VTK_MAJOR_VERSION > 5
154 for ( unsigned int i = 0; i < mSlicerManagers[index]->GetNumberOfSlicers(); i++)
155 mSlicerManagers[index]->GetSlicer(i)->ForceUpdateDisplayExtent();
158 for (int j = 1; j <= 4; j++) {
159 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
162 //Create the buttons for reload and close
163 qApp->processEvents();
164 QTreePushButton* cButton = new QTreePushButton;
165 cButton->setItem(item);
166 cButton->setColumn(COLUMN_CLOSE_IMAGE);
167 cButton->setToolTip(tr("close image"));
168 cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
169 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
170 vvMainWindow::Instance(),SLOT(CloseImage(QTreeWidgetItem*, int)));
172 QTreePushButton* rButton = new QTreePushButton;
173 rButton->setItem(item);
174 rButton->setColumn(COLUMN_RELOAD_IMAGE);
175 rButton->setToolTip(tr("reload image"));
176 rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
177 //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
178 // this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
180 DataTree->topLevelItem(index)->setExpanded(1);
181 DataTree->topLevelItem(index)->addChild(item);
182 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
183 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
185 //set the id of the image
186 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
187 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
188 //UpdateTree(DataTree);
189 qApp->processEvents();
190 //ImageInfoChanged();
191 QApplication::restoreOverrideCursor();
193 // Update the display to update, e.g., the sliders
194 // for(int i=0; i<4; i++)
195 // DisplaySliders(index, i);
197 QApplication::restoreOverrideCursor();
198 QString error = "Cannot import the new image.\n";
199 error += mSlicerManagers[index]->GetLastError().c_str();
200 QMessageBox::information(this,tr("Problem reading image !"),error);
202 //WindowLevelChanged();
205 QMessageBox::information(NULL,tr("Problem reading wipe Image !"),"File doesn't exist!");
207 //------------------------------------------------------------------------------