SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+IF(MSVC)
+ SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj" )
+ SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj" )
+ENDIF(MSVC)
+
#=========================================================
INCLUDE(${CLITK_SOURCE_DIR}/cmake/common.cmake)
INCLUDE(${CLITK_SOURCE_DIR}/cmake/dependencies.cmake)
# include <sys/resource.h>
#elif defined(_WIN32)
# include <windows.h>
+# include <stdint.h>
#endif
//--------------------------------------------------------------------
size_t nelements = 0;
nelements += fread ( (void *) hnd.sFileType, sizeof(char), 32, fp);
- nelements += fread ( (void *) &hnd.FileLength, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.FileLength, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) hnd.sChecksumSpec, sizeof(char), 4, fp);
- nelements += fread ( (void *) &hnd.nCheckSum, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nCheckSum, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) hnd.sCreationDate, sizeof(char), 8, fp);
nelements += fread ( (void *) hnd.sCreationTime, sizeof(char), 8, fp);
nelements += fread ( (void *) hnd.sPatientID, sizeof(char), 16, fp);
- nelements += fread ( (void *) &hnd.nPatientSer, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nPatientSer, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) hnd.sSeriesID, sizeof(char), 16, fp);
- nelements += fread ( (void *) &hnd.nSeriesSer, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nSeriesSer, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) hnd.sSliceID, sizeof(char), 16, fp);
- nelements += fread ( (void *) &hnd.nSliceSer, sizeof(uint32_t), 1, fp);
- nelements += fread ( (void *) &hnd.SizeX, sizeof(uint32_t), 1, fp);
- nelements += fread ( (void *) &hnd.SizeY, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nSliceSer, sizeof(itk::uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.SizeX, sizeof(itk::uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.SizeY, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) &hnd.dSliceZPos, sizeof(double), 1, fp);
nelements += fread ( (void *) hnd.sModality, sizeof(char), 16, fp);
- nelements += fread ( (void *) &hnd.nWindow, sizeof(uint32_t), 1, fp);
- nelements += fread ( (void *) &hnd.nLevel, sizeof(uint32_t), 1, fp);
- nelements += fread ( (void *) &hnd.nPixelOffset, sizeof(uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nWindow, sizeof(itk::uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nLevel, sizeof(itk::uint32_t), 1, fp);
+ nelements += fread ( (void *) &hnd.nPixelOffset, sizeof(itk::uint32_t), 1, fp);
nelements += fread ( (void *) hnd.sImageType, sizeof(char), 4, fp);
nelements += fread ( (void *) &hnd.dGantryRtn, sizeof(double), 1, fp);
nelements += fread ( (void *) &hnd.dSAD, sizeof(double), 1, fp);
nelements += fread ( (void *) &hnd.dGating4DInfoZ, sizeof(double), 1, fp);
nelements += fread ( (void *) &hnd.dGating4DInfoTime, sizeof(double), 1, fp);
- if(nelements != /*char*/120 + /*uint32_t*/10 + /*double*/41)
+ if(nelements != /*char*/120 + /*itk::uint32_t*/10 + /*double*/41)
itkGenericExceptionMacro(<< "Could not read header data in " << m_FileName);
if(fclose (fp) != 0)
{
FILE *fp;
- uint32_t* buf = (uint32_t*)buffer;
+ itk::uint32_t* buf = (itk::uint32_t*)buffer;
unsigned char *pt_lut;
- uint32_t a;
+ itk::uint32_t a;
unsigned char v;
int lut_idx, lut_off;
size_t num_read;
char dc;
short ds;
long dl, diff=0;
- uint32_t i;
+ itk::uint32_t i;
fp = fopen (m_FileName.c_str(), "rb");
if (fp == NULL)
/* Read first row */
for (i = 0; i < GetDimensions(0); i++) {
- if(1 != fread (&a, sizeof(uint32_t), 1, fp))
+ if(1 != fread (&a, sizeof(itk::uint32_t), 1, fp))
itkGenericExceptionMacro(<< "Could not read first row in: " << m_FileName);
buf[i] = a;
}
/* Read first pixel of second row */
- if(1 != fread (&a, sizeof(uint32_t), 1, fp))
+ if(1 != fread (&a, sizeof(itk::uint32_t), 1, fp))
itkGenericExceptionMacro(<< "Could not read first pixel of second row");
buf[i++] = a;
lut_idx = 0;
lut_off = 0;
while (i < GetDimensions(0) * GetDimensions(1) ) {
- uint32_t r11, r12, r21;
+ itk::uint32_t r11, r12, r21;
r11 = buf[i-GetDimensions(0)-1];
r12 = buf[i-GetDimensions(0)];
diff = ds;
break;
case 2:
- num_read = fread (&dl, sizeof(uint32_t), 1, fp);
+ num_read = fread (&dl, sizeof(itk::uint32_t), 1, fp);
if (num_read != 1) goto read_error;
diff = dl;
break;
switch(mDim) {
case 2:
UpdateWithDim<2>(mInputPixelType);
- break;;
+ break;
case 3:
UpdateWithDim<3>(mInputPixelType);
- break;;
+ break;
case 4:
UpdateWithDim<4>(mInputPixelType);
- break;;
+ break;
default:
std::cerr << "dimension unknown in Update ! " << std::endl;
}
}
// TODO SR and BP: check on the list of transforms and not the first only
- mImage->GetTransform()[0]->PostMultiply();
+ mImage->GetTransform()[0]->PreMultiply();
mImage->GetTransform()[0]->Concatenate(matrix);
mImage->GetTransform()[0]->Update();
+
+ //for image sequences, apply the transform to each images of the sequence
+ if (mImage->IsTimeSequence())
+ {
+ for (unsigned i = 1 ; i<mImage->GetTransform().size() ; i++)
+ {
+ mImage->GetTransform()[i]->PreMultiply();
+ mImage->GetTransform()[i]->Concatenate(matrix);
+ mImage->GetTransform()[i]->Update();
+ }
+ }
+
}
}
//------------------------------------------------------------------------------
IF(CLITK_EXPERIMENTAL)
WRAP_GGO(clitkBinaryImageToMesh_GGO_C clitkBinaryImageToMesh.ggo)
ADD_EXECUTABLE(clitkBinaryImageToMesh clitkBinaryImageToMesh.cxx ${clitkBinaryImageToMesh_GGO_C})
- TARGET_LINK_LIBRARIES(clitkBinaryImageToMesh itksys ${VTK_LIBRARIES})
+ TARGET_LINK_LIBRARIES(clitkBinaryImageToMesh itksys ${ITK_LIBRARIES} ${VTK_LIBRARIES})
SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkBinaryImageToMesh)
WRAP_GGO(clitkMeshToBinaryImage_GGO_C clitkMeshToBinaryImage.ggo)
WRAP_GGO(clitkMeshViewer_GGO_C clitkMeshViewer.ggo)
ADD_EXECUTABLE(clitkMeshViewer clitkMeshViewer.cxx ${clitkMeshViewer_GGO_C})
- TARGET_LINK_LIBRARIES(clitkMeshViewer ${VTK_LIBRARIES})
+ TARGET_LINK_LIBRARIES(clitkMeshViewer ${ITK_LIBRARIES} ${VTK_LIBRARIES})
SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkMeshViewer)
ENDIF(CLITK_EXPERIMENTAL)
IF(WIN32)
#INCLUDE(InstallRequiredSystemLibraries)
- INSTALL(FILES ${EXECUTABLE_OUTPUT_PATH}/vv.exe DESTINATION .)
+ INSTALL(TARGETS vv DESTINATION bin)
#INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/ducky.png DESTINATION .)
ENDIF(WIN32)
#=========================================================
</sizepolicy>
</property>
<property name="currentIndex">
- <number>0</number>
+ <number>1</number>
</property>
<widget class="QWidget" name="DataTab">
<attribute name="title">
<x>0</x>
<y>0</y>
<width>1008</width>
- <height>25</height>
+ <height>29</height>
</rect>
</property>
<property name="defaultUp">
<addaction name="actionAdd_VF_to_current_Image"/>
<addaction name="actionAdd_overlay_image_to_current_image"/>
<addaction name="actionAdd_fusion_image"/>
+ <addaction name="actionAdd_USSequence_toCT"/>
</widget>
<widget class="QMenu" name="menuScreenshots">
<property name="title">
<bool>true</bool>
</property>
</action>
+ <action name="actionAdd_USSequence_toCT">
+ <property name="icon">
+ <iconset resource="../vvIcons.qrc">
+ <normaloff>:/common/icons/rotateright.png</normaloff>:/common/icons/rotateright.png</iconset>
+ </property>
+ <property name="text">
+ <string>Test / Fusion of US & CT sequences</string>
+ </property>
+ <property name="iconVisibleInMenu">
+ <bool>true</bool>
+ </property>
+ </action>
</widget>
<customwidgets>
<customwidget>
<rect>
<x>0</x>
<y>0</y>
- <width>344</width>
- <height>480</height>
+ <width>444</width>
+ <height>612</height>
</rect>
</property>
<property name="sizePolicy">
</property>
</widget>
</item>
+ <item>
+ <widget class="QFrame" name="fCTUSFrame">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>90</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <widget class="QCheckBox" name="fCTUSActivateTimeSyncCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>60</y>
+ <width>80</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Temporal</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="fCTUSActivateSpaceSyncCheckBox">
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>10</y>
+ <width>61</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Spatial</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_13">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>31</width>
+ <height>32</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../vvIcons.qrc">:/common/icons/rotateright.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_14">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>0</y>
+ <width>171</width>
+ <height>32</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Synchronized fusion of sequences</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_15">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>30</y>
+ <width>121</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string> Browse fused sequence </string>
+ </property>
+ </widget>
+ <widget class="QSlider" name="fCTUSSlider">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>36</y>
+ <width>151</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="fCTUSLoadSignalPushButton">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>60</y>
+ <width>131</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Load Fused Seq. Signal</string>
+ </property>
+ </widget>
+ </widget>
+ </item>
<item>
<widget class="QFrame" name="vFFrame">
<property name="enabled">
std::vector<std::string> &sequence_filenames,
int n_image_loaded)
{
- const std::string open_mode_names[] = {"base", "overlay", "fusion", "vf", "contour"};
+ const std::string open_mode_names[] = {"base", "overlay", "fusion", "vf", "contour", "fusionSequence"};
if(open_mode==O_BASE)
window.LoadImages(sequence_filenames, vvImageReader::MERGEDWITHTIME);
else if (open_mode==O_OVERLAY)
class vtkImageAppend;
-class VTK_IO_EXPORT vvAnimatedGIFWriter : public vtkGenericMovieWriter
+class vvAnimatedGIFWriter : public vtkGenericMovieWriter //test this if link error...
{
public:
static vvAnimatedGIFWriter *New();
/*=========================================================================
- Program: vv http://www.creatis.insa-lyon.fr/rio/vv
+Program: vv http://www.creatis.insa-lyon.fr/rio/vv
- Authors belong to:
- - University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://www.centreleonberard.fr
- - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
+Authors belong to:
+- University of LYON http://www.universite-lyon.fr/
+- Léon Bérard cancer center http://www.centreleonberard.fr
+- CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the copyright notices for more information.
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the copyright notices for more information.
- It is distributed under dual licence
+It is distributed under dual licence
- - BSD See included LICENSE.txt file
- - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+- BSD See included LICENSE.txt file
+- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
===========================================================================**/
#include <algorithm>
/*Data Tree values
- 0,Qt::UserRole full filename
- 1,Qt::CheckStateRole checkbutton UL View
- 1,Qt::UserRole overlay, fusion or vector
- 2,Qt::CheckStateRole checkbutton UR View
- 3,Qt::CheckStateRole checkbutton DL View
- 4,Qt::CheckStateRole checkbutton DR View
- 5,0 short filename
- 5,Qt::UserRole mSlicerManager id*/
+0,Qt::UserRole full filename
+1,Qt::CheckStateRole checkbutton UL View
+1,Qt::UserRole overlay, fusion or vector
+2,Qt::CheckStateRole checkbutton UR View
+3,Qt::CheckStateRole checkbutton DL View
+4,Qt::CheckStateRole checkbutton DR View
+5,0 short filename
+5,Qt::UserRole mSlicerManager id*/
//------------------------------------------------------------------------------
vvMainWindow::vvMainWindow():vvMainWindowBase()
this->setContextMenuPolicy(Qt::CustomContextMenu);
contextActions.resize(0);
QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/fileopen.png")),
- tr("O&pen new Image"));
+ tr("O&pen new Image"));
actionOpen_new_image->setShortcut(QKeySequence(tr("Ctrl+O")));
connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
contextActions.push_back(actionOpen_new_image);
contextMenu.addSeparator();
QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/exit.png")),
- tr("Close Current Image"));
+ tr("Close Current Image"));
connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
contextActions.push_back(actionClose_Image);
QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")),
- tr("Reload Current Image"));
+ tr("Reload Current Image"));
connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
contextActions.push_back(actionReload_image);
QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
- tr("Save Current Image"));
+ tr("Save Current Image"));
connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
contextActions.push_back(actionSave_image);
QAction* actionSave_state = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
- tr("Save Current State"));
+ tr("Save Current State"));
connect(actionSave_state,SIGNAL(triggered()),this,SLOT(SaveCurrentState()));
contextActions.push_back(actionSave_state);
QAction* actionRead_state = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/filesave.png")),
- tr("Read Saved State"));
+ tr("Read Saved State"));
connect(actionRead_state,SIGNAL(triggered()),this,SLOT(ReadSavedState()));
contextActions.push_back(actionRead_state);
contextMenu.addAction(actionAdd_fusion_image);
contextActions.push_back(actionAdd_fusion_image);
+#ifdef CLITK_EXPERIMENTAL
+ contextMenu.addAction(actionAdd_USSequence_toCT);
+ contextActions.push_back(actionAdd_USSequence_toCT);
+#endif
+
+
contextMenu.addSeparator();
QAction* actionResetMatrix = contextMenu.addAction(QIcon(QString::fromUtf8(":/common/icons/identity.png")),
- tr("Reset transformation to identity"));
+ tr("Reset transformation to identity"));
connect(actionResetMatrix, SIGNAL(triggered()), this,SLOT(ResetTransformationToIdentity()));
// TRIAL DS
// m->setObjectName(QString::fromUtf8("TOTOTO"));
contextMenu.addMenu(m);
QAction * a = m->addAction(QIcon(QString::fromUtf8(":/common/icons/GPSup.png")),
- tr("BIDON"));
+ tr("BIDON"));
QAction * b = m->addAction(QIcon(QString::fromUtf8(":/common/icons/GPSup.png")),
- tr("BIDON2"));
+ tr("BIDON2"));
m->addAction(a);
m->addAction(b);
connect(a,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
actionSave_As->setEnabled(0);
actionAdd_VF_to_current_Image->setEnabled(0);
actionAdd_fusion_image->setEnabled(0);
+ actionAdd_USSequence_toCT->setEnabled(0);
//init the sliders
verticalSliders.push_back(NOVerticalSlider);
connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(SelectFusionImage()));
- connect(actionAdd_overlay_image_to_current_image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage())); connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
+ connect(actionAdd_overlay_image_to_current_image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
+ connect(actionAdd_USSequence_toCT,SIGNAL(triggered()), this,SLOT(SelectFusionSequence()));
+ connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
connect(actionRegister_vv,SIGNAL(triggered()),this,SLOT(PopupRegisterForm()));
+ connect(overlayPanel, SIGNAL(FusionSequenceSignalButtonPressed()), this, SLOT(SelectFusionSequenceTemporalSignal()));
+
+
///////////////////////////////////////////////
connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
- SLOT(DisplayChanged(QTreeWidgetItem*, int)));
+ SLOT(DisplayChanged(QTreeWidgetItem*, int)));
connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(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)));
+ this,SLOT(SetOverlayProperty(int,int,double,double)));
connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,int,double,double, bool)),
- this,SLOT(SetFusionProperty(int,int,int,double,double, bool)));
+ this,SLOT(SetFusionProperty(int,int,int,double,double, bool)));
connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
connect(landmarksPanel,SIGNAL(SelectedPointChanged()),this,SLOT(GoToLandmark()));
+ connect(overlayPanel,SIGNAL(FusionSequencePropertyUpdated(int, bool, unsigned int, bool)),
+ this,SLOT(SetFusionSequenceProperty(int, bool,unsigned int, bool)));
+
+
playMode = 0;//pause
mFrameRate = 10;
playButton->setEnabled(0);
//timerMemory->setInterval(5);
connect(timerMemory, SIGNAL(timeout()), this, SLOT(UpdateMemoryUsage()));
timerMemory->start(2000);
+
}
//------------------------------------------------------------------------------
void vvMainWindow::show()
bool ok;
int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
- mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
+ mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
if (ok) {
vvMidPosition midp;
midp.slicer_manager = mSlicerManagers[index];
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)));
+ this,SLOT(CloseImage(QTreeWidgetItem*, int)));
QTreePushButton* rButton = new QTreePushButton;
rButton->setItem(item);
//------------------------------------------------------------------------------
void vvMainWindow::AddDCStructContour(int index, QString file)
{
- vvMeshReader reader;
- reader.SetFilename(file.toStdString());
- vvStructSelector selector;
- selector.SetStructures(reader.GetROINames());
- if (!mSlicerManagers[index]->GetVF().IsNull())
- selector.EnablePropagationCheckBox();
- if (selector.exec()) {
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- reader.SetSelectedItems(selector.getSelectedItems());
- reader.SetImage(mSlicerManagers[index]->GetImage());
- if (selector.PropagationEnabled())
- reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
- reader.Update();
- std::vector<vvMesh::Pointer> contours=reader.GetOutput();
- for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
- i!=contours.end(); i++)
- AddContour(index,*i,selector.PropagationEnabled());
- QApplication::restoreOverrideCursor();
- }
+ vvMeshReader reader;
+ reader.SetFilename(file.toStdString());
+ vvStructSelector selector;
+ selector.SetStructures(reader.GetROINames());
+ if (!mSlicerManagers[index]->GetVF().IsNull())
+ selector.EnablePropagationCheckBox();
+ if (selector.exec()) {
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ reader.SetSelectedItems(selector.getSelectedItems());
+ reader.SetImage(mSlicerManagers[index]->GetImage());
+ if (selector.PropagationEnabled())
+ reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
+ reader.Update();
+ std::vector<vvMesh::Pointer> contours=reader.GetOutput();
+ for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
+ i!=contours.end(); i++)
+ AddContour(index,*i,selector.PropagationEnabled());
+ QApplication::restoreOverrideCursor();
+ }
}
//------------------------------------------------------------------------------
if (!mSlicerManagers[index]->GetVF().IsNull()) {
bool ok;
int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
- mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
+ mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
if (ok) {
WarpImage(mSlicerManagers[index],ref);
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QFileInfo info(selected_slicer->GetFileName().c_str());
vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
- reference_phase,this);
+ reference_phase,this);
if (warp.ComputeWarpedImage()) {
AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
AddImage(warp.GetDiffImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
for (int i = 0; i < files.size(); i++) {
itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
- files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+ files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
reader->SetFileName(files[i].toStdString().c_str());
reader->ReadImageInformation();
if (reader) {
currentSpacing[j] = reader->GetSpacing(j);
currentSize[j] = reader->GetDimensions(j);
} else if (currentDim != reader->GetNumberOfDimensions()
- || currentSpacing[j] != reader->GetSpacing(j)
- || currentSize[j] != (int)reader->GetDimensions(j)
- || currentOrigin[j] != reader->GetOrigin(j)) {
- QString error = "Cannot read file (too different from others ";
- error += files[i].toStdString().c_str();
- QMessageBox::information(this,tr("Reading problem"),error);
- IsOk = false;
- break;
+ || currentSpacing[j] != reader->GetSpacing(j)
+ || currentSize[j] != (int)reader->GetDimensions(j)
+ || currentOrigin[j] != reader->GetOrigin(j)) {
+ QString error = "Cannot read file (too different from others ";
+ error += files[i].toStdString().c_str();
+ QMessageBox::information(this,tr("Reading problem"),error);
+ IsOk = false;
+ break;
}
}
if (IsOk)
int numberofsuccesulreads=0;
//open images as 1 or multiples
for (int i = 0; i < fileSize; i++) {
-
progress.SetText("Opening " + files[i]);
progress.SetProgress(i,fileSize);
qApp->processEvents();
else {
SetImageSucceed = imageManager->SetImages(files,filetype, number);
}
+
if (!SetImageSucceed) {
QApplication::restoreOverrideCursor();
QString error = "Cannot open file \n";
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)));
+ this,SLOT(CloseImage(QTreeWidgetItem*, int)));
QTreePushButton* rButton = new QTreePushButton;
rButton->setItem(item);
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)));
+ this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
DataTree->addTopLevelItem(item);
DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)),
- this,SLOT(CurrentImageChanged(std::string)));
+ this,SLOT(CurrentImageChanged(std::string)));
connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)),
- this, SLOT(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)));
+ 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)));
+ this, SLOT(VectorChanged(int,double,double,double, double)));
connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)),
- this, SLOT(OverlayChanged(int,double,double)));
+ this, SLOT(OverlayChanged(int,double,double)));
connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)),
- this, SLOT(FusionChanged(int,double)));
+ this, SLOT(FusionChanged(int,double)));
connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged()),
- this,SLOT(WindowLevelChanged()));
+ this,SLOT(WindowLevelChanged()));
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(UpdateTSlice(int, int)),
- this,SLOT(ImageInfoChanged()));
+ this,SLOT(UpdateSlice(int,int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+ this,SLOT(UpdateTSlice(int, int, int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+ this,SLOT(ImageInfoChanged()));
connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)),
- this,SLOT(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)));
+ 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*)));
+ this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
- this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
+ this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+
InitSlicers();
numberofsuccesulreads++;
}
actionAdd_VF_to_current_Image->setEnabled(1);
actionAdd_fusion_image->setEnabled(1);
actionAdd_overlay_image_to_current_image->setEnabled(1);
+ actionAdd_USSequence_toCT->setEnabled(1);
actionNorth_East_Window->setEnabled(1);
actionNorth_West_Window->setEnabled(1);
actionSouth_East_Window->setEnabled(1);
colorMapComboBox->setEnabled(1);
for (int i = 0; i < DataTree->topLevelItem(index)->childCount(); i++) {
if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
- DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion") {
- colorMapComboBox->setEnabled(0);
- break;
+ DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion" ||
+ DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusionSequence") {
+ colorMapComboBox->setEnabled(0);
+ break;
}
}
QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
int nframes = mSlicerManagers[index]->GetSlicer(0)->GetTMax();
+
if (nframes > 1 || playMode == 1) {
playButton->setEnabled(1);
frameRateLabel->setEnabled(1);
imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
tSlice = mSlicerManagers[index]->GetSlicer(0)->GetFusionTSlice();
}
+ else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusionSequence") {
+ imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
+ tSlice = mSlicerManagers[index]->GetSlicer(0)->GetFusionTSlice();
+ }
else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "contour") {
imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
tSlice = mSlicerManagers[index]->GetSlicer(0)->GetTSlice();
NPixel *= inputSize[i];
}
inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
-
+
QString dim = QString::number(dimension) + " (";
dim += pixelType + ")";
infoPanel->setOrigin(GetVectorDoubleAsString(origin));
infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
+
transformation = imageSelected->GetTransform()[tSlice]->GetMatrix();
infoPanel->setTransformation(Get4x4MatrixDoubleAsString(transformation));
// }
// }
WindowLevelChanged();
+
slicingPresetComboBox->setCurrentIndex(mSlicerManagers[index]->GetSlicingPreset());
if (mSlicerManagers[index]->GetSlicer(0)->GetVF()) {
overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
- mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
- mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
+ mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
+ mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
} else {
overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
overlayPanel->getVFProperty(-1,-1,-1);
} else {
overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
}
-
+
if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
} else {
sizes[3].cols[0] = 1;
sizes[3].cols[1] = 2;
sizes[3].cols[2] = 3;
-
+
int slicer = mSlicerManagers[mCurrentPickedImageIndex]->GetSelectedSlicer();
if (viewMode == 1) {
if (slicer >= 0) {
** 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)
- mSlicerManagers[i]->GetSlicer(0)->Render();
- 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();
+ // if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
+ mSlicerManagers[i]->GetSlicer(0)->Render();
+ 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();
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
+//this actually returns the SlicerManager index!
int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item)
{
QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
QString warning = "Do you really want to close the overlay : ";
warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
- warning, 0, this);
+ warning, 0, this);
msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
if (msgBox.exec() == QMessageBox::AcceptRole) {
int overlay_index=0;
for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++) {
if (DataTree->topLevelItem(index)->\
- child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
+ child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
overlay_index++;
if (DataTree->topLevelItem(index)->child(child) == item) break;
}
+ if (overlay_type=="fusionSequence") {
+ //removing the overlay sequence in a fusion sequence visualization mode
+ //reset the transforms
+ overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+
+ //unlink and untie the slicer managers
+ RemoveLink(mSlicerManagers[index]->GetId().c_str(), mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetId().c_str());
+ mSlicerManagers[index]->SetFusionSequenceInvolvmentCode(-1);
+ mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->SetFusionSequenceInvolvmentCode(-1);
+ for (unsigned i=0 ; i<4 ; i++) {
+ mSlicerManagers[index]->GetSlicer(i)->SetFusionSequenceCode(-1);
+ mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetSlicer(i)->SetFusionSequenceCode(-1);
+ }
+
+ }
mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
mSlicerManagers[index]->SetColorMap(0);
DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
warning += "\nThis is the last image, you're about to close vv !!!";
QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
- warning, 0, this);
+ warning, 0, this);
msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
if (msgBox.exec() == QMessageBox::AcceptRole) {
QString warning = "Do you really want to close the image : ";
warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
- warning, 0, this);
+ warning, 0, this);
msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
if (msgBox.exec() == QMessageBox::AcceptRole) {
for (int i = 0; i < index; i++) {
Manageriter++;
}
+ //if the slicer manager was involved in a fusion sequence visualization...
+ if ( mSlicerManagers[index]->IsInvolvedInFusionSequence() ) {
+ //reset the transforms
+ overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+
+ //unlink and untie the slicer managers
+ RemoveLink(mSlicerManagers[index]->GetId().c_str(), mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetId().c_str());
+ mSlicerManagers[index]->SetFusionSequenceInvolvmentCode(-1);
+ mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->SetFusionSequenceInvolvmentCode(-1);
+ for (unsigned i=0 ; i<4 ; i++) {
+ mSlicerManagers[index]->GetSlicer(i)->SetFusionSequenceCode(-1);
+ mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->GetSlicer(i)->SetFusionSequenceCode(-1);
+ }
+
+ //TODO: also remove the image overlaid with the main sequence, as it is becoming invalid...
+ }
+
linkPanel->removeImage(index);
mSlicerManagers[index]->RemoveActors();
+
+ //remove the slicer manager
delete mSlicerManagers[index];
mSlicerManagers.erase(Manageriter);
int index = GetSlicerIndexFromItem(item);
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QString role=item->data(1,Qt::UserRole).toString();
- if ( role == "vector"){
+ if ( role == "vector") {
mSlicerManagers[index]->ReloadVF();
}
- else if (role == "overlay"){
+ else if (role == "overlay") {
mSlicerManagers[index]->ReloadOverlay();
}
- else if (role == "fusion"){
+ else if (role == "fusion") {
mSlicerManagers[index]->ReloadFusion();
}
- else{
+ else if (role == "fusionSequence") {
+ //both versions of the secondary sequence must be updated.
+ mSlicerManagers[index]->ReloadFusionSequence();
+ mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->Reload();
+ }
+ else {
mSlicerManagers[index]->Reload();
+ //if we update the secondary sequence, then the overlay of the main sequence should also be updated
+ if (mSlicerManagers[index]->IsSecondarySequenceOfFusionSequence()) mSlicerManagers[mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()]->ReloadFusionSequence();
}
// Update view and info
ImageInfoChanged();
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
+//called when AddOverlayImage, AddFusionSequence
+//or when UpdateWindowLevel() is called ; when slicerManager emits WindowLevelChanged
+//when ImageInfoChanged() is called
void vvMainWindow::WindowLevelChanged()
{
// Base image
// Overlay image
if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor(),
- mSlicerManagers[index]->GetLinkOverlayWindowLevel(),
- mSlicerManagers[index]->GetOverlayColorWindow(),
- mSlicerManagers[index]->GetOverlayColorLevel());
+ mSlicerManagers[index]->GetLinkOverlayWindowLevel(),
+ mSlicerManagers[index]->GetOverlayColorWindow(),
+ mSlicerManagers[index]->GetOverlayColorLevel());
else
overlayPanel->getOverlayProperty(-1,0,0.,0.);
- // Fusion image
- if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
+ // Fusion & SequenceFusion image
+ if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
- mSlicerManagers[index]->GetFusionThresholdOpacity(),
- mSlicerManagers[index]->GetFusionColorMap(),
- mSlicerManagers[index]->GetFusionWindow(),
- mSlicerManagers[index]->GetFusionLevel());
+ mSlicerManagers[index]->GetFusionThresholdOpacity(),
+ mSlicerManagers[index]->GetFusionColorMap(),
+ mSlicerManagers[index]->GetFusionWindow(),
+ mSlicerManagers[index]->GetFusionLevel());
+ if (mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) {
+ overlayPanel->getFusionSequenceProperty(mSlicerManagers[index]->GetFusionSequenceFrameIndex(),
+ mSlicerManagers[index]->GetFusionSequenceSpatialSyncFlag(),
+ mSlicerManagers[index]->GetFusionSequenceNbFrames(),
+ mSlicerManagers[index]->GetFusionSequenceTemporalSyncFlag());
+ }
+ }
+ else if ( mSlicerManagers[index]->IsSecondarySequenceOfFusionSequence() ) {
+ //if the image is involved in a fusion sequence, preserve the overlay panel!
+ int ind = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+ overlayPanel->getFusionProperty(mSlicerManagers[ind]->GetFusionOpacity(),
+ mSlicerManagers[ind]->GetFusionThresholdOpacity(),
+ mSlicerManagers[ind]->GetFusionColorMap(),
+ mSlicerManagers[ind]->GetFusionWindow(),
+ mSlicerManagers[ind]->GetFusionLevel());
+ overlayPanel->getFusionSequenceProperty(mSlicerManagers[ind]->GetFusionSequenceFrameIndex(),
+ mSlicerManagers[ind]->GetFusionSequenceSpatialSyncFlag(),
+ mSlicerManagers[ind]->GetFusionSequenceNbFrames(),
+ mSlicerManagers[ind]->GetFusionSequenceTemporalSyncFlag());
+ }
else
+ {
overlayPanel->getFusionProperty(-1, -1, -1, -1, -1);
+ overlayPanel->getFusionSequenceProperty(-1, false, 0, false);
+ }
}
//------------------------------------------------------------------------------
{
for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
if (mSlicerManagers[i]->GetId() == id) {
- //mSlicerManagers[i]->SetTSlice(temps);
mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
mSlicerManagers[i]->UpdateViews(0,slicer);
break;
contextActions[1]->setEnabled(1);
contextActions[2]->setEnabled(
DataTree->itemWidget(DataTree->selectedItems()[0],
- COLUMN_RELOAD_IMAGE)->isEnabled());
+ COLUMN_RELOAD_IMAGE)->isEnabled());
contextActions[3]->setEnabled(1);
contextActions[5]->setEnabled(1);
contextActions[6]->setEnabled(1);
return;
}
- QString Extensions = EXTENSIONS;
- Extensions += ";;All Files (*)";
- QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image"),mInputPathName,Extensions);
- if (files.isEmpty())
- return;
+ QString Extensions = EXTENSIONS;
+ Extensions += ";;All Files (*)";
+ 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);
+ std::vector<std::string> vecFileNames;
+ for (int i = 0; i < files.size(); i++) {
+ vecFileNames.push_back(files[i].toStdString());
+ }
+ AddOverlayImage(index,vecFileNames,vvImageReader::IMAGE);
}
//------------------------------------------------------------------------------
{
mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
- file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+ file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
reader->SetFileName(fileNames[0].c_str());
reader->ReadImageInformation();
std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
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)));
+ this,SLOT(CloseImage(QTreeWidgetItem*, int)));
QTreePushButton* rButton = new QTreePushButton;
rButton->setItem(item);
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)));
+ this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
DataTree->topLevelItem(index)->setExpanded(1);
DataTree->topLevelItem(index)->addChild(item);
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;
+ 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();
//check if one fusion image is added
for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
- if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") {
- QString error = "Cannot add more than one fusion image\n";
- error += "Please remove first ";
- error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
- QMessageBox::information(this,tr("Problem adding fusion image !"),error);
- return;
+ if ( (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") ||
+ (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusionSequence") ) {
+ QString error = "Cannot add more than one fusion image\n";
+ error += "Please remove first ";
+ error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
+ QMessageBox::information(this,tr("Problem adding fusion image !"),error);
+ return;
}
- QString Extensions = EXTENSIONS;
- Extensions += ";;All Files (*)";
- QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
- if (!file.isEmpty())
- AddFusionImage(index,file);
+ QString Extensions = EXTENSIONS;
+ Extensions += ";;All Files (*)";
+ QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
+ if (!file.isEmpty())
+ AddFusionImage(index,file);
}
//------------------------------------------------------------------------------
{
mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
- file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
+ file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
reader->SetFileName(file.toStdString().c_str());
reader->ReadImageInformation();
std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
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, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusion").c_str());
- qApp->processEvents();
-
- for (int j = 1; j <= 4; j++) {
- item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
- }
+ 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, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusion").c_str());
+ qApp->processEvents();
+
+ for (int j = 1; j <= 4; j++) {
+ item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
+ }
- //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)),
+ //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)));
- 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)),
+ 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)));
- 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();
+ 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";
return;
}
- QString Extensions = "Images ( *.mhd)";
- Extensions += ";;Images ( *.mha)";
- Extensions += ";;VF Images ( *.vf)";
- Extensions += ";;nii Images ( *.nii)";
- Extensions += ";;nrrd Images ( *.nrrd)";
- Extensions += ";;nhdr Images ( *.nhdr)";
- Extensions += ";;All Files (*)";
- QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
- if (!file.isEmpty())
- AddField(file,index);
+ QString Extensions = "Images ( *.mhd)";
+ Extensions += ";;Images ( *.mha)";
+ Extensions += ";;VF Images ( *.vf)";
+ Extensions += ";;nii Images ( *.nii)";
+ Extensions += ";;nrrd Images ( *.nrrd)";
+ Extensions += ";;nhdr Images ( *.nhdr)";
+ Extensions += ";;All Files (*)";
+ QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
+ if (!file.isEmpty())
+ AddField(file,index);
}
//------------------------------------------------------------------------------
cButton->setToolTip(tr("close vector field"));
cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+ this,SLOT(CloseImage(QTreeWidgetItem*, int)));
QTreePushButton* rButton = new QTreePushButton;
rButton->setItem(item);
rButton->setEnabled(from_disk);
rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+ this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
DataTree->topLevelItem(index)->setExpanded(1);
DataTree->topLevelItem(index)->addChild(item);
}
//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvMainWindow::SelectFusionSequence()
+{
+ //get the index of the slicer manager of the main sequence (CT)
+ int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+ //check if one overlay image is already associated
+ for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
+ if ( (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion") ||
+ (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusionSequence") ) {
+ QString error = "Cannot add more than one compared image\n";
+ error += "Please remove first ";
+ error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
+ QMessageBox::information(this,tr("Problem adding compared image !"),error);
+ return;
+ }
+
+ QString Extensions = EXTENSIONS;
+ Extensions += ";;All Files (*)";
+ QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Overlay image sequence"),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());
+ }
+
+ //associate the secondary sequence (US) to the main one
+ AddFusionSequence(index,vecFileNames,vvImageReader::MERGEDWITHTIME);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvMainWindow::SelectFusionSequenceTemporalSignal() {
+
+ //make sure the index is right?
+ //in the end, I should attach the temporal data to the right sequence!
+ int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+ //in case the other sequence got selected, make sure we select the primary sequence
+ if ( (!mSlicerManagers[index]->GetSlicer(0)->GetFusion()) && mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager()>=0 ) {
+ index = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+ }
+
+ //open a dialog box to find a file
+ QString Extensions = EXTENSIONS;
+ Extensions += ";;All Files (*)";
+ QString fileName = QFileDialog::getOpenFileName(this,tr("Load respiratory signal for fused sequence"),mInputPathName,Extensions);
+ if (fileName.isNull())
+ return;
+
+ //read it as a vector of values
+ std::vector<double> signal;
+ //...TODO, look for itk functions that can do that... vnl in the worst case.
+ signal.push_back(1);signal.push_back(2);
+
+ //TODO: instead: if the loaded signal is longer, just crop it...
+ //this allows loading only the first few frames when testing.
+ //->maybe raise a message that this behavior may be unsafe...
+
+ //if compatible with the fused image sequence (number of images = number of entries), enable the temporalSync
+ if ( signal.size() >= mSlicerManagers[index]->GetFusionSequenceNbFrames()) {
+ //for convenience, associate this sequence to both the current slicer manager, and to the linked one
+ mSlicerManagers[index]->SetFusionSequenceTemporalSignal(signal);
+ mSlicerManagers[ mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager() ]->SetFusionSequenceTemporalSignal(signal);
+ overlayPanel->enableFusionSequenceTemporalSync();
+ QMessageBox::information(this,tr("Adding signal"),"would add the signal from file: "+ fileName);
+ }
+ else {//else, send a message to signal the failure...
+ QString error = "The provided signal doesn't have the same duration as the sequence\n";
+ error += "Ignoring file: " + fileName;
+ QMessageBox::information(this,tr("Problem adding signal!"),error);
+ return;
+ }
+
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+//when this function is called index is the slicer manager index corresponding to the main sequence (CT)
+//the files behind fileNames points to the data for the secondary sequence
+void vvMainWindow::AddFusionSequence(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(fileNames[0].c_str());
+ reader->ReadImageInformation();
+ std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
+ int dimension = reader->GetNumberOfDimensions();
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ vvProgressDialog progress("Opening " + file.toStdString());
+ qApp->processEvents();
+
+ std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
+
+ if (mSlicerManagers[index]->SetFusionSequence(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());
+ item->setData(1,Qt::UserRole,tr("fusionSequence"));
+
+ QFileInfo fileinfo(file); //Do not show the path
+ item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
+ item->setToolTip(COLUMN_IMAGE_NAME, mSlicerManagers[index]->GetListOfAbsoluteFilePathInOneString("fusionSequence").c_str());
+ qApp->processEvents();
+ for (int j = 1; j <= 4; j++) {
+ item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
+ }
+
+ //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)));
+
+ 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)));
+
+ DataTree->topLevelItem(index)->setExpanded(1);
+ DataTree->topLevelItem(index)->addChild(item);
+ DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
+ DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
+
+ //store the original transform matrix
+ int indexParent = GetSlicerIndexFromItem( DataTree->topLevelItem(index) );
+ mSlicerManagers[indexParent]->SetFusionSequenceMainTransformMatrix( mSlicerManagers[indexParent]->GetSlicer(0)->GetImage()->GetTransform()[0]->GetMatrix() );
+
+ //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();
+ // Update the display to update, e.g., the sliders
+ for(int i=0; i<4; i++)
+ DisplaySliders(index, i);
+
+
+ //This loads the secondary sequence (US) as an independent sequence
+ LoadImages(fileNames, type);
+ //reset the transforms to identiy
+ for (unsigned i=0 ; i<mSlicerManagers.back()->GetImage()->GetTransform().size() ; i++) {
+ mSlicerManagers.back()->GetImage()->GetTransform()[i]->Identity();
+ mSlicerManagers.back()->GetImage()->GetTransform()[i]->Update();
+ }
+
+ //automatically link both images...
+ AddLink(mSlicerManagers[indexParent]->GetId().c_str(), mSlicerManagers.back()->GetId().c_str(), false);
+
+ //tie the main and secondary sequences by raising flags and informing each another of their respective SlicerManager indices
+ mSlicerManagers[indexParent]->SetFusionSequenceIndexOfLinkedManager(mSlicerManagers.size()-1);
+ mSlicerManagers[indexParent]->SetFusionSequenceInvolvmentCode(0); //main sequence
+ mSlicerManagers.back()->SetFusionSequenceIndexOfLinkedManager(indexParent);
+ mSlicerManagers.back()->SetFusionSequenceInvolvmentCode(1); //secondary sequence
+ for (unsigned i=0 ; i<4 ; i++) {
+ mSlicerManagers.back()->GetSlicer(i)->SetFusionSequenceCode(1); //flag the slicers of the secondary sequence
+ }
+
+ } 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);
+ }
+ //WindowLevelChanged();
+ ImageInfoChanged(); //this internally calls WindowLevelChanged...
+ }
+ else {
+ QMessageBox::information(this,tr("Problem reading fusion sequence !"),"File doesn't exist!");
+ return;
+ }
+
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+//fusionSequenceFrameIndex and fusionSequenceNbFrames are relative to the secondary sequence (US)
+void vvMainWindow::SetFusionSequenceProperty(int fusionSequenceFrameIndex, bool spatialSyncFlag, unsigned int fusionSequenceNbFrames, bool temporalSyncFlag)
+{
+ int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+
+ if (!mSlicerManagers[index]->IsInvolvedInFusionSequence()) return;
+
+ //check if the focus moved to the linked sequence, and in this case, select the master sequence instead
+ if (!mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) {
+ index = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+ }
+ int secondaryIndex = mSlicerManagers[index]->GetFusionSequenceIndexOfLinkedManager();
+ if (secondaryIndex==-1) return; //this should never happen
+ if ( (!mSlicerManagers[index]->IsMainSequenceOfFusionSequence()) ||
+ (!mSlicerManagers[secondaryIndex]->IsSecondarySequenceOfFusionSequence()) )
+ {return;} //this should never happen, raise an exception?
+
+ if (mSlicerManagers[index]->GetSlicer(0)->GetFusion()) {
+
+ //First, if the spatialSync button is unchecked, then reposition the parent sequence (CT) in its original coordinate frame
+ if ( (!spatialSyncFlag) && (mSlicerManagers[index]->GetFusionSequenceSpatialSyncFlag()) ) {
+ for ( unsigned i=0 ; i<mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform().size() ; i++ ) {
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->SetMatrix( mSlicerManagers[index]->GetFusionSequenceMainTransformMatrix() );
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Update();
+ }
+
+ for (int i=0; i<mSlicerManagers[index]->GetNumberOfSlicers(); i++) {
+ mSlicerManagers[index]->GetSlicer(i)->ForceUpdateDisplayExtent();
+ mSlicerManagers[index]->GetSlicer(i)->Render();
+ }
+ }
+
+ //then, update the property values in the slicer manager
+ mSlicerManagers[index]->SetFusionSequenceLength(fusionSequenceNbFrames);
+ mSlicerManagers[index]->SetFusionSequenceSpatialSyncFlag(spatialSyncFlag);
+ mSlicerManagers[index]->SetFusionSequenceTemporalSyncFlag(temporalSyncFlag);
+ mSlicerManagers[index]->SetFusionSequenceFrameIndex(fusionSequenceFrameIndex);
+
+ //select the right frame of the US sequence
+ mSlicerManagers[index]->SetFusionSequenceTSlice(fusionSequenceFrameIndex); //here, I should only update the overlayed sequence
+ mSlicerManagers[secondaryIndex]->SetTSlice(fusionSequenceFrameIndex, false); //this should update the secondary sequence (individual version)
+
+ //update the horizontal sliders of the main window
+ overlayPanel->updateFusionSequenceSliderValueFromWindow(fusionSequenceFrameIndex, false);
+
+ if (spatialSyncFlag) { //reslice the CT
+
+ if (temporalSyncFlag) { //do the temporal synchronisation
+ //TODO: add the temporal synchronisation stuff
+ //if the button is checked, get the phase of the requested US frame from the available signal
+ //and select the corresponding one in the CT. (check the one just before, and the one just after, and select the closest)
+
+ //TODO: do it also the other way around, when modifying the time index related to CT, select a close frame
+ //this should not be done here directly, but the code should be inspired from the one here
+ //->find a good US frame such that when calling this function with this US frame, it produces the expected result
+
+
+ //TODO: select the right CT image to display
+ int mainSequenceFrameIndex=0;
+ //estimate the TSlice to set to the CT
+
+ //and set it!
+ mSlicerManagers[index]->SetTSlice(mainSequenceFrameIndex, false);
+ }
+
+
+ //Set the transform matrix of the parent sequence (typically CT / 4DCT)
+ vtkSmartPointer<vtkMatrix4x4> tmpMat = vtkSmartPointer<vtkMatrix4x4>::New();
+ vtkMatrix4x4::Invert( mSlicerManagers[index]->GetFusionSequenceInitialTransformMatrixAtFrame(fusionSequenceFrameIndex), tmpMat );
+ for ( unsigned i=0 ; i<mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform().size() ; i++ ) {
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->SetMatrix( mSlicerManagers[index]->GetFusionSequenceMainTransformMatrix() );
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->PreMultiply();
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Concatenate( tmpMat );
+ mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetTransform()[i]->Update();
+ }
+
+ for (int i=0; i<mSlicerManagers[index]->GetNumberOfSlicers(); i++) {
+ mSlicerManagers[index]->GetSlicer(i)->ForceUpdateDisplayExtent();
+ mSlicerManagers[index]->GetSlicer(i)->Render();
+ }
+
+ }
+
+ }
+}
+//------------------------------------------------------------------------------
+
+
//------------------------------------------------------------------------------
void vvMainWindow::SaveAs()
{
Extensions += ")";
}
QString fileName = QFileDialog::getSaveFileName(this,
- tr("Save As"),
- mSlicerManagers[index]->GetFileName().c_str(),
- Extensions);
+ tr("Save As"),
+ mSlicerManagers[index]->GetFileName().c_str(),
+ Extensions);
if (!fileName.isEmpty()) {
std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
if (OutputListeFormat.contains(
- fileformat.c_str())) {
- QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- std::string action = "Saving";
- vvProgressDialog progress("Saving "+fileName.toStdString());
- qApp->processEvents();
- vvImageWriter::Pointer writer = vvImageWriter::New();
- writer->SetOutputFileName(fileName.toStdString());
- writer->SetInput(mSlicerManagers[index]->GetImage());
-
- // Check on transform and prompt user
- writer->SetSaveTransform(false);
- bool bId = true;
- for(int i=0; i<4; i++)
- for(int j=0; j<4; 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.)
- bId = false;
- }
- if( !bId ) {
- QString warning = "The image has an associated linear transform. Do you want to save it along?";
- QMessageBox msgBox(QMessageBox::Warning, tr("Save transform"), warning, 0, this);
- msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
- msgBox.addButton(tr("No"), QMessageBox::RejectRole);
- if (msgBox.exec() == QMessageBox::AcceptRole)
- writer->SetSaveTransform(true);
- }
+ fileformat.c_str())) {
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ std::string action = "Saving";
+ vvProgressDialog progress("Saving "+fileName.toStdString());
+ qApp->processEvents();
+ vvImageWriter::Pointer writer = vvImageWriter::New();
+ writer->SetOutputFileName(fileName.toStdString());
+ writer->SetInput(mSlicerManagers[index]->GetImage());
+
+ // Check on transform and prompt user
+ writer->SetSaveTransform(false);
+ bool bId = true;
+ for(int i=0; i<4; i++)
+ for(int j=0; j<4; 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.)
+ bId = false;
+ }
+ if( !bId ) {
+ QString warning = "The image has an associated linear transform. Do you want to save it along?";
+ QMessageBox msgBox(QMessageBox::Warning, tr("Save transform"), warning, 0, this);
+ msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
+ msgBox.addButton(tr("No"), QMessageBox::RejectRole);
+ if (msgBox.exec() == QMessageBox::AcceptRole)
+ writer->SetSaveTransform(true);
+ }
- writer->Update();
- QApplication::restoreOverrideCursor();
- if (writer->GetLastError().size()) {
- QString error = "Saving did not succeed\n";
- error += writer->GetLastError().c_str();
- QMessageBox::information(this,tr("Saving Problem"),error);
- SaveAs();
- }
+ writer->Update();
+ QApplication::restoreOverrideCursor();
+ if (writer->GetLastError().size()) {
+ QString error = "Saving did not succeed\n";
+ error += writer->GetLastError().c_str();
+ QMessageBox::information(this,tr("Saving Problem"),error);
+ SaveAs();
+ }
} else {
QString error = fileformat.c_str();
if (error.isEmpty())
{
QString Extensions = "XML Files(*.xml)";
QString fileName = QFileDialog::getSaveFileName(this,
- tr("Save Current Window State"),
- "",
- Extensions);
-
+ tr("Save Current Window State"),
+ "",
+ Extensions);
+
SaveCurrentStateAs(fileName.toStdString());
}
//------------------------------------------------------------------------------
{
QString Extensions = "XML Files(*.xml)";
QString fileName = QFileDialog::getOpenFileName(this,
- tr("Load Window State"),
- "",
- Extensions);
-
+ tr("Load Window State"),
+ "",
+ Extensions);
+
ReadSavedStateFile(fileName.toStdString());
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvMainWindow::LinkAllImages()
{
- linkPanel->linkAll();
+ linkPanel->linkAll();
}
//------------------------------------------------------------------------------
linkPanel->addLinkFromIds(image1, image2);
return;
}
-
+
unsigned int sm1 = 0;
unsigned int sm2 = 0;
DisplayChanged(item,slicer+1);
}
//------------------------------------------------------------------------------
-
void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
{
for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1) {
+ //i is the SlicerManager that is in charge of this slicer.
+ if (mSlicerManagers[i]->IsInvolvedInFusionSequence()) {
+ //if the slicerManager is involved in a fusionSequence as the secondary sequence, then update the slider position in the overlay panel and everything accordingly
+ if (mSlicerManagers[i]->IsSecondarySequenceOfFusionSequence()) {
+ overlayPanel->updateFusionSequenceSliderValueFromWindow(value, true);
+ }
+ else { //if this is the primary sequence that has been modified
+ if (mSlicerManagers[i]->GetFusionSequenceTemporalSyncFlag()) {
+ //WARNING: for some obscure reason, there are problems when accessing mSlicerManagers[mSlicerManagers[i]->GetFusionSequenceIndexOfLinkedManager()]->GetFusionSequenceFrameIndex();
+
+ //int estimatedValue=mSlicerManagers[mSlicerManagers[i]->GetFusionSequenceIndexOfLinkedManager()]->GetFusionSequenceFrameIndex();
+ int estimatedValue=0;
+ //TODO: if temporal sync is active
+ //estimate a corresponding time index for the secondary (US) sequence, and update it accordingly.
+ //estimatedValue = ...
+ overlayPanel->updateFusionSequenceSliderValueFromWindow(estimatedValue, true);
+ }
+ }
+ }
+
for (int j = 0; j < 4; j++) {
mSlicerManagers[i]->SetTSliceInSlicer(value,j);
- //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
- //UpdateTSlice(j,value);
}
mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
break;
{
// if (mCurrentTime == NOHorizontalSlider->value()) return;
HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
-// mCurrentTime = NOHorizontalSlider->value();
+ // mCurrentTime = NOHorizontalSlider->value();
}
//------------------------------------------------------------------------------
{
// if (mCurrentTime == NEHorizontalSlider->value()) return;
HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
-// mCurrentTime = NEHorizontalSlider->value();
+ // mCurrentTime = NEHorizontalSlider->value();
}
//------------------------------------------------------------------------------
void vvMainWindow::UpdateSlice(int slicer, int slice)
{
// DD("vvMainWindow::UpdateSlice");
-// DD(slicer);
-// DD(slice);
+ // DD(slicer);
+ // DD(slice);
if (slicer == 0) {
// if (slice != NOVerticalSlider->value())
NOVerticalSlider->setValue(slice);
//------------------------------------------------------------------------------
-void vvMainWindow::UpdateTSlice(int slicer, int slice)
+void vvMainWindow::UpdateTSlice(int slicer, int slice, int code)
{
+ //FusionSequence: the slider value should be updated for slicers which show the same sequence as requested
+ bool doUpdate=false;
+ if (code==-1) doUpdate=true;
+ else {
+ for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
+ if (DataTree->topLevelItem(i)->data(slicer+1,Qt::CheckStateRole).toInt() > 1) {
+ //i is the active SlicerManager
+ if (mSlicerManagers[i]->GetFusionSequenceInvolvmentCode()==code) doUpdate=true;
+ break;
+ }
+ }
+ }
+ if (!doUpdate) return;
+
switch (slicer) {
case 0:
+ if (NOHorizontalSlider->value()==slice) return;
NOHorizontalSlider->setValue(slice);
break;
case 1:
+ if (NEHorizontalSlider->value()==slice) return;
NEHorizontalSlider->setValue(slice);
break;
case 2:
+ if (SOHorizontalSlider->value()==slice) return;
SOHorizontalSlider->setValue(slice);
break;
case 3:
+ if (SEHorizontalSlider->value()==slice) return;
SEHorizontalSlider->setValue(slice);
break;
}
// Select filename base
QString filename = QFileDialog::getSaveFileName(this,
- tr("Save As (filename will be completed by slice number)"),
- itksys::SystemTools::GetFilenamePath(mSlicerManagers[index]->GetFileName()).c_str(),
- "Images( *.png);;Images( *.jpg)");
+ tr("Save As (filename will be completed by slice number)"),
+ itksys::SystemTools::GetFilenamePath(mSlicerManagers[index]->GetFileName()).c_str(),
+ "Images( *.png);;Images( *.jpg)");
// Loop on slices
for(int i=0; i<nbSlices; i++) {
windowToImageFilter->SetMagnification(1);
windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha (transparency) channel
windowToImageFilter->Update();
-
+
vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
std::string fn = itksys::SystemTools::GetFilenameWithoutLastExtension(filename.toStdString());
std::string num = clitk::toString(i);
int smIndex=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
QString fileName = QFileDialog::getSaveFileName(this,
- tr("Save As"),
- itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(),
- Extensions);
+ tr("Save As"),
+ itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(),
+ Extensions);
if (!fileName.isEmpty()) {
vtkSmartPointer<vtkWindowToImageFilter> w2i = vtkSmartPointer<vtkWindowToImageFilter>::New();
// FPS
bool ok;
int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
- tr("FPS:"), 5, 0, 1000, 1, &ok);
+ tr("FPS:"), 5, 0, 1000, 1, &ok);
if(ok)
gif->SetRate(fps);
// Loops
int loops = QInputDialog::getInteger(this, tr("Loops"),
- tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
+ tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
if(ok)
gif->SetLoops(loops);
mpg->SetQuality(2);
bool ok;
int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
- tr("FPS:"), 5, 0, 1024, 1, &ok);
+ tr("FPS:"), 5, 0, 1024, 1, &ok);
if(!ok)
fps = 5;
mpg->SetRate(fps);
mpg->SetQuality(2);
bool ok;
int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
- tr("FPS:"), 5, 0, 1024, 1, &ok);
+ tr("FPS:"), 5, 0, 1024, 1, &ok);
if(!ok)
fps = 5;
mpg->SetRate(fps);
has_temporal=true;
break;
}
- if (has_temporal) {
- playMode = 1;
- playButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/player_pause.png")));
- QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
- }
+ if (has_temporal) {
+ playMode = 1;
+ playButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/player_pause.png")));
+ QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
+ }
}
}
//------------------------------------------------------------------------------
for (int i=0; i<image_number; i++)
for (int j=0; j<4; j++)
if (mSlicerManagers[i]->GetSlicer(0)->GetTMax() > 0 &&
- DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0) {
- mSlicerManagers[i]->SetNextTSlice(j);
- break;
+ DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0) {
+ mSlicerManagers[i]->SetNextTSlice(j);
+ break;
}
- QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
+ QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
}
}
//------------------------------------------------------------------------------
for(unsigned int l=0; l<mSlicerManagers.size(); l++) {
vvSlicerManager * v = mSlicerManagers[l];
if (v->GetBaseFileName() ==
- vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) {
- number = std::max(number, v->GetBaseFileNameNumber()+1);
+ vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) {
+ number = std::max(number, v->GetBaseFileNameNumber()+1);
}
}
return number;
cButton->setColumn(COLUMN_CLOSE_IMAGE);
cButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/exit.png")));
connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(CloseImage(QTreeWidgetItem*, int)));
+ this,SLOT(CloseImage(QTreeWidgetItem*, int)));
QTreePushButton* rButton = new QTreePushButton;
rButton->setItem(item);
rButton->setIcon(QIcon(QString::fromUtf8(":/common/icons/rotateright.png")));
rButton->setEnabled(0);
connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
- this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
+ this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
DataTree->addTopLevelItem(item);
DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
mSlicerManagers.back()->SetId(id.toStdString());
linkPanel->addImage(slicer_manager->GetFileName().c_str()// filename
- , id.toStdString());
+ , id.toStdString());
connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)),
- this, SLOT(CurrentImageChanged(std::string)));
+ this, SLOT(CurrentImageChanged(std::string)));
connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)),
- this, SLOT(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)));
+ 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)));
+ this, SLOT(VectorChanged(int,double,double,double, double)));
connect(mSlicerManagers.back(), SIGNAL(UpdateOverlay(int, double, double)),
- this, SLOT(OverlayChanged(int,double,double)));
+ this, SLOT(OverlayChanged(int,double,double)));
connect(mSlicerManagers.back(), SIGNAL(UpdateFusion(int, double)),
- this, SLOT(FusionChanged(int,double)));
+ this, SLOT(FusionChanged(int,double)));
+ //connect(mSlicerManagers.back(), SIGNAL(UpdateFusionSequence(int, bool, unsigned int)),
+ // this, SLOT(FusionSequenceChanged(int, bool, unsigned int)));
connect(mSlicerManagers.back(), SIGNAL(WindowLevelChanged()),
- this,SLOT(WindowLevelChanged()));
+ this,SLOT(WindowLevelChanged()));
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(UpdateTSlice(int, int)),
- this,SLOT(ImageInfoChanged()));
+ this,SLOT(UpdateSlice(int,int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+ this,SLOT(UpdateTSlice(int, int, int)));
+ connect(mSlicerManagers.back(), SIGNAL(UpdateTSlice(int, int, int)),
+ this,SLOT(ImageInfoChanged()));
connect(mSlicerManagers.back(), SIGNAL(UpdateSliceRange(int,int,int,int,int)),
- this,SLOT(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)));
+ 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*)));
+ this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)));
connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
- this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
+ this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+
+
UpdateTree();
qApp->processEvents();
InitSlicers();
void AddOverlayImage(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type);
void AddFusionImage(int index, QString filename);
void AddROI(int index, QString filename);
+
+ //Process the sequence for fusion:
+ void AddFusionSequence(int index, std::vector<std::string> fileNames, vvImageReader::LoadedImageType type);
+
void AddLandmarks(int index, std::vector<std::string>);
///Adds a mesh to a SlicerManager, with optional warping by vector field
void AddContour(int image_index, vvMesh::Pointer contour, bool propagation);
void VectorChanged(int visibility, double x, double y, double z, double value);
void OverlayChanged(int visibility, double valueOver, double valueRef);
void FusionChanged(int visibility, double value);
+ //void FusionSequenceChanged(int visibility, double value);
void SegmentationOnCurrentImage();
void SurfaceViewerLaunch();
void WindowLevelChanged();
void UpdateSlice(int slicer, int slice);
- void UpdateTSlice(int slicer, int slice);
+ void UpdateTSlice(int slicer, int slice, int code=-1);
void UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax);
void WindowLevelEdited();
void SetWindowLevel(double w, double l);
void OpenField();
void SelectOverlayImage();
void SelectFusionImage();
+ //select the file(s) from the disk containing the image sequence to fuse
+ void SelectFusionSequence();
+ void SelectFusionSequenceTemporalSignal();
+
void ResetTransformationToIdentity();
void SetVFProperty(int subsampling,int scale,int lut, int width, double r, double g, double b);
void SetOverlayProperty(int color, int linked, double window, double level);
void SetFusionProperty(int opacity, int tresOpacity, int colormap,double window,double level, bool showLegend);
+ void SetFusionSequenceProperty(int fusionSequenceFrameIndex, bool spatialSyncFlag, unsigned int fusionSequenceNbFrames, bool temporalSyncFlag);
void GoToCursor();
void GoToLandmark();
QString GetSizeInBytes(unsigned long size);
QString GetVectorDoubleAsString(std::vector<double> vectorDouble);
QString GetVectorIntAsString(std::vector<int> vectorInt);
- int GetSlicerIndexFromItem(QTreeWidgetItem* item);
+ int GetSlicerIndexFromItem(QTreeWidgetItem* item); //this actually returns the SlicerManager index TODO: rename it to GetSlicerManagerIndexFromItem
QTreeWidgetItem* GetItemFromSlicerManager(vvSlicerManager* sm);
void SaveScreenshot(QVTKWidget *widget);
int GetImageDuplicateFilenameNumber(std::string filename);
//====================================================================
vvOverlayPanel::vvOverlayPanel(QWidget * parent):QWidget(parent)
{
+ disableFusionSignals = true;
+ disableFusionSequenceSignals = true;
+
setupUi(this);
vFFrame->hide();
compareFrame->hide();
fusionFrame->hide();
+ fCTUSFrame->hide();
subSamplingSpinBox->setEnabled(0);
scaleSpinBox->setEnabled(0);
lutCheckBox->hide();
lutCheckBox->setEnabled(0);
fusionShowLegendCheckBox->setChecked(false);
-
+
connect(subSamplingSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty()));
connect(scaleSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty()));
connect(lutCheckBox,SIGNAL(clicked()),this,SLOT(setVFProperty()));
connect(overlayLevelSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setOverlayProperty()));
connect(overlayLinkCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setOverlayProperty()));
- disableFusionSignals = false;
+ connect(fCTUSSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionSequenceProperty()));
+ connect(fCTUSActivateSpaceSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty()));
+ connect(fCTUSActivateTimeSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty()));
+ connect(fCTUSLoadSignalPushButton,SIGNAL(clicked()),this,SIGNAL(FusionSequenceSignalButtonPressed()));
}
void vvOverlayPanel::getCurrentImageName(QString name)
{
if (disableFusionSignals)
return;
-
+
fusionOpacitySpin->setValue(opacityHorizontalSlider->value());
fusionThresSpin->setValue(thresOpacityHorizontalSlider->value());
valueFusionnedLabel->setText(fusionValue);
}
+
+void vvOverlayPanel::getFusionSequenceProperty(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLenth, bool temporalSync)
+{
+ if (sequenceFrameIndex > -1) {
+ disableFusionSequenceSignals = true;
+ fCTUSFrame->show();
+ fCTUSFrame->setEnabled(1);
+ fCTUSSlider->setEnabled(1);
+ fCTUSSlider->setValue(sequenceFrameIndex);
+ fCTUSSlider->setMaximum(sequenceLenth);
+ if (spatialSync) fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Checked);
+ else fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked);
+ if (fCTUSActivateTimeSyncCheckBox->isEnabled()) {
+ if ( temporalSync ) fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Checked);
+ else fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked);
+ }
+ disableFusionSequenceSignals = false;
+ setFusionSequenceProperty();
+ } else {
+ disableFusionSequenceSignals = true;
+ fCTUSFrame->hide();
+ fCTUSFrame->setEnabled(0);
+ fCTUSSlider->setEnabled(0);
+ fCTUSSlider->setValue(0);
+ fCTUSSlider->setMaximum(0);
+ fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked);
+ fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked);
+ disableFusionSequenceSignals = false;
+ setFusionSequenceProperty();
+ }
+}
+
+
+void vvOverlayPanel::setFusionSequenceProperty()
+{
+ if (disableFusionSequenceSignals)
+ return;
+ emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
+void vvOverlayPanel::enableFusionSequenceTemporalSync() {
+ bool backup = disableFusionSequenceSignals;
+ disableFusionSequenceSignals=true; //not sure this is necessary, but just in case...
+ fCTUSActivateTimeSyncCheckBox->setEnabled(1);
+ fCTUSActivateTimeSyncCheckBox->setChecked(true);
+ disableFusionSequenceSignals = backup; //
+
+ if (disableFusionSequenceSignals) return;
+ emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
+void vvOverlayPanel::updateFusionSequenceSliderValueFromWindow(int val, bool updateVisualization) {
+ if (fCTUSSlider->value()==val) return;
+
+ disableFusionSequenceSignals = true; //not sure this is necessary, but just in case...
+ fCTUSSlider->setValue(val);
+ disableFusionSequenceSignals = false;
+
+ if (disableFusionSequenceSignals) return;
+ if (updateVisualization) emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum(), fCTUSActivateTimeSyncCheckBox->isChecked());
+}
+
void vvOverlayPanel::VFColorChangeRequest()
{
QColor color(vfColorButton->palette().color(QPalette::Background));
/*=========================================================================
- Program: vv http://www.creatis.insa-lyon.fr/rio/vv
+Program: vv http://www.creatis.insa-lyon.fr/rio/vv
- Authors belong to:
- - University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://www.centreleonberard.fr
- - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
+Authors belong to:
+- University of LYON http://www.universite-lyon.fr/
+- Léon Bérard cancer center http://www.centreleonberard.fr
+- CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the copyright notices for more information.
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the copyright notices for more information.
- It is distributed under dual licence
+It is distributed under dual licence
- - BSD See included LICENSE.txt file
- - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+- BSD See included LICENSE.txt file
+- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
===========================================================================**/
#ifndef _vvOverlayPanel_H
#define _vvOverlayPanel_H
class vvOverlayPanel : public QWidget, private Ui::vvOverlayPanel
{
- Q_OBJECT
+ Q_OBJECT
public:
- // constructor - destructor
- vvOverlayPanel(QWidget * parent=0);
- ~vvOverlayPanel() {}
+ // constructor - destructor
+ vvOverlayPanel(QWidget * parent=0);
+ ~vvOverlayPanel() {}
- void getCurrentImageName(QString name);
+ void getCurrentImageName(QString name);
- void getVFProperty(int subsampling, int scale, int log);
- void getVFName(QString name);
+ void getVFProperty(int subsampling, int scale, int log);
+ void getVFName(QString name);
- void getOverlayProperty(int color, int linked, double window, double level);
- void getOverlayName(QString name);
+ void getOverlayProperty(int color, int linked, double window, double level);
+ void getOverlayName(QString name);
- void getFusionProperty(int opacity, int thresOpacity, int colormap, double window, double level);
- void getFusionName(QString name);
+ void getFusionProperty(int opacity, int thresOpacity, int colormap, double window, double level);
+ void getFusionName(QString name);
- void getCurrentVectorInfo(int visibility, double x, double y, double z, double value);
- void getCurrentOverlayInfo(int visibility,double valueOver, double valueRef);
- void getCurrentFusionInfo(int visibility,double value);
-
- bool getShowLegend();
+ void getFusionSequenceProperty(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLength, bool temporalSync);
+
+ void getCurrentVectorInfo(int visibility, double x, double y, double z, double value);
+ void getCurrentOverlayInfo(int visibility,double valueOver, double valueRef);
+ void getCurrentFusionInfo(int visibility,double value);
+
+ bool getShowLegend();
+
+ void updateFusionSequenceSliderValueFromWindow(int val, bool updateVisualization);
public slots:
- void setVFProperty();
- void setOverlayProperty();
- void setFusionProperty();
- void setFusionSpinProperty();
- void VFColorChangeRequest();
+ void setVFProperty();
+ void setOverlayProperty();
+ void setFusionProperty();
+ void setFusionSpinProperty();
+ void VFColorChangeRequest();
+ void setFusionSequenceProperty();
+ void enableFusionSequenceTemporalSync();
signals:
- void VFPropertyUpdated(int subsampling, int scale, int log, int width, double r, double g, double b);
- void OverlayPropertyUpdated(int color, int linked, double window, double level);
- void FusionPropertyUpdated(int opacity, int thresOpacity, int colormap, double window, double level, bool showLegend);
+ void VFPropertyUpdated(int subsampling, int scale, int log, int width, double r, double g, double b);
+ void OverlayPropertyUpdated(int color, int linked, double window, double level);
+ void FusionPropertyUpdated(int opacity, int thresOpacity, int colormap, double window, double level, bool showLegend);
+ void FusionSequencePropertyUpdated(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLength, bool temporalSync);
+ void FusionSequenceSignalButtonPressed();
-
private:
- bool disableFusionSignals;
-
+ bool disableFusionSignals;
+ bool disableFusionSequenceSignals;
+
}; // end class vvOverlayPanel
//====================================================================
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
===========================================================================**/
+#include <QMessageBox>
+#include <QString>
+
#include "vvSlicer.h"
#include "vvImage.h"
#include "vvSlicerManagerCommand.h"
//------------------------------------------------------------------------------
vvSlicer::vvSlicer()
{
+ mFusionSequenceCode = -1;
this->UnInstallPipeline();
mImage = NULL;
mReducedExtent = new int[6];
mCurrentBeforeSlicingTransform[1]=y;
mCurrentBeforeSlicingTransform[2]=z;
mSlicingTransform->GetInverse()->TransformPoint(mCurrentBeforeSlicingTransform,mCurrent);
- SetTSlice(t);
+ if (t>=0) SetTSlice(t);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvSlicer::SetFusion(vvImage::Pointer fusion)
+void vvSlicer::SetFusion(vvImage::Pointer fusion, int fusionSequenceCode)
{
+ mFusionSequenceCode = fusionSequenceCode;
if (fusion->GetVTKImages().size()) {
mFusion = fusion;
else if (actor_type == "overlay") {
vis = this->mOverlayActor->GetVisibility();
}
- else if (actor_type == "fusion") {
+ else if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ){
vis = this->mFusionActor->GetVisibility();
}
else if (actor_type == "contour")
else if (actor_type == "overlay") {
this->mOverlayActor->SetVisibility(vis);
}
- else if (actor_type == "fusion") {
+ else if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ){
this->mFusionActor->SetVisibility(vis);
}
else if (actor_type == "contour")
mOverlayActor = NULL;
mOverlayMapper = NULL;
}
- if (actor_type == "fusion") {
+ if ( (actor_type == "fusion") || (actor_type == "fusionSequence") ) {
Renderer->RemoveActor(mFusionActor);
mFusion = NULL;
mFusionActor = NULL;
//------------------------------------------------------------------------------
-void vvSlicer::SetTSlice(int t)
+void vvSlicer::SetTSlice(int t, bool updateLinkedImages)
{
+ if (!updateLinkedImages) {
+ mCurrentTSlice = t;
+ mImageReslice->SetInput( mImage->GetVTKImages()[mCurrentTSlice] );
+ // Update transform
+ mConcatenatedTransform->Identity();
+ mConcatenatedTransform->Concatenate(mImage->GetTransform()[mCurrentTSlice]);
+ mConcatenatedTransform->Concatenate(mSlicingTransform);
+ UpdateDisplayExtent();
+ return;
+ }
+
if (t < 0)
mCurrentTSlice = 0;
else if ((unsigned int)t >= mImage->GetVTKImages().size())
if (mVF->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
mVOIFilter->SetInput(mVF->GetVTKImages()[mCurrentTSlice]);
}
+ //update the overlay
if (mOverlay && mOverlayActor->GetVisibility()) {
if (mOverlay->GetVTKImages().size() > (unsigned int)t) {
mCurrentOverlayTSlice = t;
mConcatenatedOverlayTransform->Concatenate(mSlicingTransform);
}
}
- if (mFusion && mFusionActor->GetVisibility()) {
+ //update the fusion ; except in case this is a fusionSequence, in which case both 'times' should be independent.
+ if (mFusion && mFusionActor->GetVisibility() && (mFusionSequenceCode<0)) {
if (mFusion->GetVTKImages().size() > (unsigned int)t) {
mCurrentFusionTSlice = t;
mFusionReslice->SetInput( mFusion->GetVTKImages()[mCurrentFusionTSlice]);
//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+void vvSlicer::SetFusionSequenceTSlice(int t)
+{
+ if (mFusion && mFusionActor->GetVisibility() && (mFusionSequenceCode>=0)) {
+ if (mFusion->GetVTKImages().size() > (unsigned int)t) {
+ mCurrentFusionTSlice = t;
+ mFusionReslice->SetInput( mFusion->GetVTKImages()[mCurrentFusionTSlice] );
+ // Update fusion transform
+ mConcatenatedFusionTransform->Identity();
+ mConcatenatedFusionTransform->Concatenate(mFusion->GetTransform()[mCurrentFusionTSlice]); //not really useful...
+ mConcatenatedFusionTransform->Concatenate(mSlicingTransform);
+ }
+ }
+
+ UpdateDisplayExtent();
+}
+//------------------------------------------------------------------------------
+
+
//------------------------------------------------------------------------------
int vvSlicer::GetTSlice()
{
int t = mCurrentTSlice;
if(mOverlay)
t = std::max(t, mCurrentOverlayTSlice);
- if(mFusion)
+ if(mFusion&& (mFusionSequenceCode<0)) //ignore fusionSequence data: for these, the times are not to be related (this way)
t = std::max(t, mCurrentFusionTSlice);
return t;
}
}
}
}
-
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void vvSlicer::SetDisplayMode(bool i)
{
- this->GetRenderer()->SetDraw(i);
- if (i)
- UpdateDisplayExtent();
+ this->GetRenderer()->SetDraw(i);
+ if (i) UpdateDisplayExtent();
}
//----------------------------------------------------------------------------
ix = lrint(X);
iy = lrint(Y);
iz = lrint(Z);
+
if (ix < image->GetWholeExtent()[0] ||
ix > image->GetWholeExtent()[1] ||
iy < image->GetWholeExtent()[2] ||
#include <iostream>
#include <vector>
+#include <QString> //TODO delete
+#include <QMessageBox>
+
#include "vvLandmarks.h"
#include "vvImage.h"
#include "vvMesh.h"
vtkActor* GetVFActor() ;
vtkCornerAnnotation* GetAnnotation();
- void SetFusion(vvImage::Pointer inputFusion);
+ void SetFusion(vvImage::Pointer inputFusion, int fusionSequenceCode = -1);
vvImage::Pointer GetFusion() {
return mFusion;
}
}
void SetLandmarks(vvLandmarks* landmarks);
- void SetTSlice(int t);
+ void SetTSlice(int t, bool updateLinkedImages = true);
+
+ void SetFusionSequenceTSlice(int t);
+
void SetSliceOrientation(int orientation);
void AdjustResliceToSliceOrientation(vtkImageReslice *reslice);
int GetTSlice();
}
void SetVFColor(double r, double g, double b);
+ //necessary to flag the secondary sequence
+ void SetFusionSequenceCode(int code) {mFusionSequenceCode=code;}
protected:
vvSlicer();
~vvSlicer();
vvLandmarks* mLandmarks;
+ int mFusionSequenceCode; //-1: not involved in a fusion sequence, 0: main sequence (CT), 1: secondary sequence (US)
+
// __________ Image coordinates accounting for spacing and origin
// Λ Λ
// | | vvImage.GetTransform()
-/*=========================================================================
- Program: vv http://www.creatis.insa-lyon.fr/rio/vv
-
- Authors belong to:
- - University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
- - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
-
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the copyright notices for more information.
-
- It is distributed under dual licence
-
- - BSD See included LICENSE.txt file
- - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
- ======================================================================-====*/
-
-#include "vvSlicerManager.h"
-#include "vvSlicer.h"
-#include "vvImage.h"
-#include "vvSlicerManagerCommand.h"
-#include "vvInteractorStyleNavigator.h"
-#include "vvLandmarks.h"
-#include "vvMesh.h"
-#include "vvBlendImageActor.h"
-
-#include <vtkImageActor.h>
-#include <vtkImageData.h>
-#include <vtkRenderWindow.h>
-#include <vtkRendererCollection.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkImageMapToWindowLevelColors.h>
-#include <vtkWindowLevelLookupTable.h>
-#include <vtkColorTransferFunction.h>
-#include <vtkImageClip.h>
-#include <vtkLODActor.h>
-#include <vtkPointData.h>
-#include <vtksys/SystemTools.hxx>
-#include <vtkCamera.h>
-
-#include <qfileinfo.h>
-
-//----------------------------------------------------------------------------
-vvSlicerManager::vvSlicerManager(int numberOfSlicers)
-{
- mFileName = "";
- mId = "";
- mVFName = "";
- mOverlayName = "";
- mFusionName = "";
- mVFId = "";
- mLastError = "";
- mType = vvImageReader::UNDEFINEDIMAGETYPE;
- mColorMap = 0;
- mPreset = 0;
- mOverlayColor = 130;
-
- mFusionOpacity = 30;
- mFusionThresOpacity = 1;
- mFusionColorMap = 3;
- mFusionWindow = 1000;
- mFusionLevel = 1000;
- mFusionShowLegend = true;
-
- mLandmarks = NULL;
- mLinkedId.resize(0);
-
- for ( int i = 0; i < numberOfSlicers; i++)
- mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());
- mSelectedSlicer = -1;
-
- mPreviousSlice.resize(numberOfSlicers);
- mPreviousTSlice.resize(numberOfSlicers);
- mSlicingPreset = WORLD_SLICING;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvSlicerManager::~vvSlicerManager()
-{
- if (mLandmarks)
- delete mLandmarks;
-}
-//----------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-void vvSlicerManager::SetFilename(std::string filename, int number)
-{
- mFileName = filename;
- mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
- mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
- mBaseFileNameNumber = number;
-
- mFileName = mBaseFileName;
- if (number != 0) {
- mFileName.append("_"+clitk::toString(number));
- }
- mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));
-
- for(unsigned int i=0; i<mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
- }
-
-}
-//------------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->AddContour(contour,propagate);
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ToggleContourSuperposition()
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++)
- mSlicers[i]->ToggleContourSuperposition();
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)
-{
- vvImageReader *reader = NULL;
-
- if(actorType=="image")
- reader = mReader;
- else if(actorType=="overlay")
- reader = mOverlayReader;
- else if(actorType=="fusion")
- reader = mFusionReader;
- else if(actorType=="vector")
- reader = mVectorReader;
-
- if(!reader)
- return "";
-
- std::string list;
- for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){
- QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path
- if(i)
- list += '\n';
- list += fileinfo.absoluteFilePath().toStdString();
- }
- return list;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)
-{
- mType = type;
- if (mReader.IsNull())
- mReader = vvImageReader::New();
- std::vector<std::string> filenames;
- filenames.push_back(filename);
- mReader->SetInputFilenames(filenames);
- mReader->SetSlice(slice); // Only used for SLICED type
- mReader->Update(type);
-
- SetFilename(filename, n);
- // mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
- //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
- //mBaseFileNameNumber = n;
-
- if (mReader->GetLastError().size() == 0) {
- mImage=mReader->GetOutput();
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
- mSlicers[i]->SetImage(mReader->GetOutput());
- }
- } else {
- mLastError = mReader->GetLastError();
- return false;
- }
- // if (n!=0) {
- // mFileName.append("_"+clitk::toString(n));
- // }
- return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetImage(vvImage::Pointer image)
-{
- mImage=image;
- for (unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetImage(image);
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)
-{
- mType = type;
- std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
- if (type == vvImageReader::DICOM)
- fileWithoutExtension += "_dicom";
- else if (type == vvImageReader::MERGED)
- fileWithoutExtension += "_merged";
- else if (type == vvImageReader::MERGEDWITHTIME)
- fileWithoutExtension += "_merged_wt";
-
- mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
- mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
- if (mReader.IsNull())
- mReader = vvImageReader::New();
- mReader->SetInputFilenames(filenames);
- mReader->Update(type);
-
- mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
- mBaseFileNameNumber = n;
-
- if (mReader->GetLastError().size() == 0) {
- mImage=mReader->GetOutput();
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(fileWithoutExtension);
- mSlicers[i]->SetImage(mReader->GetOutput());
- }
- } else {
- mLastError = mReader->GetLastError();
- return false;
- }
- if (n!=0) {
- mFileName.append("_"+clitk::toString(n));
- }
- return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)
-{
- mOverlayName = filenames[0];
- mOverlayComponent = component;
- if (dim > mImage->GetNumberOfDimensions()) {
- mLastError = " Overlay dimension cannot be greater than reference image!";
- return false;
- }
- if (mOverlayReader.IsNull())
- mOverlayReader = vvImageReader::New();
- mOverlayReader->SetInputFilenames(filenames);
- mOverlayReader->Update(type);
- if (mOverlayReader->GetLastError().size() == 0) {
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
- }
- } else {
- mLastError = mOverlayReader->GetLastError();
- return false;
- }
- return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)
-{
- mFusionName = filename;
- mFusionComponent = component;
- if (dim > mImage->GetNumberOfDimensions()) {
- mLastError = " Overlay dimension cannot be greater then reference image!";
- return false;
- }
- if (mFusionReader.IsNull())
- mFusionReader = vvImageReader::New();
- std::vector<std::string> filenames;
- filenames.push_back(filename);
- mFusionReader->SetInputFilenames(filenames);
- mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
- if (mFusionReader->GetLastError().size() == 0) {
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFusion(mFusionReader->GetOutput());
- }
- } else {
- mLastError = mFusionReader->GetLastError();
- return false;
- }
- double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
- mFusionLevel = (fusRange[0]+fusRange[1])/2;
- mFusionWindow = fusRange[1]-fusRange[0];
-
- return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetVF(std::string filename)
-{
- if (mVectorReader.IsNull())
- mVectorReader = vvImageReader::New();
- mVectorReader->SetInputFilename(filename);
-
- if (mType == vvImageReader::IMAGEWITHTIME)
- mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);
- else
- mVectorReader->Update(vvImageReader::VECTORFIELD);
- if (mVectorReader->GetLastError().size() != 0) {
- mLastError = mVectorReader->GetLastError();
- return false;
- } else
- return SetVF(mVectorReader->GetOutput(),filename);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
-{
- if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
- mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
- return false;
- }
- if (vf->GetNumberOfDimensions() == 4) {
- if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
- mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
- return false;
- }
- if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {
- mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";
- return false;
- }
- }
- mVF=vf;
- mVFName = filename;
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetVF(vf);
- }
- return true;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvSlicer* vvSlicerManager::GetSlicer(int i)
-{
- return mSlicers[i];
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSlicer(int num, bool state)
-{
- if (mSlicers[num]->GetImage())
- mSlicers[num]->SetDisplayMode(state);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
-{
- mSlicers[i]->SetRenderWindow(i,RW);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
-{
- vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
- smc->SM = this;
- smc->SetSlicerNumber(i);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
-
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
- // mSlicers[i]->GetRenderWindow()->GetInteractor()->
- // GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
- mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
- smc->Delete();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::LeftButtonReleaseEvent(int slicer)
-{
- emit LeftButtonReleaseSignal(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::EmitMousePositionUpdated(int slicer)
-{
- emit MousePositionUpdatedSignal(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::EmitKeyPressed(std::string KeyPress)
-{
- emit KeyPressedSignal(KeyPress);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)
-{
- mSlicers[slicer]->SetSliceOrientation(orientation);
- emit UpdateOrientation(slicer, orientation);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-int vvSlicerManager::GetTSlice()
-{
- return mSlicers[0]->GetTSlice();
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetTSlice(int slice)
-{
- if (slice < 0)
- slice = 0;
- else if (slice > mSlicers[0]->GetTMax())
- slice = mSlicers[0]->GetTMax();
- if (mLandmarks)
- mLandmarks->SetTime(slice);
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {
- mSlicers[i]->SetTSlice(slice);
- UpdateTSlice(i);
- }
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetNextTSlice(int originating_slicer)
-{
- int t = mSlicers[0]->GetMaxCurrentTSlice();
- t++;
- if (t > mSlicers[0]->GetTMax())
- t = 0;
- //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;
- emit UpdateTSlice(originating_slicer,t);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
-{
- int t = mSlicers[0]->GetMaxCurrentTSlice();
- t--;
- if (t < 0)
- t = mSlicers[0]->GetTMax();
- //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;
- emit UpdateTSlice(originating_slicer,t);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ToggleInterpolation()
-{
- bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
- if (mSlicers[i]->GetOverlayActor())
- mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
- if (mSlicers[i]->GetFusionActor())
- mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
-{
- if (tslice < 0)
- tslice = 0;
- else if (tslice > mSlicers[slicer]->GetTMax())
- tslice = mSlicers[slicer]->GetTMax();
- if (mLandmarks)
- mLandmarks->SetTime(tslice);
-
- if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;
-
- mSlicers[slicer]->SetTSlice(tslice);
-
- if(mSlicingPreset==VOXELS_SLICING) {
- vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
- mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);
- this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);
- imageTransformInverse->Delete();
- }
-
- UpdateTSlice(slicer);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorWindow(double s)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetColorWindow(s);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorLevel(double s)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetColorLevel(s);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOverlayColorWindow(double s)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetOverlayColorWindow(s);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOverlayColorLevel(double s)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetOverlayColorLevel(s);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetLinkOverlayWindowLevel(b);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetCursorVisibility(s);
- mSlicers[i]->SetCornerAnnotationVisibility(s);
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetOpacity(int i, double factor)
-{
- mSlicers[i]->SetOpacity(1/factor);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateViews(int current,int slicer)
-{
- double p[3], pt[3];
- p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
- p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
- p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
- mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
-
- double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
- /mSlicers[slicer]->GetInput()->GetSpacing()[0];
- double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
- /mSlicers[slicer]->GetInput()->GetSpacing()[1];
- double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
- /mSlicers[slicer]->GetInput()->GetSpacing()[2];
-
- if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
- x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
- y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
- y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
- z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
- z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {
- mSlicers[slicer]->UpdateCursorPosition();
- mSlicers[slicer]->SetCursorColor(10,212,255);
- mSelectedSlicer = slicer;
-
- switch (mSlicers[slicer]->GetSliceOrientation()) {
- case vtkImageViewer2::SLICE_ORIENTATION_XY:
- if (mSlicers[slicer]->GetSlice() != (int)lrint(z))
- mSlicers[slicer]->SetSlice((int)lrint(z));
- break;
-
- case vtkImageViewer2::SLICE_ORIENTATION_XZ:
- if (mSlicers[slicer]->GetSlice() != (int)lrint(y))
- mSlicers[slicer]->SetSlice((int)lrint(y));
- break;
-
- case vtkImageViewer2::SLICE_ORIENTATION_YZ:
- if (mSlicers[slicer]->GetSlice() != (int)lrint(x))
- mSlicers[slicer]->SetSlice((int)lrint(x));
- break;
- }
- mSlicers[slicer]->Render();
-
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- if (i != (unsigned int)slicer
- && mSlicers[i]->GetRenderer()->GetDraw()
- && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
- && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
- mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
- mSlicers[i]->UpdateCursorPosition();
- if (current) { //do not display corner annotation if image is the one picked
- mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
- -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());
- mSlicers[i]->SetCursorColor(255,10,212);
- } else {
- mSlicers[i]->SetCursorColor(150,10,282);
- }
- switch (mSlicers[i]->GetSliceOrientation()) {
- case vtkImageViewer2::SLICE_ORIENTATION_XY:
- if (mSlicers[i]->GetSlice() != (int)lrint(z))
- mSlicers[i]->SetSlice((int)lrint(z));
- break;
-
- case vtkImageViewer2::SLICE_ORIENTATION_XZ:
- if (mSlicers[i]->GetSlice() != (int)lrint(y))
- mSlicers[i]->SetSlice((int)lrint(y));
- break;
-
- case vtkImageViewer2::SLICE_ORIENTATION_YZ:
- if (mSlicers[i]->GetSlice() != (int)lrint(x))
- mSlicers[i]->SetSlice((int)lrint(x));
- break;
- }
-
- mSlicers[i]->Render();
-
- UpdateSlice(i);
- UpdateTSlice(i);
- }
- }
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateLinked(int slicer)
-{
- double p[3], pt[3];
- p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
- p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
- p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
- mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
- double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];
- double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];
- double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];
-
- if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
- x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
- y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
- y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
- z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
- z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {
- for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
- emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
- }
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)
-{
- vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();
-
- double refPosition[3];
- refCam->GetPosition(refPosition);
- refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *
- refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +
- refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];
-
- refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);
- mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);
-
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();
- camera->SetParallelScale(refCam->GetParallelScale());
-
- double position[3], focal[3];
- camera->GetPosition(position);
- camera->GetFocalPoint(focal);
-
- for(int j=0; j<3; j++) {
- if(j!=mSlicers[i]->GetSliceOrientation()) {
- position[j] = refPosition[j];
- focal[j] = refPosition[j];
- }
- }
-
- camera->SetFocalPoint(focal);
- camera->SetPosition(position);
-
- //Fix for bug #243
- mSlicers[i]->ForceUpdateDisplayExtent();
- }
-
- Render();
- if(bPropagate)
- for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
- emit UpdateLinkedNavigation(*i, this, refSlicer);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetColorWindow() const
-{
- if (mSlicers.size())
- return mSlicers[0]->GetColorWindow();
- return -1;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetColorLevel() const
-{
- if (mSlicers.size())
- return mSlicers[0]->GetColorLevel();
- return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetOverlayColorWindow() const
-{
- if (mSlicers.size())
- return mSlicers[0]->GetOverlayColorWindow();
- return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetOverlayColorLevel() const
-{
- if (mSlicers.size())
- return mSlicers[0]->GetOverlayColorLevel();
- return -1;
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-bool vvSlicerManager::GetLinkOverlayWindowLevel() const
-{
- if (mSlicers.size())
- return mSlicers[0]->GetLinkOverlayWindowLevel();
- return -1;
-}
-//----------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)
-{
- if(actorType == "image")
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
- this->GetImage()->GetTransform()[i]->Identity();
- else if(actorType == "overlay")
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
- this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();
- else if(actorType == "fusion")
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
- this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();
- else if(actorType == "vf")
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
- this->GetVF()->GetTransform()[i]->Identity();
- else
- return;
-
- for(int i=0; i< this->GetNumberOfSlicers(); i++){
- this->GetSlicer(i)->ForceUpdateDisplayExtent();
- this->GetSlicer(i)->ResetCamera();
- this->GetSlicer(i)->Render();
- }
-}
-//------------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Render()
-{
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->Render();
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::GenerateDefaultLookupTable()
-{
- SetPreset(mPreset);
- SetColorMap(mColorMap);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Reload()
-{
- mReader->Update(mType);
- mImage=mReader->GetOutput();
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetImage(mImage);
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadFusion()
-{
- mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);
-
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFusion(mFusionReader->GetOutput());
- mSlicers[i]->Render();
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadOverlay()
-{
- mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
- mSlicers[i]->Render();
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::ReloadVF()
-{
- mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function
- mVF=mVectorReader->GetOutput();
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetVF(mVF);
- mSlicers[i]->Render();
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
-{
- if (actor_type =="overlay")
- mOverlayReader = NULL;
-
- if (actor_type =="fusion")
- mFusionReader = NULL;
-
- for (unsigned int i = 0; i < mSlicers.size(); i++)
- mSlicers[i]->RemoveActor(actor_type,overlay_index);
-
- if (actor_type=="vector") {
- mVF=NULL;
- mVectorReader=NULL;
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::RemoveActors()
-{
- ///This method leaks a few objects. See RemoveActor for what a
- ///correct implementation would look like
- //DS -> probably due to the reader (now released in the
- //RemoveActor() function. (I hope)
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetDisplayMode(0);
- mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
-{
- // int view = mSlicers[slicer]->GetSliceOrientation();
- // int slice = mSlicers[slicer]->GetSlice();
- double x = mSlicers[slicer]->GetCursorPosition()[0];
- double y = mSlicers[slicer]->GetCursorPosition()[1];
- double z = mSlicers[slicer]->GetCursorPosition()[2];
- double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
- mSlicers[slicer]->GetInput()->GetSpacing()[0];
- double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
- mSlicers[slicer]->GetInput()->GetSpacing()[1];
- double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
- mSlicers[slicer]->GetInput()->GetSpacing()[2];
- double value = -VTK_DOUBLE_MAX;
- int displayVec = 0;
- double xVec=0, yVec=0, zVec=0, valueVec=0;
- int displayOver = 0;
- int displayFus = 0;
- double valueOver=0, valueFus=0;
- if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
- X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
- Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
- Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
- Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
- Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
- value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
-
- if (mSlicers[slicer]->GetVFActor() ) {
- displayVec = 1;
- unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();
- vtkImageData *vf = NULL;
-
- if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
- vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
- else
- vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
-
- if (vf) {
- double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
- double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
- double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
- xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
- yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
- zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
- valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
- }
- }
- if (mSlicers[slicer]->GetOverlayActor() ) {
- displayOver = 1;
- vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());
- double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];
- double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];
- double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];
- valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);
- }
- if (mSlicers[slicer]->GetFusionActor() ) {
- displayFus = 1;
- vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());
- double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];
- double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];
- double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];
- valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);
- }
- emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
- x,y,z,X,Y,Z,value);
- emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
- emit UpdateOverlay(displayOver,valueOver,value);
- emit UpdateFusion(displayFus,valueFus);
- }
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Activated()
-{
- emit currentImageChanged(mId);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::Picked()
-{
- emit currentPickedImageChanged(mId);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateWindowLevel()
-{
- emit WindowLevelChanged();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSlice(int slicer)
-{
- if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
- //DD("============= NOTHING");
- return;
- }
- //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;
- emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
- mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...
- mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateTSlice(int slicer)
-{
- int slice = mSlicers[slicer]->GetSlice();
- int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();
- if (mPreviousSlice[slicer] == slice) {
- if (mPreviousTSlice[slicer] == tslice) {
- // DD("************** NOTHING ***********");
- return;
- }
- }
- mPreviousSlice[slicer] = slice;
- mPreviousTSlice[slicer] = tslice;
- //std::cout << "vvSlicerManager::UpdateTSlice " << slicer << " " << tslice << std::endl;
- emit UpdateTSlice(slicer, tslice);
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::UpdateSliceRange(int slicer)
-{
- emit UpdateSliceRange(slicer,
- mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
- 0,mSlicers[slicer]->GetTMax());
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)
-{
- if(mSlicingPreset==preset)
- return;
-
- vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
- mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);
-
- for(int i=0; i< this->GetNumberOfSlicers(); i++){
- vvSlicer *s = this->GetSlicer(i);
- switch(preset)
- {
- case WORLD_SLICING:
- s->GetSlicingTransform()->Identity();
- break;
- case VOXELS_SLICING:
- s->GetSlicingTransform()->SetMatrix(imageTransformInverse);
- break;
- default:
- imageTransformInverse->Delete();
- return;
- }
- s->ForceUpdateDisplayExtent();
- s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]
- +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);
- s->ResetCamera();
- s->Render();
- }
-
- imageTransformInverse->Delete();
- mSlicingPreset = preset;
-}
-
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetPreset(int preset)
-{
- //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
- double window = mSlicers[0]->GetColorWindow();
- double level = mSlicers[0]->GetColorLevel();
-
- std::string component_type=mImage->GetScalarTypeAsITKString();
- switch (preset) {
- case 0:
- double range[2];
- mImage->GetScalarRange(range);
- window = range[1] - range[0];
- level = (range[1] + range[0])* 0.5;
- break;
- case 1:
- window = 2000;
- level = 0;
- break;
- case 2:
- window = 400;
- level = 20;
- break;
- case 3: // lungs (same as FOCAL)
- window = 1700;
- level = -300;
- break;
- case 4:
- window = 1000;
- level = 500;
- break;
- case 5:
- window = 1;
- level = 0.5;
- break;
- case 6:
- break;
- case 7:
- window=1.;
- level=0.;
- break;
- }
- mPreset = preset;
- this->SetColorWindow(window);
- this->SetColorLevel(level);
-
- //if (LUT)
- //{
- // SetColorMap(-1);
- //}
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)
-{
- double min, max;
- if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {
- int t = mSlicers[slicer]->GetFusionTSlice();
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
- this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],
- this->mSlicers[slicer]->GetConcatenatedFusionTransform());
- this->SetFusionWindow(max-min);
- this->SetFusionLevel(0.5*(min+max));
- this->SetColorMap(mColorMap);
- }
- else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {
- int t = mSlicers[slicer]->GetOverlayTSlice();
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
- this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],
- this->mSlicers[slicer]->GetConcatenatedOverlayTransform());
- if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){
- this->SetColorWindow(max-min);
- this->SetColorLevel(0.5*(min+max));
- } else {
- this->SetOverlayColorWindow(max-min);
- this->SetOverlayColorLevel(0.5*(min+max));
- }
- }
- else {
- int t = this->GetTSlice();
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
- this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],
- this->mSlicers[slicer]->GetConcatenatedTransform());
- this->SetColorWindow(max-min);
- this->SetColorLevel(0.5*(min+max));
- this->SetPreset(6);
- }
- this->Render();
- this->UpdateWindowLevel();
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetColorMap(int colormap)
-{
- double range[2];
- range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
- range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
-
- double window = mSlicers[0]->GetWindowLevel()->GetWindow();
- double level = mSlicers[0]->GetWindowLevel()->GetLevel();
-
- vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
- switch (colormap) {
- case -1:
- break;
- case 0:
- LUT = NULL;
- break;
- case 1:
- if (LUT == NULL)
- LUT = vtkLookupTable::New();
- LUT->SetValueRange(0,1);
- LUT->SetSaturationRange(1,1);
- LUT->SetHueRange(0,0.18);
- break;
- case 2:
- if (LUT == NULL)
- LUT = vtkLookupTable::New();
- LUT->SetValueRange(0,1);
- LUT->SetSaturationRange(1,1);
- LUT->SetHueRange(0.4,0.80);
- break;
- case 3:
- if (LUT == NULL)
- LUT = vtkLookupTable::New();
- LUT->SetValueRange(0.5,1);
- LUT->SetSaturationRange(1,1);
- LUT->SetHueRange(0.666,0);
- break;
- case 4:
- if (LUT == NULL)
- LUT = vtkLookupTable::New();
- LUT->SetValueRange(1,1);
- LUT->SetSaturationRange(1,1);
- LUT->SetHueRange(0,1);
- LUT->SetAlphaRange(1, 1);
- break;
- case 5:
- if (LUT == NULL)
- LUT = vtkLookupTable::New();
- LUT->SetValueRange(1,1);
- LUT->SetSaturationRange(1,1);
- LUT->SetHueRange(1,0.1);
- //LUT->SetRampToLinear();
- break;
- }
- if (LUT) {
- LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);
- LUT->Build();
- }
- vtkWindowLevelLookupTable* fusLUT = NULL;
- if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {
- fusLUT = vtkWindowLevelLookupTable::New();
- double fusRange [2];
- fusRange[0] = mFusionLevel - mFusionWindow/2;
- fusRange[1] = mFusionLevel + mFusionWindow/2;
- double* frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
- fusLUT->SetTableRange(frange);
- fusLUT->SetValueRange(1,1);
- fusLUT->SetSaturationRange(1,1);
- fusLUT->SetAlphaRange(1, 1);
- fusLUT->SetWindow(mFusionWindow);
- fusLUT->SetLevel(mFusionLevel);
- if (mFusionColorMap == 1)
- fusLUT->SetHueRange(0,0.18);
- else if (mFusionColorMap == 2)
- fusLUT->SetHueRange(0.4,0.80);
- else if (mFusionColorMap == 3)
- {
- fusLUT->SetHueRange(0.666, 0);
- fusLUT->SetValueRange(0.5, 1);
- }
- else if (mFusionColorMap == 4)
- fusLUT->SetHueRange(0,1);
- else if (mFusionColorMap <= 0)
- {
- fusLUT->SetValueRange(0,1);
- fusLUT->SetSaturationRange(0,0);
- }
-
- fusLUT->ForceBuild();
- double v[4];
-
- // set color table transparency
- //double alpha_range=(double)mFusionThresOpacity/10;
- double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;
- double curr_value = fusRange[0];
- int nvalues = fusLUT->GetNumberOfTableValues();
- for (double i = 0; curr_value < range_end; i++) {
- fusLUT->GetTableValue(i, v);
- v[3] = 0;
- //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);
- //else v[3] = 1;
- fusLUT->SetTableValue(i, v);
- curr_value += (fusRange[1] - fusRange[0])/nvalues;
- }
- }
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-
- if (mSlicers[i]->GetOverlay()) {
- vtkLookupTable* supLUT = vtkLookupTable::New();
- supLUT->SetTableRange(range[0],range[1]);
- supLUT->SetValueRange(1,1);
- supLUT->SetSaturationRange(1,1);
- supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
- supLUT->Build();
- vtkLookupTable* invLUT = vtkLookupTable::New();
- invLUT->SetTableRange(range[0],range[1]);
- invLUT->SetValueRange(1,1);
- invLUT->SetSaturationRange(1,1);
- invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
- invLUT->Build();
- mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
- mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
- invLUT->Delete();
- supLUT->Delete();
- } else if (mSlicers[i]->GetOverlay()) {
- mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
- } else {
- mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
- }
-
- if (mSlicers[i]->GetFusion()) {
- mSlicers[i]->ShowFusionLegend(mFusionShowLegend);
- mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
- mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
- }
- }
- if (fusLUT)
- fusLUT->Delete();
- if (colormap >= 0)
- mColorMap = colormap;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-vvLandmarks* vvSlicerManager::GetLandmarks()
-{
- if (mLandmarks == NULL) {
- mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
- for (unsigned int i = 0; i < mSlicers.size(); i++)
- mSlicers[i]->SetLandmarks(mLandmarks);
- }
- return mLandmarks;
-}
-//----------------------------------------------------------------------------
-
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
-{
- double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
- double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
- double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
- if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&
- x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&
- y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&
- y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&
- z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&
- z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) {
- double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);
- this->GetLandmarks()->AddLandmark(x,y,z,t,value);
- emit LandmarkAdded();
- }
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::PrevImage(int slicer)
-{
- emit ChangeImageWithIndexOffset(this, slicer, -1);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::NextImage(int slicer)
-{
- emit ChangeImageWithIndexOffset(this, slicer, 1);
-}
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
-{
- emit AVerticalSliderHasChanged(slicer, slice);
-}
-
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
-{
- int ix, iy, iz;
- return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
-}
-//----------------------------------------------------------------------------
+/*=========================================================================\r
+ Program: vv http://www.creatis.insa-lyon.fr/rio/vv\r
+\r
+ Authors belong to:\r
+ - University of LYON http://www.universite-lyon.fr/\r
+ - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr\r
+ - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr\r
+\r
+ This software is distributed WITHOUT ANY WARRANTY; without even\r
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
+ PURPOSE. See the copyright notices for more information.\r
+\r
+ It is distributed under dual licence\r
+\r
+ - BSD See included LICENSE.txt file\r
+ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html\r
+ ======================================================================-====*/\r
+\r
+#include "vvSlicerManager.h"\r
+#include "vvSlicer.h"\r
+#include "vvImage.h"\r
+#include "vvSlicerManagerCommand.h"\r
+#include "vvInteractorStyleNavigator.h"\r
+#include "vvLandmarks.h"\r
+#include "vvMesh.h"\r
+#include "vvBlendImageActor.h"\r
+\r
+#include <vtkImageActor.h>\r
+#include <vtkImageData.h>\r
+#include <vtkRenderWindow.h>\r
+#include <vtkRendererCollection.h>\r
+#include <vtkRenderWindowInteractor.h>\r
+#include <vtkImageMapToWindowLevelColors.h>\r
+#include <vtkWindowLevelLookupTable.h>\r
+#include <vtkColorTransferFunction.h>\r
+#include <vtkImageClip.h>\r
+#include <vtkLODActor.h>\r
+#include <vtkPointData.h>\r
+#include <vtksys/SystemTools.hxx>\r
+#include <vtkCamera.h>\r
+\r
+#include <qfileinfo.h>\r
+#include <QMessageBox>\r
+//----------------------------------------------------------------------------\r
+vvSlicerManager::vvSlicerManager(int numberOfSlicers)\r
+{\r
+ mFileName = "";\r
+ mId = "";\r
+ mVFName = "";\r
+ mOverlayName = "";\r
+ mFusionName = "";\r
+ mVFId = "";\r
+ mLastError = "";\r
+ mType = vvImageReader::UNDEFINEDIMAGETYPE;\r
+ mColorMap = 0;\r
+ mPreset = 0;\r
+ mOverlayColor = 130;\r
+\r
+ mFusionOpacity = 30;\r
+ mFusionThresOpacity = 1;\r
+ mFusionColorMap = 3;\r
+ mFusionWindow = 1000;\r
+ mFusionLevel = 1000;\r
+ mFusionShowLegend = true;\r
+ \r
+ mFusionSequenceInvolvementCode = -1;\r
+ mFusionSequenceIndexLinkedManager = -1;\r
+ mFusionSequenceFrameIndex = -1;\r
+ mFusionSequenceNbFrames = 0;\r
+ mFusionSequenceSpatialSyncFlag = false;\r
+ mFusionSequenceTemporalSyncFlag = false;\r
+\r
+ mLandmarks = NULL;\r
+ mLinkedId.resize(0);\r
+\r
+ for ( int i = 0; i < numberOfSlicers; i++)\r
+ mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());\r
+ mSelectedSlicer = -1;\r
+ \r
+ mPreviousSlice.resize(numberOfSlicers, 0);\r
+ mPreviousTSlice.resize(numberOfSlicers, 0);\r
+ mSlicingPreset = WORLD_SLICING;\r
+\r
+ \r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvSlicerManager::~vvSlicerManager()\r
+{\r
+ if (mLandmarks)\r
+ delete mLandmarks;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//------------------------------------------------------------------------------\r
+void vvSlicerManager::SetFilename(std::string filename, int number)\r
+{\r
+ mFileName = filename;\r
+ mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+ mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+ mBaseFileNameNumber = number;\r
+\r
+ mFileName = mBaseFileName;\r
+ if (number != 0) {\r
+ mFileName.append("_"+clitk::toString(number));\r
+ }\r
+ mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));\r
+\r
+ for(unsigned int i=0; i<mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
+ }\r
+ \r
+}\r
+//------------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->AddContour(contour,propagate);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ToggleContourSuperposition()\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++)\r
+ mSlicers[i]->ToggleContourSuperposition();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)\r
+{\r
+ vvImageReader *reader = NULL;\r
+\r
+ if(actorType=="image")\r
+ reader = mReader;\r
+ else if(actorType=="overlay")\r
+ reader = mOverlayReader;\r
+ else if(actorType=="fusion")\r
+ reader = mFusionReader;\r
+ else if(actorType=="vector")\r
+ reader = mVectorReader;\r
+ else if(actorType=="fusionSequence")\r
+ reader = mFusionSequenceReader;\r
+\r
+ if(!reader)\r
+ return "";\r
+\r
+ std::string list;\r
+ for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){\r
+ QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path\r
+ if(i)\r
+ list += '\n';\r
+ list += fileinfo.absoluteFilePath().toStdString();\r
+ }\r
+ return list;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)\r
+{\r
+ mType = type;\r
+ if (mReader.IsNull())\r
+ mReader = vvImageReader::New();\r
+ std::vector<std::string> filenames;\r
+ filenames.push_back(filename);\r
+ mReader->SetInputFilenames(filenames);\r
+ mReader->SetSlice(slice); // Only used for SLICED type\r
+ mReader->Update(type);\r
+\r
+ SetFilename(filename, n);\r
+ // mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+ //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+ //mBaseFileNameNumber = n;\r
+\r
+ if (mReader->GetLastError().size() == 0) {\r
+ mImage=mReader->GetOutput();\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
+ mSlicers[i]->SetImage(mReader->GetOutput());\r
+ }\r
+ } else {\r
+ mLastError = mReader->GetLastError();\r
+ return false;\r
+ }\r
+ // if (n!=0) {\r
+ // mFileName.append("_"+clitk::toString(n));\r
+ // }\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetImage(vvImage::Pointer image)\r
+{\r
+ mImage=image;\r
+ for (unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetImage(image);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)\r
+{\r
+ mType = type;\r
+ std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);\r
+ if (type == vvImageReader::DICOM)\r
+ fileWithoutExtension += "_dicom";\r
+ else if (type == vvImageReader::MERGED)\r
+ fileWithoutExtension += "_merged";\r
+ else if (type == vvImageReader::MERGEDWITHTIME)\r
+ fileWithoutExtension += "_merged_wt";\r
+\r
+ mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
+ mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);\r
+ if (mReader.IsNull())\r
+ mReader = vvImageReader::New();\r
+ mReader->SetInputFilenames(filenames);\r
+ mReader->Update(type);\r
+\r
+ mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
+ mBaseFileNameNumber = n;\r
+\r
+ if (mReader->GetLastError().size() == 0) {\r
+ mImage=mReader->GetOutput();\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFileName(fileWithoutExtension);\r
+ mSlicers[i]->SetImage(mReader->GetOutput());\r
+ }\r
+ } else {\r
+ mLastError = mReader->GetLastError();\r
+ return false;\r
+ }\r
+ if (n!=0) {\r
+ mFileName.append("_"+clitk::toString(n));\r
+ }\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
+{\r
+ mOverlayName = filenames[0];\r
+ mOverlayComponent = component;\r
+ if (dim > mImage->GetNumberOfDimensions()) {\r
+ mLastError = " Overlay dimension cannot be greater than reference image!";\r
+ return false;\r
+ }\r
+ if (mOverlayReader.IsNull())\r
+ mOverlayReader = vvImageReader::New();\r
+ mOverlayReader->SetInputFilenames(filenames);\r
+ mOverlayReader->Update(type);\r
+ if (mOverlayReader->GetLastError().size() == 0) {\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
+ }\r
+ } else {\r
+ mLastError = mOverlayReader->GetLastError();\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)\r
+{\r
+ mFusionName = filename;\r
+ mFusionComponent = component;\r
+ if (dim > mImage->GetNumberOfDimensions()) {\r
+ mLastError = " Overlay dimension cannot be greater then reference image!";\r
+ return false;\r
+ }\r
+ if (mFusionReader.IsNull())\r
+ mFusionReader = vvImageReader::New();\r
+ std::vector<std::string> filenames;\r
+ filenames.push_back(filename);\r
+ mFusionReader->SetInputFilenames(filenames);\r
+ mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);\r
+ if (mFusionReader->GetLastError().size() == 0) {\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
+ }\r
+ } else {\r
+ mLastError = mFusionReader->GetLastError();\r
+ return false;\r
+ }\r
+ double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+ mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
+ mFusionWindow = fusRange[1]-fusRange[0];\r
+\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+//this function is called by vvMainWindow::AddFusionSequence for the primary sequence (CT), while the given files constitute the secondary sequence.\r
+bool vvSlicerManager::SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type)\r
+{\r
+ mFusionSequenceInvolvementCode = 0;\r
+\r
+ mFusionName = filenames[0];\r
+ mFusionComponent = component;\r
+\r
+ if (dim > mImage->GetNumberOfDimensions()) {\r
+ mLastError = " Fusion Sequence dimension cannot be greater than reference image!";\r
+ return false;\r
+ }\r
+\r
+ if (mFusionSequenceReader.IsNull())\r
+ mFusionSequenceReader = vvImageReader::New();\r
+\r
+ mFusionSequenceReader->SetInputFilenames(filenames);\r
+ mFusionSequenceReader->Update(type);\r
+\r
+\r
+ if (mFusionSequenceReader->GetLastError().size() == 0) {\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), mFusionSequenceInvolvementCode);\r
+ }\r
+ } else {\r
+ mLastError = mFusionSequenceReader->GetLastError();\r
+ return false;\r
+ }\r
+ double *fusRange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+ mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
+ mFusionWindow = fusRange[1]-fusRange[0];\r
+\r
+ //store the initial transform matrices of each frame, and reset them to identity\r
+ mFusionSequenceListInitialTransformMatrices.clear();\r
+ for (unsigned i=0 ; i<mFusionSequenceReader->GetOutput()->GetTransform().size() ; i++) {\r
+ AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
+ mFusionSequenceReader->GetOutput()->GetTransform()[i]->Identity();\r
+ mFusionSequenceReader->GetOutput()->GetTransform()[i]->Update();\r
+ }\r
+\r
+ //adjust the time slider in the overlay panel\r
+ mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size()-1; //actually, this is the maximum index...\r
+ mFusionSequenceFrameIndex = std::max<int>( 0, std::min<int>(mFusionSequenceFrameIndex, mFusionSequenceNbFrames));\r
+\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetVF(std::string filename)\r
+{\r
+ if (mVectorReader.IsNull())\r
+ mVectorReader = vvImageReader::New();\r
+ mVectorReader->SetInputFilename(filename);\r
+ \r
+ if (mType == vvImageReader::IMAGEWITHTIME)\r
+ mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);\r
+ else\r
+ mVectorReader->Update(vvImageReader::VECTORFIELD);\r
+ if (mVectorReader->GetLastError().size() != 0) {\r
+ mLastError = mVectorReader->GetLastError();\r
+ return false;\r
+ } else\r
+ return SetVF(mVectorReader->GetOutput(),filename);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)\r
+{\r
+ if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {\r
+ mLastError = "Sorry, vector field dimension cannot be greater then reference image.";\r
+ return false;\r
+ }\r
+ if (vf->GetNumberOfDimensions() == 4) {\r
+ if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {\r
+ mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";\r
+ return false;\r
+ }\r
+ if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {\r
+ mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";\r
+ return false;\r
+ }\r
+ }\r
+ mVF=vf;\r
+ mVFName = filename;\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetVF(vf);\r
+ }\r
+ return true;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvSlicer* vvSlicerManager::GetSlicer(int i)\r
+{\r
+ return mSlicers[i];\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSlicer(int num, bool state)\r
+{\r
+ if (mSlicers[num]->GetImage()) {\r
+ mSlicers[num]->SetDisplayMode(state);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)\r
+{\r
+ mSlicers[i]->SetRenderWindow(i,RW);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)\r
+{\r
+ vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();\r
+ smc->SM = this;\r
+ smc->SetSlicerNumber(i);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);\r
+\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);\r
+ // mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ // GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);\r
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
+ GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);\r
+ smc->Delete();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::LeftButtonReleaseEvent(int slicer)\r
+{\r
+ emit LeftButtonReleaseSignal(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::EmitMousePositionUpdated(int slicer)\r
+{\r
+ emit MousePositionUpdatedSignal(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::EmitKeyPressed(std::string KeyPress)\r
+{\r
+ emit KeyPressedSignal(KeyPress);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)\r
+{\r
+ mSlicers[slicer]->SetSliceOrientation(orientation);\r
+ emit UpdateOrientation(slicer, orientation);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+int vvSlicerManager::GetTSlice()\r
+{\r
+ return mSlicers[0]->GetTSlice();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetTSlice(int slice, bool updateLinkedImages)\r
+{\r
+ if (!updateLinkedImages) { //for fusionSequence, TMax / MaxCurrentTSlice are irrelevant.\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
+ UpdateTSlice(i);\r
+ }\r
+ return;\r
+ }\r
+\r
+ if (slice < 0)\r
+ slice = 0;\r
+ else if (slice > mSlicers[0]->GetTMax())\r
+ slice = mSlicers[0]->GetTMax();\r
+ if (mLandmarks)\r
+ mLandmarks->SetTime(slice);\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {\r
+ mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
+ UpdateTSlice(i);\r
+ }\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetFusionSequenceTSlice(int slice)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFusionSequenceTSlice(slice);\r
+ UpdateTSlice(i);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetNextTSlice(int originating_slicer)\r
+{\r
+ int t = mSlicers[0]->GetMaxCurrentTSlice();\r
+ t++;\r
+ if (t > mSlicers[0]->GetTMax())\r
+ t = 0;\r
+ //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;\r
+ emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetPreviousTSlice(int originating_slicer)\r
+{\r
+ int t = mSlicers[0]->GetMaxCurrentTSlice();\r
+ t--;\r
+ if (t < 0)\r
+ t = mSlicers[0]->GetTMax();\r
+ //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;\r
+ emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ToggleInterpolation()\r
+{\r
+ bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);\r
+ if (mSlicers[i]->GetOverlayActor())\r
+ mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);\r
+ if (mSlicers[i]->GetFusionActor())\r
+ mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)\r
+{\r
+ if (tslice < 0)\r
+ tslice = 0;\r
+ else if (tslice > mSlicers[slicer]->GetTMax())\r
+ tslice = mSlicers[slicer]->GetTMax();\r
+ if (mLandmarks)\r
+ mLandmarks->SetTime(tslice);\r
+\r
+ if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;\r
+\r
+ mSlicers[slicer]->SetTSlice(tslice);\r
+\r
+ if(mSlicingPreset==VOXELS_SLICING) {\r
+ vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
+ mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);\r
+ this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
+ imageTransformInverse->Delete();\r
+ }\r
+\r
+ UpdateTSlice(slicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorWindow(double s)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetColorWindow(s);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorLevel(double s)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetColorLevel(s);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOverlayColorWindow(double s)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetOverlayColorWindow(s);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOverlayColorLevel(double s)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetOverlayColorLevel(s);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetLinkOverlayWindowLevel(b);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetCursorVisibility(s);\r
+ mSlicers[i]->SetCornerAnnotationVisibility(s);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetOpacity(int i, double factor)\r
+{\r
+ mSlicers[i]->SetOpacity(1/factor);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateViews(int current,int slicer)\r
+{\r
+ double p[3], pt[3];\r
+ p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
+ p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
+ p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
+ mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
+\r
+ double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])\r
+ /mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+ double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])\r
+ /mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+ double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])\r
+ /mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+\r
+ if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+ x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+ y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+ y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+ z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+ z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+ mSlicers[slicer]->UpdateCursorPosition();\r
+ mSlicers[slicer]->SetCursorColor(10,212,255);\r
+ mSelectedSlicer = slicer;\r
+\r
+ switch (mSlicers[slicer]->GetSliceOrientation()) {\r
+ case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(z))\r
+ mSlicers[slicer]->SetSlice((int)lrint(z));\r
+ break;\r
+\r
+ case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(y))\r
+ mSlicers[slicer]->SetSlice((int)lrint(y));\r
+ break;\r
+\r
+ case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(x))\r
+ mSlicers[slicer]->SetSlice((int)lrint(x));\r
+ break;\r
+ }\r
+ mSlicers[slicer]->Render();\r
+\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ if (i != (unsigned int)slicer\r
+ && mSlicers[i]->GetRenderer()->GetDraw()\r
+ && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2\r
+ && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {\r
+ mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
+ mSlicers[i]->UpdateCursorPosition();\r
+ if (current) { //do not display corner annotation if image is the one picked\r
+ mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,\r
+ -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());\r
+ mSlicers[i]->SetCursorColor(255,10,212);\r
+ } else {\r
+ mSlicers[i]->SetCursorColor(150,10,282);\r
+ }\r
+ switch (mSlicers[i]->GetSliceOrientation()) {\r
+ case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
+ if (mSlicers[i]->GetSlice() != (int)lrint(z))\r
+ mSlicers[i]->SetSlice((int)lrint(z));\r
+ break;\r
+\r
+ case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
+ if (mSlicers[i]->GetSlice() != (int)lrint(y))\r
+ mSlicers[i]->SetSlice((int)lrint(y));\r
+ break;\r
+\r
+ case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
+ if (mSlicers[i]->GetSlice() != (int)lrint(x))\r
+ mSlicers[i]->SetSlice((int)lrint(x));\r
+ break;\r
+ }\r
+ \r
+ mSlicers[i]->Render();\r
+ \r
+ UpdateSlice(i);\r
+ UpdateTSlice(i);\r
+ }\r
+ }\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateLinked(int slicer)\r
+{\r
+ double p[3], pt[3];\r
+ p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
+ p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
+ p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
+ mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
+ double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+ double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+ double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+\r
+ if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+ x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+ y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+ y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+ z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+ z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+ for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {\r
+ if (this->IsInvolvedInFusionSequence()) {\r
+ //this SlicerManager is involved in fusionSequence => do not synchronize the times\r
+ emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], -1);\r
+ }\r
+ else {\r
+ emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
+ }\r
+ }\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)\r
+{\r
+ vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();\r
+\r
+ double refPosition[3];\r
+ refCam->GetPosition(refPosition);\r
+ refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *\r
+ refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +\r
+ refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];\r
+\r
+ refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);\r
+ mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);\r
+\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();\r
+ camera->SetParallelScale(refCam->GetParallelScale());\r
+\r
+ double position[3], focal[3];\r
+ camera->GetPosition(position);\r
+ camera->GetFocalPoint(focal);\r
+\r
+ for(int j=0; j<3; j++) {\r
+ if(j!=mSlicers[i]->GetSliceOrientation()) {\r
+ position[j] = refPosition[j];\r
+ focal[j] = refPosition[j];\r
+ }\r
+ }\r
+\r
+ camera->SetFocalPoint(focal);\r
+ camera->SetPosition(position);\r
+\r
+ //Fix for bug #243\r
+ mSlicers[i]->ForceUpdateDisplayExtent();\r
+ }\r
+ \r
+ Render();\r
+ if(bPropagate)\r
+ for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)\r
+ emit UpdateLinkedNavigation(*i, this, refSlicer);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetColorWindow() const\r
+{\r
+ if (mSlicers.size())\r
+ return mSlicers[0]->GetColorWindow();\r
+ return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetColorLevel() const\r
+{\r
+ if (mSlicers.size())\r
+ return mSlicers[0]->GetColorLevel();\r
+ return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetOverlayColorWindow() const\r
+{\r
+ if (mSlicers.size())\r
+ return mSlicers[0]->GetOverlayColorWindow();\r
+ return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetOverlayColorLevel() const\r
+{\r
+ if (mSlicers.size())\r
+ return mSlicers[0]->GetOverlayColorLevel();\r
+ return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+bool vvSlicerManager::GetLinkOverlayWindowLevel() const\r
+{\r
+ if (mSlicers.size())\r
+ return mSlicers[0]->GetLinkOverlayWindowLevel();\r
+ return -1;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//------------------------------------------------------------------------------\r
+void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)\r
+{\r
+ if(actorType == "image")\r
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+ this->GetImage()->GetTransform()[i]->Identity();\r
+ else if(actorType == "overlay")\r
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+ this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();\r
+ else if(actorType == "fusion")\r
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+ this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
+ else if(actorType == "fusionSequence") //TODO: Check what should really be done here\r
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+ this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
+ else if(actorType == "vf")\r
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
+ this->GetVF()->GetTransform()[i]->Identity();\r
+ else\r
+ return;\r
+\r
+ for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
+ this->GetSlicer(i)->ForceUpdateDisplayExtent();\r
+ this->GetSlicer(i)->ResetCamera();\r
+ this->GetSlicer(i)->Render();\r
+ }\r
+}\r
+//------------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Render()\r
+{\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->Render();\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::GenerateDefaultLookupTable()\r
+{\r
+ SetPreset(mPreset);\r
+ SetColorMap(mColorMap);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Reload()\r
+{\r
+ mReader->Update(mType);\r
+ mImage=mReader->GetOutput();\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetImage(mImage);\r
+ }\r
+ \r
+ //if this image is the primary sequence of a fusion sequence, then the main transform matrix should be updated.\r
+ if (this->IsMainSequenceOfFusionSequence()) {\r
+ SetFusionSequenceMainTransformMatrix( mImage->GetTransform()[0]->GetMatrix() );\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadFusion()\r
+{\r
+ mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);\r
+\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
+ mSlicers[i]->Render();\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+//the secondary sequence is being reloaded.\r
+void vvSlicerManager::ReloadFusionSequence()\r
+{\r
+ mFusionSequenceReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),vvImageReader::MERGEDWITHTIME);\r
+\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), 1);\r
+ mSlicers[i]->Render();\r
+ }\r
+\r
+ //Update the slider\r
+ mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();\r
+ if (mFusionSequenceFrameIndex>=mFusionSequenceNbFrames) {\r
+ mFusionSequenceFrameIndex=0;\r
+ }\r
+\r
+ //Update the list of initial transforms\r
+ mFusionSequenceListInitialTransformMatrices.clear();\r
+ for (unsigned i=0 ; i<mFusionSequenceNbFrames ; i++) {\r
+ this->AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
+ }\r
+\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadOverlay()\r
+{\r
+ mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
+ mSlicers[i]->Render();\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::ReloadVF()\r
+{\r
+ mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function\r
+ mVF=mVectorReader->GetOutput();\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetVF(mVF);\r
+ mSlicers[i]->Render();\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)\r
+{\r
+ if (actor_type =="overlay")\r
+ mOverlayReader = NULL;\r
+\r
+ if (actor_type =="fusion")\r
+ mFusionReader = NULL;\r
+\r
+ if (actor_type =="fusionSequence") {\r
+ mFusionSequenceReader = NULL;\r
+ }\r
+\r
+ for (unsigned int i = 0; i < mSlicers.size(); i++)\r
+ mSlicers[i]->RemoveActor(actor_type,overlay_index);\r
+\r
+ if (actor_type=="vector") {\r
+ mVF=NULL;\r
+ mVectorReader=NULL;\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::RemoveActors()\r
+{\r
+ ///This method leaks a few objects. See RemoveActor for what a\r
+ ///correct implementation would look like\r
+ //DS -> probably due to the reader (now released in the\r
+ //RemoveActor() function. (I hope)\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+ mSlicers[i]->SetDisplayMode(0);\r
+ mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)\r
+{\r
+ // int view = mSlicers[slicer]->GetSliceOrientation();\r
+ // int slice = mSlicers[slicer]->GetSlice();\r
+ double x = mSlicers[slicer]->GetCursorPosition()[0];\r
+ double y = mSlicers[slicer]->GetCursorPosition()[1];\r
+ double z = mSlicers[slicer]->GetCursorPosition()[2];\r
+ double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/\r
+ mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
+ double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/\r
+ mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
+ double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/\r
+ mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
+ double value = -VTK_DOUBLE_MAX;\r
+ int displayVec = 0;\r
+ double xVec=0, yVec=0, zVec=0, valueVec=0;\r
+ int displayOver = 0;\r
+ int displayFus = 0;\r
+ double valueOver=0, valueFus=0;\r
+ if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&\r
+ X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&\r
+ Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&\r
+ Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&\r
+ Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&\r
+ Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {\r
+\r
+ value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);\r
+\r
+ if (mSlicers[slicer]->GetVFActor() ) {\r
+ displayVec = 1;\r
+ unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();\r
+ vtkImageData *vf = NULL;\r
+\r
+ if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)\r
+ vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];\r
+ else\r
+ vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];\r
+\r
+ if (vf) {\r
+ double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];\r
+ double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];\r
+ double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];\r
+ xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);\r
+ yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);\r
+ zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);\r
+ valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);\r
+ }\r
+ }\r
+ if (mSlicers[slicer]->GetOverlayActor() ) {\r
+ displayOver = 1;\r
+ vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());\r
+ double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];\r
+ double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];\r
+ double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];\r
+ valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);\r
+ }\r
+\r
+ if ( mSlicers[slicer]->GetFusionActor() ) {\r
+ displayFus = 1;\r
+ vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());\r
+ double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];\r
+ double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];\r
+ double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];\r
+ valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);\r
+ }\r
+ else if (this->IsInvolvedInFusionSequence()) { \r
+ //if the cursor moves over the 'independent' version of the secondary sequence\r
+ //do not update the panel, just keep it as it is.\r
+ displayFus = 1;\r
+ valueFus = std::numeric_limits<double>::quiet_NaN();\r
+ }\r
+\r
+ emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),\r
+ x,y,z,X,Y,Z,value);\r
+ emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);\r
+ emit UpdateOverlay(displayOver,valueOver,value);\r
+ emit UpdateFusion(displayFus,valueFus);\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Activated()\r
+{\r
+ emit currentImageChanged(mId);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::Picked()\r
+{\r
+ emit currentPickedImageChanged(mId);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateWindowLevel()\r
+{\r
+ emit WindowLevelChanged();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSlice(int slicer)\r
+{\r
+ if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {\r
+ //DD("============= NOTHING");\r
+ return;\r
+ }\r
+ //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;\r
+ emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());\r
+ mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...\r
+ mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateTSlice(int slicer)\r
+{\r
+ int slice = mSlicers[slicer]->GetSlice();\r
+\r
+ int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();\r
+ //if (this->IsInvolvedInFusionSequence()) tslice = mSlicers[slicer]->GetTSlice(); //actually, this is handled by the Slicer\r
+\r
+ if (mPreviousSlice[slicer] == slice) {\r
+ if (mPreviousTSlice[slicer] == tslice) {\r
+ // DD("************** NOTHING ***********");\r
+ return;\r
+ }\r
+ }\r
+ mPreviousSlice[slicer] = slice;\r
+ mPreviousTSlice[slicer] = tslice;\r
+\r
+ emit UpdateTSlice(slicer, tslice, mFusionSequenceInvolvementCode);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::UpdateSliceRange(int slicer)\r
+{\r
+ emit UpdateSliceRange(slicer,\r
+ mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],\r
+ 0,mSlicers[slicer]->GetTMax());\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)\r
+{\r
+ if(mSlicingPreset==preset)\r
+ return;\r
+\r
+ vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
+ mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);\r
+\r
+ for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
+ vvSlicer *s = this->GetSlicer(i);\r
+ switch(preset)\r
+ {\r
+ case WORLD_SLICING:\r
+ s->GetSlicingTransform()->Identity();\r
+ break;\r
+ case VOXELS_SLICING:\r
+ s->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
+ break;\r
+ default:\r
+ imageTransformInverse->Delete();\r
+ return;\r
+ }\r
+ s->ForceUpdateDisplayExtent();\r
+ s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]\r
+ +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);\r
+ s->ResetCamera();\r
+ s->Render();\r
+ }\r
+\r
+ imageTransformInverse->Delete();\r
+ mSlicingPreset = preset;\r
+}\r
+\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetPreset(int preset)\r
+{\r
+ //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
+ double window = mSlicers[0]->GetColorWindow();\r
+ double level = mSlicers[0]->GetColorLevel();\r
+\r
+ std::string component_type=mImage->GetScalarTypeAsITKString();\r
+ switch (preset) {\r
+ case 0:\r
+ double range[2];\r
+ mImage->GetScalarRange(range);\r
+ window = range[1] - range[0];\r
+ level = (range[1] + range[0])* 0.5;\r
+ break;\r
+ case 1:\r
+ window = 2000;\r
+ level = 0;\r
+ break;\r
+ case 2:\r
+ window = 400;\r
+ level = 20;\r
+ break;\r
+ case 3: // lungs (same as FOCAL)\r
+ window = 1700;\r
+ level = -300;\r
+ break;\r
+ case 4:\r
+ window = 1000;\r
+ level = 500;\r
+ break;\r
+ case 5:\r
+ window = 1;\r
+ level = 0.5;\r
+ break;\r
+ case 6:\r
+ break;\r
+ case 7:\r
+ window=1.;\r
+ level=0.;\r
+ break;\r
+ }\r
+ mPreset = preset;\r
+ this->SetColorWindow(window);\r
+ this->SetColorLevel(level);\r
+\r
+ //if (LUT)\r
+ //{\r
+ // SetColorMap(-1);\r
+ //}\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)\r
+{\r
+ double min, max;\r
+ if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {\r
+ int t = mSlicers[slicer]->GetFusionTSlice();\r
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+ this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],\r
+ this->mSlicers[slicer]->GetConcatenatedFusionTransform());\r
+ this->SetFusionWindow(max-min);\r
+ this->SetFusionLevel(0.5*(min+max));\r
+ this->SetColorMap(mColorMap);\r
+ }\r
+ else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {\r
+ int t = mSlicers[slicer]->GetOverlayTSlice();\r
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+ this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],\r
+ this->mSlicers[slicer]->GetConcatenatedOverlayTransform());\r
+ if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){\r
+ this->SetColorWindow(max-min);\r
+ this->SetColorLevel(0.5*(min+max));\r
+ } else {\r
+ this->SetOverlayColorWindow(max-min);\r
+ this->SetOverlayColorLevel(0.5*(min+max));\r
+ }\r
+ }\r
+ else {\r
+ int t = this->GetTSlice();\r
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
+ this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],\r
+ this->mSlicers[slicer]->GetConcatenatedTransform());\r
+ this->SetColorWindow(max-min);\r
+ this->SetColorLevel(0.5*(min+max));\r
+ this->SetPreset(6);\r
+ }\r
+ this->Render();\r
+ this->UpdateWindowLevel();\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::SetColorMap(int colormap)\r
+{\r
+ double range[2];\r
+\r
+ range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];\r
+ range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];\r
+\r
+ double window = mSlicers[0]->GetWindowLevel()->GetWindow();\r
+ double level = mSlicers[0]->GetWindowLevel()->GetLevel();\r
+\r
+ vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
+ switch (colormap) {\r
+ case -1:\r
+ break;\r
+ case 0:\r
+ LUT = NULL;\r
+ break;\r
+ case 1:\r
+ if (LUT == NULL)\r
+ LUT = vtkLookupTable::New();\r
+ LUT->SetValueRange(0,1);\r
+ LUT->SetSaturationRange(1,1);\r
+ LUT->SetHueRange(0,0.18);\r
+ break;\r
+ case 2:\r
+ if (LUT == NULL)\r
+ LUT = vtkLookupTable::New();\r
+ LUT->SetValueRange(0,1);\r
+ LUT->SetSaturationRange(1,1);\r
+ LUT->SetHueRange(0.4,0.80);\r
+ break;\r
+ case 3:\r
+ if (LUT == NULL)\r
+ LUT = vtkLookupTable::New();\r
+ LUT->SetValueRange(0.5,1);\r
+ LUT->SetSaturationRange(1,1);\r
+ LUT->SetHueRange(0.666,0);\r
+ break;\r
+ case 4:\r
+ if (LUT == NULL)\r
+ LUT = vtkLookupTable::New();\r
+ LUT->SetValueRange(1,1);\r
+ LUT->SetSaturationRange(1,1);\r
+ LUT->SetHueRange(0,1);\r
+ LUT->SetAlphaRange(1, 1);\r
+ break;\r
+ case 5:\r
+ if (LUT == NULL)\r
+ LUT = vtkLookupTable::New();\r
+ LUT->SetValueRange(1,1);\r
+ LUT->SetSaturationRange(1,1);\r
+ LUT->SetHueRange(1,0.1);\r
+ //LUT->SetRampToLinear();\r
+ break;\r
+ }\r
+ if (LUT) {\r
+ LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);\r
+ LUT->Build();\r
+ }\r
+ vtkWindowLevelLookupTable* fusLUT = NULL;\r
+\r
+ //FUSION / FUSION SEQUENCE\r
+ if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {\r
+ fusLUT = vtkWindowLevelLookupTable::New();\r
+ double fusRange [2];\r
+ fusRange[0] = mFusionLevel - mFusionWindow/2;\r
+ fusRange[1] = mFusionLevel + mFusionWindow/2;\r
+\r
+ //check whether it is actually a fusionSequence or a fusion, before invoking mFusionReader...\r
+ double* frange;\r
+ if (this->IsInvolvedInFusionSequence()) \r
+ frange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+ else\r
+ frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
+\r
+ fusLUT->SetTableRange(frange);\r
+ fusLUT->SetValueRange(1,1);\r
+ fusLUT->SetSaturationRange(1,1);\r
+ fusLUT->SetAlphaRange(1, 1);\r
+ fusLUT->SetWindow(mFusionWindow);\r
+ fusLUT->SetLevel(mFusionLevel);\r
+ if (mFusionColorMap == 1)\r
+ fusLUT->SetHueRange(0,0.18);\r
+ else if (mFusionColorMap == 2)\r
+ fusLUT->SetHueRange(0.4,0.80);\r
+ else if (mFusionColorMap == 3)\r
+ {\r
+ fusLUT->SetHueRange(0.666, 0);\r
+ fusLUT->SetValueRange(0.5, 1);\r
+ }\r
+ else if (mFusionColorMap == 4)\r
+ fusLUT->SetHueRange(0,1);\r
+ else if (mFusionColorMap <= 0)\r
+ {\r
+ fusLUT->SetValueRange(0,1);\r
+ fusLUT->SetSaturationRange(0,0);\r
+ }\r
+\r
+ fusLUT->ForceBuild();\r
+ double v[4];\r
+\r
+ // set color table transparency\r
+ //double alpha_range=(double)mFusionThresOpacity/10;\r
+ double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;\r
+ double curr_value = fusRange[0];\r
+ int nvalues = fusLUT->GetNumberOfTableValues();\r
+ for (double i = 0; curr_value < range_end; i++) { \r
+ fusLUT->GetTableValue(i, v);\r
+ v[3] = 0;\r
+ //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);\r
+ //else v[3] = 1;\r
+ fusLUT->SetTableValue(i, v);\r
+ curr_value += (fusRange[1] - fusRange[0])/nvalues;\r
+ }\r
+ }\r
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
+\r
+ if (mSlicers[i]->GetOverlay()) {\r
+ vtkLookupTable* supLUT = vtkLookupTable::New();\r
+ supLUT->SetTableRange(range[0],range[1]);\r
+ supLUT->SetValueRange(1,1);\r
+ supLUT->SetSaturationRange(1,1);\r
+ supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);\r
+ supLUT->Build();\r
+ vtkLookupTable* invLUT = vtkLookupTable::New();\r
+ invLUT->SetTableRange(range[0],range[1]);\r
+ invLUT->SetValueRange(1,1);\r
+ invLUT->SetSaturationRange(1,1);\r
+ invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);\r
+ invLUT->Build();\r
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);\r
+ mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);\r
+ invLUT->Delete();\r
+ supLUT->Delete();\r
+ } else if (mSlicers[i]->GetOverlay()) {\r
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
+ } else {\r
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
+ }\r
+\r
+ if (mSlicers[i]->GetFusion()) {\r
+ mSlicers[i]->ShowFusionLegend(mFusionShowLegend);\r
+ mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);\r
+ mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);\r
+ }\r
+ }\r
+ if (fusLUT)\r
+ fusLUT->Delete();\r
+ if (colormap >= 0)\r
+ mColorMap = colormap;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+vvLandmarks* vvSlicerManager::GetLandmarks()\r
+{\r
+ if (mLandmarks == NULL) {\r
+ mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);\r
+ for (unsigned int i = 0; i < mSlicers.size(); i++)\r
+ mSlicers[i]->SetLandmarks(mLandmarks);\r
+ }\r
+ return mLandmarks;\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::AddLandmark(float x,float y,float z,float t)\r
+{\r
+ double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];\r
+ double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];\r
+ double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];\r
+ if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
+ x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
+ y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
+ y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
+ z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
+ z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) {\r
+ double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);\r
+ this->GetLandmarks()->AddLandmark(x,y,z,t,value);\r
+ emit LandmarkAdded();\r
+ }\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::PrevImage(int slicer)\r
+{\r
+ emit ChangeImageWithIndexOffset(this, slicer, -1);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::NextImage(int slicer)\r
+{\r
+ emit ChangeImageWithIndexOffset(this, slicer, 1);\r
+}\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)\r
+{\r
+ emit AVerticalSliderHasChanged(slicer, slice);\r
+}\r
+\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)\r
+{\r
+ int ix, iy, iz;\r
+ return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);\r
+}\r
+//----------------------------------------------------------------------------\r
bool SetOverlay(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
bool SetFusion(std::string filename, int dim, std::string component);
+ bool SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
///Set a VF by loading it from the disk
bool SetVF(std::string filename);
///Set a VF from memory
void SetSliceOrientation(int slicer, int orientation);
int GetTSlice();
- void SetTSlice(int slice);
+ void SetTSlice(int slice, bool updateLinkedImages = true);
void SetNextTSlice(int originating_slicer);
void SetPreviousTSlice(int originating_slicer);
void SetTSliceInSlicer(int tslice, int slicer);
+ void SetFusionSequenceTSlice(int slice);
+
void GenerateDefaultLookupTable();
void SetColorWindow(double s);
void SetColorLevel(double s);
mFusionShowLegend = show;
}
+
+ //set/get fusionSequence related data
+ void SetFusionSequenceFrameIndex(int sequenceFrameIndex) { mFusionSequenceFrameIndex = sequenceFrameIndex; }
+ void SetFusionSequenceSpatialSyncFlag(bool spatialSync) { mFusionSequenceSpatialSyncFlag = spatialSync; }
+ void SetFusionSequenceTemporalSyncFlag(bool temporalSync) { mFusionSequenceTemporalSyncFlag = temporalSync; }
+ void SetFusionSequenceLength(unsigned int fusionSequenceNbFrames) { mFusionSequenceNbFrames = fusionSequenceNbFrames; }
+ void SetFusionSequenceMainTransformMatrix(vtkSmartPointer<vtkMatrix4x4> mat) {
+ mFusionSequenceMainTransform = vtkSmartPointer<vtkMatrix4x4>::New();
+ mFusionSequenceMainTransform->DeepCopy(mat);
+ }
+ void AddFusionSequenceInitialTransformMatrices(vtkSmartPointer<vtkMatrix4x4> mat) {
+ vtkSmartPointer<vtkMatrix4x4> tmpMat = vtkSmartPointer<vtkMatrix4x4>::New();
+ tmpMat->DeepCopy(mat);
+ mFusionSequenceListInitialTransformMatrices.push_back( tmpMat );
+ }
+ void SetFusionSequenceIndexOfLinkedManager(int index) { mFusionSequenceIndexLinkedManager = index; }
+ void SetFusionSequenceTemporalSignal(std::vector<double> s) { mFusionSequenceTemporalSignal = s; }
+
+ void SetFusionSequenceInvolvmentCode(int code) { mFusionSequenceInvolvementCode=code; }
+ int GetFusionSequenceInvolvmentCode() { return mFusionSequenceInvolvementCode;}
+ bool IsInvolvedInFusionSequence() {return (!(mFusionSequenceInvolvementCode==-1));}
+ bool IsMainSequenceOfFusionSequence() {return (mFusionSequenceInvolvementCode==0);}
+ bool IsSecondarySequenceOfFusionSequence() {return (mFusionSequenceInvolvementCode==1);}
+
+ int GetFusionSequenceIndexOfLinkedManager() { return mFusionSequenceIndexLinkedManager; }
+ int GetFusionSequenceFrameIndex() { return mFusionSequenceFrameIndex; }
+ bool GetFusionSequenceSpatialSyncFlag() { return mFusionSequenceSpatialSyncFlag; }
+ bool GetFusionSequenceTemporalSyncFlag() { return mFusionSequenceTemporalSyncFlag; }
+ unsigned int GetFusionSequenceNbFrames() { return mFusionSequenceNbFrames; }
+ const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceMainTransformMatrix() {return mFusionSequenceMainTransform;}
+ const std::vector< vtkSmartPointer<vtkMatrix4x4> >& GetFusionSequenceInitialTransformMatrices() {return mFusionSequenceListInitialTransformMatrices;}
+ const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceInitialTransformMatrixAtFrame(unsigned i) {
+ return mFusionSequenceListInitialTransformMatrices[i];
+ }
+ const std::vector<double>& GetFusionSequenceTemporalSignal() {return mFusionSequenceTemporalSignal;}
+
double GetColorWindow() const;
double GetColorLevel() const;
double GetOverlayColorWindow() const;
return mFusionLevel;
}
+
void SetCursorAndCornerAnnotationVisibility(int s);
void UpdateViews(int current, int slicer);
void UpdateLinked(int slicer);
void Reload();
void ReloadOverlay();
void ReloadFusion();
+ void ReloadFusionSequence();
void ReloadVF();
void Activated();
void UpdateVector(int display, double x, double y, double z, double value);
void UpdateOverlay(int display, double valueOver, double valueRef);
void UpdateFusion(int display, double valueFus);
+ void UpdateFusionSequence(int fusionSequenceFrameIndex, bool fusionSequenceSpatialSyncFlag, unsigned int fusionSequenceNbFrames);
void MousePositionUpdatedSignal(int slicer);
void KeyPressedSignal(std::string KeyPressed);
void UpdateOrientation(int slicer, int orientation);
void UpdateSlice(int slicer, int slice);
- void UpdateTSlice(int slicer, int slice);
+ void UpdateTSlice(int slicer, int slice, int code);
void UpdateSliceRange(int slice, int min, int max, int tmin, int tmax);
void WindowLevelChanged();
void UpdateLinkManager(std::string, int slicer, double x, double y, double z, int temps);
vvImageReader::Pointer mReader;
vvImageReader::Pointer mOverlayReader;
vvImageReader::Pointer mFusionReader;
+ vvImageReader::Pointer mFusionSequenceReader;
vvImageReader::Pointer mVectorReader;
vvImage::Pointer mImage;
vvImage::Pointer mVF;
double mFusionLevel;
bool mFusionShowLegend;
+ //Fusion of sequences related data
+ int mFusionSequenceInvolvementCode; //-1: not involved, 0: main sequence(CT), 1: secondary sequence (US)
+ int mFusionSequenceIndexLinkedManager; //index of the other sequence involved in the visualization
+ int mFusionSequenceFrameIndex; //temporal index of the current image in the sequence (<->TSlice)
+ unsigned int mFusionSequenceNbFrames; //number of frames in the temporal sequence
+ bool mFusionSequenceSpatialSyncFlag, mFusionSequenceTemporalSyncFlag; //flags indicating whether the spatial/temporal synchronization are actives
+ vtkSmartPointer<vtkMatrix4x4> mFusionSequenceMainTransform;
+ std::vector< vtkSmartPointer<vtkMatrix4x4> > mFusionSequenceListInitialTransformMatrices;
+ std::vector<double> mFusionSequenceTemporalSignal;
+
int mPreset;
SlicingPresetType mSlicingPreset;
vvImageReader::LoadedImageType mType;
#ifndef VVTOOLBASEBASE_H
#define VVTOOLBASEBASE_H
+#include <algorithm>
#include "vvMainWindowBase.h"
#include "vvToolCreatorBase.h"
class QXmlStreamWriter;