Mercurial > hg > orthanc-wsi
annotate Framework/DicomToolbox.cpp @ 189:7326f7d105e1
ORTHANC_FRAMEWORK_BUILDING_PLUGIN
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 05 Jun 2020 19:07:55 +0200 |
parents | e3cbf890b588 |
children | f299c191cd76 |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
175
e3cbf890b588
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
16
7a88c614be04
preparing for precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
22 #include "PrecompiledHeadersWSI.h" |
0 | 23 #include "DicomToolbox.h" |
24 | |
140
a0f9a3df1110
resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
115
diff
changeset
|
25 #include <Core/Logging.h> |
a0f9a3df1110
resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
115
diff
changeset
|
26 #include <Core/OrthancException.h> |
a0f9a3df1110
resort to Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
115
diff
changeset
|
27 #include <Core/Toolbox.h> |
0 | 28 |
29 #if ORTHANC_ENABLE_DCMTK == 1 | |
30 # include <dcmtk/dcmdata/dcelem.h> | |
31 # include <dcmtk/dcmdata/dcsequen.h> | |
83 | 32 # include <dcmtk/dcmdata/dcvrat.h> |
0 | 33 #endif |
34 | |
35 namespace OrthancWSI | |
36 { | |
37 namespace DicomToolbox | |
38 { | |
39 #if ORTHANC_ENABLE_DCMTK == 1 | |
40 void SetStringTag(DcmItem& dataset, | |
41 const DcmTagKey& key, | |
42 const std::string& value) | |
43 { | |
44 if (!dataset.tagExists(key) && | |
45 !dataset.putAndInsertString(key, value.c_str()).good()) | |
46 { | |
47 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
48 } | |
49 } | |
50 | |
51 void SetUint16Tag(DcmItem& dataset, | |
52 const DcmTagKey& key, | |
53 uint16_t value) | |
54 { | |
55 if (!dataset.tagExists(key) && | |
56 !dataset.putAndInsertUint16(key, value).good()) | |
57 { | |
58 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
59 } | |
60 } | |
61 | |
62 | |
63 void SetUint32Tag(DcmItem& dataset, | |
64 const DcmTagKey& key, | |
65 uint32_t value) | |
66 { | |
67 if (!dataset.tagExists(key) && | |
68 !dataset.putAndInsertUint32(key, value).good()) | |
69 { | |
70 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
71 } | |
72 } | |
73 | |
74 | |
83 | 75 void SetAttributeTag(DcmItem& dataset, |
76 const DcmTagKey& key, | |
77 const DcmTagKey& value) | |
78 { | |
79 if (!dataset.tagExists(key)) | |
80 { | |
81 std::auto_ptr<DcmAttributeTag> tag(new DcmAttributeTag(key)); | |
82 | |
83 if (!tag->putTagVal(value).good() || | |
84 !dataset.insert(tag.release()).good()) | |
85 { | |
86 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
87 } | |
88 } | |
89 } | |
90 | |
91 | |
0 | 92 DcmItem* ExtractSingleSequenceItem(DcmItem& dataset, |
93 const DcmTagKey& key) | |
94 { | |
95 DcmElement* element = NULL; | |
96 if (!const_cast<DcmItem&>(dataset).findAndGetElement(key, element).good() || | |
97 element == NULL) | |
98 { | |
99 return NULL; | |
100 } | |
101 | |
102 if (element->getVR() != EVR_SQ) | |
103 { | |
104 DcmTag tag(key); | |
105 LOG(ERROR) << "The following element in the DICOM dataset is not a sequence as expected: " << tag.getTagName(); | |
106 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
107 } | |
108 | |
109 DcmSequenceOfItems& sequence = dynamic_cast<DcmSequenceOfItems&>(*element); | |
110 if (sequence.card() != 1) | |
111 { | |
112 LOG(ERROR) << "Bad number of elements in the sequence (it must contain exactly 1 element)"; | |
113 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
114 } | |
115 | |
116 return sequence.getItem(0); | |
117 } | |
118 | |
119 | |
120 uint16_t GetUint16Tag(DcmItem& dataset, | |
121 const DcmTagKey& key) | |
122 { | |
123 uint16_t value; | |
124 if (dataset.findAndGetUint16(key, value).good()) | |
125 { | |
126 return value; | |
127 } | |
128 else | |
129 { | |
130 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
131 } | |
132 } | |
133 | |
134 | |
135 uint32_t GetUint32Tag(DcmItem& dataset, | |
136 const DcmTagKey& key) | |
137 { | |
138 Uint32 value; | |
139 if (dataset.findAndGetUint32(key, value).good()) | |
140 { | |
141 return value; | |
142 } | |
143 else | |
144 { | |
145 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
146 } | |
147 } | |
148 | |
149 | |
150 int32_t GetInt32Tag(DcmItem& dataset, | |
151 const DcmTagKey& key) | |
152 { | |
153 Sint32 value; | |
154 if (dataset.findAndGetSint32(key, value).good()) | |
155 { | |
156 return value; | |
157 } | |
158 else | |
159 { | |
160 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
161 } | |
162 } | |
163 | |
164 | |
165 std::string GetStringTag(DcmItem& dataset, | |
166 const DcmTagKey& key) | |
167 { | |
168 const char* value = NULL; | |
169 if (dataset.findAndGetString(key, value).good() && | |
170 value != NULL) | |
171 { | |
172 return Orthanc::Toolbox::StripSpaces(value); | |
173 } | |
174 else | |
175 { | |
176 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
177 } | |
178 } | |
179 #endif | |
180 } | |
181 } |