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 {