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