comparison OrthancStone/Sources/Toolbox/SortedFrames.cpp @ 1631:960bb5fcc440

SortedFrames::GetFrameGeometry()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 09 Nov 2020 18:49:08 +0100
parents 78509230f0d7
children 882e2253a90e
comparison
equal deleted inserted replaced
1630:78509230f0d7 1631:960bb5fcc440
22 22
23 #include "SortedFrames.h" 23 #include "SortedFrames.h"
24 24
25 #include "GeometryToolbox.h" 25 #include "GeometryToolbox.h"
26 26
27 #include <Logging.h>
27 #include <OrthancException.h> 28 #include <OrthancException.h>
28 #include <Toolbox.h> 29 #include <Toolbox.h>
29 30
30 namespace OrthancStone 31 namespace OrthancStone
31 { 32 {
38 { 39 {
39 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); 40 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
40 } 41 }
41 42
42 uint32_t tmp; 43 uint32_t tmp;
43 if (tags.ParseUnsignedInteger32(tmp, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) 44 if (tags.ParseUnsignedInteger32(tmp, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES) &&
45 tmp > 0)
44 { 46 {
45 numberOfFrames_ = tmp; 47 numberOfFrames_ = tmp;
46 } 48 }
47 else 49 else
48 { 50 {
57 } 59 }
58 else 60 else
59 { 61 {
60 monochrome1_ = false; 62 monochrome1_ = false;
61 } 63 }
62 } 64
63 65 bool ok = false;
66
67 if (numberOfFrames_ > 1)
68 {
69 std::string offsets, increment;
70 if (tags.LookupStringValue(offsets, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, false) &&
71 tags.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false))
72 {
73 Orthanc::Toolbox::ToUpperCase(increment);
74 if (increment != "3004,000C")
75 {
76 LOG(WARNING) << "Bad value for the FrameIncrementPointer tags in a multiframe image";
77 }
78 else if (LinearAlgebra::ParseVector(frameOffsets_, offsets))
79 {
80 if (frameOffsets_.size() == numberOfFrames_)
81 {
82 ok = true;
83 }
84 else
85 {
86 LOG(WARNING) << "The size of the GridFrameOffsetVector does not correspond to the number of frames";
87 }
88 }
89 else
90 {
91 LOG(WARNING) << "Cannot parse the GridFrameOffsetVector tag";
92 }
93 }
94 else
95 {
96 LOG(INFO) << "Missing the frame offset information in a multiframe image";
97 }
98 }
99
100 if (!ok)
101 {
102 frameOffsets_.resize(numberOfFrames_);
103 for (size_t i = 0; i < numberOfFrames_; i++)
104 {
105 frameOffsets_[i] = 0;
106 }
107 }
108 }
109
110
111 double SortedFrames::Instance::GetFrameOffset(unsigned int frame) const
112 {
113 assert(GetNumberOfFrames() == frameOffsets_.size());
114
115 if (frame >= GetNumberOfFrames())
116 {
117 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
118 }
119 else
120 {
121 return frameOffsets_[frame];
122 }
123 }
124
64 125
65 SortedFrames::Frame::Frame(const Instance& instance, 126 SortedFrames::Frame::Frame(const Instance& instance,
66 unsigned int frameNumber) : 127 unsigned int frameNumber) :
67 instance_(&instance), 128 instance_(&instance),
68 frameNumber_(frameNumber) 129 frameNumber_(frameNumber)
362 "Sort() has not been called"); 423 "Sort() has not been called");
363 } 424 }
364 } 425 }
365 426
366 427
428 CoordinateSystem3D SortedFrames::GetFrameGeometry(size_t frameIndex) const
429 {
430 const Frame& frame = GetFrame(frameIndex);
431 CoordinateSystem3D geometry = frame.GetInstance().GetGeometry();
432
433 if (geometry.IsValid())
434 {
435 geometry.SetOrigin(geometry.GetOrigin() + geometry.GetNormal() *
436 frame.GetInstance().GetFrameOffset(frame.GetFrameNumberInInstance()));
437 return geometry;
438 }
439 else
440 {
441 return geometry;
442 }
443 }
444
445
367 bool SortedFrames::LookupFrame(size_t& frameIndex, 446 bool SortedFrames::LookupFrame(size_t& frameIndex,
368 const std::string& sopInstanceUid, 447 const std::string& sopInstanceUid,
369 unsigned int frameNumber) const 448 unsigned int frameNumber) const
370 { 449 {
371 if (sorted_) 450 if (sorted_)