Authors belong to:
- University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://oncora1.lyon.fnclcc.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
- BSD See included LICENSE.txt file
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
- ======================================================================-====*/
+ ===========================================================================**/
#include "vvSlicer.h"
#include "vvImage.h"
#include <vtkImageAccumulate.h>
#include <vtkImageReslice.h>
+// template <class T, unsigned int dim>
+// void print_vector(const char* pmsg, T* pvec)
+// {
+// std::cout << pmsg << ": ";
+// for (unsigned int i = 0; i < dim; i++)
+// std::cout << pvec[i] << " ";
+// std::cout << std::endl;
+// }
+
+
vtkCxxRevisionMacro(vvSlicer, "DummyRevision");
vtkStandardNewMacro(vvSlicer);
}
//----------------------------------------------------------------------------
+
//----------------------------------------------------------------------------
void vvSlicer::UpdateDisplayExtent()
{
// Image actor
this->ImageActor->SetDisplayExtent(w_ext);
- // Position vector
- double position[3] = {0.,0.,0.};
- double positionInc = (Renderer->GetActiveCamera()->GetPosition()[this->SliceOrientation] > this->Slice)?10:-10;
- position[this->SliceOrientation] += positionInc;
-
// Overlay image actor
if (mOverlay && mOverlayActor->GetVisibility()) {
int overExtent[6];
this->ConvertImageToImageDisplayExtent(input, w_ext, mOverlayReslice->GetOutput(), overExtent);
ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent());
mOverlayActor->SetDisplayExtent( overExtent );
- mOverlayActor->SetPosition(position);
}
- position[this->SliceOrientation] += positionInc;
// Fusion image actor
if (mFusion && mFusionActor->GetVisibility()) {
this->ConvertImageToImageDisplayExtent(input, w_ext, mFusionReslice->GetOutput(), fusExtent);
ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent());
mFusionActor->SetDisplayExtent(fusExtent);
- mFusionActor->SetPosition(position);
}
- position[this->SliceOrientation] += positionInc;
// Vector field actor
+ double* camera = Renderer->GetActiveCamera()->GetPosition();
+ double* image_bounds = ImageActor->GetBounds();
+ double position[3] = {0, 0, 0};
+ position[this->SliceOrientation] = image_bounds[this->SliceOrientation*2];
+
+ //print_vector<double, 6>("camera", camera);
+ //print_vector<double, 6>("image_bounds", image_bounds);
+ //print_vector<double, 3>("position", position);
+
+ // find where to place the VF actor. to deal with
+ // z-buffer issues, the VF is placed right in front of the image,
+ // subject to a small offset. the position actually depends on the
+ // the location of the camera relative to the image.
+ double offset = 1;
+ if (camera[this->SliceOrientation] < image_bounds[this->SliceOrientation*2])
+ offset = -1;
+
if (mVF && mVFActor->GetVisibility()) {
int vfExtent[6];
mVF->GetVTKImages()[0]->UpdateInformation();
orientation[this->SliceOrientation] = 0;
mGlyphFilter->SetOrientation(orientation[0], orientation[1], orientation[2]);
mVFMapper->Update();
+
+ position[this->SliceOrientation] += offset;
mVFActor->SetPosition(position);
}
- position[this->SliceOrientation] += positionInc;
-
+
// Landmarks actor
if (mLandActor) {
if (mClipBox) {
double bounds [6];
for(unsigned int i=0; i<6; i++)
bounds[i] = ImageActor->GetBounds()[i];
- bounds[ this->SliceOrientation*2 ] = ImageActor->GetBounds()[ this->SliceOrientation*2 ]-fabs(0.5/this->GetInput()->GetSpacing()[this->SliceOrientation]);
- bounds[ this->SliceOrientation*2+1 ] = ImageActor->GetBounds()[ this->SliceOrientation*2+1 ]+fabs(0.5/this->GetInput()->GetSpacing()[this->SliceOrientation]);
+ bounds[ this->SliceOrientation*2 ] = ImageActor->GetBounds()[ this->SliceOrientation*2 ]-fabs(this->GetInput()->GetSpacing()[this->SliceOrientation]);
+ bounds[ this->SliceOrientation*2+1 ] = ImageActor->GetBounds()[ this->SliceOrientation*2+1 ]+fabs(this->GetInput()->GetSpacing()[this->SliceOrientation]);
mClipBox->SetBounds(bounds);
UpdateLandmarks();
}
+
+ position[this->SliceOrientation] = offset;
mLandActor->SetPosition(position);
}
}
}
}
+
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
-double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, int X, double Y, double Z, int &ix, int &iy, int &iz, int component)
+double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int &ix, int &iy, int &iz, int component)
{
ix = lrint(X);
iy = lrint(Y);
iy > image->GetWholeExtent()[3] ||
iz < image->GetWholeExtent()[4] ||
iz > image->GetWholeExtent()[5] )
- return sqrt(-1.);
+ return std::numeric_limits<double>::quiet_NaN();
image->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
image->Update();
} else legend->SetVisibility(0);
if (ca->GetVisibility()) {
- std::string worldPos = "";
- std::stringstream world1;
- std::stringstream world2;
- std::stringstream world3;
- world1 << (int)mCurrent[0];
- world2 << (int)mCurrent[1];
- world3 << (int)mCurrent[2];
+ std::stringstream worldPos;
double X = (mCurrent[0] - this->GetInput()->GetOrigin()[0])/this->GetInput()->GetSpacing()[0];
double Y = (mCurrent[1] - this->GetInput()->GetOrigin()[1])/this->GetInput()->GetSpacing()[1];
double Z = (mCurrent[2] - this->GetInput()->GetOrigin()[2])/this->GetInput()->GetSpacing()[2];
int ix, iy, iz;
double value = this->GetScalarComponentAsDouble(this->GetInput(), X, Y, Z, ix, iy, iz);
- std::stringstream pixel1;
- std::stringstream pixel2;
- std::stringstream pixel3;
- std::stringstream temps;
- pixel1 << ix;
- pixel2 << iy;
- pixel3 << iz;
- temps << mCurrentTSlice;
-
- std::stringstream val;
- val << value;
- worldPos += "data value : " + val.str();
- worldPos += "\n mm : " + world1.str() + " " + world2.str() + " " +
- world3.str() + " " + temps.str();
- worldPos += "\n pixel : " + pixel1.str() + " " + pixel2.str() + " " +
- pixel3.str() + " " + temps.str();
+ worldPos << "data value : " << value << std::endl;
+ worldPos << "mm : " << lrint(mCurrent[0]) << ' '
+ << lrint(mCurrent[1]) << ' '
+ << lrint(mCurrent[2]) << ' '
+ << mCurrentTSlice
+ << std::endl;
+ worldPos << "pixel : " << ix << ' '
+ << iy << ' '
+ << iz << ' '
+ << mCurrentTSlice
+ << std::endl;
}
- ca->SetText(1,worldPos.c_str());
+ ca->SetText(1,worldPos.str().c_str());
}
if (pdmA->GetVisibility()) {