mScale = 1;
mVFLog = 0;
mVFWidth = 1;
+ mVFColor[0] = 0;
+ mVFColor[1] = 1;
+ mVFColor[2] = 0;
std::string text = "F1 = sagital; F2 = coronal; F3 = axial\n";
text += "F5 = horizontal flip; F6 = vertical flip\n\n";
//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+void vvSlicer::SetCornerAnnotationVisibility(bool s)
+{
+ ca->SetVisibility(s);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+bool vvSlicer::GetCornerAnnotationVisibility()
+{
+ return ca->GetVisibility();
+}
+//------------------------------------------------------------------------------
+
+
//------------------------------------------------------------------------------
vvSlicer::~vvSlicer()
{
{
if (image->GetVTKImages().size()) {
mImage = image;
- this->Superclass::SetInput(image->GetVTKImages()[0]);
+ this->Superclass::SetInput(image->GetTransformedVTKImages()[0]);
- // Prevent crash when reload -> change slice if outside extent
int extent[6];
this->GetInput()->GetWholeExtent(extent);
- if (SliceOrientation == 0) {
- if (Slice >= extent[1]) {
- Slice = (extent[1]-extent[0])/2.0;
- }
- }
- if (SliceOrientation == 1) {
- if (Slice >= extent[3]) {
- Slice = (extent[3]-extent[2])/2.0;
- }
- }
- if (SliceOrientation == 2) {
- if (Slice >= extent[5]) {
- Slice = (extent[5]-extent[4])/2.0;
- }
+
+ // Prevent crash when reload -> change slice if outside extent
+ if (Slice < extent[SliceOrientation*2] || Slice>=extent[SliceOrientation*2+1]) {
+ Slice = (extent[SliceOrientation*2+1]-extent[SliceOrientation*2])/2.0;
}
+ // Make sure that the required part image has been computed
+ extent[SliceOrientation*2] = Slice;
+ extent[SliceOrientation*2+1] = Slice;
+ image->GetTransformedVTKImages()[0]->SetUpdateExtent(extent);
+ image->GetTransformedVTKImages()[0]->Update();
+
this->UpdateDisplayExtent();
+
mCurrentTSlice = 0;
ca->SetText(0,mFileName.c_str());
}
if (!mOverlayMapper)
mOverlayMapper = vtkSmartPointer<vtkImageMapToWindowLevelColors>::New();
- mOverlayMapper->SetInput(overlay->GetVTKImages()[0]);
+ mOverlayMapper->SetInput(overlay->GetTransformedVTKImages()[0]);
if (!mOverlayActor) {
mOverlayActor = vtkSmartPointer<vvBlendImageActor>::New();
if (!mFusionMapper)
mFusionMapper = vtkSmartPointer<vtkImageMapToWindowLevelColors>::New();
- mFusionMapper->SetInput(fusion->GetVTKImages()[0]);
+ mFusionMapper->SetInput(fusion->GetTransformedVTKImages()[0]);
if (!mFusionActor) {
mFusionActor = vtkSmartPointer<vtkImageActor>::New();
mVOIFilter = vtkSmartPointer<vtkExtractVOI>::New();
mVOIFilter->SetSampleRate(mSubSampling,mSubSampling,mSubSampling);
}
- mVOIFilter->SetInput(vf->GetVTKImages()[0]);
+ mVOIFilter->SetInput(vf->GetTransformedVTKImages()[0]);
mAAFilter->SetInput(mVOIFilter->GetOutput());
///This tells VTK to use the scalar (pixel) data of the image to draw the little arrows
mAAFilter->Assign(vtkDataSetAttributes::SCALARS, vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA);
mGlyphFilter->SetVectorModeToUseVector();
mGlyphFilter->SetColorModeToColorByVector();
+ if (!mVFColorLUT)
+ mVFColorLUT = vtkSmartPointer<vtkLookupTable>::New();
+
+ double mVFColorHSV[3];
+ vtkMath::RGBToHSV(mVFColor, mVFColorHSV);
+ mVFColorLUT->SetHueRange(mVFColorHSV[0], mVFColorHSV[0]);
+ mVFColorLUT->SetSaturationRange(mVFColorHSV[1],mVFColorHSV[1]);
+ mVFColorLUT->SetValueRange(mVFColorHSV[2], mVFColorHSV[2]);
+
if (!mVFMapper)
mVFMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
- //mVFMapper->SetInputConnection(mGlyphFilter->GetOutputPort());
mVFMapper->SetInput(mGlyphFilter->GetOutput());
mVFMapper->ImmediateModeRenderingOn();
+ mVFMapper->SetLookupTable(mVFColorLUT);
if (!mVFActor)
mVFActor = vtkSmartPointer<vtkActor>::New();
if (mCurrentTSlice == t) return;
mCurrentTSlice = t;
- this->SetInput(mImage->GetVTKImages()[t]);
+ this->SetInput(mImage->GetTransformedVTKImages()[t]);
if (mVF && mVFActor->GetVisibility()) {
if (mVF->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
- mVOIFilter->SetInput(mVF->GetVTKImages()[mCurrentTSlice]);
+ mVOIFilter->SetInput(mVF->GetTransformedVTKImages()[mCurrentTSlice]);
}
if (mOverlay && mOverlayActor->GetVisibility()) {
- if (mOverlay->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
- mOverlayMapper->SetInput(mOverlay->GetVTKImages()[mCurrentTSlice]);
+ if (mOverlay->GetTransformedVTKImages().size() > (unsigned int)mCurrentTSlice)
+ mOverlayMapper->SetInput(mOverlay->GetTransformedVTKImages()[mCurrentTSlice]);
}
if (mFusion && mFusionActor->GetVisibility()) {
if (mFusion->GetVTKImages().size() > (unsigned int)mCurrentTSlice)
- mFusionMapper->SetInput(mFusion->GetVTKImages()[mCurrentTSlice]);
+ mFusionMapper->SetInput(mFusion->GetTransformedVTKImages()[mCurrentTSlice]);
}
if (mSurfaceCutActors.size() > 0)
for (std::vector<vvMeshActor*>::iterator i=mSurfaceCutActors.begin();
mClipBox->SetBounds(bounds);
UpdateLandmarks();
}
- // DD(mLandActor->GetPosition()[2]);
- // DD(Renderer->GetActiveCamera()->GetPosition()[2]);
mLandActor->SetPosition(0,0,-1.5);
/*
if (Renderer->GetActiveCamera()->GetPosition()[2] > this->Slice)
mClipBox->SetBounds(bounds);
UpdateLandmarks();
}
- // DD(mLandActor->GetPosition()[1]);
- //DD(Renderer->GetActiveCamera()->GetPosition()[1]);
if (Renderer->GetActiveCamera()->GetPosition()[1] > this->Slice)
mLandActor->SetPosition(0,1.5,0);
else
mClipBox->SetBounds(bounds);
UpdateLandmarks();
}
- // DD(mLandActor->GetPosition()[1]);
- // DD(Renderer->GetActiveCamera()->GetPosition()[1]);
if (Renderer->GetActiveCamera()->GetPosition()[0] > this->Slice)
mLandActor->SetPosition(1.5,0,0);
else
//----------------------------------------------------------------------------
void vvSlicer::ComputeVFDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int vfExtent[6])
{
- vtkImageData* image=this->GetInput();
- vfExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
- mVF->GetSpacing()[0];
- vfExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
- mVF->GetSpacing()[0];
- vfExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
- mVF->GetSpacing()[1];
- vfExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
- mVF->GetSpacing()[1];
- vfExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
- mVF->GetSpacing()[2];
- vfExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
- mVF->GetSpacing()[2];
+ double dVfExtent[6];
+ vtkImageData* image = this->GetInput();
+ dVfExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+ dVfExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+ dVfExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+ dVfExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+ dVfExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+ dVfExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+
+ vtkImageData* vf = mVF->GetTransformedVTKImages()[0];
+ vf->UpdateInformation();
+ for(unsigned int i=0; i<6; i++)
+ vfExtent[i] = itk::Math::Round((dVfExtent[i]- vf->GetOrigin()[i/2]) / vf->GetSpacing()[i/2]);
ClipDisplayedExtent(vfExtent,mVOIFilter->GetInput()->GetWholeExtent());
}
//----------------------------------------------------------------------------
void vvSlicer::ComputeOverlayDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int overExtent[6])
{
- vtkImageData* image=this->GetInput();
- overExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
- mOverlay->GetSpacing()[0];
- overExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
- mOverlay->GetSpacing()[0];
- overExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
- mOverlay->GetSpacing()[1];
- overExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
- mOverlay->GetSpacing()[1];
- overExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
- mOverlay->GetSpacing()[2];
- overExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
- mOverlay->GetSpacing()[2];
+ double dOverExtent[6];
+ vtkImageData* image = this->GetInput();
+ dOverExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+ dOverExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+ dOverExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+ dOverExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+ dOverExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+ dOverExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+
+ vtkImageData* overlay = mOverlay->GetTransformedVTKImages()[0];
+ overlay->UpdateInformation();
+ for(unsigned int i=0; i<6; i++)
+ overExtent[i] = itk::Math::Round((dOverExtent[i]- overlay->GetOrigin()[i/2]) / overlay->GetSpacing()[i/2]);
+
ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent());
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void vvSlicer::ComputeFusionDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int fusExtent[6])
{
- vtkImageData* image=this->GetInput();
- fusExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
- mFusion->GetSpacing()[0];
- fusExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
- mFusion->GetSpacing()[0];
- fusExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
- mFusion->GetSpacing()[1];
- fusExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
- mFusion->GetSpacing()[1];
- fusExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
- mFusion->GetSpacing()[2];
- fusExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
- mFusion->GetSpacing()[2];
+ double dFusExtent[6];
+ vtkImageData* image = this->GetInput();
+ dFusExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+ dFusExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+ dFusExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+ dFusExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+ dFusExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+ dFusExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+
+ vtkImageData* fusion = mFusion->GetTransformedVTKImages()[0];
+ fusion->UpdateInformation();
+ for(unsigned int i=0; i<6; i++)
+ fusExtent[i] = itk::Math::Round((dFusExtent[i]- fusion->GetOrigin()[i/2]) / fusion->GetSpacing()[i/2]);
+
ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent());
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void vvSlicer::ResetCamera()
{
- if (this->GetInput()) {
- double* input_bounds=this->GetInput()->GetBounds();
- double bmax=input_bounds[1]-input_bounds[0];
- if (bmax < input_bounds[3]-input_bounds[2]) bmax=input_bounds[3]-input_bounds[2];
- if (bmax < input_bounds[5]-input_bounds[4]) bmax=input_bounds[5]-input_bounds[4];
- this->GetRenderer()->ResetCamera();
- this->GetRenderer()->GetActiveCamera()->SetParallelScale(bmax/2);
- }
+ this->GetRenderer()->ResetCamera();
}
//----------------------------------------------------------------------------
}
//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, int X, double Y, double Z, int &ix, int &iy, int &iz, int component)
+{
+ ix = lrint(X);
+ iy = lrint(Y);
+ iz = lrint(Z);
+ if (ix < image->GetWholeExtent()[0] ||
+ ix > image->GetWholeExtent()[1] ||
+ iy < image->GetWholeExtent()[2] ||
+ iy > image->GetWholeExtent()[3] ||
+ iz < image->GetWholeExtent()[4] ||
+ iz > image->GetWholeExtent()[5] )
+ return sqrt(-1.);
+
+ image->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
+ image->Update();
+ return image->GetScalarComponentAsDouble(ix, iy, iz, component);
+}
+//----------------------------------------------------------------------------
+
//----------------------------------------------------------------------------
void vvSlicer::Render()
{
Y <= this->GetInput()->GetWholeExtent()[3] &&
Z >= this->GetInput()->GetWholeExtent()[4] &&
Z <= this->GetInput()->GetWholeExtent()[5]) {
+ 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 << (int)X;
- pixel2 << (int)Y;
- pixel3 << (int)Z;
+ pixel1 << ix;
+ pixel2 << iy;
+ pixel3 << iz;
temps << mCurrentTSlice;
- double value = this->GetInput()->GetScalarComponentAsDouble(lrint(X),
- lrint(Y),
- lrint(Z),0);
std::stringstream val;
val << value;
if (mOverlay && mOverlayActor->GetVisibility()) {
mOverlayMapper->SetWindow(this->GetColorWindow());
mOverlayMapper->SetLevel(this->GetColorLevel());
+ mOverlayMapper->GetOutput()->SetUpdateExtent(mOverlayActor->GetDisplayExtent());
+ mOverlayMapper->GetOutput()->Update();
mOverlayMapper->Update();
}
if (mLandMapper)
}
//----------------------------------------------------------------------------
-
-
-
-
-
+//----------------------------------------------------------------------------
+void vvSlicer::SetVFColor(double r, double g, double b)
+{
+ double mVFColorHSV[3];
+ mVFColor[0] = r;
+ mVFColor[1] = g;
+ mVFColor[2] = b;
+
+ vtkMath::RGBToHSV(mVFColor, mVFColorHSV);
+ mVFColorLUT->SetHueRange(mVFColorHSV[0], mVFColorHSV[0]);
+ mVFColorLUT->SetSaturationRange(mVFColorHSV[1],mVFColorHSV[1]);
+ mVFColorLUT->SetValueRange(mVFColorHSV[2], mVFColorHSV[2]);
+
+ this->Render();
+}