Mercurial > hg > orthanc-stone
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 |