X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicer.cxx;h=9a2eec41414a0a8193322717ed71bbf47dc7881d;hb=30659c9eea7c95c04002cb3de18d6e584f8d1296;hp=a5c2641bd1a8f24c249bcf8fda6376441c5bc961;hpb=4ea2c946973c570cbe540a27cf44d6acdf44867c;p=clitk.git diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx index a5c2641..9a2eec4 100644 --- a/vv/vvSlicer.cxx +++ b/vv/vvSlicer.cxx @@ -64,6 +64,7 @@ #include #include #include +#include vtkCxxRevisionMacro(vvSlicer, "DummyRevision"); vtkStandardNewMacro(vvSlicer); @@ -87,6 +88,7 @@ vvSlicer::vvSlicer() mSubSampling = 5; mScale = 1; mVFLog = 0; + mVFWidth = 1; std::string text = "F1 = sagital; F2 = coronal; F3 = axial\n"; text += "F5 = horizontal flip; F6 = vertical flip\n\n"; @@ -140,6 +142,7 @@ vvSlicer::vvSlicer() this->WindowLevel->Delete(); this->WindowLevel = vvImageMapToWLColors::New(); this->InstallPipeline(); + } //------------------------------------------------------------------------------ @@ -279,6 +282,26 @@ void vvSlicer::SetImage(vvImage::Pointer image) { mImage = image; this->Superclass::SetInput(image->GetVTKImages()[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; + } + } + this->UpdateDisplayExtent(); mCurrentTSlice = 0; ca->SetText(0,mFileName.c_str()); @@ -421,6 +444,7 @@ void vvSlicer::SetVF(vvImage::Pointer vf) mVFActor = vtkActor::New(); mVFActor->SetMapper(mVFMapper); mVFActor->SetPickable(0); + mVFActor->GetProperty()->SetLineWidth(mVFWidth); this->UpdateDisplayExtent(); this->GetRenderer()->AddActor(mVFActor); @@ -543,6 +567,17 @@ void vvSlicer::SetVFScale(int scale) } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvSlicer::SetVFWidth(int width) +{ + mVFWidth = width; + if (mVFActor) + mVFActor->GetProperty()->SetLineWidth(mVFWidth); + UpdateDisplayExtent(); + Render(); +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvSlicer::SetVFLog(int log) @@ -566,6 +601,9 @@ void vvSlicer::SetTSlice(int t) t = 0; else if ((unsigned int)t >= mImage->GetVTKImages().size()) t = mImage->GetVTKImages().size() -1; + + if (mCurrentTSlice == t) return; + mCurrentTSlice = t; this->SetInput(mImage->GetVTKImages()[t]); if (mVF && mVFActor->GetVisibility()) @@ -635,6 +673,27 @@ void vvSlicer::SetSliceOrientation(int orientation) SetContourSlice(); } +//---------------------------------------------------------------------------- + + +//---------------------------------------------------------------------------- +int * vvSlicer::GetExtent() { + int *w_ext; + if (mUseReducedExtent) { + w_ext = mReducedExtent; + } + else w_ext = GetInput()->GetWholeExtent(); + return w_ext; +} +//---------------------------------------------------------------------------- + + +//---------------------------------------------------------------------------- +int vvSlicer::GetOrientation() { + return this->SliceOrientation; +} +//---------------------------------------------------------------------------- + //---------------------------------------------------------------------------- void vvSlicer::UpdateDisplayExtent() @@ -1152,8 +1211,8 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) { if (i!=SliceOrientation) //SR: assumes that SliceOrientation is valid in ViewCoordinates (???) { - fLocalExtents[i*2 ] -= 0.2; - fLocalExtents[i*2+1] += 0.2; + fLocalExtents[i*2 ] -= 0.2; + fLocalExtents[i*2+1] += 0.2; } } this->Renderer->ViewToWorld(fLocalExtents[0], fLocalExtents[2], fLocalExtents[4]); @@ -1170,17 +1229,24 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]); if(iLocalExtents[i*2 ]>iLocalExtents[i*2+1]) - std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]); + std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]); } - + vtkSmartPointer voiFilter = vtkExtractVOI::New(); voiFilter->SetInput(this->GetInput()); voiFilter->SetVOI(iLocalExtents); + voiFilter->Update(); + if (!voiFilter->GetOutput()->GetNumberOfPoints()) + { + min = 0; + max = 0; + return; + } vtkSmartPointer accFilter = vtkImageAccumulate::New(); accFilter->SetInput(voiFilter->GetOutput()); accFilter->Update(); - + min = *(accFilter->GetMin()); max = *(accFilter->GetMax()); } @@ -1189,6 +1255,8 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) //---------------------------------------------------------------------------- void vvSlicer::Render() { + // DD("vvSlicer::Render"); + // DD(SliceOrientation); if (this->GetWindowLevel()->GetLookupTable() && !this->mOverlay && !this->mFusion) { legend->SetLookupTable(this->GetWindowLevel()->GetLookupTable()); @@ -1253,10 +1321,9 @@ void vvSlicer::Render() pixel2 << (int)Y; pixel3 << (int)Z; temps << mCurrentTSlice; - double value = this->GetInput()->GetScalarComponentAsDouble( - (int)X, - (int)Y, - (int)Z,0); + double value = this->GetInput()->GetScalarComponentAsDouble(lrint(X), + lrint(Y), + lrint(Z),0); std::stringstream val; val << value; @@ -1341,7 +1408,11 @@ void vvSlicer::SetSlice(int slice) SetContourSlice(); this->Modified(); this->UpdateDisplayExtent(); - this->Render(); + + // DD("SetSlice de slicer = Render"); + + // Seems to work without this line + // this->Render(); } //---------------------------------------------------------------------------- @@ -1380,3 +1451,10 @@ void vvSlicer::PrintSelf(ostream& os, vtkIndent indent) this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- + + + + + + +