diff Framework/Toolbox/ParallelSlices.cpp @ 735:c3bbb130abc4

removing dependencies in ImageBuffer3D
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 21 May 2019 16:15:06 +0200
parents b70e9be013e4
children
line wrap: on
line diff
--- a/Framework/Toolbox/ParallelSlices.cpp	Tue May 21 15:20:04 2019 +0200
+++ b/Framework/Toolbox/ParallelSlices.cpp	Tue May 21 16:15:06 2019 +0200
@@ -22,6 +22,7 @@
 #include "ParallelSlices.h"
 
 #include "GeometryToolbox.h"
+#include "../Volumes/ImageBuffer3D.h"
 
 #include <Core/Logging.h>
 #include <Core/OrthancException.h>
@@ -30,7 +31,7 @@
 {
   ParallelSlices::ParallelSlices()
   {
-    LinearAlgebra::AssignVector(normal_, 0, 0, 1);
+    Clear();
   }
 
 
@@ -48,7 +49,7 @@
   }
 
 
-  ParallelSlices::~ParallelSlices()
+  void ParallelSlices::Clear()
   {
     for (size_t i = 0; i < slices_.size(); i++)
     {
@@ -58,6 +59,15 @@
         slices_[i] = NULL;
       }
     }
+
+    slices_.clear();
+    LinearAlgebra::AssignVector(normal_, 0, 0, 1);
+  }
+  
+
+  ParallelSlices::~ParallelSlices()
+  {
+    Clear();
   }
 
 
@@ -146,4 +156,60 @@
 
     return reversed.release();
   }
+
+
+  ParallelSlices* ParallelSlices::FromVolumeImage(const VolumeImageGeometry& geometry,
+                                                  VolumeProjection projection)
+  {
+    const Vector dimensions = geometry.GetVoxelDimensions(VolumeProjection_Axial);
+    const CoordinateSystem3D& axial = geometry.GetAxialGeometry();
+    
+    std::auto_ptr<ParallelSlices> result(new ParallelSlices);
+
+    switch (projection)
+    {
+      case VolumeProjection_Axial:
+        for (unsigned int z = 0; z < geometry.GetDepth(); z++)
+        {
+          Vector origin = axial.GetOrigin();
+          origin += static_cast<double>(z) * dimensions[2] * axial.GetNormal();
+
+          result->AddSlice(origin,
+                           axial.GetAxisX(),
+                           axial.GetAxisY());
+        }
+        break;
+
+      case VolumeProjection_Coronal:
+        for (unsigned int y = 0; y < geometry.GetHeight(); y++)
+        {
+          Vector origin = axial.GetOrigin();
+          origin += static_cast<double>(y) * dimensions[1] * axial.GetAxisY();
+          origin += static_cast<double>(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal();
+
+          result->AddSlice(origin,
+                           axial.GetAxisX(),
+                           -axial.GetNormal());
+        }
+        break;
+
+      case VolumeProjection_Sagittal:
+        for (unsigned int x = 0; x < geometry.GetWidth(); x++)
+        {
+          Vector origin = axial.GetOrigin();
+          origin += static_cast<double>(x) * dimensions[0] * axial.GetAxisX();
+          origin += static_cast<double>(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal();
+
+          result->AddSlice(origin,
+                           axial.GetAxisY(),
+                           -axial.GetNormal());
+        }
+        break;
+
+      default:
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
+    }
+
+    return result.release();
+  }
 }