X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvMainWindow.cxx;h=5fec7b2091d91125aeec04ebfb0182f1e0767db0;hb=451f8e875ec446efa2235abc2085fcf6ec67f523;hp=8225ece82813bc69d8d440f45660362f154f23c0;hpb=97ff83e02ea212ec4a20c1794f75eed2576fffc7;p=clitk.git diff --git a/vv/vvMainWindow.cxx b/vv/vvMainWindow.cxx index 8225ece..5fec7b2 100644 --- a/vv/vvMainWindow.cxx +++ b/vv/vvMainWindow.cxx @@ -38,41 +38,42 @@ #include "vvDeformationDialog.h" #include "vvImageWarp.h" #include "vvUtils.h" -#include "vvMaximumIntensityProjection.h" #include "vvMidPosition.h" #include "vvMesh.h" #include "vvStructSelector.h" #include "vvMeshReader.h" #include "vvConstants.h" - -#ifdef CLITK_VV_USE_BDCM -#include -#endif +#include "clitkConfiguration.h" // ITK include -#include "itkImage.h" -#include "itkImageFileReader.h" -#include "itkByteSwapper.h" -#include "itkCommand.h" -#include "itkNumericSeriesFileNames.h" +#include +#include +#include +#include +#include // VTK include -#include "vtkImageData.h" -#include "vtkImageActor.h" -#include "vtkCornerAnnotation.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkRendererCollection.h" -#include "vtkWindowToImageFilter.h" -#include "vtkBMPWriter.h" -#include "vtkTIFFWriter.h" -#include "vtkPNMWriter.h" -#include "vtkPNGWriter.h" -#include "vtkJPEGWriter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Standard includes #include +#include +#include #define COLUMN_TREE 0 #define COLUMN_UL_VIEW 1 @@ -83,7 +84,7 @@ #define COLUMN_RELOAD_IMAGE 6 #define COLUMN_IMAGE_NAME 7 -#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr)" +#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr *.SCAN )" /*Data Tree values 0,Qt::UserRole full filename @@ -102,10 +103,14 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() mInputPathName = ""; mMenuTools = menuTools; + // mMenuSegmentation = menuSegmentation; mContextMenu = &contextMenu; mMenuExperimentalTools = menuExperimental; mMainWidget = this; mCurrentTime = -1; + mCurrentSelectedImageId = ""; + mCurrentPickedImageId = ""; + mCurrentPickedImageIndex = 0; //Init the contextMenu this->setContextMenuPolicy(Qt::CustomContextMenu); @@ -134,18 +139,6 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() contextMenu.addSeparator(); - // QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/crop.png")), - // tr("Crop Current Image")); - // connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage())); - // contextActions.push_back(actionCrop_image); - - QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/cut.png")), - tr("Split Current Image")); - connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage())); - contextActions.push_back(actionSplit_image); - - contextMenu.addSeparator(); - contextMenu.addAction(actionAdd_VF_to_current_Image); contextActions.push_back(actionAdd_VF_to_current_Image); @@ -157,7 +150,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage())); contextMenu.addAction(actionAdd_fusion_image); - connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage())); + connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(SelectFusionImage())); contextActions.push_back(actionAdd_fusion_image); // TRIAL DS @@ -238,7 +231,6 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved())); //connect everything - connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP())); connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition())); connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration())); connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage())); @@ -247,6 +239,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour())); connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour())); connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages())); + connect(actionSlice_Image_As_Multiple_Images,SIGNAL(triggered()),this,SLOT(SliceImages())); connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime())); connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime())); connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs())); @@ -280,13 +273,14 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap())); connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel())); connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel())); + connect(applyWindowLevelToAllButton,SIGNAL(clicked()),this,SLOT(ApplyWindowLevelToAllImages())); connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint))); connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString))); connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString))); - connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int,int)),this,SLOT(SetVFProperty(int,int,int,int))); + connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int,int,double,double,double)),this,SLOT(SetVFProperty(int,int,int,int,double,double,double))); connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int))); connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)), this,SLOT(SetFusionProperty(int,int,double,double))); @@ -314,6 +308,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() QMenu * rmenu = new QMenu("Recently opened files..."); rmenu->setIcon(QIcon(QString::fromUtf8(":/common/icons/open.png"))); menuFile->insertMenu(actionOpen_Image_With_Time,rmenu); + menuFile->insertSeparator(actionOpen_Image_With_Time); for (std::list::iterator i = recent_files.begin(); i!=recent_files.end(); i++) { QAction* current=new QAction(QIcon(QString::fromUtf8(":/common/icons/open.png")), (*i).c_str(),this); @@ -327,19 +322,23 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() if (!CLITK_EXPERIMENTAL) menuExperimental->menuAction()->setVisible(false); + + + QTimer * timerMemory = new QTimer(this); + //timerMemory->setInterval(5); + connect(timerMemory, SIGNAL(timeout()), this, SLOT(UpdateMemoryUsage())); + timerMemory->start(2000); + } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvMainWindow::ComputeMIP() +void vvMainWindow::UpdateMemoryUsage() { - vvMaximumIntensityProjection mip; - vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])]; - QFileInfo info(selected_slicer->GetFileName().c_str()); - mip.Compute(selected_slicer); - if (!mip.error) - AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd"); + // clitk::PrintMemory(true); + if (clitk::GetMemoryUsageInMb() == 0) infoPanel->setMemoryInMb("NA"); + else infoPanel->setMemoryInMb(QString::number(clitk::GetMemoryUsageInMb())+" MiB"); } //------------------------------------------------------------------------------ @@ -443,7 +442,7 @@ void vvMainWindow::OpenVTKContour() void vvMainWindow::OpenDCStructContour() { if (mSlicerManagers.size() > 0) { - QString Extensions = "Dicom Files ( *.dcm; RS*)"; + QString Extensions = "Dicom Files ( *.dcm RS*)"; Extensions += ";;All Files (*)"; QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions); if (file.isNull()) @@ -607,6 +606,22 @@ void vvMainWindow::MergeImages() } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvMainWindow::SliceImages() +{ + QString Extensions = EXTENSIONS; + Extensions += ";;All Files (*)"; + + QStringList files = QFileDialog::getOpenFileNames(this,tr("Slice Images"),mInputPathName,Extensions); + if (files.isEmpty()) + return; + mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str(); + std::vector vector; + for (int i = 0; i < files.size(); i++) + vector.push_back(files[i].toStdString()); + LoadImages(vector, SLICED); +} +//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvMainWindow::MergeImagesWithTime() @@ -678,32 +693,11 @@ void vvMainWindow::OpenDicom() { std::vector files; -#ifdef CLITK_VV_USE_BDCM - bool r = bdcm::OpenDicomFilesSelectorDialog(files, - "DicomFilesSelectorDialog test", - 0,0,800,800,1); - - if (r) { - std::cout << "$$$$ main : user clicked 'OK' $$$$"<::iterator i; - for (i=files.begin(); i!=files.end(); ++i) { - std::cout << *i << std::endl; - } - std::cout << "$$$$ "<exec() == QDialog::Accepted) { files = *(dicomSeriesSelector->GetFilenames()); LoadImages(files,DICOM); } -#endif - } //------------------------------------------------------------------------------ @@ -763,6 +757,32 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi else fileSize = 1; + // For SLICED, we need the number of slices (ndim and #slices) + std::vector nSlices; + nSlices.resize(files.size()); + std::fill(nSlices.begin(), nSlices.end(), 1); + if (filetype == SLICED) { + for (int i = 0; i < fileSize; i++) { + itk::ImageIOBase::Pointer header = clitk::readImageHeader(files[i]); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + if (!header) { + nSlices[i] = 0; + QString error = "Cannot open file \n"; + error += files[i].c_str(); + QMessageBox::information(this,tr("Reading problem"),error); + return; + } + if (header->GetNumberOfDimensions() < 3) { + nSlices[i] = 0; + QString error = "Dimension problem. Cannot slice \n"; + error += files[i].c_str(); + QMessageBox::information(this,tr("Reading problem"),error); + return; + } + nSlices[i] = header->GetDimensions( header->GetNumberOfDimensions()-1 ); + } + } + //Only add to the list of recently opened files when a single file is opened, //to avoid polluting the list of recently opened files if (files.size() == 1) { @@ -778,107 +798,103 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi //open images as 1 or multiples for (int i = 0; i < fileSize; i++) { - progress.Update("Opening " + files[i]); + progress.SetText("Opening " + files[i]); progress.SetProgress(i,fileSize); qApp->processEvents(); - //read the image and put it in mSlicerManagers - vvSlicerManager* imageManager = new vvSlicerManager(4); - qApp->processEvents(); + for (unsigned int j = 0; j < nSlices[i]; j++) { + //read the image and put it in mSlicerManagers + vvSlicerManager* imageManager = new vvSlicerManager(4); + qApp->processEvents(); - bool SetImageSucceed=false; - - // Change filename if an image with the same already exist - // DD(files[i]); - int number=0; - for(unsigned int l=0; lGetBaseFileName()); - // DD(v->GetFileName()); - if (v->GetBaseFileName() == - vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(files[i]))) { - number = std::max(number, v->GetBaseFileNameNumber()+1); + bool SetImageSucceed=false; + + // Change filename if an image with the same already exist + int number = GetImageDuplicateFilenameNumber(files[i] + std::string("_slice")); + + if (filetype == IMAGE || filetype == IMAGEWITHTIME || filetype == SLICED) + SetImageSucceed = imageManager->SetImage(files[i],filetype, number, j); + else { + SetImageSucceed = imageManager->SetImages(files,filetype, number); } - } + if (!SetImageSucceed) { + QApplication::restoreOverrideCursor(); + QString error = "Cannot open file \n"; + error += imageManager->GetLastError().c_str(); + QMessageBox::information(this,tr("Reading problem"),error); + delete imageManager; + } else { + mSlicerManagers.push_back(imageManager); + //create an item in the tree with good settings + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setData(0,Qt::UserRole,files[i].c_str()); + QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path + item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName()); + item->setToolTip(COLUMN_IMAGE_NAME,fileinfo.absoluteFilePath()); + qApp->processEvents(); - if (filetype == IMAGE || filetype == IMAGEWITHTIME) - SetImageSucceed = imageManager->SetImage(files[i],filetype, number); - else { - SetImageSucceed = imageManager->SetImages(files,filetype, number); - } - if (SetImageSucceed == false) { - QApplication::restoreOverrideCursor(); - QString error = "Cannot open file \n"; - error += imageManager->GetLastError().c_str(); - QMessageBox::information(this,tr("Reading problem"),error); - delete imageManager; - } else { - mSlicerManagers.push_back(imageManager); + //Create the buttons for reload and close + qApp->processEvents(); + QTreePushButton* cButton = new QTreePushButton; + cButton->setItem(item); + cButton->setColumn(COLUMN_CLOSE_IMAGE); + cButton->setToolTip(tr("close image")); + cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png"))); + connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), + this,SLOT(CloseImage(QTreeWidgetItem*, int))); - //create an item in the tree with good settings - QTreeWidgetItem *item = new QTreeWidgetItem(); - item->setData(0,Qt::UserRole,files[i].c_str()); - QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName()); - qApp->processEvents(); + QTreePushButton* rButton = new QTreePushButton; + rButton->setItem(item); + rButton->setColumn(COLUMN_RELOAD_IMAGE); + rButton->setToolTip(tr("reload image")); + rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png"))); + connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), + this,SLOT(ReloadImage(QTreeWidgetItem*, int))); - //Create the buttons for reload and close - qApp->processEvents(); - QTreePushButton* cButton = new QTreePushButton; - cButton->setItem(item); - cButton->setColumn(COLUMN_CLOSE_IMAGE); - cButton->setToolTip(tr("close image")); - cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png"))); - connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(CloseImage(QTreeWidgetItem*, int))); + DataTree->addTopLevelItem(item); + DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton); + DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton); - QTreePushButton* rButton = new QTreePushButton; - rButton->setItem(item); - rButton->setColumn(COLUMN_RELOAD_IMAGE); - rButton->setToolTip(tr("reload image")); - rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png"))); - connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(ReloadImage(QTreeWidgetItem*, int))); + //set the id of the image + QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1); + item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); + mSlicerManagers.back()->SetId(id.toStdString()); - DataTree->addTopLevelItem(item); - DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton); - DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton); + linkPanel->addImage(imageManager->GetFileName(), id.toStdString()); - //set the id of the image - QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1); - item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); - mSlicerManagers.back()->SetId(id.toStdString()); - - linkPanel->addImage(imageManager->GetFileName(), id.toStdString()); - - connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)), - this,SLOT(CurrentImageChanged(std::string))); - connect(mSlicerManagers.back(), SIGNAL(UpdatePosition(int, double, double, double, double, double, double, double)), - this,SLOT(MousePositionChanged(int,double, double, double, double, double, double, double))); - connect(mSlicerManagers.back(), SIGNAL(UpdateVector(int, double, double, double, double)), - this, SLOT(VectorChanged(int,double,double,double, double))); - connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)), - this, SLOT(OverlayChanged(int,double,double))); - connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)), - this, SLOT(FusionChanged(int,double))); - connect(mSlicerManagers.back(), SIGNAL(UpdateWindows(int, int, int)), - this,SLOT(WindowsChanged(int, int, int))); - connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged(double, double,int, int)), - this,SLOT(WindowLevelChanged(double, double, int, int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateSlice(int,int)), - this,SLOT(UpdateSlice(int,int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)), - this,SLOT(UpdateTSlice(int, int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)), - this,SLOT(UpdateSliceRange(int,int,int,int,int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), - this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); - connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)), - this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int))); - connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint())); - InitSlicers(); - numberofsuccesulreads++; + connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)), + this,SLOT(CurrentImageChanged(std::string))); + connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)), + this, SLOT(CurrentPickedImageChanged(std::string))); + connect(mSlicerManagers.back(), SIGNAL(UpdatePosition(int, double, double, double, double, double, double, double)), + this,SLOT(MousePositionChanged(int,double, double, double, double, double, double, double))); + connect(mSlicerManagers.back(), SIGNAL(UpdateVector(int, double, double, double, double)), + this, SLOT(VectorChanged(int,double,double,double, double))); + connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)), + this, SLOT(OverlayChanged(int,double,double))); + connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)), + this, SLOT(FusionChanged(int,double))); + connect(mSlicerManagers.back(), SIGNAL(UpdateWindows(int, int, int)), + this,SLOT(WindowsChanged(int, int, int))); + connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged(double, double,int, int)), + this,SLOT(WindowLevelChanged(double, double, int, int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateSlice(int,int)), + this,SLOT(UpdateSlice(int,int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)), + this,SLOT(UpdateTSlice(int, int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)), + this,SLOT(UpdateSliceRange(int,int,int,int,int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), + this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)), + this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*))); + connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)), + this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int))); + connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint())); + InitSlicers(); + numberofsuccesulreads++; + } } } if (numberofsuccesulreads) { @@ -889,19 +905,17 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi UpdateTree(); InitDisplay(); ShowLastImage(); - } - QApplication::restoreOverrideCursor(); - // Try to guess default WindowLevel - double range[2]; - mSlicerManagers.back()->GetImage()->GetFirstVTKImageData()->GetScalarRange(range); - // DD(range[0]); - // DD(range[1]); - if ((range[0] == 0) && (range[1] == 1)) { - presetComboBox->setCurrentIndex(5);// binary - } else { - // TODO + // Try to guess default WindowLevel + double range[2]; + mSlicerManagers.back()->GetImage()->GetFirstVTKImageData()->GetScalarRange(range); + if ((range[0] == 0) && (range[1] == 1)) { + presetComboBox->setCurrentIndex(5);// binary + } else { + // TODO + } } + QApplication::restoreOverrideCursor(); } //------------------------------------------------------------------------------ @@ -922,7 +936,7 @@ void vvMainWindow::UpdateTree() //------------------------------------------------------------------------------ void vvMainWindow::CurrentImageChanged(std::string id) { - // DD("CurrentImageChanged"); + if (id == mCurrentSelectedImageId) return; // Do nothing int selected = 0; for (int i = 0; i < DataTree->topLevelItemCount(); i++) { if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id) { @@ -935,16 +949,37 @@ void vvMainWindow::CurrentImageChanged(std::string id) } DataTree->topLevelItem(selected)->setSelected(1); - // DD(mSlicerManagers[selected]->GetFileName()); + mCurrentSelectedImageId = id; emit SelectedImageHasChanged(mSlicerManagers[selected]); } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvMainWindow::CurrentPickedImageChanged(std::string id) +{ + if (id == mCurrentPickedImageId) return; // Do nothing + int selected = 0; + for (int i = 0; i < DataTree->topLevelItemCount(); i++) { + if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id) { + selected = i; + } else { + DataTree->topLevelItem(i)->setSelected(0); + } + for (int child = 0; child < DataTree->topLevelItem(i)->childCount(); child++) + DataTree->topLevelItem(i)->child(child)->setSelected(0); + + } + DataTree->topLevelItem(selected)->setSelected(1); + mCurrentPickedImageId = id; + mCurrentPickedImageIndex = selected; +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvMainWindow::ImageInfoChanged() { - contextActions[7]->setEnabled(1); contextActions[6]->setEnabled(1); + contextActions[5]->setEnabled(1); actionSave_As->setEnabled(1); actionAdd_VF_to_current_Image->setEnabled(1); actionAdd_fusion_image->setEnabled(1); @@ -972,6 +1007,7 @@ void vvMainWindow::ImageInfoChanged() std::vector inputSpacing; std::vector inputSize; std::vector sizeMM; + vtkSmartPointer transformation; int dimension=0; QString pixelType; QString inputSizeInBytes; @@ -990,14 +1026,15 @@ void vvMainWindow::ImageInfoChanged() //read image header int NPixel = 1; + vvImage::Pointer imageSelected; if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0]) { - vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage(); + imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage(); dimension = imageSelected->GetNumberOfDimensions(); origin.resize(dimension); inputSpacing.resize(dimension); inputSize.resize(dimension); sizeMM.resize(dimension); - pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str(); + pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str(); for (int i = 0; i < dimension; i++) { origin[i] = imageSelected->GetOrigin()[i]; inputSpacing[i] = imageSelected->GetSpacing()[i]; @@ -1007,13 +1044,13 @@ void vvMainWindow::ImageInfoChanged() } inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000); } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector") { - vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF(); + imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF(); dimension = imageSelected->GetNumberOfDimensions(); origin.resize(dimension); inputSpacing.resize(dimension); inputSize.resize(dimension); sizeMM.resize(dimension); - pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str(); + pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsITKString().c_str(); for (int i = 0; i < dimension; i++) { origin[i] = imageSelected->GetOrigin()[i]; inputSpacing[i] = imageSelected->GetSpacing()[i]; @@ -1023,13 +1060,13 @@ void vvMainWindow::ImageInfoChanged() } inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000); } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay") { - vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay(); + imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay(); dimension = imageSelected->GetNumberOfDimensions(); origin.resize(dimension); inputSpacing.resize(dimension); inputSize.resize(dimension); sizeMM.resize(dimension); - pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str(); + pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str(); for (int i = 0; i < dimension; i++) { origin[i] = imageSelected->GetOrigin()[i]; inputSpacing[i] = imageSelected->GetSpacing()[i]; @@ -1039,13 +1076,13 @@ void vvMainWindow::ImageInfoChanged() } inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000); } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion") { - vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion(); + imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion(); dimension = imageSelected->GetNumberOfDimensions(); origin.resize(dimension); inputSpacing.resize(dimension); inputSize.resize(dimension); sizeMM.resize(dimension); - pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str(); + pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str(); for (int i = 0; i < dimension; i++) { origin[i] = imageSelected->GetOrigin()[i]; inputSpacing[i] = imageSelected->GetSpacing()[i]; @@ -1066,6 +1103,8 @@ void vvMainWindow::ImageInfoChanged() infoPanel->setOrigin(GetVectorDoubleAsString(origin)); infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing)); infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")"); + transformation = imageSelected->GetTransform()->GetMatrix(); + infoPanel->setTransformation(Get4x4MatrixDoubleAsString(transformation)); landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(), mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size()); @@ -1081,8 +1120,6 @@ void vvMainWindow::ImageInfoChanged() } windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow()); levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel()); - // DD(mSlicerManagers[index]->GetColorMap()); - // DD(mSlicerManagers[index]->GetPreset()); presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset()); colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap()); @@ -1216,6 +1253,29 @@ QString vvMainWindow::GetSizeInBytes(unsigned long size) } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +QString vvMainWindow::Get4x4MatrixDoubleAsString(vtkSmartPointer matrix) +{ + std::ostringstream strmatrix; + + for (unsigned int i = 0; i < 4; i++) { + for (unsigned int j = 0; j < 4; j++) { + strmatrix.flags(ios::showpos); + strmatrix.width(10); + strmatrix.precision(3); + strmatrix.setf(ios::fixed,ios::floatfield); + strmatrix.fill(' '); + strmatrix << std::left << matrix->GetElement(i, j); + //strmatrix.width(10); + strmatrix << " "; + } + strmatrix << std::endl; + } + QString result = strmatrix.str().c_str(); + return result; +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ QString vvMainWindow::GetVectorDoubleAsString(std::vector vectorDouble) { @@ -1487,6 +1547,7 @@ void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) InitDisplay(); } } + ImageInfoChanged(); } //------------------------------------------------------------------------------ @@ -1520,134 +1581,6 @@ void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) } //------------------------------------------------------------------------------ -// void vvMainWindow::CropImage() -// { -// int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); -// vvCropDialog crop(mSlicerManagers,index); -// if(crop.exec()) -// AddImage(crop.GetOutput(),"cropped.mhd"); -// } - -//------------------------------------------------------------------------------ -void vvMainWindow::SplitImage() -{ - int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); - int dim = mSlicerManagers[index]->GetDimension(); - QString warning = "Do you really want to split the "; - warning += QString::number(dim) + "D image "; - warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into "; - warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " "; - warning += QString::number(dim-1) + "D images."; - QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"), - warning, 0, this); - msgBox.addButton(tr("Split"), QMessageBox::AcceptRole); - msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole); - if (msgBox.exec() == QMessageBox::AcceptRole) { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - if (dim > 2) { - std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString(); - int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]; - std::string path = itksys::SystemTools::GetFilenamePath( - filename); - path += "/"; - path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString(); - path += "%03d"; - path += itksys::SystemTools::GetFilenameLastExtension( - filename).c_str(); - - typedef itk::NumericSeriesFileNames NameGeneratorType; - NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New(); - nameGenerator->SetSeriesFormat(path.c_str()); - nameGenerator->SetStartIndex(0); - nameGenerator->SetEndIndex(numberOfSlice-1); - nameGenerator->SetIncrementIndex(1); - - for (int i = 0; i < numberOfSlice; i++) { - vvSlicerManager* imageManager = new vvSlicerManager(4); - imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i], - mSlicerManagers[index]->GetSlicer(0)->GetImage(), i); - mSlicerManagers.push_back(imageManager); - - //create an item in the tree with good settings - QTreeWidgetItem *item = new QTreeWidgetItem(); - item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str()); - std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension( - nameGenerator->GetFileNames()[i]).c_str(); - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str()); - for (int j = 1; j <= 4; j++) { - for (int i = 0; i < DataTree->topLevelItemCount(); i++) { - DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0); - } - item->setData(j,Qt::CheckStateRole,2); - } - - //Create the buttons for reload and close - QTreePushButton* cButton = new QTreePushButton; - cButton->setItem(item); - cButton->setColumn(COLUMN_CLOSE_IMAGE); - cButton->setToolTip(tr("close image")); - cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png"))); - connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(CloseImage(QTreeWidgetItem*, int))); - - QTreePushButton* rButton = new QTreePushButton; - rButton->setItem(item); - rButton->setColumn(COLUMN_RELOAD_IMAGE); - rButton->setToolTip(tr("reload image")); - rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png"))); - rButton->setEnabled(false); - connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(ReloadImage(QTreeWidgetItem*, int))); - - DataTree->addTopLevelItem(item); - DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton); - DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton); - - //set the id of the image - QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1); - item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); - mSlicerManagers.back()->SetId(id.toStdString()); - linkPanel->addImage(fileI, id.toStdString()); - connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)), - this,SLOT(CurrentImageChanged(std::string))); - connect(mSlicerManagers.back(),SIGNAL( - UpdatePosition(int, double, double, double, double, double, double, double)),this, - SLOT(MousePositionChanged(int,double, double, double, double, double, double, double))); - connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)), - this, SLOT(VectorChanged(int,double,double,double, double))); - connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)), - this, SLOT(OverlayChanged(int,double,double))); - connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)), - this, SLOT(FusionChanged(int,double))); - connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)), - this,SLOT(WindowsChanged(int, int, int))); - connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)), - this,SLOT(WindowLevelChanged(double, double, int, int))); - connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)), - this,SLOT(UpdateSlice(int,int))); - connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)), - this,SLOT(UpdateTSlice(int, int))); - connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)), - this,SLOT(UpdateSliceRange(int,int,int,int,int))); - connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), - this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); - connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint())); - UpdateTree(); - qApp->processEvents(); - InitSlicers(); - InitDisplay(); - qApp->processEvents(); - } - QApplication::restoreOverrideCursor(); - } else { - QApplication::restoreOverrideCursor(); - QString error = "Cannot split file (dimensions must be greater than 2) "; - QMessageBox::information(this,tr("Splitting problem"),error); - } - } -} -//------------------------------------------------------------------------------ - //------------------------------------------------------------------------------ void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) { @@ -1712,6 +1645,8 @@ void vvMainWindow::UpdateWindowLevel() mSlicerManagers[index]->SetColorLevel(levelSpinBox->value()); mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex()); mSlicerManagers[index]->Render(); + windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow()); + levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel()); } } //------------------------------------------------------------------------------ @@ -1736,6 +1671,20 @@ void vvMainWindow::SwitchWindowLevel() } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvMainWindow::ApplyWindowLevelToAllImages() +{ + for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { + if (mSlicerManagers[i] == NULL) + continue; + mSlicerManagers[i]->SetColorWindow(windowSpinBox->value()); + mSlicerManagers[i]->SetColorLevel(levelSpinBox->value()); + mSlicerManagers[i]->SetPreset(6); + mSlicerManagers[i]->Render(); + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) { @@ -1750,6 +1699,17 @@ void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, doubl } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvMainWindow::UpdateLinkedNavigation(std::string id, vvSlicerManager * sm, vvSlicer* refSlicer) +{ + for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { + if (id == mSlicerManagers[i]->GetId()) { + mSlicerManagers[i]->UpdateLinkedNavigation(refSlicer); + } + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvMainWindow::ShowContextMenu(QPoint point) { @@ -1760,7 +1720,6 @@ void vvMainWindow::ShowContextMenu(QPoint point) contextActions[4]->setEnabled(0); contextActions[5]->setEnabled(0); contextActions[6]->setEnabled(0); - contextActions[7]->setEnabled(0); } else { int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); contextActions[1]->setEnabled(1); @@ -1770,7 +1729,6 @@ void vvMainWindow::ShowContextMenu(QPoint point) contextActions[3]->setEnabled(1); contextActions[5]->setEnabled(1); contextActions[6]->setEnabled(1); - contextActions[7]->setEnabled(1); if (mSlicerManagers[index]->GetDimension() < 3) contextActions[4]->setEnabled(0); @@ -1839,7 +1797,9 @@ void vvMainWindow::AddOverlayImage(int index, QString file) QTreeWidgetItem *item = new QTreeWidgetItem(); item->setData(0,Qt::UserRole,file.toStdString().c_str()); item->setData(1,Qt::UserRole,tr("overlay")); - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str()); + QFileInfo fileinfo(file); //Do not show the path + item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName()); + item->setToolTip(COLUMN_IMAGE_NAME,fileinfo.absoluteFilePath()); qApp->processEvents(); for (int j = 1; j <= 4; j++) { @@ -1885,8 +1845,38 @@ void vvMainWindow::AddOverlayImage(int index, QString file) QMessageBox::information(this,tr("Problem reading image !"),error); } } +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvMainWindow::AddROI(int index, QString file) +{ + /* + // Get slice manager + + // Load image + + vvImageReader * mReader = new vvImageReader; + mReader->SetInputFilename(filename.toStdString()); + mReader->Update(IMAGE); + if (mReader->GetLastError().size() != 0) { + std::cerr << "Error while reading " << filename.toStdString() << std::endl; + QString error = "Cannot open file \n"; + error += mReader->GetLastError().c_str(); + QMessageBox::information(this,tr("Reading problem"),error); + delete mReader; + return; + } + vvImage::Pointer roi = mReader->GetOutput(); + + // Create roi in new tool + vvToolStructureSetManager::AddImage(mCurrentSlicerManager, roi); + */ +} +//------------------------------------------------------------------------------ -void vvMainWindow::AddFusionImage() +//------------------------------------------------------------------------------ +void vvMainWindow::SelectFusionImage() { int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); @@ -1903,74 +1893,82 @@ void vvMainWindow::AddFusionImage() QString Extensions = EXTENSIONS; Extensions += ";;All Files (*)"; QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions); - if (!file.isEmpty()) { - mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str(); - itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO( - file.toStdString().c_str(), itk::ImageIOFactory::ReadMode); - reader->SetFileName(file.toStdString().c_str()); - reader->ReadImageInformation(); - std::string component = reader->GetComponentTypeAsString(reader->GetComponentType()); - if (reader) { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - vvProgressDialog progress("Opening fusion"); - qApp->processEvents(); + if (!file.isEmpty()) + AddFusionImage(index,file); +} +//------------------------------------------------------------------------------ - std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str(); - if (mSlicerManagers[index]->SetFusion(file.toStdString(), - reader->GetNumberOfDimensions(), component)) { - //create an item in the tree with good settings - QTreeWidgetItem *item = new QTreeWidgetItem(); - item->setData(0,Qt::UserRole,file.toStdString().c_str()); - item->setData(1,Qt::UserRole,tr("fusion")); - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str()); - qApp->processEvents(); +//------------------------------------------------------------------------------ +void vvMainWindow::AddFusionImage(int index, QString file) +{ + mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str(); + itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO( + file.toStdString().c_str(), itk::ImageIOFactory::ReadMode); + reader->SetFileName(file.toStdString().c_str()); + reader->ReadImageInformation(); + std::string component = reader->GetComponentTypeAsString(reader->GetComponentType()); + if (reader) { + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + vvProgressDialog progress("Opening fusion"); + qApp->processEvents(); - for (int j = 1; j <= 4; j++) { - item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole)); - mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0, - DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt()); - } + std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str(); + if (mSlicerManagers[index]->SetFusion(file.toStdString(), + reader->GetNumberOfDimensions(), component)) { + //create an item in the tree with good settings + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setData(0,Qt::UserRole,file.toStdString().c_str()); + item->setData(1,Qt::UserRole,tr("fusion")); + QFileInfo fileinfo(filename.c_str()); //Do not show the path + item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName()); + item->setToolTip(COLUMN_IMAGE_NAME,fileinfo.absoluteFilePath()); + qApp->processEvents(); - //Create the buttons for reload and close - qApp->processEvents(); - QTreePushButton* cButton = new QTreePushButton; - cButton->setItem(item); - cButton->setColumn(COLUMN_CLOSE_IMAGE); - cButton->setToolTip(tr("close image")); - cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png"))); - connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(CloseImage(QTreeWidgetItem*, int))); + for (int j = 1; j <= 4; j++) { + item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole)); + mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0, + DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt()); + } - QTreePushButton* rButton = new QTreePushButton; - rButton->setItem(item); - rButton->setColumn(COLUMN_RELOAD_IMAGE); - rButton->setToolTip(tr("reload image")); - rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png"))); - connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), - this,SLOT(ReloadImage(QTreeWidgetItem*, int))); + //Create the buttons for reload and close + qApp->processEvents(); + QTreePushButton* cButton = new QTreePushButton; + cButton->setItem(item); + cButton->setColumn(COLUMN_CLOSE_IMAGE); + cButton->setToolTip(tr("close image")); + cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png"))); + connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), + this,SLOT(CloseImage(QTreeWidgetItem*, int))); - DataTree->topLevelItem(index)->setExpanded(1); - DataTree->topLevelItem(index)->addChild(item); - DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton); - DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton); + QTreePushButton* rButton = new QTreePushButton; + rButton->setItem(item); + rButton->setColumn(COLUMN_RELOAD_IMAGE); + rButton->setToolTip(tr("reload image")); + rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png"))); + connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)), + this,SLOT(ReloadImage(QTreeWidgetItem*, int))); - //set the id of the image - QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString(); - item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); - UpdateTree(); - qApp->processEvents(); - ImageInfoChanged(); - QApplication::restoreOverrideCursor(); - } else { - QApplication::restoreOverrideCursor(); - QString error = "Cannot import the new image.\n"; - error += mSlicerManagers[index]->GetLastError().c_str(); - QMessageBox::information(this,tr("Problem reading image !"),error); - } + DataTree->topLevelItem(index)->setExpanded(1); + DataTree->topLevelItem(index)->addChild(item); + DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton); + DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton); + + //set the id of the image + QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString(); + item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); + UpdateTree(); + qApp->processEvents(); + ImageInfoChanged(); + QApplication::restoreOverrideCursor(); } else { + QApplication::restoreOverrideCursor(); QString error = "Cannot import the new image.\n"; + error += mSlicerManagers[index]->GetLastError().c_str(); QMessageBox::information(this,tr("Problem reading image !"),error); } + } else { + QString error = "Cannot import the new image.\n"; + QMessageBox::information(this,tr("Problem reading image !"),error); } } //------------------------------------------------------------------------------ @@ -2006,7 +2004,9 @@ void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk) QTreeWidgetItem *item = new QTreeWidgetItem(); item->setData(0,Qt::UserRole,filename.toStdString().c_str()); item->setData(1,Qt::UserRole,tr("vector")); - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename); + QFileInfo fileinfo(filename); //Do not show the path + item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName()); + item->setToolTip(COLUMN_IMAGE_NAME,fileinfo.absoluteFilePath()); qApp->processEvents(); for (int j = 1; j <= 4; j++) { @@ -2100,7 +2100,7 @@ void vvMainWindow::AddField(QString file,int index) //------------------------------------------------------------------------------ -void vvMainWindow::SetVFProperty(int subsampling, int scale, int log, int width) +void vvMainWindow::SetVFProperty(int subsampling, int scale, int log, int width, double r, double g, double b) { int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); if (mSlicerManagers[index]->GetSlicer(0)->GetVF()) { @@ -2108,6 +2108,7 @@ void vvMainWindow::SetVFProperty(int subsampling, int scale, int log, int width) mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling); mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale); mSlicerManagers[index]->GetSlicer(i)->SetVFWidth(width); + mSlicerManagers[index]->GetSlicer(i)->SetVFColor(r,g,b); if (log > 0) mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1); else @@ -2193,7 +2194,7 @@ void vvMainWindow::SaveAs() std::string action = "Saving"; vvProgressDialog progress("Saving "+fileName.toStdString()); qApp->processEvents(); - vvImageWriter *writer = new vvImageWriter; + vvImageWriter::Pointer writer = vvImageWriter::New(); writer->SetOutputFileName(fileName.toStdString()); writer->SetInput(mSlicerManagers[index]->GetImage()); writer->Update(); @@ -2221,22 +2222,35 @@ void vvMainWindow::SaveAs() //------------------------------------------------------------------------------ void vvMainWindow::AddLink(QString image1,QString image2) { + unsigned int sm1 = 0; + unsigned int sm2 = 0; + for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { if (image1.toStdString() == mSlicerManagers[i]->GetId()) { mSlicerManagers[i]->AddLink(image2.toStdString()); + sm1 = i; } if (image2.toStdString() == mSlicerManagers[i]->GetId()) { mSlicerManagers[i]->AddLink(image1.toStdString()); + sm2 = i; } } + + if (linkPanel->isLinkAll()) { + emit UpdateLinkedNavigation(mSlicerManagers[sm1]->GetId(), mSlicerManagers[mCurrentPickedImageIndex], mSlicerManagers[mCurrentPickedImageIndex]->GetSlicer(0)); + emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[mCurrentPickedImageIndex], mSlicerManagers[mCurrentPickedImageIndex]->GetSlicer(0)); + } + else { + emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[sm1], mSlicerManagers[sm1]->GetSlicer(0)); + } } + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvMainWindow::RemoveLink(QString image1,QString image2) { - // DD("vvMainWindow:RemoveLink"); for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { if (image1.toStdString() == mSlicerManagers[i]->GetId()) { mSlicerManagers[i]->RemoveLink(image2.toStdString()); @@ -2326,23 +2340,21 @@ void vvMainWindow::NOVerticalSliderChanged() if (value == NOVerticalSlider->value()) return; else value = NOVerticalSlider->value(); // int value = NOVerticalSlider->value(); - for (unsigned int i = 0; i < mSlicerManagers.size(); i++) - { - if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1) - { - if (mSlicerManagers[i]->GetSlicer(0)->GetSlice() != value) { - mSlicerManagers[i]->GetSlicer(0)->SetSlice(value); - mSlicerManagers[i]->VerticalSliderHasChanged(0, value); - - // If nor Update/Render -> slider not work - // only render = ok navigation, but for contour Update needed but slower ? - - mSlicerManagers[i]->UpdateSlice(0); // <-- DS add this. Not too much update ? YES. but needed for ImageContour ... - //mSlicerManagers[i]->GetSlicer(0)->Render(); // <-- DS add this, needed for contour, seems ok ? not too slow ? - } - break; - } + for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { + if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1) { + if (mSlicerManagers[i]->GetSlicer(0)->GetSlice() != value) { + mSlicerManagers[i]->GetSlicer(0)->SetSlice(value); + mSlicerManagers[i]->VerticalSliderHasChanged(0, value); + + // If nor Update/Render -> slider not work + // only render = ok navigation, but for contour Update needed but slower ? + + mSlicerManagers[i]->UpdateSlice(0); // <-- DS add this. Not too much update ? YES. but needed for ImageContour ... + //mSlicerManagers[i]->GetSlicer(0)->Render(); // <-- DS add this, needed for contour, seems ok ? not too slow ? + } + break; } + } } //------------------------------------------------------------------------------ @@ -2372,10 +2384,7 @@ void vvMainWindow::NEVerticalSliderChanged() //------------------------------------------------------------------------------ void vvMainWindow::SOVerticalSliderChanged() { - // DD("SOVerticalSliderChanged"); static int value=-1; - // DD(value); -// DD(SOVerticalSlider->value()); if (value == SOVerticalSlider->value()) return; else value = SOVerticalSlider->value(); //int value = SOVerticalSlider->value(); @@ -2497,11 +2506,7 @@ void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int //------------------------------------------------------------------------------ void vvMainWindow::SaveNOScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(NOViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(NOViewWidget); } //------------------------------------------------------------------------------ @@ -2509,11 +2514,7 @@ void vvMainWindow::SaveNOScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveNEScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(NEViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(NEViewWidget); } //------------------------------------------------------------------------------ @@ -2521,11 +2522,7 @@ void vvMainWindow::SaveNEScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveSOScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(SOViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(SOViewWidget); } //------------------------------------------------------------------------------ @@ -2533,29 +2530,35 @@ void vvMainWindow::SaveSOScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveSEScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(SEViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(SEViewWidget); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvMainWindow::SaveScreenshot(vtkImageData* image) +void vvMainWindow::SaveScreenshot(QVTKWidget *widget) { QString Extensions = "Images( *.png);;"; Extensions += "Images( *.jpg);;"; Extensions += "Images( *.bmp);;"; Extensions += "Images( *.tif);;"; Extensions += "Images( *.ppm)"; +#ifdef VTK_USE_MPEG2_ENCODER + Extensions += "Images( *.mpg)"; +#endif + + int smIndex=GetSlicerIndexFromItem(DataTree->selectedItems()[0]); QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), - itksys::SystemTools::GetFilenamePath( - mSlicerManagers[0]->GetFileName()).c_str(), + itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(), Extensions); + if (!fileName.isEmpty()) { + vtkSmartPointer w2i = vtkSmartPointer::New(); + w2i->SetInput(widget->GetRenderWindow()); + w2i->Update(); + vtkImageData *image = w2i->GetOutput(); + const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4; if (!strcmp(ext, ".bmp")) { vtkBMPWriter *bmp = vtkBMPWriter::New(); @@ -2587,11 +2590,31 @@ void vvMainWindow::SaveScreenshot(vtkImageData* image) jpg->SetFileName(fileName.toStdString().c_str()); jpg->Write(); jpg->Delete(); +#ifdef VTK_USE_MPEG2_ENCODER + } else if (!strcmp(ext, ".mpg")) { + vtkMPEG2Writer *mpg = vtkMPEG2Writer::New(); + mpg->SetInput(image); + mpg->SetFileName(fileName.toStdString().c_str()); + mpg->Start(); + + vvImage * vvImg = mSlicerManagers[smIndex]->GetImage(); + int nSlice = vvImg->GetVTKImages().size(); + for(int i=0; iSetNextTSlice(0); + vtkSmartPointer w2i = vtkSmartPointer::New(); + w2i->SetInput(widget->GetRenderWindow()); + w2i->Update(); + mpg->SetInput(w2i->GetOutput()); + mpg->Write(); + } + mpg->End(); + mpg->Delete(); +#endif } else { QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!")); } } - } //------------------------------------------------------------------------------ @@ -2692,19 +2715,42 @@ void vvMainWindow::SurfaceViewerLaunch() vvSurfaceViewerDialog surfaceViewer; surfaceViewer.exec(); } +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ -void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename) +int vvMainWindow::GetImageDuplicateFilenameNumber(std::string filename) { + int number=0; + for(unsigned int l=0; lGetBaseFileName() == + vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) { + number = std::max(number, v->GetBaseFileNameNumber()+1); + } + } + return number; +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filename) +{ + // Change filename if another image exist with the same name + int number = GetImageDuplicateFilenameNumber(filename); + + // Create new SliceManager vvSlicerManager* slicer_manager = new vvSlicerManager(4); - slicer_manager->SetImage(image); - slicer_manager->SetFilename(filename); + slicer_manager->SetImage(image);//, IMAGE, number); + // filename = filename+"_"+clitk::toString(number); + slicer_manager->SetFilename(filename, number); mSlicerManagers.push_back(slicer_manager); //create an item in the tree with good settings QTreeWidgetItem *item = new QTreeWidgetItem(); item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str()); - item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str()); + item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,slicer_manager->GetFileName().c_str());//filename.c_str()); qApp->processEvents(); for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1); @@ -2735,10 +2781,13 @@ void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename) item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str()); mSlicerManagers.back()->SetId(id.toStdString()); - linkPanel->addImage(filename, id.toStdString()); + linkPanel->addImage(slicer_manager->GetFileName().c_str()// filename + , id.toStdString()); connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)), this, SLOT(CurrentImageChanged(std::string))); + connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)), + this, SLOT(CurrentPickedImageChanged(std::string))); connect(mSlicerManagers.back(), SIGNAL(UpdatePosition(int, double, double, double, double, double, double, double)), this, SLOT(MousePositionChanged(int,double, double, double, double, double, double, double))); connect(mSlicerManagers.back(), SIGNAL(UpdateVector(int, double, double, double, double)), @@ -2759,6 +2808,8 @@ void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename) this,SLOT(UpdateSliceRange(int,int,int,int,int))); connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); + connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)), + this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*))); connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)), this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int))); connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint())); @@ -2768,6 +2819,10 @@ void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename) ShowLastImage(); InitDisplay(); qApp->processEvents(); + + // End + ImageInfoChanged(); + return slicer_manager; } //------------------------------------------------------------------------------