#define COLUMN_RELOAD_IMAGE 6
#define COLUMN_IMAGE_NAME 7
-#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.mha *.hdr *.vox *.his *.xdr *.SCAN *.nii *.nrrd *.nhdr)"
+#if CLITK_PRIVATE_FEATURES
+ #define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.mha *.hdr *.vox *.his *.xdr *.SCAN *.nii *.nrrd *.nhdr *.usf)"
+#else
+ #define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.mha *.hdr *.vox *.his *.xdr *.SCAN *.nii *.nrrd *.nhdr)"
+#endif
/*Data Tree values
0,Qt::UserRole full filename
connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
+ connect(slicingPresetComboBox, SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateSlicingPreset()));
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(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,int,double,double)),
this,SLOT(SetOverlayProperty(int,int,double,double)));
- connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,int,double,double)),
- this,SLOT(SetFusionProperty(int,int,int,double,double)));
+ connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,int,double,double, bool)),
+ this,SLOT(SetFusionProperty(int,int,int,double,double, bool)));
connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
playMode = 0;//pause
this,SLOT(UpdateSlice(int,int)));
connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
this,SLOT(UpdateTSlice(int, int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
+ this,SLOT(ImageInfoChanged()));
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)),
QString inputSizeInBytes;
QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
- if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1) {
+ int nframes = mSlicerManagers[index]->GetSlicer(0)->GetTMax();
+ if (nframes > 1 || playMode == 1) {
playButton->setEnabled(1);
frameRateLabel->setEnabled(1);
frameRateSpinBox->setEnabled(1);
infoPanel->setOrigin(GetVectorDoubleAsString(origin));
infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
- transformation = imageSelected->GetTransform()->GetMatrix();
+ transformation = imageSelected->GetTransform()[mSlicerManagers[index]->GetTSlice()]->GetMatrix();
infoPanel->setTransformation(Get4x4MatrixDoubleAsString(transformation));
landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
}
}
WindowLevelChanged();
+ slicingPresetComboBox->setCurrentIndex(mSlicerManagers[index]->GetSlicingPreset());
if (mSlicerManagers[index]->GetSlicer(0)->GetVF()) {
overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
//------------------------------------------------------------------------------
void vvMainWindow::ChangeViewMode()
{
- QList<int> size;
+ typedef struct _SIZE{
+ QSplitter* splitter;
+ QList<int> size1, size2;
+ }SplitterSize;
+ SplitterSize sizes[4];
+ sizes[0].splitter = OSplitter;
+ sizes[0].size1.push_back(1);
+ sizes[0].size1.push_back(0);
+ sizes[0].size2.push_back(1);
+ sizes[0].size2.push_back(0);
+
+ sizes[1].splitter = ESplitter;
+ sizes[1].size1.push_back(0);
+ sizes[1].size1.push_back(1);
+ sizes[1].size2.push_back(1);
+ sizes[1].size2.push_back(0);
+
+ sizes[2].splitter = OSplitter;
+ sizes[2].size1.push_back(1);
+ sizes[2].size1.push_back(0);
+ sizes[2].size2.push_back(0);
+ sizes[2].size2.push_back(1);
+
+ sizes[3].splitter = ESplitter;
+ sizes[3].size1.push_back(0);
+ sizes[3].size1.push_back(1);
+ sizes[3].size2.push_back(0);
+ sizes[3].size2.push_back(1);
+
+ int slicer = mSlicerManagers[mCurrentPickedImageIndex]->GetSelectedSlicer();
if (viewMode == 1) {
- viewMode = 0;
- size.push_back(1);
- size.push_back(0);
- splitter_3->setSizes(size);
- OSplitter->setSizes(size);
- DataTree->setColumnHidden(2,1);
- DataTree->setColumnHidden(3,1);
- DataTree->setColumnHidden(4,1);
+ if (slicer >= 0) {
+ viewMode = 0;
+ splitter_3->setSizes(sizes[slicer].size1);
+ sizes[slicer].splitter->setSizes(sizes[slicer].size2);
+ DataTree->setColumnHidden(2,1);
+ DataTree->setColumnHidden(3,1);
+ DataTree->setColumnHidden(4,1);
+ }
} else {
- viewMode = 1;
- size.push_back(1);
- size.push_back(1);
- splitter_3->setSizes(size);
- OSplitter->setSizes(size);
- DataTree->setColumnHidden(2,0);
- DataTree->setColumnHidden(3,0);
- DataTree->setColumnHidden(4,0);
+ QList<int> size;
+ if (slicer >= 0) {
+ viewMode = 1;
+ size.push_back(1);
+ size.push_back(1);
+ splitter_3->setSizes(size);
+ sizes[slicer].splitter->setSizes(size);
+ DataTree->setColumnHidden(2,0);
+ DataTree->setColumnHidden(3,0);
+ DataTree->setColumnHidden(4,0);
+ }
}
UpdateRenderWindows();
/*
** the associated Slicer to redraw crosses.
*/
for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
- if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
+// if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
mSlicerManagers[i]->GetSlicer(0)->Render();
- if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
+ mSlicerManagers[i]->GetSlicer(1)->Render();
+// if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
mSlicerManagers[i]->GetSlicer(2)->Render();
+ mSlicerManagers[i]->GetSlicer(3)->Render();
}
}
//------------------------------------------------------------------------------
int tRange[2];
tRange[0] = 0;
tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
- int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
+ int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetMaxCurrentTSlice();
bool showHorizontal = false;
bool showVertical = false;
- if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
- || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
- && mSlicerManagers[slicer]->GetType() != vvImageReader::IMAGEWITHTIME
- && mSlicerManagers[slicer]->GetType() != vvImageReader::MERGEDWITHTIME))
+ if (range[1]>0)
showVertical = true;
- if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
- || mSlicerManagers[slicer]->GetType() == vvImageReader::IMAGEWITHTIME
- || mSlicerManagers[slicer]->GetType() == vvImageReader::MERGEDWITHTIME)
+ if (tRange[1]>0)
showHorizontal = true;
if (showVertical)
}
//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+void vvMainWindow::UpdateSlicingPreset()
+{
+ if (DataTree->selectedItems().size()) {
+ int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+ mSlicerManagers[index]->SetSlicingPreset(vvSlicerManager::SlicingPresetType(slicingPresetComboBox->currentIndex()));
+ }
+}
+//------------------------------------------------------------------------------
+
//------------------------------------------------------------------------------
void vvMainWindow::UpdateColorMap()
{
QString Extensions = EXTENSIONS;
Extensions += ";;All Files (*)";
- QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
- if (!file.isEmpty())
- AddOverlayImage(index,file);
+ QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image"),mInputPathName,Extensions);
+ if (files.isEmpty())
+ return;
+
+ std::vector<std::string> vecFileNames;
+ for (int i = 0; i < files.size(); i++) {
+ vecFileNames.push_back(files[i].toStdString());
+ }
+ AddOverlayImage(index,vecFileNames,vvImageReader::IMAGE);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvMainWindow::AddOverlayImage(int index, QString file)
+void vvMainWindow::AddOverlayImage(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type)
{
+ QString file(fileNames[0].c_str());
if (QFile::exists(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->SetFileName(fileNames[0].c_str());
reader->ReadImageInformation();
std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
int dimension = reader->GetNumberOfDimensions();
qApp->processEvents();
std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
- if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component)) {
+ if (mSlicerManagers[index]->SetOverlay(fileNames,dimension, component,type)) {
//create an item in the tree with good settings
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setData(0,Qt::UserRole,file.toStdString().c_str());
qApp->processEvents();
ImageInfoChanged();
QApplication::restoreOverrideCursor();
+
+ // Update the display to update, e.g., the sliders
+ for(int i=0; i<4; i++)
+ DisplaySliders(index, i);
} else {
QApplication::restoreOverrideCursor();
QString error = "Cannot import the new image.\n";
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvMainWindow::SetFusionProperty(int opacity, int thresOpacity, int colormap,double window, double level)
+void vvMainWindow::SetFusionProperty(int opacity, int thresOpacity, int colormap,double window, double level, bool showLegend)
{
int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
mSlicerManagers[index]->SetFusionThresholdOpacity(thresOpacity);
mSlicerManagers[index]->SetFusionWindow(window);
mSlicerManagers[index]->SetFusionLevel(level);
+ mSlicerManagers[index]->SetFusionShowLegend(showLegend);
mSlicerManagers[index]->SetColorMap(0);
mSlicerManagers[index]->Render();
}
bool bId = true;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++) {
- double elt = mSlicerManagers[index]->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
+ // TODO SR and BP: check on the list of transforms and not the first only
+ double elt = mSlicerManagers[index]->GetImage()->GetTransform()[0]->GetMatrix()->GetElement(i,j);
if(i==j && elt!=1.)
bId = false;
if(i!=j && elt!=0.)
{
vvSaveState save_state;
save_state.Run(this, stateFile);
-
- std::cout << "void vvMainWindow::SaveCurrentState()" << std::endl;
}
//------------------------------------------------------------------------------
w2i->Update();
vtkImageData *image = w2i->GetOutput();
- const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
+ std::string ext(itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString()));
// Image
vtkImageWriter *imgwriter = NULL;
- if (!strcmp(ext, ".bmp"))
+ if (ext==".bmp")
imgwriter = vtkBMPWriter::New();
- else if (!strcmp(ext, ".tif"))
+ else if (ext==".tif")
imgwriter = vtkTIFFWriter::New();
- else if (!strcmp(ext, ".ppm"))
+ else if (ext==".ppm")
imgwriter = vtkPNMWriter::New();
- else if (!strcmp(ext, ".png"))
+ else if (ext==".png")
imgwriter = vtkPNGWriter::New();
- else if (!strcmp(ext, ".jpg"))
+ else if (ext==".jpg")
imgwriter = vtkJPEGWriter::New();
// Snapshot image if not null
// Video
vtkGenericMovieWriter *vidwriter = NULL;
-#ifdef CLITK_EXPERIMENTAL
- if (!strcmp(ext, ".gif")) {
+#if CLITK_EXPERIMENTAL == 1
+ if (ext==".gif") {
vvAnimatedGIFWriter *gif = vvAnimatedGIFWriter::New();
vidwriter = gif;
// FPS
bool ok;
- int fps = QInputDialog::getInt(this, tr("Number of frames per second"),
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
tr("FPS:"), 5, 0, 1000, 1, &ok);
if(ok)
gif->SetRate(fps);
// Loops
- int loops = QInputDialog::getInt(this, tr("Loops"),
+ int loops = QInputDialog::getInteger(this, tr("Loops"),
tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
if(ok)
gif->SetLoops(loops);
+
+ // Dithering
+ QString msg = "Would you like to activate dithering?";
+ QMessageBox msgBox(QMessageBox::Question, tr("Dithering"),msg, 0, this);
+ msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
+ msgBox.addButton(tr("No"), QMessageBox::RejectRole);
+ gif->SetDither(msgBox.exec() == QMessageBox::AcceptRole);
}
#endif
#ifdef VTK_USE_VIDEO_FOR_WINDOWS
- if (!strcmp(ext, ".avi")) {
+ if (ext==".avi") {
vtkAVIWriter *mpg = vtkAVIWriter::New();
vidwriter = mpg;
mpg->SetQuality(2);
bool ok;
- int fps = QInputDialog::getInt(this, tr("Number of frames per second"),
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
tr("FPS:"), 5, 0, 1024, 1, &ok);
if(!ok)
fps = 5;
}
#endif
#ifdef VTK_USE_FFMPEG_ENCODER
- if (!strcmp(ext, ".avi")) {
+ if (ext==".avi") {
vtkFFMPEGWriter *mpg = vtkFFMPEGWriter::New();
vidwriter = mpg;
mpg->SetQuality(2);
bool ok;
- int fps = QInputDialog::getInt(this, tr("Number of frames per second"),
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
tr("FPS:"), 5, 0, 1024, 1, &ok);
if(!ok)
fps = 5;
}
#endif
#ifdef VTK_USE_MPEG2_ENCODER
- if (!strcmp(ext, ".mpg")) {
+ if (ext==".mpg") {
vtkMPEG2Writer *mpg = vtkMPEG2Writer::New();
vidwriter = mpg;
}
vidwriter->SetInput(image);
vidwriter->SetFileName(fileName.toStdString().c_str());
vidwriter->Start();
- vvImage * vvImg = mSlicerManagers[smIndex]->GetImage();
- int nSlice = vvImg->GetVTKImages().size();
- for(int i=0; i<nSlice; i++) {
+ int nSlice = mSlicerManagers[smIndex]->GetSlicer(0)->GetTMax();
+ for(int i=0; i<=nSlice; i++) {
mSlicerManagers[smIndex]->SetNextTSlice(0);
vtkSmartPointer<vtkWindowToImageFilter> w2i = vtkSmartPointer<vtkWindowToImageFilter>::New();
w2i->SetInput(widget->GetRenderWindow());
int image_number=DataTree->topLevelItemCount();
bool has_temporal;
for (int i=0; i<image_number; i++)
- if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1) {
+ if (mSlicerManagers[i]->GetSlicer(0)->GetTMax() > 0) {
has_temporal=true;
break;
}
///Only play one slicer per SM, and only if the SM is being displayed
for (int i=0; i<image_number; i++)
for (int j=0; j<4; j++)
- if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 &&
+ if (mSlicerManagers[i]->GetSlicer(0)->GetTMax() > 0 &&
DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0) {
mSlicerManagers[i]->SetNextTSlice(j);
break;
this,SLOT(UpdateSlice(int,int)));
connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
this,SLOT(UpdateTSlice(int, int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int)),
+ this,SLOT(ImageInfoChanged()));
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)),