Add ResetScale too fit window function.(After First render and MPR change)

This commit is contained in:
Krad
2022-04-19 15:53:44 +08:00
parent 96c59eddcb
commit 8349a37cd3
3 changed files with 42 additions and 15 deletions

View File

@@ -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 }; double fp[3] = { 0.0,0.0,0.0 };
Renderer->GetActiveCamera()->GetPosition(fp); Renderer->GetActiveCamera()->GetPosition(fp);
fp[0] = fp[0] + p[0]; fp[0] = fp[0] + p[0];
@@ -969,7 +1000,8 @@ void infinitiViewer::Render()
//camera->GetPosition(cameraPosition); //camera->GetPosition(cameraPosition);
int currentIndex = ImageMapper->GetSliceNumber(); int currentIndex = ImageMapper->GetSliceNumber();
if (currentIndex != lastIndex) this->SetSlice(lastIndex); 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 //calibration of image by VFlip
//this->Renderer->GetActiveCamera()->Elevation(-180); //this->Renderer->GetActiveCamera()->Elevation(-180);
//this->Renderer->GetActiveCamera()->Roll(180); //this->Renderer->GetActiveCamera()->Roll(180);
@@ -1165,9 +1197,8 @@ void infinitiViewer::SetSliceOrientation(int orientation)
if (this->Renderer && this->GetInput()) if (this->Renderer && this->GetInput())
{ {
double scale = this->Renderer->GetActiveCamera()->GetParallelScale();
this->Renderer->ResetCamera(); this->Renderer->ResetCamera();
this->Renderer->GetActiveCamera()->SetParallelScale(scale); ResetZoomScaleToFitWindowSize();
} }
// first render to update imageMapper slice // first render to update imageMapper slice
this->Render(); this->Render();

View File

@@ -160,7 +160,8 @@ public:
//@} //@}
void SetZoomScale(double scale); 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 * Get the position (x and y) of the rendering window in
@@ -393,7 +394,8 @@ private:
bool rulerActive = false; bool rulerActive = false;
void RenderRuler(); void RenderRuler();
int currentPresetIndex=1; int currentPresetIndex=1;
int viewUpIndex = 0;
int viewRightIndex = 1;
DicomCornerInfo m_cornerInfo; DicomCornerInfo m_cornerInfo;
char SOP_UID[20]={0}; char SOP_UID[20]={0};
vtkNew<vtkMatrix4x4> matrix; vtkNew<vtkMatrix4x4> matrix;

View File

@@ -1,4 +1,4 @@
#include "view/dicomimageview.h" #include "view/dicomimageview.h"
#include <QMessageBox> #include <QMessageBox>
#include <QDebug> #include <QDebug>
#include "view/thumbnailImage.h" #include "view/thumbnailImage.h"
@@ -566,13 +566,9 @@ void DicomImageView::SetPanOffset(double * pan)
//FIXME:这个函数有问题,会导致MPR显示出错 //FIXME:这个函数有问题,会导致MPR显示出错
void DicomImageView::ResetPanZoom() void DicomImageView::ResetPanZoom()
{ {
return;
if (HasSeries()) if (HasSeries())
{ {
//necessary to reset pan _ImageViewer->ResetZoomScaleToFitWindowSize();
_ImageViewer->GetRenderer()->ResetCamera();
//necessary to reset zoom
_ImageViewer->GetRenderer()->GetActiveCamera()->SetParallelScale(_Series->GetExtent());
} }
} }
@@ -622,7 +618,6 @@ void DicomImageView::HFlip()
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//HFlip //HFlip
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0); //_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0);
_ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180); _ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180);
@@ -643,7 +638,6 @@ void DicomImageView::VFlip()
//double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale(); //double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale();
int slice = _ImageViewer->GetSlice(); int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//Method 2: Order matters //Method 2: Order matters
_ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180); _ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180);
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180); _ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180);
@@ -664,7 +658,6 @@ void DicomImageView::Rotate(double angle, TransFormType operation)
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = _ImageViewer->GetSlice();
ResetPanZoom();
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle); _ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle);
//to avoid black out problem during slicing //to avoid black out problem during slicing
//slcing is related with rotation, you have to recalculate to get it right //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); _scrollBar->setValue(0);
} }
int DicomImageView::GetSliceOrientation() { int DicomImageView::GetSliceOrientation() {
return slice_orientation; return slice_orientation;
} }