Mercurial > hg > orthanc-stone
comparison Framework/Radiography/RadiographySceneReader.cpp @ 1279:7ec8fea061b9 broker
integration mainline->broker
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 04 Feb 2020 15:20:08 +0100 |
parents | 37bc7f115f81 69177b10e2b9 |
children | 68579a31eeb4 |
comparison
equal
deleted
inserted
replaced
1271:0ca50d275b9a | 1279:7ec8fea061b9 |
---|---|
48 } | 48 } |
49 | 49 |
50 | 50 |
51 RadiographyDicomLayer* RadiographySceneReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) | 51 RadiographyDicomLayer* RadiographySceneReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) |
52 { | 52 { |
53 return dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(*orthancApiClient_, instanceId, frame, false, geometry))); | 53 return dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(orthancApiClient_, instanceId, frame, false, geometry))); |
54 } | |
55 | |
56 RadiographyDicomLayer* RadiographySceneGeometryReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) | |
57 { | |
58 std::auto_ptr<RadiographyPlaceholderLayer> layer(new RadiographyPlaceholderLayer(scene_)); | |
59 layer->SetGeometry(*geometry); | |
60 layer->SetSize(dicomImageWidth_, dicomImageHeight_); | |
61 scene_.RegisterLayer(layer.get()); | |
62 | |
63 return layer.release(); | |
54 } | 64 } |
55 | 65 |
56 void RadiographySceneBuilder::Read(const Json::Value& input) | 66 void RadiographySceneBuilder::Read(const Json::Value& input) |
57 { | 67 { |
58 unsigned int version = input["version"].asUInt(); | 68 unsigned int version = input["version"].asUInt(); |
128 else | 138 else |
129 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | 139 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
130 } | 140 } |
131 } | 141 } |
132 | 142 |
133 void RadiographySceneReader::Read(const Json::Value& input) | |
134 { | |
135 unsigned int version = input["version"].asUInt(); | |
136 | 143 |
137 if (version != 1) | |
138 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
139 | 144 |
140 if (input.isMember("hasWindowing") && input["hasWindowing"].asBool()) | |
141 { | |
142 scene_.SetWindowing(input["windowCenter"].asFloat(), input["windowWidth"].asFloat()); | |
143 } | |
144 | |
145 RadiographyDicomLayer* dicomLayer = NULL; | |
146 for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) | |
147 { | |
148 const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; | |
149 RadiographyLayer::Geometry geometry; | |
150 | |
151 if (jsonLayer["type"].asString() == "dicom") | |
152 { | |
153 ReadLayerGeometry(geometry, jsonLayer); | |
154 dicomLayer = dynamic_cast<RadiographyDicomLayer*>(&(scene_.LoadDicomFrame(*orthancApiClient_, jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), false, &geometry))); | |
155 } | |
156 else if (jsonLayer["type"].asString() == "mask") | |
157 { | |
158 if (dicomLayer == NULL) | |
159 { | |
160 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // we always assumed the dicom layer was read before the mask | |
161 } | |
162 ReadLayerGeometry(geometry, jsonLayer); | |
163 | |
164 float foreground = jsonLayer["foreground"].asFloat(); | |
165 std::vector<Orthanc::ImageProcessing::ImagePoint> corners; | |
166 for (size_t i = 0; i < jsonLayer["corners"].size(); i++) | |
167 { | |
168 Orthanc::ImageProcessing::ImagePoint corner(jsonLayer["corners"][(int)i]["x"].asInt(), | |
169 jsonLayer["corners"][(int)i]["y"].asInt()); | |
170 corners.push_back(corner); | |
171 } | |
172 | |
173 scene_.LoadMask(corners, *dicomLayer, foreground, &geometry); | |
174 } | |
175 else if (jsonLayer["type"].asString() == "text") | |
176 { | |
177 ReadLayerGeometry(geometry, jsonLayer); | |
178 scene_.LoadText(jsonLayer["text"].asString(), jsonLayer["font"].asString(), jsonLayer["fontSize"].asUInt(), static_cast<uint8_t>(jsonLayer["foreground"].asUInt()), &geometry, false); | |
179 } | |
180 else if (jsonLayer["type"].asString() == "alpha") | |
181 { | |
182 ReadLayerGeometry(geometry, jsonLayer); | |
183 | |
184 const std::string& pngContentBase64 = jsonLayer["content"].asString(); | |
185 std::string pngContent; | |
186 std::string mimeType; | |
187 Orthanc::Toolbox::DecodeDataUriScheme(mimeType, pngContent, pngContentBase64); | |
188 | |
189 std::auto_ptr<Orthanc::ImageAccessor> image; | |
190 if (mimeType == "image/png") | |
191 { | |
192 image.reset(new Orthanc::PngReader()); | |
193 dynamic_cast<Orthanc::PngReader*>(image.get())->ReadFromMemory(pngContent); | |
194 } | |
195 else | |
196 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
197 | |
198 RadiographyAlphaLayer& layer = dynamic_cast<RadiographyAlphaLayer&>(scene_.LoadAlphaBitmap(image.release(), &geometry)); | |
199 | |
200 if (!jsonLayer["isUsingWindowing"].asBool()) | |
201 { | |
202 layer.SetForegroundValue((float)(jsonLayer["foreground"].asDouble())); | |
203 } | |
204 } | |
205 else | |
206 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
207 } | |
208 } | |
209 | 145 |
210 void RadiographySceneBuilder::ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input) | 146 void RadiographySceneBuilder::ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input) |
211 { | 147 { |
212 for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) | 148 for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) |
213 { | 149 { |