diff OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp @ 2076:990f396484b1

fix rendering of RT-DOSE with negative GridFrameOffsetVector
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 Jul 2023 15:58:16 +0200
parents 7053b8a0aaec
children 07964689cb0b
line wrap: on
line diff
--- a/OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp	Tue Jul 11 13:20:20 2023 +0200
+++ b/OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp	Tue Jul 11 15:58:16 2023 +0200
@@ -215,7 +215,11 @@
     switch (parameters.GetSopClassUid())
     {
       case SopClassUid_RTDose:
-        spacingZ = parameters.GetSliceThickness();
+        if (!parameters.ComputeFrameOffsetsSpacing(spacingZ))
+        {
+          throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
+                                          "Cannot load RT-DOSE with incorrect GridFrameOffsetVector (3004,000C)");
+        }
         break;
 
       default:
@@ -224,6 +228,8 @@
           "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom));
     }
 
+    isReversedFrameOffsets_ = parameters.IsReversedFrameOffsets();
+
     const unsigned int width = parameters.GetImageInformation().GetWidth();
     const unsigned int height = parameters.GetImageInformation().GetHeight();
     const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames();
@@ -231,7 +237,7 @@
     {
       VolumeImageGeometry geometry;
       geometry.SetSizeInVoxels(width, height, depth);
-      geometry.SetAxialGeometry(parameters.GetGeometry());
+      geometry.SetAxialGeometry(parameters.GetMultiFrameGeometry());
       geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(),
                                   parameters.GetPixelSpacingY(), spacingZ);
       volume_->Initialize(geometry, format, true /* Do compute range */);
@@ -241,8 +247,6 @@
 
     ScheduleFrameDownloads();
 
-
-
     BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_));
   }
 
@@ -322,7 +326,17 @@
 
       for (unsigned int z = 0; z < depth; z++)
       {
-        ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, z);
+        unsigned targetZ;
+        if (isReversedFrameOffsets_)
+        {
+          targetZ = depth - 1 - z;
+        }
+        else
+        {
+          targetZ = z;
+        }
+
+        ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, targetZ);
 
         assert(writer.GetAccessor().GetWidth() == width &&
           writer.GetAccessor().GetHeight() == height);
@@ -554,6 +568,7 @@
     float outliersHalfRejectionRate) 
     : LoaderStateMachine(loadersContext)
     , volume_(volume)
+    , isReversedFrameOffsets_(false)
     , pixelDataLoaded_(false)
     , outliersHalfRejectionRate_(outliersHalfRejectionRate)
     , distributionRawMin_(0)