diff --git a/src/src/Common/SeriesImageSet.h b/src/src/Common/SeriesImageSet.h index 4e44a56..1c495f9 100644 --- a/src/src/Common/SeriesImageSet.h +++ b/src/src/Common/SeriesImageSet.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Common/QGlobals.h" #include #include @@ -38,10 +38,7 @@ public: bool IntersectWorldBounds(SeriesImageSet* imageSet); private: - - vtkSmartPointer m_image; ExtendMedicalImageProperties* m_property = nullptr; - std::string m_pUniqueID; }; diff --git a/src/src/Rendering/infinitiViewer.cxx b/src/src/Rendering/infinitiViewer.cxx index 9470604..2c26e2f 100644 --- a/src/src/Rendering/infinitiViewer.cxx +++ b/src/src/Rendering/infinitiViewer.cxx @@ -582,6 +582,18 @@ void infinitiViewer::SetPanOffset(const double *p) { } +void infinitiViewer::setPanFocalPoint(const double *p) { + double fp[3] = {0.0, 0.0, 0.0}; + double newP[3] = {p[0], p[1], p[2]}; + Renderer->GetActiveCamera()->GetPosition(fp); + newP[SliceOrientation] = fp[2]; + Renderer->GetActiveCamera()->SetPosition(newP); + Renderer->GetActiveCamera()->GetFocalPoint(fp); + newP[SliceOrientation] = fp[2]; + Renderer->GetActiveCamera()->SetFocalPoint(newP); + +} + // window---------------------------------------------------------------------- double infinitiViewer::GetColorWindow() { return this->ImageActor->GetProperty()->GetColorWindow(); diff --git a/src/src/Rendering/infinitiViewer.h b/src/src/Rendering/infinitiViewer.h index 696dcf0..980073a 100644 --- a/src/src/Rendering/infinitiViewer.h +++ b/src/src/Rendering/infinitiViewer.h @@ -193,6 +193,8 @@ vtkTypeMacro(infinitiViewer, vtkObject); void SetPanOffset(const double *point); + void setPanFocalPoint(const double *point); + void ResetZoomScaleToFitWindowSize(); //@{ /** diff --git a/src/src/UI/Widget/dicomimageview.cpp b/src/src/UI/Widget/dicomimageview.cpp index d32e05b..f53bb16 100644 --- a/src/src/UI/Widget/dicomimageview.cpp +++ b/src/src/UI/Widget/dicomimageview.cpp @@ -1,4 +1,4 @@ -#include "dicomimageview.h" +#include "dicomimageview.h" #include #include @@ -372,12 +372,12 @@ void DicomImageView::clearFusionContext() { } //Callbacks------------------------------------------------------------------------------------ -void DicomImageView::updateWindowLevelCb() { +void DicomImageView::windowLevelHandle() { mImageViewer->UpdateCornerInfo(BOTTOM_RIGHT); emit onFusionWindowChange(mImageViewer->GetColorLevel(), mImageViewer->GetColorWindow()); } -void DicomImageView::scalarEventCb(vtkObject *, unsigned long eventId, void *calldata) { +void DicomImageView::scalarEventHandle(vtkObject *, unsigned long eventId, void *calldata) { double *r = (double *) calldata; switch (eventId) { case (ActorDraggableInteractorStyle::ScalarShiftEvent): @@ -395,31 +395,36 @@ void DicomImageView::scalarEventCb(vtkObject *, unsigned long eventId, void *cal } } -void DicomImageView::doubleclickedEventCb() { +void DicomImageView::doubleClickHandle() { emit onViewDoubleClick(this); } -//TODO:重新匹配该函数,部分逻辑可以直接保留,需要注意Endxxx系列事件不是仅仅为了sync设计的 -void DicomImageView::syncEventFunc(vtkObject *, unsigned long eid, void *calldata) { +void DicomImageView::dispatchEvent(vtkObject *, unsigned long eid, void *callData) { - int *r = (int *) calldata; + int *r = (int *) callData; switch (eid) { - case (vtkCommand::EventIds::EndPanEvent): - emit onSync(this, VTKIS_IMAGE_PAN, calldata); + case (vtkCommand::EventIds::EndPanEvent):{ + emit onEndPan(this, callData); break; - case (vtkCommand::EventIds::EndWindowLevelEvent): + } + case (vtkCommand::EventIds::EndWindowLevelEvent):{ //update corner info through callback - emit onSync(this, VTKIS_IMAGE_WINDOWLEVEL, calldata); + emit onEndWindowLevel(this, + mImageViewer->GetColorLevel(), + mImageViewer->GetColorWindow()); break; - case (ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent): - emit onSync(this, VTKIS_IMAGE_ZOOM, calldata); + } + case (ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent):{ + double newScaleFactor = ((double *) callData)[1]; + emit onEndZoom(this, newScaleFactor); break; + } case (ActorDraggableInteractorStyle::DraggableStyleEvents::SlicedEvent): { mScrollBar->SetValueSilently(r[0]); //invoke event double focusPoint[3] = {.0, .0, .0}; mImageViewer->GetSlicePoint(focusPoint); - emit onSync(this, VTKIS_IMAGE_SLICING, focusPoint); + emit onSlice(this, focusPoint); break; } default: @@ -481,12 +486,18 @@ void DicomImageView::setZoomScale(double scale) { void DicomImageView::setPanOffset(double *pan) { if (hasSeries()) { - mImageViewer->SetPanOffset(pan); mImageViewer->Render(); } } +void DicomImageView::setPanFocalPoint(double *pan) { + if (hasSeries()) { + mImageViewer->setPanFocalPoint(pan); + mImageViewer->Render(); + } +} + void DicomImageView::resetPanZoom() { if (hasSeries()) { mImageViewer->GetRenderer()->ResetCamera(); @@ -582,6 +593,7 @@ void DicomImageView::rotateImage(double angle, TransFormType operation) { void DicomImageView::ClearTransformations() { if (hasSeries()) { int slice = mImageViewer->GetSlice(); + //reset flip and rotation mImageViewer->UpdateOrientation(); resetPanZoom(); //avoid black out problem diff --git a/src/src/UI/Widget/dicomimageview.h b/src/src/UI/Widget/dicomimageview.h index e34b86b..3a3bb18 100644 --- a/src/src/UI/Widget/dicomimageview.h +++ b/src/src/UI/Widget/dicomimageview.h @@ -116,6 +116,8 @@ public: void setPanOffset(double *p); + void setPanFocalPoint(double *p); + void SyncScrollBar(); //CineMode @@ -177,6 +179,14 @@ signals: void onSync(DicomImageView *view, int interactionMode, void *calldata); + void onSlice(DicomImageView *view, void *calldata); + + void onEndPan(DicomImageView *view, void * offsetVector); + + void onEndZoom(DicomImageView *view, double newScaleFactor); + + void onEndWindowLevel(DicomImageView *view, double level, double window); + void onFusionWindowChange(double level, double width); void onTransform(TransFormType); @@ -262,14 +272,14 @@ private: } //Callback - void doubleclickedEventCb(); + void doubleClickHandle(); - void scalarEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr); + void scalarEventHandle(vtkObject *sender, unsigned long eventId, void *calldata = nullptr); - void updateWindowLevelCb(); + void windowLevelHandle(); - void syncEventFunc(vtkObject *caller, unsigned long eid, void *calldata); + void dispatchEvent(vtkObject *caller, unsigned long eid, void *callData); void initCineModeThread();