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 };
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();

View File

@@ -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<vtkMatrix4x4> matrix;

View File

@@ -1,4 +1,4 @@
#include "view/dicomimageview.h"
#include "view/dicomimageview.h"
#include <QMessageBox>
#include <QDebug>
#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;
}