From 0ebbcb10083db31b91fa751357ca8338d5377164 Mon Sep 17 00:00:00 2001 From: kradchen Date: Mon, 30 Jun 2025 13:21:39 +0800 Subject: [PATCH] feat: add default layout open function from PACS --- src/src/Common/QGlobals.h | 6 +++ src/src/UI/Manager/ImageViewManager.cpp | 11 +++++ src/src/UI/Manager/ImageViewManager.h | 3 ++ src/src/UI/Window/QDicomViewer.cpp | 54 ++++++++++++++++++++++++- src/src/UI/Window/QDicomViewer.h | 3 ++ 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/src/Common/QGlobals.h b/src/src/Common/QGlobals.h index a977bd7..75701b7 100644 --- a/src/src/Common/QGlobals.h +++ b/src/src/Common/QGlobals.h @@ -141,6 +141,12 @@ enum SeriesOpenMode { DIR_OPEN_MODE }; +enum SeriesType { + UNKNOWN_SIDE, + LEFT_SIDE, + RIGHT_SIDE +}; + //typedef std::shared_ptr DicomTagInfo_t*; //typedef std::shared_ptr UniqueIDInfo_t*; diff --git a/src/src/UI/Manager/ImageViewManager.cpp b/src/src/UI/Manager/ImageViewManager.cpp index d29a1a3..b4ee874 100644 --- a/src/src/UI/Manager/ImageViewManager.cpp +++ b/src/src/UI/Manager/ImageViewManager.cpp @@ -368,6 +368,17 @@ void ImageViewManager::viewReload(const std::string &unique_info) { reloadCurrentView(currentView); } +void ImageViewManager::viewReloadWithID(int aID, const std::string &unique_info) +{ + if (!getView(aID)) return; + auto selectView = getView(aID); + selectView->unloadFusion(); + ImageSetStore *helper = ImageSetStore::GetInstance(); + selectView->loadSeries(helper->getSeriesImageSet(unique_info)); + selectView->render(); + reloadCurrentView(selectView); +} + void ImageViewManager::viewCleared(DicomImageView* view) { smartDo([](auto v, auto callData) { auto src = (DicomImageView*)callData; diff --git a/src/src/UI/Manager/ImageViewManager.h b/src/src/UI/Manager/ImageViewManager.h index 6594255..7c58360 100644 --- a/src/src/UI/Manager/ImageViewManager.h +++ b/src/src/UI/Manager/ImageViewManager.h @@ -73,6 +73,9 @@ public: void viewReload(const std::string &unique_info); + void viewReloadWithID(int aID, const std::string &unique_info); + + void viewCleared(DicomImageView* view); void clearCurrentView(); diff --git a/src/src/UI/Window/QDicomViewer.cpp b/src/src/UI/Window/QDicomViewer.cpp index a582b35..8529eda 100644 --- a/src/src/UI/Window/QDicomViewer.cpp +++ b/src/src/UI/Window/QDicomViewer.cpp @@ -295,7 +295,7 @@ void QDicomViewer::Slot_ToolbarVisibilityChanged(bool visible) { void QDicomViewer::openDICOMFromPACS(int err, std::string dirName) { if (err == NOERROR) { - openDICOM(dirName, DIR_OPEN_MODE); + openDICOMWithLayout(dirName, LEFT_SIDE); } else { //pop out msg box QMessageBox::warning(this, tr("Warning"), tr("open DICOM Images From PACS Fail")); @@ -325,7 +325,7 @@ void QDicomViewer::openDICOM(const std::string &dicomName, SeriesOpenMode openMo int count = 0; std::vector vector; if (openMode == SeriesOpenMode::DIR_OPEN_MODE){ - DicomLoader::readPropertiesFromDir(dicomName, vector,count); + DicomLoader::readPropertiesFromDir(dicomName, vector, count); }else{ DicomLoader::readPropertiesFromFile(dicomName, vector, count); } @@ -338,4 +338,54 @@ void QDicomViewer::openDICOM(const std::string &dicomName, SeriesOpenMode openMo ui->thumbnailBar->updateThumbnailBar(); } +void QDicomViewer::openDICOMWithLayout(const std::string &dicomName, SeriesType aSeriesType) +{ + displayThumbnailBar(true); + ui->viewContainer->viewLayoutChanged(2,2); + //reset store + ImageSetStore *helper = ImageSetStore::GetInstance(); + helper->reset(); + + int count = 0; + std::vector vector; + DicomLoader::readPropertiesFromDir(dicomName, vector, count); + QString selectSide = "L"; + if (aSeriesType == UNKNOWN_SIDE) + { + bool canload = false; + for (int i = 0; i < count; ++i) { + QString des = vector[i]->GetSeriesDescription(); + if (des.count() < 6) continue; + //default use Left side + if (des.left(4).toUpper() == "REFL" && des.right(1) == "L") + canload = true; + } + if (!canload) selectSide = "R"; + } + else{ + selectSide = aSeriesType == LEFT_SIDE ? "L" : "R"; + } + for (int i = 0; i < count; ++i) + { + helper->addImageSet(vector[i]); + QString des = vector[i]->GetSeriesDescription(); + if (des.count() < 6) + continue; + if (des.left(4).toUpper() == "REFL" && des.right(1) == selectSide) + { + ui->viewContainer->getViewManager()->viewReloadWithID(0, vector[i]->GetUniqueID()); + ui->viewContainer->getViewManager()->getView(0)->setReconPlane(0); + ui->viewContainer->getViewManager()->viewReloadWithID(1, vector[i]->GetUniqueID()); + ui->viewContainer->getViewManager()->getView(1)->setReconPlane(1); + ui->viewContainer->getViewManager()->viewReloadWithID(2, vector[i]->GetUniqueID()); + ui->viewContainer->getViewManager()->getView(02)->setReconPlane(2); + + } + if (des.left(7).toUpper() == "CORONAL" && des.right(1) == selectSide) + { + ui->viewContainer->getViewManager()->viewReloadWithID(3, vector[i]->GetUniqueID()); + } + } + ui->thumbnailBar->updateThumbnailBar(); +} diff --git a/src/src/UI/Window/QDicomViewer.h b/src/src/UI/Window/QDicomViewer.h index e921d9f..df6d1ab 100644 --- a/src/src/UI/Window/QDicomViewer.h +++ b/src/src/UI/Window/QDicomViewer.h @@ -70,6 +70,9 @@ private: */ void openDICOM(const std::string &dicomName, SeriesOpenMode openMode); + void openDICOMWithLayout(const std::string &dicomName, SeriesType aSeriesType = UNKNOWN_SIDE); + + /** * 设置部分空间的槽函数连接 */