Mercurial > hg > orthanc-stone
comparison Framework/Radiography/RadiographySceneReader.cpp @ 553:92305ee35b1c dev
web-worker consequences: give access to lower level data
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Wed, 03 Apr 2019 17:38:43 +0200 |
parents | aede9b042cb7 |
children | fd9b9d993fc7 200f7e1d57d1 |
comparison
equal
deleted
inserted
replaced
545:e1ba16436d59 | 553:92305ee35b1c |
---|---|
26 #include <Core/OrthancException.h> | 26 #include <Core/OrthancException.h> |
27 #include <Core/Toolbox.h> | 27 #include <Core/Toolbox.h> |
28 | 28 |
29 namespace OrthancStone | 29 namespace OrthancStone |
30 { | 30 { |
31 void RadiographySceneReader::Read(const Json::Value& input) | 31 |
32 void RadiographySceneBuilder::Read(const Json::Value& input, Orthanc::ImageAccessor* dicomImage /* takes ownership */, | |
33 DicomFrameConverter* dicomFrameConverter /* takes ownership */, | |
34 PhotometricDisplayMode preferredPhotometricDisplayMode | |
35 ) | |
36 { | |
37 dicomImage_.reset(dicomImage); | |
38 dicomFrameConverter_.reset(dicomFrameConverter); | |
39 preferredPhotometricDisplayMode_ = preferredPhotometricDisplayMode; | |
40 Read(input); | |
41 } | |
42 | |
43 RadiographyDicomLayer* RadiographySceneBuilder::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) | |
44 { | |
45 return dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomImage(dicomImage_.release(), instanceId, frame, dicomFrameConverter_.release(), preferredPhotometricDisplayMode_, geometry))); | |
46 } | |
47 | |
48 | |
49 RadiographyDicomLayer* RadiographySceneReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) | |
50 { | |
51 return dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(orthancApiClient_, instanceId, frame, false, geometry))); | |
52 } | |
53 | |
54 void RadiographySceneBuilder::Read(const Json::Value& input) | |
32 { | 55 { |
33 unsigned int version = input["version"].asUInt(); | 56 unsigned int version = input["version"].asUInt(); |
34 | 57 |
35 if (version != 1) | 58 if (version != 1) |
36 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | 59 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
42 RadiographyLayer::Geometry geometry; | 65 RadiographyLayer::Geometry geometry; |
43 | 66 |
44 if (jsonLayer["type"].asString() == "dicom") | 67 if (jsonLayer["type"].asString() == "dicom") |
45 { | 68 { |
46 ReadLayerGeometry(geometry, jsonLayer); | 69 ReadLayerGeometry(geometry, jsonLayer); |
47 dicomLayer = dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(orthancApiClient_, jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), false, &geometry))); | 70 dicomLayer = LoadDicom(jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), &geometry); |
48 } | 71 } |
49 else if (jsonLayer["type"].asString() == "mask") | 72 else if (jsonLayer["type"].asString() == "mask") |
50 { | 73 { |
51 if (dicomLayer == NULL) | 74 if (dicomLayer == NULL) |
52 { | 75 { |
108 else | 131 else |
109 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | 132 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
110 } | 133 } |
111 } | 134 } |
112 | 135 |
113 void RadiographySceneReader::ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& jsonLayer) | 136 |
137 void RadiographySceneReader::Read(const Json::Value& input) | |
138 { | |
139 unsigned int version = input["version"].asUInt(); | |
140 | |
141 if (version != 1) | |
142 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
143 | |
144 RadiographyDicomLayer* dicomLayer = NULL; | |
145 for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) | |
146 { | |
147 const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; | |
148 RadiographyLayer::Geometry geometry; | |
149 | |
150 if (jsonLayer["type"].asString() == "dicom") | |
151 { | |
152 ReadLayerGeometry(geometry, jsonLayer); | |
153 dicomLayer = dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(orthancApiClient_, jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), false, &geometry))); | |
154 } | |
155 else if (jsonLayer["type"].asString() == "mask") | |
156 { | |
157 if (dicomLayer == NULL) | |
158 { | |
159 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // we always assumed the dicom layer was read before the mask | |
160 } | |
161 ReadLayerGeometry(geometry, jsonLayer); | |
162 | |
163 float foreground = jsonLayer["foreground"].asFloat(); | |
164 std::vector<Orthanc::ImageProcessing::ImagePoint> corners; | |
165 for (size_t i = 0; i < jsonLayer["corners"].size(); i++) | |
166 { | |
167 Orthanc::ImageProcessing::ImagePoint corner(jsonLayer["corners"][(int)i]["x"].asInt(), | |
168 jsonLayer["corners"][(int)i]["y"].asInt()); | |
169 corners.push_back(corner); | |
170 } | |
171 | |
172 scene_.LoadMask(corners, *dicomLayer, foreground, &geometry); | |
173 } | |
174 else if (jsonLayer["type"].asString() == "text") | |
175 { | |
176 if (fontRegistry_ == NULL || fontRegistry_->GetSize() == 0) | |
177 { | |
178 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); // you must provide a FontRegistry if you need to re-create text layers. | |
179 } | |
180 | |
181 ReadLayerGeometry(geometry, jsonLayer); | |
182 const Orthanc::Font* font = fontRegistry_->FindFont(jsonLayer["fontName"].asString()); | |
183 if (font == NULL) // if not found, take the first font in the registry | |
184 { | |
185 font = &(fontRegistry_->GetFont(0)); | |
186 } | |
187 scene_.LoadText(*font, jsonLayer["text"].asString(), &geometry); | |
188 } | |
189 else if (jsonLayer["type"].asString() == "alpha") | |
190 { | |
191 ReadLayerGeometry(geometry, jsonLayer); | |
192 | |
193 const std::string& pngContentBase64 = jsonLayer["content"].asString(); | |
194 std::string pngContent; | |
195 std::string mimeType; | |
196 Orthanc::Toolbox::DecodeDataUriScheme(mimeType, pngContent, pngContentBase64); | |
197 | |
198 std::auto_ptr<Orthanc::ImageAccessor> image; | |
199 if (mimeType == "image/png") | |
200 { | |
201 image.reset(new Orthanc::PngReader()); | |
202 dynamic_cast<Orthanc::PngReader*>(image.get())->ReadFromMemory(pngContent); | |
203 } | |
204 else | |
205 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
206 | |
207 RadiographyAlphaLayer& layer = dynamic_cast<RadiographyAlphaLayer&>(scene_.LoadAlphaBitmap(image.release(), &geometry)); | |
208 | |
209 if (!jsonLayer["isUsingWindowing"].asBool()) | |
210 { | |
211 layer.SetForegroundValue((float)(jsonLayer["foreground"].asDouble())); | |
212 } | |
213 } | |
214 else | |
215 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
216 } | |
217 } | |
218 | |
219 void RadiographySceneBuilder::ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& jsonLayer) | |
114 { | 220 { |
115 {// crop | 221 {// crop |
116 unsigned int x, y, width, height; | 222 unsigned int x, y, width, height; |
117 if (jsonLayer["crop"]["hasCrop"].asBool()) | 223 if (jsonLayer["crop"]["hasCrop"].asBool()) |
118 { | 224 { |