X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicer.cxx;h=ce6d335abdd69cac344c49c0305f596be7fb9ebf;hb=99b8973aa53da85bd951268f29495311a1e3471f;hp=de7055d1c0ec6722e7f48b89393c5f04fb86b040;hpb=ae5640b3937e3d0d7b54c7af1f311ebbe2dd7a9a;p=clitk.git diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx index de7055d..ce6d335 100644 --- a/vv/vvSlicer.cxx +++ b/vv/vvSlicer.cxx @@ -57,6 +57,7 @@ #include #include #include +#include #include #include @@ -75,8 +76,8 @@ #include #include #include -#include #if VTK_MAJOR_VERSION >= 6 || (VTK_MAJOR_VERSION >= 5 && VTK_MINOR_VERSION >= 10) +# include # include # include #endif @@ -149,10 +150,10 @@ vvSlicer::vvSlicer() legend = vtkSmartPointer::New(); //legend->SetTitle("test!"); - legend->SetPosition(0.82,0.18); - legend->SetWidth(0.1); + legend->SetPosition(0.82,0.08); + //legend->SetWidth(0.1); legend->SetVisibility(0); - legend->SetLabelFormat("%.1f"); + legend->SetLabelFormat("%.1e"); this->GetRenderer()->AddActor(legend); showFusionLegend = false; @@ -169,6 +170,7 @@ vvSlicer::vvSlicer() mConcatenatedTransform = vtkSmartPointer::New(); mConcatenatedFusionTransform = vtkSmartPointer::New(); mConcatenatedOverlayTransform = vtkSmartPointer::New(); + mConcatenatedVFTransform = vtkSmartPointer::New(); mFirstSetSliceOrientation = true; } //------------------------------------------------------------------------------ @@ -322,6 +324,13 @@ double* vvSlicer::GetCurrentPosition() } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvSlicer::SetInterpolationImageReslice(int interpolation) +{ + mImageReslice->SetInterpolationMode(interpolation); +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvSlicer::SetCurrentPosition(double x, double y, double z, int t) { @@ -351,6 +360,7 @@ void vvSlicer::SetImage(vvImage::Pointer image) mConcatenatedTransform->Concatenate(mImage->GetTransform()[0]); mConcatenatedTransform->Concatenate(mSlicingTransform); mImageReslice->SetResliceTransform(mConcatenatedTransform); + //mImageReslice->SetResliceAxes(mConcatenatedTransform->GetMatrix()); #if VTK_MAJOR_VERSION <= 5 mImageReslice->SetInput(0, mImage->GetFirstVTKImageData()); #else @@ -417,6 +427,7 @@ void vvSlicer::SetOverlay(vvImage::Pointer overlay) mOverlayReslice->SetResliceTransform(mConcatenatedOverlayTransform); #if VTK_MAJOR_VERSION <= 5 mOverlayReslice->SetInput(0, mOverlay->GetFirstVTKImageData()); + mImageReslice->UpdateInformation(); #else mOverlayReslice->SetInputData(0, mOverlay->GetFirstVTKImageData()); #endif @@ -483,6 +494,7 @@ void vvSlicer::SetFusion(vvImage::Pointer fusion, int fusionSequenceCode) mFusionReslice->SetResliceTransform(mConcatenatedFusionTransform); #if VTK_MAJOR_VERSION <= 5 mFusionReslice->SetInput(0, mFusion->GetFirstVTKImageData()); + mFusionReslice->UpdateInformation(); #else mFusionReslice->SetInputData(0, mFusion->GetFirstVTKImageData()); #endif @@ -572,15 +584,31 @@ void vvSlicer::SetVF(vvImage::Pointer vf) mVFVisibility = true; if (!mAAFilter) { + mVFReslice = vtkSmartPointer::New(); + mVFReslice->SetInterpolationModeToLinear(); + mVFReslice->AutoCropOutputOn(); + mVFReslice->SetBackgroundColor(-1000,-1000,-1000,1); mAAFilter= vtkSmartPointer::New(); mVOIFilter = vtkSmartPointer::New(); mVOIFilter->SetSampleRate(mSubSampling,mSubSampling,mSubSampling); } + + mConcatenatedVFTransform->Identity(); + mConcatenatedVFTransform->Concatenate(mVF->GetTransform()[0]); + mConcatenatedVFTransform->Concatenate(mSlicingTransform); + mVFReslice->SetResliceTransform(mConcatenatedVFTransform); +#if VTK_MAJOR_VERSION <= 5 + mVFReslice->SetInput(0, mVF->GetFirstVTKImageData()); +#else + mVFReslice->SetInputData(0, mVF->GetFirstVTKImageData()); +#endif + mVFReslice->Update(); + #if VTK_MAJOR_VERSION <= 5 - mVOIFilter->SetInput(vf->GetFirstVTKImageData()); + mVOIFilter->SetInput(mVFReslice->GetOutput()); mAAFilter->SetInput(mVOIFilter->GetOutput()); #else - mVOIFilter->SetInputData(vf->GetFirstVTKImageData()); + mVOIFilter->SetInputConnection(mVFReslice->GetOutputPort()); mAAFilter->SetInputConnection(mVOIFilter->GetOutputPort()); #endif ///This tells VTK to use the scalar (pixel) data of the image to draw the little arrows @@ -669,12 +697,24 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks) mLandClipper->SetClipFunction(mClipBox); mLandClipper->InsideOutOn(); #if VTK_MAJOR_VERSION <= 5 - mLandClipper->SetInput(mLandmarks->GetOutput()); + mLandmarkTransform = vtkSmartPointer::New(); + mLandmarkTransform->SetInput(mLandmarks->GetOutput()); + mConcatenatedTransform->Identity(); + mConcatenatedTransform->Concatenate(mImage->GetTransform()[0]); + mConcatenatedTransform->Concatenate(mSlicingTransform); + mLandmarkTransform->SetTransform(mConcatenatedTransform->GetInverse()); + mLandClipper->SetInput(mLandmarkTransform->GetOutput()); mLandGlyph->SetSource(mCross->GetOutput()); mLandGlyph->SetInput(mLandClipper->GetOutput()); #else - mLandClipper->SetInputData(mLandmarks->GetOutput()); + mLandmarkTransform = vtkSmartPointer::New(); + mLandmarkTransform->SetInputData(mLandmarks->GetOutput()); + mConcatenatedTransform->Identity(); + mConcatenatedTransform->Concatenate(mImage->GetTransform()[0]); + mConcatenatedTransform->Concatenate(mSlicingTransform); + mLandmarkTransform->SetTransform(mConcatenatedTransform->GetInverse()); + mLandClipper->SetInputConnection(mLandmarkTransform->GetOutputPort()); mLandGlyph->SetSourceConnection(mCross->GetOutputPort()); mLandGlyph->SetInputConnection(mLandClipper->GetOutputPort()); @@ -692,12 +732,11 @@ void vvSlicer::SetLandmarks(vvLandmarks* landmarks) //mLandMapper->ScalarVisibilityOff(); mLandActor->SetMapper(mLandMapper); - mLandActor->GetProperty()->SetOpacity(0.995); + mLandActor->GetProperty()->SetOpacity(0.995); //in order to get VTK to turn on the alpha-blending in OpenGL mLandActor->GetProperty()->SetColor(255,10,212); mLandActor->SetPickable(0); mLandActor->SetVisibility(true); this->UpdateDisplayExtent(); - this->GetRenderer()->AddActor(mLandActor); } } //------------------------------------------------------------------------------ @@ -824,10 +863,14 @@ void vvSlicer::SetTSlice(int t, bool updateLinkedImages) if (mVF && mVFActor->GetVisibility()) { if (mVF->GetVTKImages().size() > (unsigned int)mCurrentTSlice) #if VTK_MAJOR_VERSION <= 5 - mVOIFilter->SetInput(mVF->GetVTKImages()[mCurrentTSlice]); + mVFReslice->SetInput(mVF->GetVTKImages()[mCurrentTSlice]); #else - mVOIFilter->SetInputData(mVF->GetVTKImages()[mCurrentTSlice]); + mVFReslice->SetInputData(mVF->GetVTKImages()[mCurrentTSlice]); #endif + // Update overlay transform + mConcatenatedVFTransform->Identity(); + mConcatenatedVFTransform->Concatenate(mVF->GetTransform()[mCurrentTSlice]); + mConcatenatedVFTransform->Concatenate(mSlicingTransform); } //update the overlay if (mOverlay && mOverlayActor->GetVisibility()) { @@ -903,9 +946,9 @@ int vvSlicer::GetTSlice() int vvSlicer::GetMaxCurrentTSlice() { int t = mCurrentTSlice; - if(mOverlay) + if(mOverlay && mOverlayActor->GetVisibility()) t = std::max(t, mCurrentOverlayTSlice); - if(mFusion&& (mFusionSequenceCode<0)) //ignore fusionSequence data: for these, the times are not to be related (this way) + if(mFusion&& (mFusionSequenceCode<0) && mFusionActor->GetVisibility()) //ignore fusionSequence data: for these, the times are not to be related (this way) t = std::max(t, mCurrentFusionTSlice); return t; } @@ -954,6 +997,9 @@ void vvSlicer::SetSliceOrientation(int orientation) if(mOverlay) AdjustResliceToSliceOrientation(mOverlayReslice); + if(mVF) + AdjustResliceToSliceOrientation(mVFReslice); + // Update the viewer // Go to current cursor position @@ -1037,6 +1083,9 @@ void vvSlicer::AdjustResliceToSliceOrientation(vtkImageReslice *reslice) reslice->SetOutputOrigin(origin); reslice->SetOutputSpacing(spacing); reslice->UpdateInformation(); +#if VTK_MAJOR_VERSION <= 5 + reslice->GetOutput()->UpdateInformation(); +#endif } //------------------------------------------------------------------------------ @@ -1085,7 +1134,11 @@ void vvSlicer::UpdateDisplayExtent() // Local copy of extent int w_ext[6]; +#if VTK_MAJOR_VERSION <= 5 + int* ext = GetExtent(); +#else int* ext = mImageReslice->GetOutputInformation(0)->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT()); +#endif copyExtent(ext, w_ext); if (mUseReducedExtent) { copyExtent(mReducedExtent, w_ext); @@ -1108,11 +1161,12 @@ void vvSlicer::UpdateDisplayExtent() if (mOverlay && mOverlayVisibility) { AdjustResliceToSliceOrientation(mOverlayReslice); int overExtent[6]; - this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mOverlayReslice->GetOutput(), overExtent); #if VTK_MAJOR_VERSION <= 5 + this->ConvertImageToImageDisplayExtent(input, w_ext, mOverlayReslice->GetOutput(), overExtent); bool out = ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent()); #else - bool out = ClipDisplayedExtent(overExtent, mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())); + this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mOverlayReslice->GetOutput(), overExtent); + bool out = ClipDisplayedExtent(overExtent, mOverlayMapper->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())); #endif mOverlayActor->SetVisibility(!out); mOverlayActor->SetDisplayExtent( overExtent ); @@ -1128,11 +1182,12 @@ void vvSlicer::UpdateDisplayExtent() if (mFusion && mFusionVisibility) { AdjustResliceToSliceOrientation(mFusionReslice); int fusExtent[6]; - this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mFusionReslice->GetOutput(), fusExtent); #if VTK_MAJOR_VERSION <= 5 + this->ConvertImageToImageDisplayExtent(input, w_ext, mFusionReslice->GetOutput(), fusExtent); bool out = ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent()); #else - bool out = ClipDisplayedExtent(fusExtent, mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())); + this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mFusionReslice->GetOutput(), fusExtent); + bool out = ClipDisplayedExtent(fusExtent, mFusionMapper->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())); #endif mFusionActor->SetVisibility(!out); mFusionActor->SetDisplayExtent( fusExtent ); @@ -1162,17 +1217,16 @@ void vvSlicer::UpdateDisplayExtent() offset = -1; if (mVF && mVFVisibility) { + AdjustResliceToSliceOrientation(mVFReslice); int vfExtent[6]; #if VTK_MAJOR_VERSION <= 5 mVF->GetVTKImages()[0]->UpdateInformation(); -#else - //this->UpdateInformation(); -#endif - this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mVF->GetVTKImages()[0], vfExtent); -#if VTK_MAJOR_VERSION <= 5 + this->ConvertImageToImageDisplayExtent(input, w_ext, mVFReslice->GetOutput(), vfExtent); bool out = ClipDisplayedExtent(vfExtent, mVOIFilter->GetInput()->GetWholeExtent()); #else - bool out = ClipDisplayedExtent(vfExtent, mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())); + mVOIFilter->Update(); + this->ConvertImageToImageDisplayExtent(mImageReslice->GetOutputInformation(0), w_ext, mVFReslice->GetOutput(), vfExtent); + bool out = ClipDisplayedExtent(vfExtent, mVOIFilter->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())); #endif mVFActor->SetVisibility(!out); mVOIFilter->SetVOI(vfExtent); @@ -1181,7 +1235,7 @@ void vvSlicer::UpdateDisplayExtent() mGlyphFilter->SetOrientation(orientation[0], orientation[1], orientation[2]); position[this->SliceOrientation] += offset; mVFActor->SetPosition(position); - mVFActor->GetProperty()->SetOpacity(0.995); + mVFActor->GetProperty()->SetOpacity(0.995); //in order to get VTK to turn on the alpha-blending in OpenGL mVFMapper->Update(); } @@ -1261,6 +1315,29 @@ void vvSlicer::ConvertImageToImageDisplayExtent(vtkInformation *sourceImage, con } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +void vvSlicer::ConvertImageToImageDisplayExtent(vtkImageData *sourceImage, const int sourceExtent[6], + vtkImageData *targetImage, int targetExtent[6]) +{ + double dExtents[6]; + for(unsigned int i=0; i<6; i++) { + // From source voxel coordinates to world coordinates + dExtents[i] = sourceImage->GetOrigin()[i/2] + sourceImage->GetSpacing()[i/2] * sourceExtent[i]; + + // From world coordinates to floating point target voxel coordinates + dExtents[i] = (dExtents[i]- targetImage->GetOrigin()[i/2]) / targetImage->GetSpacing()[i/2]; + + // Round to current slice or larger extent + if(i/2==this->GetOrientation()) + targetExtent[i] = itk::Math::Round(dExtents[i]); + else if(i%2==1) + targetExtent[i] = itk::Math::Ceil(dExtents[i]); + else + targetExtent[i] = itk::Math::Floor(dExtents[i]); + } +} +//---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- bool vvSlicer::ClipDisplayedExtent(int extent[6], int refExtent[6]) { @@ -1521,6 +1598,16 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max, vtkImag if(iLocalExtents[i*2 ]>iLocalExtents[i*2+1]) std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]); + +#if VTK_MAJOR_VERSION > 5 + for(int j=0;j<2; j++) { + if(iLocalExtents[i*2+j]< mImageReslice->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())[2*i]) + iLocalExtents[i*2+j] = mImageReslice->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())[2*i]; + + if(iLocalExtents[i*2+j]> mImageReslice->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())[2*i+1]) + iLocalExtents[i*2+j] = mImageReslice->GetInputInformation()->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT())[2*i+1]; + } +#endif } vtkSmartPointer voiFilter = vtkSmartPointer::New(); @@ -1577,7 +1664,6 @@ double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, double X, doubl //image->SetUpdateExtent(ix, ix, iy, iy, iz, iz); //image->Update(); #endif - return image->GetScalarComponentAsDouble(ix, iy, iz, component); } //---------------------------------------------------------------------------- @@ -1597,7 +1683,6 @@ void vvSlicer::Render() } else legend->SetVisibility(0); if (ca->GetVisibility()) { - std::stringstream worldPos(" "); double pt[3]; mConcatenatedTransform->TransformPoint(mCurrent, pt); @@ -1611,25 +1696,6 @@ void vvSlicer::Render() Y <= mImage->GetVTKImages()[mCurrentTSlice]->GetWholeExtent()[3]+0.5 && Z >= mImage->GetVTKImages()[mCurrentTSlice]->GetWholeExtent()[4]-0.5 && Z <= mImage->GetVTKImages()[mCurrentTSlice]->GetWholeExtent()[5]+0.5) { - - - int ix, iy, iz; - double value = this->GetScalarComponentAsDouble(mImage->GetVTKImages()[mCurrentTSlice], X, Y, Z, ix, iy, iz); - - if(ImageActor->GetVisibility()) - worldPos << "data value : " << value << std::endl; - - worldPos << "mm : " << lrint(mCurrentBeforeSlicingTransform[0]) << ' ' - << lrint(mCurrentBeforeSlicingTransform[1]) << ' ' - << lrint(mCurrentBeforeSlicingTransform[2]) << ' ' - << mCurrentTSlice - << std::endl; - worldPos << "pixel : " << ix << ' ' - << iy << ' ' - << iz << ' ' - << mCurrentTSlice - << std::endl; - } #else if (X >= mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[0]-0.5 && X <= mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1]+0.5 && @@ -1637,16 +1703,14 @@ void vvSlicer::Render() Y <= mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3]+0.5 && Z >= mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[4]-0.5 && Z <= mImage->GetVTKImages()[mCurrentTSlice]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5]+0.5) { - +#endif int ix, iy, iz; double value = this->GetScalarComponentAsDouble(mImage->GetVTKImages()[mCurrentTSlice], X, Y, Z, ix, iy, iz); - if(ImageActor->GetVisibility()) worldPos << "data value : " << value << std::endl; - - worldPos << "mm : " << lrint(mCurrentBeforeSlicingTransform[0]) << ' ' - << lrint(mCurrentBeforeSlicingTransform[1]) << ' ' - << lrint(mCurrentBeforeSlicingTransform[2]) << ' ' + worldPos << "mm : " << lrint(mCurrent[0]) << ' ' + << lrint(mCurrent[1]) << ' ' + << lrint(mCurrent[2]) << ' ' << mCurrentTSlice << std::endl; worldPos << "pixel : " << ix << ' ' @@ -1656,7 +1720,6 @@ void vvSlicer::Render() << std::endl; } -#endif ca->SetText(1,worldPos.str().c_str()); std::stringstream slicePos; @@ -1765,7 +1828,7 @@ void vvSlicer::UpdateCursorPosition() //---------------------------------------------------------------------------- void vvSlicer::RemoveLandmarks() { - vtkPolyData *pd = static_cast(mLandClipper->GetInput()); + vtkPolyData *pd = static_cast(mLandmarks->GetOutput()); if (pd->GetPoints()) { //First remove all captions: @@ -1791,12 +1854,12 @@ void vvSlicer::DisplayLandmarks() mClipBox->SetBounds(bounds); - vtkPolyData *pd = static_cast(mLandClipper->GetInput()); + vtkPolyData *pd = static_cast(mLandmarks->GetOutput()); if (pd->GetPoints()) { + this->GetRenderer()->AddActor(mLandActor); //mLandGlyph->SetRange(0,1); //mLandGlyph->Modified(); //mLandGlyph->Update(); - mClipBox->Modified(); mLandClipper->Update(); mLandMapper->Update();