/*=========================================================================
-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://oncora1.lyon.fnclcc.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://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.
+ 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 "vvSlicerManager.h"
#include "vvSlicer.h"
#include <vtkLODActor.h>
#include <vtkPointData.h>
#include <vtksys/SystemTools.hxx>
+#include <vtkCamera.h>
//----------------------------------------------------------------------------
vvSlicerManager::vvSlicerManager(int numberOfSlicers)
//------------------------------------------------------------------------------
-void vvSlicerManager::SetFilename(std::string f)
+void vvSlicerManager::SetFilename(std::string filename, int number)
{
- mFileName = f;
+ mFileName = filename;
+ mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
+ mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+ // DD(mBaseFileName);
+ mBaseFileNameNumber = number;
+
for(unsigned int i=0; i<mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(f);
+ mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
+ }
+
+ if (number != 0) {
+ mFileName.append("_"+clitk::toString(number));
}
}
//------------------------------------------------------------------------------
//----------------------------------------------------------------------------
-bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n)
+bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n, unsigned int slice)
{
- mFileName = filename;
mType = type;
if (mReader == NULL)
mReader = new vvImageReader;
std::vector<std::string> filenames;
filenames.push_back(filename);
mReader->SetInputFilenames(filenames);
+ mReader->SetSlice(slice); // Only used for SLICED type
mReader->Update(type);
- mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
- mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+ SetFilename(filename, n);
+ // mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
+ //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
// DD(mBaseFileName);
- mBaseFileNameNumber = n;
+ //mBaseFileNameNumber = n;
if (mReader->GetLastError().size() == 0) {
mImage=mReader->GetOutput();
mLastError = mReader->GetLastError();
return false;
}
- if (n!=0) {
- // DD(mFileName);
- mFileName.append("_"+clitk::toString(n));
- }
+ // if (n!=0) {
+ // // DD(mFileName);
+ // mFileName.append("_"+clitk::toString(n));
+ // }
return true;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetExtractedImage(std::string filename,vvImage::Pointer image, int slice)
-{
- mFileName = filename;
- mImage = vvImage::New();
- if (image->GetNumberOfDimensions() == 4) {
- mImage->AddImage(image->GetVTKImages()[slice]);
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
- mSlicers[i]->SetImage(mImage);
- }
- } else {
- vtkImageClip* clipper = vtkImageClip::New();
- int extent[6];
- image->GetVTKImages()[0]->GetWholeExtent(extent);
- clipper->SetInput(image->GetVTKImages()[0]);
- clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],slice,slice);
- clipper->Update();
- mImage->AddImage(clipper->GetOutput());
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {
- mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
- mSlicers[i]->SetImage(mImage);
- }
- clipper->Delete();
- }
-}
-//----------------------------------------------------------------------------
-
-
//----------------------------------------------------------------------------
vvSlicer* vvSlicerManager::GetSlicer(int i)
{
mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
// mSlicers[i]->GetRenderWindow()->GetInteractor()->
// GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
mSlicers[i]->GetRenderWindow()->GetInteractor()->
- GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
+ GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
smc->Delete();
}
//----------------------------------------------------------------------------
if (t > mSlicers[0]->GetTMax())
t = 0;
// DD("SetNextTSlice");
-// DD(originating_slicer);
-// DD(t);
+ // DD(originating_slicer);
+ // DD(t);
emit UpdateTSlice(originating_slicer,t);
}
//----------------------------------------------------------------------------
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::UpdateViews(int current,int slicer)
{
// DD("UpdateViews");
-// DD(current);
-// DD(slicer);
+ // DD(current);
+ // DD(slicer);
double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
- /mSlicers[slicer]->GetInput()->GetSpacing()[0];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[0];
double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
- /mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[1];
double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
- /mSlicers[slicer]->GetInput()->GetSpacing()[2];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[2];
if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
void vvSlicerManager::UpdateLinked(int slicer)
{
double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
- /mSlicers[slicer]->GetInput()->GetSpacing()[0];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[0];
double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
- /mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[1];
double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
- /mSlicers[slicer]->GetInput()->GetSpacing()[2];
+ /mSlicers[slicer]->GetInput()->GetSpacing()[2];
if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
}
//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *slicer, bool bPropagate)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ vtkCamera *camera = mSlicers[i] ->GetRenderer()->GetActiveCamera();
+ vtkCamera *refCam = slicer->GetRenderer()->GetActiveCamera();
+ camera->SetParallelScale(refCam->GetParallelScale());
+
+ double position[3], focal[3];
+ camera->GetPosition(position);
+ camera->GetFocalPoint(focal);
+
+ double refPosition[3], refFocal[3];
+ refCam->GetPosition(refPosition);
+ refCam->GetFocalPoint(refFocal);
+
+ if(slicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) {
+ for(int i=0; i<3; i++) {
+ position[i] = refPosition[i];
+ focal[i] = refFocal[i];
+ }
+ }
+
+ if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+ position[0] = refPosition[0];
+ focal[0] = refFocal[0];
+ }
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+ position[1] = refPosition[1];
+ focal[1] = refFocal[1];
+ }
+ }
+
+ if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+ position[2] = refPosition[2];
+ focal[2] = refFocal[2];
+ }
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+ position[0] = refPosition[0];
+ focal[0] = refFocal[0];
+ }
+ }
+
+ if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
+ position[1] = refPosition[1];
+ focal[1] = refFocal[1];
+ }
+ if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
+ position[2] = refPosition[2];
+ focal[2] = refFocal[2];
+ }
+ }
+
+ camera->SetFocalPoint(focal);
+ camera->SetPosition(position);
+
+ if(bPropagate)
+ for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
+ emit UpdateLinkedNavigation(*i, this);
+ }
+ Render();
+}
+//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
double vvSlicerManager::GetColorWindow()
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];
+ mSlicers[slicer]->GetInput()->GetSpacing()[0];
double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
- mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ mSlicers[slicer]->GetInput()->GetSpacing()[1];
double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
- mSlicers[slicer]->GetInput()->GetSpacing()[2];
+ mSlicers[slicer]->GetInput()->GetSpacing()[2];
double value = -VTK_DOUBLE_MAX;
int displayVec = 0;
double xVec=0, yVec=0, zVec=0, valueVec=0;
Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble(
- (int)floor(X),
- (int)floor(Y),
- (int)floor(Z),0);
+ (int)floor(X),
+ (int)floor(Y),
+ (int)floor(Z),0);
if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) {
displayVec = 1;
unsigned int currentTime = mSlicers[slicer]->GetTSlice();
if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) {
displayOver = 1;
double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0])
- /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
+ /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1])
- /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
+ /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2])
- /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
+ /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] &&
Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] &&
Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] &&
Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] &&
Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5]) {
valueOver = static_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput())->
- GetScalarComponentAsDouble(
- (int)floor(Xover),
- (int)floor(Yover),
- (int)floor(Zover),0);
+ GetScalarComponentAsDouble(
+ (int)floor(Xover),
+ (int)floor(Yover),
+ (int)floor(Zover),0);
}
}
if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) {
displayFus = 1;
double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0])
- /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
+ /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1])
- /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
+ /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2])
- /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
+ /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] &&
Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] &&
Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] &&
Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] &&
Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5]) {
valueFus = static_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput())->
- GetScalarComponentAsDouble(
- (int)floor(Xfus),
- (int)floor(Yfus),
- (int)floor(Zfus),0);
+ GetScalarComponentAsDouble(
+ (int)floor(Xfus),
+ (int)floor(Yfus),
+ (int)floor(Zfus),0);
}
}
emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
void vvSlicerManager::UpdateSlice(int slicer)
{
// DD("vvSlicerManager::UpdateSlice emit UpdateSlice");
-// DD(slicer);
-// DD(mSlicers[slicer]->GetSlice());
+ // DD(slicer);
+ // DD(mSlicers[slicer]->GetSlice());
if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
//DD("============= NOTHING");
return;
void vvSlicerManager::UpdateTSlice(int slicer)
{
// DD("vvSlicerManager::UpdateTSlice emit UpdateTSlice");
-// DD(slicer);
-// DD(mSlicers[slicer]->GetTSlice());
-// DD(mSlicers[slicer]->GetSlice());
+ // DD(slicer);
+ // DD(mSlicers[slicer]->GetTSlice());
+ // DD(mSlicers[slicer]->GetSlice());
if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
if (mPreviousTSlice[slicer] == mSlicers[slicer]->GetTSlice()) {
// DD("************** NOTHING ***********");
double window = mSlicers[0]->GetColorWindow();
double level = mSlicers[0]->GetColorLevel();
- std::string component_type=mImage->GetScalarTypeAsString();
+ std::string component_type=mImage->GetScalarTypeAsITKString();
switch (preset) {
case 0:
- if (component_type == "unsigned_char") {
- window = 255;
- level = 127;
- } else if (component_type == "short") {
- window = 2000;
- level = 0;
- } else {
- double range[2];
- mImage->GetScalarRange(range);
- window = range[1] - range[0];
- level = (range[1] + range[0])* 0.5;
- }
+ double range[2];
+ mImage->GetScalarRange(range);
+ window = range[1] - range[0];
+ level = (range[1] + range[0])* 0.5;
break;
case 1:
window = 2000;
invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
invLUT->Build();
dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
- ->SetWindowLevelMode(true);
+ ->SetWindowLevelMode(true);
mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
invLUT->Delete();
if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility()) {
mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
+ mSlicers[i]->GetFusionMapper()->SetWindow(mFusionWindow);
+ mSlicers[i]->GetFusionMapper()->SetLevel(mFusionLevel);
}
}
if (fusLUT)
z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] &&
z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) {
double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble(
- (int)x_index,
- (int)y_index,
- (int)z_index,0);
+ (int)x_index,
+ (int)y_index,
+ (int)z_index,0);
this->GetLandmarks()->AddLandmark(x,y,z,t,value);
emit LandmarkAdded();
}