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 {