comparison Framework/Widgets/LayerWidget.cpp @ 121:e66b2c757790 wasm

displaying rt-struct
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 04 Oct 2017 17:53:47 +0200
parents ba83e38cf3ff
children e2fe9352f240
comparison
equal deleted inserted replaced
120:063f7f3d9f14 121:e66b2c757790
31 { 31 {
32 class LayerWidget::Scene : public boost::noncopyable 32 class LayerWidget::Scene : public boost::noncopyable
33 { 33 {
34 private: 34 private:
35 CoordinateSystem3D slice_; 35 CoordinateSystem3D slice_;
36 double thickness_;
36 size_t countMissing_; 37 size_t countMissing_;
37 std::vector<ILayerRenderer*> renderers_; 38 std::vector<ILayerRenderer*> renderers_;
38 39
39 void DeleteLayer(size_t index) 40 void DeleteLayer(size_t index)
40 { 41 {
54 } 55 }
55 } 56 }
56 57
57 public: 58 public:
58 Scene(const CoordinateSystem3D& slice, 59 Scene(const CoordinateSystem3D& slice,
60 double thickness,
59 size_t countLayers) : 61 size_t countLayers) :
60 slice_(slice), 62 slice_(slice),
63 thickness_(thickness),
61 countMissing_(countLayers), 64 countMissing_(countLayers),
62 renderers_(countLayers, NULL) 65 renderers_(countLayers, NULL)
63 { 66 {
67 if (thickness <= 0)
68 {
69 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
70 }
64 } 71 }
65 72
66 ~Scene() 73 ~Scene()
67 { 74 {
68 for (size_t i = 0; i < renderers_.size(); i++) 75 for (size_t i = 0; i < renderers_.size(); i++)
191 if (renderers_[index] != NULL) 198 if (renderers_[index] != NULL)
192 { 199 {
193 renderers_[index]->SetLayerStyle(style); 200 renderers_[index]->SetLayerStyle(style);
194 } 201 }
195 } 202 }
203
204 bool ContainsPlane(const CoordinateSystem3D& slice) const
205 {
206 bool isOpposite;
207 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite,
208 slice.GetNormal(),
209 slice_.GetNormal()))
210 {
211 return false;
212 }
213 else
214 {
215 double z = (slice_.ProjectAlongNormal(slice.GetOrigin()) -
216 slice_.ProjectAlongNormal(slice_.GetOrigin()));
217
218 if (z < 0)
219 {
220 z = -z;
221 }
222
223 return z <= thickness_;
224 }
225 }
226
227 double GetThickness() const
228 {
229 return thickness_;
230 }
196 }; 231 };
197 232
198 233
199 bool LayerWidget::LookupLayer(size_t& index /* out */, 234 bool LayerWidget::LookupLayer(size_t& index /* out */,
200 const ILayerSource& layer) const 235 const ILayerSource& layer) const
264 } 299 }
265 300
266 301
267 void LayerWidget::ResetPendingScene() 302 void LayerWidget::ResetPendingScene()
268 { 303 {
269 pendingScene_.reset(new Scene(slice_, layers_.size())); 304 double thickness;
305 if (pendingScene_.get() == NULL)
306 {
307 thickness = 1.0;
308 }
309 else
310 {
311 thickness = pendingScene_->GetThickness();
312 }
313
314 pendingScene_.reset(new Scene(slice_, thickness, layers_.size()));
270 } 315 }
271 316
272 317
273 void LayerWidget::UpdateLayer(size_t index, 318 void LayerWidget::UpdateLayer(size_t index,
274 ILayerRenderer* renderer, 319 ILayerRenderer* renderer,
275 const Slice& slice) 320 const CoordinateSystem3D& slice)
276 { 321 {
277 LOG(INFO) << "Updating layer " << index; 322 LOG(INFO) << "Updating layer " << index;
278 323
279 std::auto_ptr<ILayerRenderer> tmp(renderer); 324 std::auto_ptr<ILayerRenderer> tmp(renderer);
280 325
290 335
291 assert(layers_.size() == styles_.size()); 336 assert(layers_.size() == styles_.size());
292 renderer->SetLayerStyle(styles_[index]); 337 renderer->SetLayerStyle(styles_[index]);
293 338
294 if (currentScene_.get() != NULL && 339 if (currentScene_.get() != NULL &&
295 slice.ContainsPlane(currentScene_->GetSlice())) 340 currentScene_->ContainsPlane(slice))
296 { 341 {
297 currentScene_->SetLayer(index, tmp.release()); 342 currentScene_->SetLayer(index, tmp.release());
298 NotifyChange(); 343 NotifyChange();
299 } 344 }
300 else if (pendingScene_.get() != NULL && 345 else if (pendingScene_.get() != NULL &&
301 slice.ContainsPlane(pendingScene_->GetSlice())) 346 pendingScene_->ContainsPlane(slice))
302 { 347 {
303 pendingScene_->SetLayer(index, tmp.release()); 348 pendingScene_->SetLayer(index, tmp.release());
304 349
305 if (currentScene_.get() == NULL || 350 if (currentScene_.get() == NULL ||
306 !currentScene_->IsComplete() || 351 !currentScene_->IsComplete() ||
481 } 526 }
482 527
483 528
484 void LayerWidget::NotifyLayerReady(std::auto_ptr<ILayerRenderer>& renderer, 529 void LayerWidget::NotifyLayerReady(std::auto_ptr<ILayerRenderer>& renderer,
485 const ILayerSource& source, 530 const ILayerSource& source,
486 const Slice& slice, 531 const CoordinateSystem3D& slice,
487 bool isError) 532 bool isError)
488 { 533 {
489 size_t index; 534 size_t index;
490 if (slice.IsValid() && 535 if (LookupLayer(index, source))
491 LookupLayer(index, source) &&
492 slice.ContainsPlane(slice_)) // Whether the slice comes from an older request
493 { 536 {
494 if (isError) 537 if (isError)
495 { 538 {
496 LOG(ERROR) << "Using error renderer on layer " << index; 539 LOG(ERROR) << "Using error renderer on layer " << index;
497 } 540 }
504 { 547 {
505 UpdateLayer(index, renderer.release(), slice); 548 UpdateLayer(index, renderer.release(), slice);
506 } 549 }
507 else if (isError) 550 else if (isError)
508 { 551 {
509 UpdateLayer(index, new SliceOutlineRenderer(slice), slice); 552 // TODO
553 //UpdateLayer(index, new SliceOutlineRenderer(slice), slice);
510 } 554 }
511 } 555 }
512 } 556 }
513 557
514 558