From 8349a37cd3c6f8179b0638d2989116ef14826590 Mon Sep 17 00:00:00 2001 From: Krad Date: Tue, 19 Apr 2022 15:53:44 +0800 Subject: [PATCH] Add ResetScale too fit window function.(After First render and MPR change) --- src/src/base/infinitiViewer.cxx | 39 +++++++++++++++++++++++++++++---- src/src/base/infinitiViewer.h | 6 +++-- src/src/view/dicomimageview.cpp | 12 +++------- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/src/base/infinitiViewer.cxx b/src/src/base/infinitiViewer.cxx index a4b1174..226b3c4 100644 --- a/src/src/base/infinitiViewer.cxx +++ b/src/src/base/infinitiViewer.cxx @@ -665,7 +665,38 @@ void infinitiViewer::SetZoomScale(double scale) { } } -void infinitiViewer::SetPanOffset(double* p) { +void infinitiViewer::ResetZoomScaleToFitWindowSize() { + vtkImageData * inputData = nullptr; + if (Renderer && (inputData = GetInput())){ + double proj[4] ={0,0,0,1}; + Renderer->GetActiveCamera()->GetDirectionOfProjection(proj); + double viewUp[4]= {0,0,0,1}; + this->Renderer->GetActiveCamera()->GetViewUp(viewUp); + double viewRight[4]= {0,0,0,1}; + vtkMath::Cross(viewUp,proj,viewRight); + int upIndex = (int) abs(round(1.0*viewUp[1]+2.0*viewUp[2])); + int rightIndex = (int)abs(round(1.0*viewRight[1]+2.0*viewRight[2])); + int* size = this->RenderWindow->GetSize(); + double whFactor = 0.5; + double ws = 1.0* size[0]; + double hs = 1.0* size[1]; + double hp = 1.0 * inputData->GetBounds()[upIndex*2+1]; + double wp = 1.0 * inputData->GetBounds()[rightIndex*2+1]; + //because Parallel Scale is campare with half height + if(wp/hp>ws/hs){ + double aspect = hs/ws; + SetZoomScale((wp)*aspect*0.5+3.0); + } + else{ + SetZoomScale((hp)*0.5+3.0); + } + } + else{ + SetZoomScale(1.0); + } +} + +void infinitiViewer::SetPanOffset(const double* p) { double fp[3] = { 0.0,0.0,0.0 }; Renderer->GetActiveCamera()->GetPosition(fp); fp[0] = fp[0] + p[0]; @@ -969,7 +1000,8 @@ void infinitiViewer::Render() //camera->GetPosition(cameraPosition); int currentIndex = ImageMapper->GetSliceNumber(); if (currentIndex != lastIndex) this->SetSlice(lastIndex); - this->Renderer->GetActiveCamera()->SetParallelScale(xs < 150 ? 75 : (xs - 1) / 2.0); + ResetZoomScaleToFitWindowSize(); +// this->Renderer->GetActiveCamera()->SetParallelScale(xs < 150 ? 75 : (xs - 1) / 2.0); //calibration of image by VFlip //this->Renderer->GetActiveCamera()->Elevation(-180); //this->Renderer->GetActiveCamera()->Roll(180); @@ -1165,9 +1197,8 @@ void infinitiViewer::SetSliceOrientation(int orientation) if (this->Renderer && this->GetInput()) { - double scale = this->Renderer->GetActiveCamera()->GetParallelScale(); this->Renderer->ResetCamera(); - this->Renderer->GetActiveCamera()->SetParallelScale(scale); + ResetZoomScaleToFitWindowSize(); } // first render to update imageMapper slice this->Render(); diff --git a/src/src/base/infinitiViewer.h b/src/src/base/infinitiViewer.h index 29184f2..85bdacc 100644 --- a/src/src/base/infinitiViewer.h +++ b/src/src/base/infinitiViewer.h @@ -160,7 +160,8 @@ public: //@} void SetZoomScale(double scale); - void SetPanOffset(double* point); + void SetPanOffset(const double* point); + void ResetZoomScaleToFitWindowSize(); //@{ /** * Get the position (x and y) of the rendering window in @@ -393,7 +394,8 @@ private: bool rulerActive = false; void RenderRuler(); int currentPresetIndex=1; - + int viewUpIndex = 0; + int viewRightIndex = 1; DicomCornerInfo m_cornerInfo; char SOP_UID[20]={0}; vtkNew matrix; diff --git a/src/src/view/dicomimageview.cpp b/src/src/view/dicomimageview.cpp index d230818..96646c5 100644 --- a/src/src/view/dicomimageview.cpp +++ b/src/src/view/dicomimageview.cpp @@ -1,4 +1,4 @@ -#include "view/dicomimageview.h" +#include "view/dicomimageview.h" #include #include #include "view/thumbnailImage.h" @@ -566,13 +566,9 @@ void DicomImageView::SetPanOffset(double * pan) //FIXME:这个函数有问题,会导致MPR显示出错!!! void DicomImageView::ResetPanZoom() { - return; if (HasSeries()) { - //necessary to reset pan - _ImageViewer->GetRenderer()->ResetCamera(); - //necessary to reset zoom - _ImageViewer->GetRenderer()->GetActiveCamera()->SetParallelScale(_Series->GetExtent()); + _ImageViewer->ResetZoomScaleToFitWindowSize(); } } @@ -622,7 +618,6 @@ void DicomImageView::HFlip() { if (HasSeries()) { int slice = _ImageViewer->GetSlice(); - ResetPanZoom(); //HFlip //_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0); _ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180); @@ -643,7 +638,6 @@ void DicomImageView::VFlip() //double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale(); int slice = _ImageViewer->GetSlice(); - ResetPanZoom(); //Method 2: Order matters _ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180); _ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180); @@ -664,7 +658,6 @@ void DicomImageView::Rotate(double angle, TransFormType operation) { if (HasSeries()) { int slice = _ImageViewer->GetSlice(); - ResetPanZoom(); _ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle); //to avoid black out problem during slicing //slcing is related with rotation, you have to recalculate to get it right @@ -843,6 +836,7 @@ void DicomImageView::SetSliceOrientation(int orientation) { _scrollBar->setValue(0); } + int DicomImageView::GetSliceOrientation() { return slice_orientation; }