From 8c87641c3606438b3d4cd8547536c0651436a61f Mon Sep 17 00:00:00 2001 From: Krad Date: Tue, 19 Apr 2022 16:07:46 +0800 Subject: [PATCH] Add Image Data bounds intersect and orientation check.(Use by ViewManager DoScope::EStudyEBoundsSeries) --- src/src/base/SeriesImageSet.cpp | 20 +++++++++++++++++++- src/src/base/SeriesImageSet.h | 4 ++-- src/src/base/infinitiViewer.cxx | 6 ++++++ src/src/base/infinitiViewer.h | 2 +- src/src/view/ImageViewManager.cpp | 14 +++++++++++++- src/src/view/dicomimageview.h | 4 ++++ src/src/view/viewcontainerwidget.cpp | 18 ++---------------- 7 files changed, 47 insertions(+), 21 deletions(-) diff --git a/src/src/base/SeriesImageSet.cpp b/src/src/base/SeriesImageSet.cpp index 754a323..b018ab9 100644 --- a/src/src/base/SeriesImageSet.cpp +++ b/src/src/base/SeriesImageSet.cpp @@ -1,10 +1,11 @@ -#include "base/SeriesImageSet.h" +#include "base/SeriesImageSet.h" #include #include "view/dicomimageview.h" #include "base/DicomLoader.h" #include #include #include "ExtendMedicalImageProperties.h" +#include @@ -47,3 +48,20 @@ const char *SeriesImageSet::getStudyUID() const { if (!m_property) return nullptr; return m_property->GetStudyUID(); } + +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]; + } + vtkBoundingBox box1; + box1.SetBounds(adjustBounds); + vtkBoundingBox box2; + box2.SetBounds(imageSet->GetData()->GetBounds()); + return box1.IntersectBox(box2); +} \ No newline at end of file diff --git a/src/src/base/SeriesImageSet.h b/src/src/base/SeriesImageSet.h index 5115c15..7d10980 100644 --- a/src/src/base/SeriesImageSet.h +++ b/src/src/base/SeriesImageSet.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "global/include_vitk.h" #include @@ -44,6 +44,7 @@ public: } } + bool IntersectWorldBounds(SeriesImageSet* imageSet); private: @@ -51,7 +52,6 @@ private: ExtendMedicalImageProperties* m_property = nullptr; std::string m_pUniqueID; - double m_extent; double m_cameraPosition[3]; double m_vup[3]; }; diff --git a/src/src/base/infinitiViewer.cxx b/src/src/base/infinitiViewer.cxx index 226b3c4..dcd3234 100644 --- a/src/src/base/infinitiViewer.cxx +++ b/src/src/base/infinitiViewer.cxx @@ -1457,3 +1457,9 @@ void infinitiViewer::UnActiveRuler() { rulerActive = false; } +int infinitiViewer::GetWorldSliceOrientation() { + double orientations[4]={.0, .0, .0, 1.0}; + orientations[SliceOrientation] = 1.0; + 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 85bdacc..a47d1b8 100644 --- a/src/src/base/infinitiViewer.h +++ b/src/src/base/infinitiViewer.h @@ -113,7 +113,7 @@ public: { this->SetSliceOrientation(infinitiViewer::SLICE_ORIENTATION_XZ); } - + int GetWorldSliceOrientation(); //@{ /** * Set/Get the current slice to display (depending on the orientation diff --git a/src/src/view/ImageViewManager.cpp b/src/src/view/ImageViewManager.cpp index c396f77..739d125 100644 --- a/src/src/view/ImageViewManager.cpp +++ b/src/src/view/ImageViewManager.cpp @@ -54,7 +54,19 @@ void ImageViewManager::smartDo(SmartDoCallback cb, DicomImageView *sourceView, v if (!v->HasSeries()) return; //check series auto series = sourceView->getSeriesInstance(); - if (v->getSeriesInstance()==series && v->GetSliceOrientation() == sourceView->GetSliceOrientation()){ + auto currentSeries = v->getSeriesInstance(); + //same series + if (series == currentSeries + //equal slice orientation + && v->GetSliceOrientation() == sourceView->GetSliceOrientation()) { + cb(v, callData); + } + //equal study + else if (strcmp(currentSeries->getStudyUID(), series->getStudyUID()) == 0 + //equal world slice orientation + && v->CompareWorldSliceOrientation(sourceView) + //Intersect bounds + && currentSeries->IntersectWorldBounds(series)) { cb(v, callData); } }); diff --git a/src/src/view/dicomimageview.h b/src/src/view/dicomimageview.h index 9f7fc11..5be88d4 100644 --- a/src/src/view/dicomimageview.h +++ b/src/src/view/dicomimageview.h @@ -127,6 +127,10 @@ public: void SetSliceOrientation(int orientation); int GetSliceOrientation(); + bool CompareWorldSliceOrientation(DicomImageView* view){ + return this->_ImageViewer->GetWorldSliceOrientation() == view->_ImageViewer->GetWorldSliceOrientation(); + } + 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 4942d45..a759a4c 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 @@ -377,14 +377,6 @@ void ViewContainerWidget::removeCurrentViewWithFusion() } } -bool compareDoubleArray(double* a, double* b, int valCount){ - static const double m = 1.0; - for (int i = 0; i < valCount; i++){ - if (fabs(a[i]-b[i])>m) return false; - } - return true; -} - bool ViewContainerWidget::checkFusionStatus(DicomImageView *base, DicomImageView* overlap) { SeriesImageSet* baseSeries = base->getSeriesInstance(); @@ -396,13 +388,7 @@ bool ViewContainerWidget::checkFusionStatus(DicomImageView *base, DicomImageView strcmp(baseSeries->getStudyUID(), overlapSeries->getStudyUID())!=0) return false; //same series if (baseSeries->GetSeriesNumber() == overlapSeries->GetSeriesNumber()) return false; - //diff position - if (!compareDoubleArray(baseSeries->GetProperty()->GetPosition(),overlapSeries->GetProperty()->GetPosition(),3)) return false; - //diff orientation - if (!compareDoubleArray(baseSeries->GetProperty()->GetDirectionCosine(),overlapSeries->GetProperty()->GetDirectionCosine(),6)) return false; - //diff bounds - if (!compareDoubleArray(baseSeries->GetData()->GetBounds(), overlapSeries->GetData()->GetBounds(),6)) return false; - return true; + return baseSeries->IntersectWorldBounds(overlapSeries); } void ViewContainerWidget::updateCornerInfoAll() {