diff --git a/src/src/base/SeriesImageSet.cpp b/src/src/base/SeriesImageSet.cpp index 6d61085..e3cfb2e 100644 --- a/src/src/base/SeriesImageSet.cpp +++ b/src/src/base/SeriesImageSet.cpp @@ -1,4 +1,4 @@ -#include "base/SeriesImageSet.h" +#include "base/SeriesImageSet.h" #include #include "view/dicomimageview.h" #include "base/DicomLoader.h" @@ -51,18 +51,33 @@ const char *SeriesImageSet::getStudyUID() const { } bool SeriesImageSet::IntersectWorldBounds(SeriesImageSet *imageSet) { - double originOffset[3] = {.0, .0, .0}; - for (int i = 0; i < 3; ++i) { - originOffset[i] = GetProperty()->GetPosition()[i] - imageSet->GetProperty()->GetPosition()[i]; - } - double adjustBounds[6] ={.0,.0,.0,.0,.0,.0}; - GetData()->GetBounds(adjustBounds); - for (int j = 0; j < 6; ++j) { - adjustBounds[j] = adjustBounds[j] + originOffset[j/2]; - } + double bounds[6] ={.0,.0,.0,.0,.0,.0}; + imageSet->GetData()->GetBounds(bounds); + double minP[4] ={bounds[0],bounds[2], bounds[4], 1.0}; + double maxP[4] ={bounds[1],bounds[3], bounds[5], 1.0}; + imageSet->GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(minP,minP); + imageSet->GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(maxP,maxP); + bounds[0] = min(minP[0],maxP[0]); + bounds[1] = max(minP[0],maxP[0]); + bounds[2] = min(minP[1],maxP[1]); + bounds[3] = max(minP[1],maxP[1]); + bounds[4] = min(minP[2],maxP[2]); + bounds[5] = max(minP[2],maxP[2]); + double cBounds[6] ={.0,.0,.0,.0,.0,.0}; + GetData()->GetBounds(cBounds); + double minP2[4] ={cBounds[0], cBounds[2], cBounds[4], 1.0}; + double maxP2[4] ={cBounds[1], cBounds[3], cBounds[5], 1.0}; + GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(minP2,minP2); + GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(maxP2,maxP2); + cBounds[0] = min(minP2[0], maxP2[0]); + cBounds[1] = max(minP2[0],maxP2[0]); + cBounds[2] = min(minP2[1], maxP2[1]); + cBounds[3] = max(minP2[1], maxP2[1]); + cBounds[4] = min(minP2[2], maxP2[2]); + cBounds[5] = max(minP2[2], maxP2[2]); vtkBoundingBox box1; - box1.SetBounds(adjustBounds); + box1.SetBounds(bounds); vtkBoundingBox box2; - box2.SetBounds(imageSet->GetData()->GetBounds()); + box2.SetBounds(cBounds); return box1.IntersectBox(box2); } \ No newline at end of file diff --git a/src/src/base/infinitiViewer.cxx b/src/src/base/infinitiViewer.cxx index eaeb1d9..af511ee 100644 --- a/src/src/base/infinitiViewer.cxx +++ b/src/src/base/infinitiViewer.cxx @@ -628,7 +628,31 @@ void infinitiViewer::ChangeSlice(vtkObject *, unsigned long eventid, void *calld } void infinitiViewer::SyncSlicePoint(double * point) { -//TODO:SyncSlicePoint with different series in same study + double focusPoint[4] = {.0, .0, .0, 1.0}; + focusPoint[0] = point[0] - imageDataOrigin[0]; + focusPoint[1] = point[1] - imageDataOrigin[1]; + focusPoint[2] = point[2] - imageDataOrigin[2]; + matrix->Invert(); + matrix->MultiplyPoint(focusPoint, focusPoint); + matrix->Invert(); + double f[3] = {.0, .0, .0}; + Renderer->GetActiveCamera()->GetFocalPoint(f); + double bounds[6] = {.0, .0, .0, .0, .0, .0}; + ImageMapper->GetBounds(bounds); + f[SliceOrientation] = focusPoint[SliceOrientation]; + Renderer->GetActiveCamera()->SetFocalPoint(f); +} + +void infinitiViewer::GetSlicePoint(double * point) { + double focusPoint[4] = {.0, .0, .0, 1.0}; + Renderer->GetActiveCamera()->GetFocalPoint(focusPoint); + matrix->MultiplyPoint(focusPoint, focusPoint); + focusPoint[0] += imageDataOrigin[0]; + focusPoint[1] += imageDataOrigin[1]; + focusPoint[2] += imageDataOrigin[2]; + point[0] = focusPoint[0]; + point[1] = focusPoint[1]; + point[2] = focusPoint[2]; } vtkSmartPointer infinitiViewer::GetSliceBoundPoints(){ @@ -1055,7 +1079,7 @@ vtkTypeBool infinitiViewer::GetOffScreenRendering() void infinitiViewer::SetInputData(vtkImageData* in) { #ifdef _DEBUG - printf("fusion origin:%f,%f,%f", in->GetOrigin()[0], in->GetOrigin()[1], in->GetOrigin()[2]); + printf("fusion imageDataOrigin:%f,%f,%f", in->GetOrigin()[0], in->GetOrigin()[1], in->GetOrigin()[2]); printf("fusion spacing:%f,%f,%f", in->GetSpacing()[0], in->GetSpacing()[1], in->GetSpacing()[2]); #endif this->FirstRender = 1; @@ -1362,17 +1386,22 @@ void infinitiViewer::initCornerInfo(ExtendMedicalImageProperties* pSeries) matrix->Zero(); - matrix->SetElement(0, 0, xVector[0]); - matrix->SetElement(0, 1, xVector[1]); - matrix->SetElement(0, 2, xVector[2]); - matrix->SetElement(1, 0, yVector[0]); - matrix->SetElement(1, 1, yVector[1]); - matrix->SetElement(1, 2, yVector[2]); - matrix->SetElement(2, 0, zVector[0]); - matrix->SetElement(2, 1, zVector[1]); - matrix->SetElement(2, 2, zVector[2]); - matrix->SetElement(3, 3, 1); - matrix->Invert(); + matrix->SetElement( 0,0, xVector[0]); + matrix->SetElement( 1,0, xVector[1]); + matrix->SetElement( 2,0, xVector[2]); + matrix->SetElement( 0,1, yVector[0]); + matrix->SetElement( 1,1, yVector[1]); + matrix->SetElement( 2,1, yVector[2]); + matrix->SetElement( 0,2, zVector[0]); + matrix->SetElement( 1,2, zVector[1]); + matrix->SetElement( 2,2, zVector[2]); + matrix->SetElement( 3,3, 1); +// matrix->Invert(); + + double* p = pSeries->GetPosition(); + imageDataOrigin[0] = p[0]; + imageDataOrigin[1] = p[1]; + imageDataOrigin[2] = p[2]; } int getOrientationIndex(double* v){ @@ -1467,3 +1496,4 @@ int infinitiViewer::GetWorldSliceOrientation() { matrix->MultiplyPoint(orientations, orientations); return (int)abs(round(1.0 * orientations[1]) + round(2.0 * orientations[2])); } + diff --git a/src/src/base/infinitiViewer.h b/src/src/base/infinitiViewer.h index 414953a..982f8a1 100644 --- a/src/src/base/infinitiViewer.h +++ b/src/src/base/infinitiViewer.h @@ -323,6 +323,7 @@ public: return &raiser; } void SyncSlicePoint(double* point); + void GetSlicePoint(double* point); protected: infinitiViewer(); @@ -370,11 +371,6 @@ protected: void RemoveMeasures(vtkObject*,unsigned long eventid,void* calldata ); private: - - void updateTopLeftCornerInfo(); - - - infinitiViewer(const infinitiViewer&) = delete; void operator=(const infinitiViewer&) = delete; std::vector> fusion_tf_vector; @@ -387,10 +383,10 @@ private: void raiseEvent(vtkObject* sender,unsigned long eventId,void* callData = nullptr){ raiser.raiseEvent(sender,eventId,callData); } - void ClearCurrentSliceMeasure() const; - void ReloadCurrentSliceMeasure(); + void updateTopLeftCornerInfo(); + vtkNew ruler; bool rulerActive = false; void RenderRuler(); @@ -399,6 +395,7 @@ private: int viewRightIndex = 1; DicomCornerInfo m_cornerInfo; char SOP_UID[20]={0}; + double imageDataOrigin[3] = {.0, .0, .0}; vtkNew matrix; }; diff --git a/src/src/view/dicomimageview.cpp b/src/src/view/dicomimageview.cpp index 43c6e9c..8b5bcb6 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" @@ -111,16 +111,12 @@ void DicomImageView::Slot_scrollValueChanged(int slice) } case(scrollScope::TriggerType::STYLE_TRIGGER): { + qDebug()<<"======>>"; _ImageViewer->updateCornerInfo(TOP_LEFT); //invoke event - _SliceStep = slice - _PrevSlice; - _PrevSlice = slice; - //emit Signal_scrollValueChanged(this, slice); - int sliceArray[2]; - sliceArray[0] = slice; - sliceArray[1] = _SliceStep; - - this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, sliceArray); + double focusPoint[3] = {.0, .0, .0}; + _ImageViewer->GetSlicePoint(focusPoint); + this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, focusPoint); break; } case(scrollScope::TriggerType::SYNC_ONLY): @@ -847,3 +843,10 @@ int DicomImageView::GetSliceOrientation() { void DicomImageView::viewerClicked() { emit Signal_ViewClicked(this); } + +void DicomImageView::SyncScrollBar() { + setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY); + _scrollBar->setValue(_ImageViewer->GetSlice()); + _ImageViewer->updateCornerInfo(TOP_LEFT); + setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER); +} diff --git a/src/src/view/dicomimageview.h b/src/src/view/dicomimageview.h index 6a24e27..6db0db9 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" @@ -98,6 +98,7 @@ public: void SetSlice(int slice); void SetZoomScale(double scale); void SetPanOffset(double * p); + void SyncScrollBar(); //CineMode void onFirstFrame(); @@ -130,7 +131,10 @@ public: bool CompareWorldSliceOrientation(DicomImageView* view){ return this->_ImageViewer->GetWorldSliceOrientation() == view->_ImageViewer->GetWorldSliceOrientation(); } - + void SyncSlicePoint(double* point){ + _ImageViewer->SyncSlicePoint(point); + _ImageViewer->Render(); + } signals: /** * This signal will be emitted whenever a mouse event occurs within the QVTK window. diff --git a/src/src/view/viewcontainerwidget.cpp b/src/src/view/viewcontainerwidget.cpp index a759a4c..e7b1a86 100644 --- a/src/src/view/viewcontainerwidget.cpp +++ b/src/src/view/viewcontainerwidget.cpp @@ -70,10 +70,9 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo { manager.smartDo([](auto v,auto callData){ if (v->HasSeries()) { - int *r = (int *) callData; - v->setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY); - v->SetSlice(r[0]); - v->setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER); + double* r = (double*) callData; + v->SyncSlicePoint(r); + v->SyncScrollBar(); } },view, calldata,ImageViewManager::EStudyEBoundsSeries); }