From dcb75e7b05077847f98e8340ec5321dc0c00ad10 Mon Sep 17 00:00:00 2001 From: Krad Date: Fri, 15 Apr 2022 09:20:18 +0800 Subject: [PATCH] Change check fusion status logic. --- src/src/view/viewcontainerwidget.cpp | 44 +++++++++++++++------------- src/src/view/viewcontainerwidget.h | 9 ++++++ 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/src/view/viewcontainerwidget.cpp b/src/src/view/viewcontainerwidget.cpp index 826f8a9..5496acc 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 @@ -376,28 +376,32 @@ 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) { - if (nullptr == base || nullptr == overlap) - { - - return false; - } - if (!base->HasSeries() || !overlap->HasSeries()) - { - return false; - } - if (base->getSeriesNumber() != DicomModality::ReflMode) - { - return false; - } - if (overlap->getSeriesNumber() == DicomModality::AttMode || overlap->getSeriesNumber() == DicomModality::SosMode) - { - return true; - } - return false; + SeriesImageSet* baseSeries = base->getSeriesInstance(); + SeriesImageSet* overlapSeries = overlap->getSeriesInstance(); + // no data + if (!base->HasSeries() || !overlap->HasSeries()) return false; + // diff study + if (baseSeries->getStudyUID() == nullptr || + 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; } void ViewContainerWidget::updateCornerInfoAll() { diff --git a/src/src/view/viewcontainerwidget.h b/src/src/view/viewcontainerwidget.h index dea962d..181fcb8 100644 --- a/src/src/view/viewcontainerwidget.h +++ b/src/src/view/viewcontainerwidget.h @@ -70,6 +70,15 @@ protected: private: //fusion void replaceViewWithFusion(); + + /** + * 判断是否能fusion,判断依据为是否相同Study, + * 且是否相同ImageOrientation和ImagePosition, + * 两边的Bounds是否一致 + * @param base 基础数据源View + * @param overlap 覆盖数据源View + * @return + */ bool checkFusionStatus(DicomImageView *base, DicomImageView* overlap); DicomImageView *createImageView(QWidget* parent);