diff Framework/Toolbox/DicomStructureSet.h @ 122:e3433dabfb8d wasm

refactoring DicomStructureSet
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 06 Oct 2017 17:25:08 +0200
parents 2eca030792aa
children 44fc253d4876
line wrap: on
line diff
--- a/Framework/Toolbox/DicomStructureSet.h	Wed Oct 04 17:53:47 2017 +0200
+++ b/Framework/Toolbox/DicomStructureSet.h	Fri Oct 06 17:25:08 2017 +0200
@@ -24,7 +24,7 @@
 #include "CoordinateSystem3D.h"
 #include "../Viewport/CairoContext.h"
 
-#include <Plugins/Samples/Common/IOrthancConnection.h>
+#include <Plugins/Samples/Common/FullOrthancDataset.h>
 
 #include <list>
 
@@ -33,13 +33,64 @@
   class DicomStructureSet : public boost::noncopyable
   {
   private:
+    struct ReferencedSlice
+    {
+      std::string          seriesInstanceUid_;
+      CoordinateSystem3D   geometry_;
+      double               thickness_;
+
+      ReferencedSlice()
+      {
+      }
+      
+      ReferencedSlice(const std::string& seriesInstanceUid,
+                      const CoordinateSystem3D& geometry,
+                      double thickness) :
+        seriesInstanceUid_(seriesInstanceUid),
+        geometry_(geometry),
+        thickness_(thickness)
+      {
+      }
+    };
+
+    typedef std::map<std::string, ReferencedSlice>  ReferencedSlices;
+    
     typedef std::list<Vector>  Points;
 
-    struct Polygon
+    class Polygon
     {
-      double  projectionAlongNormal_;
-      double  sliceThickness_;  // In millimeters
-      Points  points_;
+    private:
+      std::string sopInstanceUid_;
+      bool        hasSlice_;
+      Vector      normal_;
+      double      projectionAlongNormal_;
+      double      sliceThickness_;  // In millimeters
+      Points      points_;
+
+      void CheckPoint(const Vector& v);
+
+    public:
+      Polygon(const std::string& sopInstanceUid) :
+        sopInstanceUid_(sopInstanceUid),
+        hasSlice_(false)
+      {
+      }
+
+      void AddPoint(const Vector& v);
+
+      bool UpdateReferencedSlice(const ReferencedSlices& slices);
+
+      bool IsOnSlice(const CoordinateSystem3D& geometry) const;
+
+      const std::string& GetSopInstanceUid() const
+      {
+        return sopInstanceUid_;
+      }
+
+      const Points& GetPoints() const
+      {
+        return points_;
+      }
     };
 
     typedef std::list<Polygon>  Polygons;
@@ -56,25 +107,13 @@
 
     typedef std::vector<Structure>  Structures;
 
-    Structures   structures_;
-    std::string  parentSeriesId_;
-    Vector       normal_;
-
-    CoordinateSystem3D ExtractSliceGeometry(double& sliceThickness,
-                                            OrthancPlugins::IOrthancConnection& orthanc,
-                                            const OrthancPlugins::IDicomDataset& tags,
-                                            size_t contourIndex,
-                                            size_t sliceIndex);
+    Structures        structures_;
+    ReferencedSlices  referencedSlices_;
 
     const Structure& GetStructure(size_t index) const;
 
-    bool IsPolygonOnSlice(const Polygon& polygon,
-                          const CoordinateSystem3D& geometry) const;
-
-
   public:
-    DicomStructureSet(OrthancPlugins::IOrthancConnection& orthanc,
-                      const std::string& instanceId);
+    DicomStructureSet(const OrthancPlugins::FullOrthancDataset& instance);
 
     size_t GetStructureCount() const
     {
@@ -92,12 +131,23 @@
                            uint8_t& blue,
                            size_t index) const;
 
-    const Vector& GetNormal() const
-    {
-      return normal_;
-    }
+    void GetReferencedInstances(std::set<std::string>& instances);
+
+    void AddReferencedSlice(const std::string& sopInstanceUid,
+                            const std::string& seriesInstanceUid,
+                            const CoordinateSystem3D& geometry,
+                            double thickness);
+
+    void AddReferencedSlice(const Orthanc::DicomMap& dataset);
+
+    void CheckReferencedSlices();
 
     void Render(CairoContext& context,
-                const CoordinateSystem3D& slice) const;
+                const CoordinateSystem3D& slice);
+
+    Vector GetNormal() const;
+
+    static DicomStructureSet* SynchronousLoad(OrthancPlugins::IOrthancConnection& orthanc,
+                                              const std::string& instanceId);
   };
 }