From b88efa3b2580e0cb19eff18a1efe59df26f9c4f5 Mon Sep 17 00:00:00 2001 From: Krad Date: Sat, 2 Apr 2022 16:12:14 +0800 Subject: [PATCH] Simple MPR and slice orientation features --- src/src/QDicomViewer.cpp | 4 ++++ src/src/base/infinitiViewer.cxx | 11 ++++++++--- src/src/view/dicomimageview.cpp | 23 ++++++++++++++++++++--- src/src/view/dicomimageview.h | 5 ++++- src/src/view/viewcontainerwidget.cpp | 10 +++++++++- src/src/view/viewcontainerwidget.h | 3 +++ 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/src/QDicomViewer.cpp b/src/src/QDicomViewer.cpp index 30241b9..dd7eeb6 100644 --- a/src/src/QDicomViewer.cpp +++ b/src/src/QDicomViewer.cpp @@ -216,6 +216,10 @@ void QDicomViewer::createToolButton() this->SetupMaximizeTool(btnmaximize); this->SetupMinimizeTool(btnminimize); this->SetupCloseTool(btnclose); + + connect(btnMPR,&QToolButton::clicked,[=](){ + ui->viewContainer->SetCurrentViewSliceOrientation((ui->viewContainer->GetCurrentViewSliceOrientation()+1)%3); + }); } void QDicomViewer::SetupFullScreenTool(QToolButton* btnfullscreen) diff --git a/src/src/base/infinitiViewer.cxx b/src/src/base/infinitiViewer.cxx index 6a8e75e..dfaed49 100644 --- a/src/src/base/infinitiViewer.cxx +++ b/src/src/base/infinitiViewer.cxx @@ -45,6 +45,7 @@ void infinitiViewer::SetFusionInputData(vtkImageData* data) if (!this->FusionMapper) { this->FusionMapper = vtkImageSliceMapper::New(); this->FusionMapper->SliceAtFocalPointOn(); + this->FusionMapper->SliceFacesCameraOn(); FusionMapper->SetInputData(data); this->FusionActor = vtkImageSlice::New(); FusionActor->SetPickable(false); @@ -304,6 +305,8 @@ infinitiViewer::infinitiViewer() this->ImageActor = vtkImageSlice::New(); this->ImageMapper = vtkImageSliceMapper::New(); this->ImageMapper->SliceAtFocalPointOn(); + this->ImageMapper->SliceFacesCameraOn(); + this->ImageActor->SetMapper(this->ImageMapper); this->FusionActor = nullptr; this->FusionMapper = nullptr; @@ -657,8 +660,10 @@ void infinitiViewer::SetSliceOrientation(int orientation) this->Renderer->ResetCamera(); this->Renderer->GetActiveCamera()->SetParallelScale(scale); } - - this->Render(); + // first render to update imageMapper slice + this->Render(); + //use SetSlice as second render the first image + SetSlice(0); } //---------------------------------------------------------------------------- @@ -679,7 +684,7 @@ void infinitiViewer::UpdateOrientation() case infinitiViewer::SLICE_ORIENTATION_XZ: cam->SetFocalPoint(0, 0, 0); - cam->SetPosition(0, -1, 0); // 1 if medical ? + cam->SetPosition(0, 1, 0); // 1 if medical ? cam->SetViewUp(0, 0, 1); break; diff --git a/src/src/view/dicomimageview.cpp b/src/src/view/dicomimageview.cpp index ba70b3e..05ac5d9 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 @@ -562,8 +562,10 @@ void DicomImageView::SetPanOffset(double * pan) } } +//FIXME:这个函数有问题,会导致MPR显示出错!!! void DicomImageView::ResetPanZoom() { + return; if (HasSeries()) { //necessary to reset pan @@ -667,7 +669,7 @@ void DicomImageView::Rotate(double angle, TransFormType operation) //slcing is related with rotation, you have to recalculate to get it right _ImageViewer->GetRenderer()->ResetCameraClippingRange(); _ImageViewer->SetSlice(slice); - _ImageViewer->GetRenderWindow()->Render(); +// _ImageViewer->GetRenderWindow()->Render(); emit Signal_Transformation(operation); } @@ -827,4 +829,19 @@ void DicomImageView::removeViewWithMeasure() { _ImageViewer->UnActiveMeasure(); _ImageViewer->DeleteCurrentSeriesMeasure(); -} \ No newline at end of file +} + +void DicomImageView::SetSliceOrientation(int orientation) { + slice_orientation = orientation; + _ImageViewer->SetSliceOrientation(orientation); + int max = 0; + int min = 0; + _ImageViewer->GetSliceRange(min, max); + _scrollBar->setValue(min); + _scrollBar->setMaximum(max); + _scrollBar->setValue(0); +} + +int DicomImageView::GetSliceOrientation() { + return slice_orientation; +} diff --git a/src/src/view/dicomimageview.h b/src/src/view/dicomimageview.h index a5e8223..b18141e 100644 --- a/src/src/view/dicomimageview.h +++ b/src/src/view/dicomimageview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include "ClickableScrollBar.h" @@ -124,6 +124,8 @@ public: //Negative void ToggleNegativeMode(); + void SetSliceOrientation(int orientation); + int GetSliceOrientation(); signals: /** @@ -227,6 +229,7 @@ private: int _SliceStep =0; int _PrevSlice =0; int _ScrollTriggerType = scrollScope::TriggerType::USER_TRIGGER; + int slice_orientation = 2; bool isCine = false; bool isNegative = false; diff --git a/src/src/view/viewcontainerwidget.cpp b/src/src/view/viewcontainerwidget.cpp index 7c6a1b8..f3de2d5 100644 --- a/src/src/view/viewcontainerwidget.cpp +++ b/src/src/view/viewcontainerwidget.cpp @@ -1,4 +1,4 @@ -#include "viewcontainerwidget.h" +#include "viewcontainerwidget.h" #include "thumbnailImage.h" #include "DicomLoader.h" #include @@ -434,3 +434,11 @@ void ViewContainerWidget::activeMeasure() { }, nullptr, nullptr, ImageViewManager::All); } +void ViewContainerWidget::SetCurrentViewSliceOrientation(int type) { + manager.getCurrentView()->SetSliceOrientation(type); +} + +int ViewContainerWidget::GetCurrentViewSliceOrientation() { + return manager.getCurrentView()->GetSliceOrientation();; +} + diff --git a/src/src/view/viewcontainerwidget.h b/src/src/view/viewcontainerwidget.h index 9a39e25..dea962d 100644 --- a/src/src/view/viewcontainerwidget.h +++ b/src/src/view/viewcontainerwidget.h @@ -43,6 +43,9 @@ public: void removeCurrentViewWithFusion(); void SetInteractionMode(int InteractionMode); + void SetCurrentViewSliceOrientation(int orientation); + int GetCurrentViewSliceOrientation(); + signals: void Signal_NotifyThumbnail(DicomImageView *view);