Mercurial > hg > orthanc-stone
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)