Mercurial > hg > orthanc-stone
comparison OrthancStone/Sources/Toolbox/DicomStructuredReport.h @ 2099:67db5afb305d
partial integration dicom-sr->mainline
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 08 Nov 2023 17:26:22 +0100 |
parents | 7c3d65166c26 |
children | 129cb165ea8d c23eef785569 |
comparison
equal
deleted
inserted
replaced
2095:ec676dbe85ac | 2099:67db5afb305d |
---|---|
29 | 29 |
30 #if ORTHANC_ENABLE_DCMTK != 1 | 30 #if ORTHANC_ENABLE_DCMTK != 1 |
31 # error Support for DCMTK must be enabled | 31 # error Support for DCMTK must be enabled |
32 #endif | 32 #endif |
33 | 33 |
34 #include "../Scene2D/ScenePoint2D.h" | |
35 | |
34 #include <DicomParsing/ParsedDicomFile.h> | 36 #include <DicomParsing/ParsedDicomFile.h> |
35 | 37 |
36 #include <dcmtk/dcmdata/dcitem.h> | 38 #include <dcmtk/dcmdata/dcitem.h> |
39 #include <deque> | |
37 #include <list> | 40 #include <list> |
38 #include <set> | 41 #include <set> |
39 | 42 |
40 namespace OrthancStone | 43 namespace OrthancStone |
41 { | 44 { |
42 class DicomStructuredReport : public boost::noncopyable | 45 class DicomStructuredReport : public boost::noncopyable |
43 { | 46 { |
47 public: | |
48 enum StructureType | |
49 { | |
50 StructureType_Point, | |
51 StructureType_Polyline | |
52 }; | |
53 | |
54 class Structure : public boost::noncopyable | |
55 { | |
56 private: | |
57 std::string sopInstanceUid_; | |
58 bool hasFrameNumber_; | |
59 unsigned int frameNumber_; | |
60 bool hasProbabilityOfCancer_; | |
61 float probabilityOfCancer_; | |
62 | |
63 protected: | |
64 void Copy(const Structure& other); | |
65 | |
66 public: | |
67 Structure(const std::string& sopInstanceUid); | |
68 | |
69 virtual ~Structure() | |
70 { | |
71 } | |
72 | |
73 virtual Structure* Clone() const = 0; | |
74 | |
75 virtual StructureType GetType() const = 0; | |
76 | |
77 const std::string& GetSopInstanceUid() const | |
78 { | |
79 return sopInstanceUid_; | |
80 } | |
81 | |
82 void SetFrameNumber(unsigned int frame); | |
83 | |
84 void SetProbabilityOfCancer(float probability); | |
85 | |
86 bool HasFrameNumber() const | |
87 { | |
88 return hasFrameNumber_; | |
89 } | |
90 | |
91 bool HasProbabilityOfCancer() const | |
92 { | |
93 return hasProbabilityOfCancer_; | |
94 } | |
95 | |
96 unsigned int GetFrameNumber() const; | |
97 | |
98 float GetProbabilityOfCancer() const; | |
99 }; | |
100 | |
101 | |
102 class Point : public Structure | |
103 { | |
104 private: | |
105 ScenePoint2D point_; | |
106 | |
107 public: | |
108 Point(const std::string& sopInstanceUid, | |
109 double x, | |
110 double y); | |
111 | |
112 virtual Structure* Clone() const ORTHANC_OVERRIDE; | |
113 | |
114 virtual StructureType GetType() const ORTHANC_OVERRIDE | |
115 { | |
116 return StructureType_Point; | |
117 } | |
118 | |
119 const ScenePoint2D& GetPoint() const | |
120 { | |
121 return point_; | |
122 } | |
123 }; | |
124 | |
125 | |
126 class Polyline : public Structure | |
127 { | |
128 private: | |
129 std::vector<ScenePoint2D> points_; | |
130 | |
131 public: | |
132 Polyline(const std::string& sopInstanceUid, | |
133 const float* points, | |
134 unsigned long pointsCount); | |
135 | |
136 Polyline(const std::string& sopInstanceUid, | |
137 const std::vector<ScenePoint2D>& points); | |
138 | |
139 virtual Structure* Clone() const ORTHANC_OVERRIDE; | |
140 | |
141 virtual StructureType GetType() const ORTHANC_OVERRIDE | |
142 { | |
143 return StructureType_Polyline; | |
144 } | |
145 | |
146 size_t GetSize() const | |
147 { | |
148 return points_.size(); | |
149 } | |
150 | |
151 const ScenePoint2D& GetPoint(size_t i) const; | |
152 }; | |
153 | |
154 | |
44 private: | 155 private: |
45 class Structure; | 156 class ReferencedInstance |
46 class Point; | |
47 class Polyline; | |
48 | |
49 class ReferencedInstance : public boost::noncopyable | |
50 { | 157 { |
51 private: | 158 private: |
52 std::string studyInstanceUid_; | 159 std::string studyInstanceUid_; |
53 std::string seriesInstanceUid_; | 160 std::string seriesInstanceUid_; |
54 std::string sopClassUid_; | 161 std::string sopClassUid_; |
77 const std::string& GetSopClassUid() const | 184 const std::string& GetSopClassUid() const |
78 { | 185 { |
79 return sopClassUid_; | 186 return sopClassUid_; |
80 } | 187 } |
81 | 188 |
82 void AddFrame(unsigned int frame); | 189 void AddFrame(unsigned int frame) |
190 { | |
191 frames_.insert(frame); | |
192 } | |
83 | 193 |
84 const std::set<unsigned int>& GetFrames() const | 194 const std::set<unsigned int>& GetFrames() const |
85 { | 195 { |
86 return frames_; | 196 return frames_; |
87 } | 197 } |
98 std::string studyInstanceUid_; | 208 std::string studyInstanceUid_; |
99 std::string seriesInstanceUid_; | 209 std::string seriesInstanceUid_; |
100 std::string sopInstanceUid_; | 210 std::string sopInstanceUid_; |
101 std::map<std::string, ReferencedInstance*> instancesInformation_; | 211 std::map<std::string, ReferencedInstance*> instancesInformation_; |
102 std::vector<std::string> orderedInstances_; | 212 std::vector<std::string> orderedInstances_; |
103 std::list<Structure*> structures_; | 213 std::deque<Structure*> structures_; |
104 | 214 |
105 public: | 215 public: |
106 class ReferencedFrame | 216 class ReferencedFrame |
107 { | 217 { |
108 private: | 218 private: |
152 } | 262 } |
153 }; | 263 }; |
154 | 264 |
155 DicomStructuredReport(Orthanc::ParsedDicomFile& dicom); | 265 DicomStructuredReport(Orthanc::ParsedDicomFile& dicom); |
156 | 266 |
267 DicomStructuredReport(const DicomStructuredReport& other); // Copy constructor | |
268 | |
157 ~DicomStructuredReport(); | 269 ~DicomStructuredReport(); |
158 | 270 |
159 const std::string& GetStudyInstanceUid() const | 271 const std::string& GetStudyInstanceUid() const |
160 { | 272 { |
161 return studyInstanceUid_; | 273 return studyInstanceUid_; |
181 std::string& sopInstanceUid, | 293 std::string& sopInstanceUid, |
182 std::string& sopClassUid, | 294 std::string& sopClassUid, |
183 size_t i) const; | 295 size_t i) const; |
184 | 296 |
185 void ExportReferencedFrames(std::list<ReferencedFrame>& frames) const; | 297 void ExportReferencedFrames(std::list<ReferencedFrame>& frames) const; |
298 | |
299 size_t GetStructuresCount() const | |
300 { | |
301 return structures_.size(); | |
302 } | |
303 | |
304 const Structure& GetStructure(size_t index) const; | |
186 }; | 305 }; |
187 } | 306 } |