diff Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1862:63587fdeec69

added 'SkipSeriesFromModalities' to ignore series from modality types
author Alain Mazy <am@osimis.io>
date Thu, 23 Sep 2021 14:38:42 +0200
parents 58681a5c727b
children 3889ae96d2e9
line wrap: on
line diff
--- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Tue Sep 21 12:44:40 2021 +0200
+++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Thu Sep 23 14:38:42 2021 +0200
@@ -98,7 +98,7 @@
 #include <boost/math/special_functions/round.hpp>
 #include <boost/make_shared.hpp>
 #include <stdio.h>
-
+#include <algorithm>
 
 #if !defined(STONE_WEB_VIEWER_EXPORT)
 // We are not running ParseWebAssemblyExports.py, but we're compiling the wasm
@@ -321,6 +321,7 @@
   boost::shared_ptr<OrthancStone::SeriesMetadataLoader>    metadataLoader_;
   std::set<std::string>                                    scheduledVirtualSeriesThumbnails_;
   VirtualSeries                                            virtualSeries_;
+  std::vector<std::string>                                 skipSeriesFromModalities_;
 
   explicit ResourcesLoader(OrthancStone::ILoadersContext& context,
                            const OrthancStone::DicomSource& source) :
@@ -342,20 +343,41 @@
     LOG(INFO) << "resources loaded: " << dicom.GetSize()
               << ", " << Orthanc::EnumerationToString(payload.GetValue());
 
+    std::vector<std::string> seriesIdsToRemove;
+
     if (payload.GetValue() == Orthanc::ResourceType_Series)
     {
+      // the 'dicom' var is actually equivalent to the 'series_' member in this case
+
       for (size_t i = 0; i < dicom.GetSize(); i++)
       {
-        std::string studyInstanceUid, seriesInstanceUid;
+        std::string studyInstanceUid, seriesInstanceUid, modality;
         if (dicom.GetResource(i).LookupStringValue(
               studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) &&
             dicom.GetResource(i).LookupStringValue(
-              seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false))
+              seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) &&
+            dicom.GetResource(i).LookupStringValue(
+              modality, Orthanc::DICOM_TAG_MODALITY, false))
         {
-          thumbnailsLoader_->ScheduleLoadThumbnail(source_, "", studyInstanceUid, seriesInstanceUid);
-          metadataLoader_->ScheduleLoadSeries(PRIORITY_LOW + 1, source_, studyInstanceUid, seriesInstanceUid);
+          // skip series that should not be displayed
+          if (std::find(skipSeriesFromModalities_.begin(), skipSeriesFromModalities_.end(), modality) == skipSeriesFromModalities_.end())
+          {
+            thumbnailsLoader_->ScheduleLoadThumbnail(source_, "", studyInstanceUid, seriesInstanceUid);
+            metadataLoader_->ScheduleLoadSeries(PRIORITY_LOW + 1, source_, studyInstanceUid, seriesInstanceUid);
+          }
+
+          else
+          {
+            seriesIdsToRemove.push_back(seriesInstanceUid);
+          }
         }
       }
+
+      for (size_t i = 0; i < seriesIdsToRemove.size(); i++)
+      {
+        LOG(INFO) << "series to hide: " << seriesIdsToRemove[i];
+        dicom.RemoveResource(seriesIdsToRemove[i]);  
+      }
     }
 
     if (pending_ == 0)
@@ -515,6 +537,11 @@
   }
 
 public:
+  void SetSkipSeriesFromModalities(const std::vector<std::string>& skipSeriesFromModalities)
+  {
+    skipSeriesFromModalities_ = skipSeriesFromModalities;
+  }
+
   static boost::shared_ptr<ResourcesLoader> Create(OrthancStone::ILoadersContext::ILock& lock,
                                                    const OrthancStone::DicomSource& source)
   {
@@ -3572,6 +3599,27 @@
   
 
   EMSCRIPTEN_KEEPALIVE
+  void SetSkipSeriesFromModalities(const char* value)
+  {
+    try
+    {
+      LOG(WARNING) << "SetSkipSeriesFromModalities " << value;
+      
+      Json::Value modalities;
+      Orthanc::Toolbox::ReadJson(modalities, value);
+      std::vector<std::string> skipSeriesFromModalities;
+
+      for (Json::Value::ArrayIndex i = 0; i < modalities.size(); i++)
+      {
+        skipSeriesFromModalities.push_back(modalities[i].asString());
+      }
+      GetResourcesLoader().SetSkipSeriesFromModalities(skipSeriesFromModalities);
+    }
+    EXTERN_CATCH_EXCEPTIONS;
+  }
+
+
+  EMSCRIPTEN_KEEPALIVE
   void FetchAllStudies()
   {
     try