X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicer.cxx;h=55d3797fe0ce44033f87329e4708d0b52faa1502;hb=ff1d5b8af965e75ecdbc1b0cbff0dad6f3b3c511;hp=bbecaa40acd3e8e515ff856c3a891dc4394e566d;hpb=1e034c70105f0926939acaaa27ddb46e904ae8bf;p=clitk.git diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx index bbecaa4..55d3797 100644 --- a/vv/vvSlicer.cxx +++ b/vv/vvSlicer.cxx @@ -73,6 +73,7 @@ vtkStandardNewMacro(vvSlicer); //------------------------------------------------------------------------------ vvSlicer::vvSlicer() { + this->UnInstallPipeline(); mImage = NULL; mCurrentTSlice = 0; mUseReducedExtent = false; @@ -90,6 +91,9 @@ vvSlicer::vvSlicer() 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"; @@ -107,22 +111,22 @@ vvSlicer::vvSlicer() text += "middle button : grab image\n"; text += "right button : change windowing\n"; - crossCursor = vtkCursor2D::New(); + crossCursor = vtkSmartPointer::New(); crossCursor->AllOff(); crossCursor->AxesOn(); crossCursor->SetTranslationMode(1); crossCursor->SetRadius(2); - pdm = vtkPolyDataMapper2D::New(); + pdm = vtkSmartPointer::New(); pdm->SetInput(crossCursor->GetOutput()); - pdmA = vtkActor2D::New(); + pdmA = vtkSmartPointer::New(); pdmA->SetMapper(pdm); pdmA->GetProperty()->SetColor(255,10,212); pdmA->SetVisibility(0); pdmA->SetPickable(0); - ca = vtkCornerAnnotation::New(); + ca = vtkSmartPointer::New(); ca->GetTextProperty()->SetColor(255,10,212); ca->SetVisibility(1); mFileName = ""; @@ -142,8 +146,8 @@ vvSlicer::vvSlicer() this->WindowLevel->Delete(); this->WindowLevel = vvImageMapToWLColors::New(); - this->InstallPipeline(); + this->InstallPipeline(); } //------------------------------------------------------------------------------ @@ -263,6 +267,22 @@ bool vvSlicer::GetCursorVisibility() //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvSlicer::SetCornerAnnotationVisibility(bool s) +{ + ca->SetVisibility(s); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +bool vvSlicer::GetCornerAnnotationVisibility() +{ + return ca->GetVisibility(); +} +//------------------------------------------------------------------------------ + + //------------------------------------------------------------------------------ vvSlicer::~vvSlicer() { @@ -289,28 +309,24 @@ void vvSlicer::SetImage(vvImage::Pointer image) { 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()); } @@ -325,11 +341,11 @@ void vvSlicer::SetOverlay(vvImage::Pointer overlay) mOverlay = overlay; if (!mOverlayMapper) - mOverlayMapper = vtkImageMapToWindowLevelColors::New(); - mOverlayMapper->SetInput(overlay->GetVTKImages()[0]); + mOverlayMapper = vtkSmartPointer::New(); + mOverlayMapper->SetInput(overlay->GetTransformedVTKImages()[0]); if (!mOverlayActor) { - mOverlayActor = vvBlendImageActor::New(); + mOverlayActor = vtkSmartPointer::New(); mOverlayActor->SetInput(mOverlayMapper->GetOutput()); mOverlayActor->SetPickable(0); mOverlayActor->SetVisibility(false); @@ -359,11 +375,11 @@ void vvSlicer::SetFusion(vvImage::Pointer fusion) mFusion = fusion; if (!mFusionMapper) - mFusionMapper = vtkImageMapToWindowLevelColors::New(); - mFusionMapper->SetInput(fusion->GetVTKImages()[0]); + mFusionMapper = vtkSmartPointer::New(); + mFusionMapper->SetInput(fusion->GetTransformedVTKImages()[0]); if (!mFusionActor) { - mFusionActor = vtkImageActor::New(); + mFusionActor = vtkSmartPointer::New(); mFusionActor->SetInput(mFusionMapper->GetOutput()); mFusionActor->SetPickable(0); mFusionActor->SetVisibility(false); @@ -405,24 +421,24 @@ void vvSlicer::SetVF(vvImage::Pointer vf) mVF = vf; if (!mAAFilter) { - mAAFilter=vtkAssignAttribute::New(); - mVOIFilter = vtkExtractVOI::New(); + mAAFilter= vtkSmartPointer::New(); + mVOIFilter = vtkSmartPointer::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); if (!mArrow) - mArrow = vvGlyphSource::New(); + mArrow = vtkSmartPointer::New(); mArrow->SetGlyphTypeToSpecificArrow(); mArrow->SetScale(mScale); mArrow->FilledOff(); // Glyph the gradient vector (with arrows) if (!mGlyphFilter) - mGlyphFilter = vvGlyph2D::New(); + mGlyphFilter = vtkSmartPointer::New(); mGlyphFilter->SetInput(mAAFilter->GetOutput()); mGlyphFilter->SetSource(mArrow->GetOutput()); mGlyphFilter->ScalingOn(); @@ -431,14 +447,23 @@ void vvSlicer::SetVF(vvImage::Pointer vf) mGlyphFilter->SetVectorModeToUseVector(); mGlyphFilter->SetColorModeToColorByVector(); + if (!mVFColorLUT) + mVFColorLUT = vtkSmartPointer::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 = vtkPolyDataMapper::New(); - //mVFMapper->SetInputConnection(mGlyphFilter->GetOutputPort()); + mVFMapper = vtkSmartPointer::New(); mVFMapper->SetInput(mGlyphFilter->GetOutput()); mVFMapper->ImmediateModeRenderingOn(); + mVFMapper->SetLookupTable(mVFColorLUT); if (!mVFActor) - mVFActor = vtkActor::New(); + mVFActor = vtkSmartPointer::New(); mVFActor->SetMapper(mVFMapper); mVFActor->SetPickable(0); mVFActor->GetProperty()->SetLineWidth(mVFWidth); @@ -459,14 +484,14 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks) if (landmarks) { if (!mCross) - mCross = vtkCursor3D::New(); + mCross = vtkSmartPointer::New(); mCross->SetFocalPoint(0.0,0.0,0.0); mCross->SetModelBounds(-10,10,-10,10,-10,10); mCross->AllOff(); mCross->AxesOn(); if (!mLandGlyph) - mLandGlyph = vtkGlyph3D::New(); + mLandGlyph = vtkSmartPointer::New(); mLandGlyph->SetSource(mCross->GetOutput()); mLandGlyph->SetInput(landmarks->GetOutput()); //mLandGlyph->SetIndexModeToScalar(); @@ -476,20 +501,20 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks) mLandGlyph->SetColorModeToColorByScalar(); if (!mClipBox) - mClipBox = vtkBox::New(); + mClipBox = vtkSmartPointer::New(); if (!mLandClipper) - mLandClipper = vtkClipPolyData::New(); + mLandClipper = vtkSmartPointer::New(); mLandClipper->InsideOutOn(); mLandClipper->SetInput(mLandGlyph->GetOutput()); mLandClipper->SetClipFunction(mClipBox); if (!mLandMapper) - mLandMapper = vtkPolyDataMapper::New(); + mLandMapper = vtkSmartPointer::New(); mLandMapper->SetInputConnection(mLandClipper->GetOutputPort()); //mLandMapper->ScalarVisibilityOff(); if (!mLandActor) - mLandActor = vtkActor::New(); + mLandActor = vtkSmartPointer::New(); mLandActor->SetMapper(mLandMapper); mLandActor->GetProperty()->SetColor(255,10,212); mLandActor->SetPickable(0); @@ -595,18 +620,18 @@ void vvSlicer::SetTSlice(int t) 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::iterator i=mSurfaceCutActors.begin(); @@ -647,6 +672,11 @@ void vvSlicer::SetSliceOrientation(int orientation) if (range) this->Slice = static_cast((range[0] + range[1]) * 0.5); + // Go to current cursor position + // double* cursorPos = GetCursorPosition(); + // DDV(cursorPos, 3); + // SetCurrentPosition(cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]); + this->UpdateOrientation(); this->UpdateDisplayExtent(); @@ -698,7 +728,7 @@ void vvSlicer::UpdateDisplayExtent() switch (this->SliceOrientation) { case vtkImageViewer2::SLICE_ORIENTATION_XY: this->ImageActor->SetDisplayExtent( - w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice); + w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice); if (mVF && mVFActor->GetVisibility()) { int vfExtent[6]; ComputeVFDisplayedExtent(w_ext[0], w_ext[1], w_ext[2], w_ext[3], this->Slice, this->Slice,vfExtent); @@ -736,21 +766,24 @@ void vvSlicer::UpdateDisplayExtent() bounds[1] = ImageActor->GetBounds()[1]; bounds[2] = ImageActor->GetBounds()[2]; bounds[3] = ImageActor->GetBounds()[3]; - bounds[4] = ImageActor->GetBounds()[4]-(0.9/this->GetInput()->GetSpacing()[2]); - bounds[5] = ImageActor->GetBounds()[5]+(0.9/this->GetInput()->GetSpacing()[2]); + bounds[4] = ImageActor->GetBounds()[4]-fabs(0.5/this->GetInput()->GetSpacing()[2]); + bounds[5] = ImageActor->GetBounds()[5]+fabs(0.5/this->GetInput()->GetSpacing()[2]); mClipBox->SetBounds(bounds); UpdateLandmarks(); } + mLandActor->SetPosition(0,0,-1.5); + /* if (Renderer->GetActiveCamera()->GetPosition()[2] > this->Slice) mLandActor->SetPosition(0,0,1.5); else mLandActor->SetPosition(0,0,-1.5); + */ } break; case vtkImageViewer2::SLICE_ORIENTATION_XZ: this->ImageActor->SetDisplayExtent( - w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5]); + w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5]); if (mVF && mVFActor->GetVisibility()) { int vfExtent[6]; ComputeVFDisplayedExtent(w_ext[0], w_ext[1], this->Slice, this->Slice, w_ext[4], w_ext[5],vfExtent); @@ -786,8 +819,8 @@ void vvSlicer::UpdateDisplayExtent() double bounds [6]; bounds[0] = ImageActor->GetBounds()[0]; bounds[1] = ImageActor->GetBounds()[1]; - bounds[2] = ImageActor->GetBounds()[2]-(0.5/this->GetInput()->GetSpacing()[1]); - bounds[3] = ImageActor->GetBounds()[3]+(0.5/this->GetInput()->GetSpacing()[1]); + bounds[2] = ImageActor->GetBounds()[2]-fabs(0.5/this->GetInput()->GetSpacing()[1]); + bounds[3] = ImageActor->GetBounds()[3]+fabs(0.5/this->GetInput()->GetSpacing()[1]); bounds[4] = ImageActor->GetBounds()[4]; bounds[5] = ImageActor->GetBounds()[5]; mClipBox->SetBounds(bounds); @@ -802,7 +835,7 @@ void vvSlicer::UpdateDisplayExtent() case vtkImageViewer2::SLICE_ORIENTATION_YZ: this->ImageActor->SetDisplayExtent( - this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5]); + this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5]); if (mVF && mVFActor->GetVisibility()) { int vfExtent[6]; ComputeVFDisplayedExtent(this->Slice, this->Slice, w_ext[2], w_ext[3], w_ext[4], w_ext[5],vfExtent); @@ -836,8 +869,8 @@ void vvSlicer::UpdateDisplayExtent() if (mLandActor) { if (mClipBox) { double bounds [6]; - bounds[0] = ImageActor->GetBounds()[0]-(0.5/this->GetInput()->GetSpacing()[0]); - bounds[1] = ImageActor->GetBounds()[1]+(0.5/this->GetInput()->GetSpacing()[0]); + bounds[0] = ImageActor->GetBounds()[0]-fabs(0.5/this->GetInput()->GetSpacing()[0]); + bounds[1] = ImageActor->GetBounds()[1]+fabs(0.5/this->GetInput()->GetSpacing()[0]); bounds[2] = ImageActor->GetBounds()[2]; bounds[3] = ImageActor->GetBounds()[3]; bounds[4] = ImageActor->GetBounds()[4]; @@ -871,7 +904,7 @@ void vvSlicer::UpdateDisplayExtent() double avg_spacing = ((double)spacing[0] + (double)spacing[1] + (double)spacing[2]) / 3.0; cam->SetClippingRange( - range - avg_spacing * 3.0, range + avg_spacing * 3.0); + range - avg_spacing * 3.0, range + avg_spacing * 3.0); } } } @@ -884,17 +917,17 @@ void vvSlicer::ComputeVFDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z { vtkImageData* image=this->GetInput(); vfExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) / - mVF->GetSpacing()[0]; + mVF->GetSpacing()[0]; vfExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) / - mVF->GetSpacing()[0]; + mVF->GetSpacing()[0]; vfExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) / - mVF->GetSpacing()[1]; + mVF->GetSpacing()[1]; vfExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) / - mVF->GetSpacing()[1]; + mVF->GetSpacing()[1]; vfExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) / - mVF->GetSpacing()[2]; + mVF->GetSpacing()[2]; vfExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) / - mVF->GetSpacing()[2]; + mVF->GetSpacing()[2]; ClipDisplayedExtent(vfExtent,mVOIFilter->GetInput()->GetWholeExtent()); } @@ -906,17 +939,17 @@ void vvSlicer::ComputeOverlayDisplayedExtent(int x1,int x2,int y1,int y2,int z1, { vtkImageData* image=this->GetInput(); overExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) / - mOverlay->GetSpacing()[0]; + mOverlay->GetSpacing()[0]; overExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) / - mOverlay->GetSpacing()[0]; + mOverlay->GetSpacing()[0]; overExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) / - mOverlay->GetSpacing()[1]; + mOverlay->GetSpacing()[1]; overExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) / - mOverlay->GetSpacing()[1]; + mOverlay->GetSpacing()[1]; overExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) / - mOverlay->GetSpacing()[2]; + mOverlay->GetSpacing()[2]; overExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) / - mOverlay->GetSpacing()[2]; + mOverlay->GetSpacing()[2]; ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent()); } //---------------------------------------------------------------------------- @@ -927,17 +960,17 @@ void vvSlicer::ComputeFusionDisplayedExtent(int x1,int x2,int y1,int y2,int z1,i { vtkImageData* image=this->GetInput(); fusExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) / - mFusion->GetSpacing()[0]; + mFusion->GetSpacing()[0]; fusExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) / - mFusion->GetSpacing()[0]; + mFusion->GetSpacing()[0]; fusExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) / - mFusion->GetSpacing()[1]; + mFusion->GetSpacing()[1]; fusExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) / - mFusion->GetSpacing()[1]; + mFusion->GetSpacing()[1]; fusExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) / - mFusion->GetSpacing()[2]; + mFusion->GetSpacing()[2]; fusExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) / - mFusion->GetSpacing()[2]; + mFusion->GetSpacing()[2]; ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent()); } //---------------------------------------------------------------------------- @@ -1051,14 +1084,7 @@ void vvSlicer::SetRenderWindow(int orientation, vtkRenderWindow * rw) //---------------------------------------------------------------------------- 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(); } //---------------------------------------------------------------------------- @@ -1179,7 +1205,7 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]); } - vtkSmartPointer voiFilter = vtkExtractVOI::New(); + vtkSmartPointer voiFilter = vtkSmartPointer::New(); voiFilter->SetInput(this->GetInput()); voiFilter->SetVOI(iLocalExtents); voiFilter->Update(); @@ -1189,7 +1215,7 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) return; } - vtkSmartPointer accFilter = vtkImageAccumulate::New(); + vtkSmartPointer accFilter = vtkSmartPointer::New(); accFilter->SetInput(voiFilter->GetOutput()); accFilter->Update(); @@ -1198,11 +1224,29 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +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() { - // DD("vvSlicer::Render"); - // DD(SliceOrientation); if (this->GetWindowLevel()->GetLookupTable() && !this->mOverlay && !this->mFusion) { legend->SetLookupTable(this->GetWindowLevel()->GetLookupTable()); legend->SetVisibility(1); @@ -1252,31 +1296,33 @@ 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; worldPos += "data value : " + val.str(); worldPos += "\n mm : " + world1.str() + " " + world2.str() + " " + - world3.str() + " " + temps.str(); + world3.str() + " " + temps.str(); worldPos += "\n pixel : " + pixel1.str() + " " + pixel2.str() + " " + - pixel3.str() + " " + temps.str(); + pixel3.str() + " " + temps.str(); } ca->SetText(1,worldPos.c_str()); } if (mOverlay && mOverlayActor->GetVisibility()) { mOverlayMapper->SetWindow(this->GetColorWindow()); mOverlayMapper->SetLevel(this->GetColorLevel()); + mOverlayMapper->GetOutput()->SetUpdateExtent(mOverlayActor->GetDisplayExtent()); + mOverlayMapper->GetOutput()->Update(); mOverlayMapper->Update(); } if (mLandMapper) @@ -1340,8 +1386,6 @@ void vvSlicer::SetSlice(int slice) this->Modified(); this->UpdateDisplayExtent(); - // DD("SetSlice de slicer = Render"); - // Seems to work without this line // this->Render(); } @@ -1383,9 +1427,19 @@ void vvSlicer::PrintSelf(ostream& os, vtkIndent indent) } //---------------------------------------------------------------------------- - - - - - +//---------------------------------------------------------------------------- +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(); +}