Mercurial > hg > orthanc-stone
comparison Framework/Widgets/SliceViewerWidget.cpp @ 728:8190213e2279 am-dev
Merged default into am-dev
author | Alain Mazy <am@osimis.io> |
---|---|
date | Tue, 21 May 2019 13:25:58 +0200 |
parents | 4f2416d519b4 |
children |
comparison
equal
deleted
inserted
replaced
690:f185cfcb72a0 | 728:8190213e2279 |
---|---|
31 #include <boost/math/constants/constants.hpp> | 31 #include <boost/math/constants/constants.hpp> |
32 | 32 |
33 | 33 |
34 static const double THIN_SLICE_THICKNESS = 100.0 * std::numeric_limits<double>::epsilon(); | 34 static const double THIN_SLICE_THICKNESS = 100.0 * std::numeric_limits<double>::epsilon(); |
35 | 35 |
36 namespace OrthancStone | 36 namespace Deprecated |
37 { | 37 { |
38 class SliceViewerWidget::Scene : public boost::noncopyable | 38 class SliceViewerWidget::Scene : public boost::noncopyable |
39 { | 39 { |
40 private: | 40 private: |
41 CoordinateSystem3D plane_; | 41 OrthancStone::CoordinateSystem3D plane_; |
42 double thickness_; | 42 double thickness_; |
43 size_t countMissing_; | 43 size_t countMissing_; |
44 std::vector<ILayerRenderer*> renderers_; | 44 std::vector<ILayerRenderer*> renderers_; |
45 | 45 |
46 public: | 46 public: |
60 renderers_[index] = NULL; | 60 renderers_[index] = NULL; |
61 countMissing_++; | 61 countMissing_++; |
62 } | 62 } |
63 } | 63 } |
64 | 64 |
65 Scene(const CoordinateSystem3D& plane, | 65 Scene(const OrthancStone::CoordinateSystem3D& plane, |
66 double thickness, | 66 double thickness, |
67 size_t countLayers) : | 67 size_t countLayers) : |
68 plane_(plane), | 68 plane_(plane), |
69 thickness_(thickness), | 69 thickness_(thickness), |
70 countMissing_(countLayers), | 70 countMissing_(countLayers), |
96 | 96 |
97 renderers_[index] = renderer; | 97 renderers_[index] = renderer; |
98 countMissing_--; | 98 countMissing_--; |
99 } | 99 } |
100 | 100 |
101 const CoordinateSystem3D& GetPlane() const | 101 const OrthancStone::CoordinateSystem3D& GetPlane() const |
102 { | 102 { |
103 return plane_; | 103 return plane_; |
104 } | 104 } |
105 | 105 |
106 bool HasRenderer(size_t index) | 106 bool HasRenderer(size_t index) |
113 return countMissing_ == 0; | 113 return countMissing_ == 0; |
114 } | 114 } |
115 | 115 |
116 unsigned int GetCountMissing() const | 116 unsigned int GetCountMissing() const |
117 { | 117 { |
118 return countMissing_; | 118 return static_cast<unsigned int>(countMissing_); |
119 } | 119 } |
120 | 120 |
121 bool RenderScene(CairoContext& context, | 121 bool RenderScene(OrthancStone::CairoContext& context, |
122 const ViewportGeometry& view, | 122 const ViewportGeometry& view, |
123 const CoordinateSystem3D& viewportPlane) | 123 const OrthancStone::CoordinateSystem3D& viewportPlane) |
124 { | 124 { |
125 bool fullQuality = true; | 125 bool fullQuality = true; |
126 cairo_t *cr = context.GetObject(); | 126 cairo_t *cr = context.GetObject(); |
127 | 127 |
128 for (size_t i = 0; i < renderers_.size(); i++) | 128 for (size_t i = 0; i < renderers_.size(); i++) |
129 { | 129 { |
130 if (renderers_[i] != NULL) | 130 if (renderers_[i] != NULL) |
131 { | 131 { |
132 const CoordinateSystem3D& framePlane = renderers_[i]->GetLayerPlane(); | 132 const OrthancStone::CoordinateSystem3D& framePlane = renderers_[i]->GetLayerPlane(); |
133 | 133 |
134 double x0, y0, x1, y1, x2, y2; | 134 double x0, y0, x1, y1, x2, y2; |
135 viewportPlane.ProjectPoint(x0, y0, framePlane.GetOrigin()); | 135 viewportPlane.ProjectPoint(x0, y0, framePlane.GetOrigin()); |
136 viewportPlane.ProjectPoint(x1, y1, framePlane.GetOrigin() + framePlane.GetAxisX()); | 136 viewportPlane.ProjectPoint(x1, y1, framePlane.GetOrigin() + framePlane.GetAxisX()); |
137 viewportPlane.ProjectPoint(x2, y2, framePlane.GetOrigin() + framePlane.GetAxisY()); | 137 viewportPlane.ProjectPoint(x2, y2, framePlane.GetOrigin() + framePlane.GetAxisY()); |
205 { | 205 { |
206 renderers_[index]->SetLayerStyle(style); | 206 renderers_[index]->SetLayerStyle(style); |
207 } | 207 } |
208 } | 208 } |
209 | 209 |
210 bool ContainsPlane(const CoordinateSystem3D& plane) const | 210 bool ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const |
211 { | 211 { |
212 bool isOpposite; | 212 bool isOpposite; |
213 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, | 213 if (!OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, |
214 plane.GetNormal(), | 214 plane.GetNormal(), |
215 plane_.GetNormal())) | 215 plane_.GetNormal())) |
216 { | 216 { |
217 return false; | 217 return false; |
218 } | 218 } |
219 else | 219 else |
220 { | 220 { |
254 return true; | 254 return true; |
255 } | 255 } |
256 } | 256 } |
257 | 257 |
258 | 258 |
259 void SliceViewerWidget::GetLayerExtent(Extent2D& extent, | 259 void SliceViewerWidget::GetLayerExtent(OrthancStone::Extent2D& extent, |
260 IVolumeSlicer& source) const | 260 IVolumeSlicer& source) const |
261 { | 261 { |
262 extent.Reset(); | 262 extent.Reset(); |
263 | 263 |
264 std::vector<Vector> points; | 264 std::vector<OrthancStone::Vector> points; |
265 if (source.GetExtent(points, plane_)) | 265 if (source.GetExtent(points, plane_)) |
266 { | 266 { |
267 for (size_t i = 0; i < points.size(); i++) | 267 for (size_t i = 0; i < points.size(); i++) |
268 { | 268 { |
269 double x, y; | 269 double x, y; |
272 } | 272 } |
273 } | 273 } |
274 } | 274 } |
275 | 275 |
276 | 276 |
277 Extent2D SliceViewerWidget::GetSceneExtent() | 277 OrthancStone::Extent2D SliceViewerWidget::GetSceneExtent() |
278 { | 278 { |
279 Extent2D sceneExtent; | 279 OrthancStone::Extent2D sceneExtent; |
280 | 280 |
281 for (size_t i = 0; i < layers_.size(); i++) | 281 for (size_t i = 0; i < layers_.size(); i++) |
282 { | 282 { |
283 assert(layers_[i] != NULL); | 283 assert(layers_[i] != NULL); |
284 Extent2D layerExtent; | 284 OrthancStone::Extent2D layerExtent; |
285 GetLayerExtent(layerExtent, *layers_[i]); | 285 GetLayerExtent(layerExtent, *layers_[i]); |
286 | 286 |
287 sceneExtent.Union(layerExtent); | 287 sceneExtent.Union(layerExtent); |
288 } | 288 } |
289 | 289 |
290 return sceneExtent; | 290 return sceneExtent; |
291 } | 291 } |
292 | 292 |
293 | 293 |
294 bool SliceViewerWidget::RenderScene(CairoContext& context, | 294 bool SliceViewerWidget::RenderScene(OrthancStone::CairoContext& context, |
295 const ViewportGeometry& view) | 295 const ViewportGeometry& view) |
296 { | 296 { |
297 if (currentScene_.get() != NULL) | 297 if (currentScene_.get() != NULL) |
298 { | 298 { |
299 return currentScene_->RenderScene(context, view, plane_); | 299 return currentScene_->RenderScene(context, view, plane_); |
321 } | 321 } |
322 | 322 |
323 | 323 |
324 void SliceViewerWidget::UpdateLayer(size_t index, | 324 void SliceViewerWidget::UpdateLayer(size_t index, |
325 ILayerRenderer* renderer, | 325 ILayerRenderer* renderer, |
326 const CoordinateSystem3D& plane) | 326 const OrthancStone::CoordinateSystem3D& plane) |
327 { | 327 { |
328 LOG(INFO) << "Updating layer " << index; | 328 LOG(INFO) << "Updating layer " << index; |
329 | 329 |
330 std::auto_ptr<ILayerRenderer> tmp(renderer); | 330 std::auto_ptr<ILayerRenderer> tmp(renderer); |
331 | 331 |
362 } | 362 } |
363 } | 363 } |
364 } | 364 } |
365 | 365 |
366 | 366 |
367 SliceViewerWidget::SliceViewerWidget(MessageBroker& broker, | 367 SliceViewerWidget::SliceViewerWidget(OrthancStone::MessageBroker& broker, |
368 const std::string& name) : | 368 const std::string& name) : |
369 WorldSceneWidget(name), | 369 WorldSceneWidget(name), |
370 IObserver(broker), | 370 IObserver(broker), |
371 IObservable(broker), | 371 IObservable(broker), |
372 started_(false) | 372 started_(false) |
383 } | 383 } |
384 } | 384 } |
385 | 385 |
386 void SliceViewerWidget::ObserveLayer(IVolumeSlicer& layer) | 386 void SliceViewerWidget::ObserveLayer(IVolumeSlicer& layer) |
387 { | 387 { |
388 layer.RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::GeometryReadyMessage> | 388 layer.RegisterObserverCallback(new OrthancStone::Callable<SliceViewerWidget, IVolumeSlicer::GeometryReadyMessage> |
389 (*this, &SliceViewerWidget::OnGeometryReady)); | 389 (*this, &SliceViewerWidget::OnGeometryReady)); |
390 // currently ignore errors layer->RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::GeometryErrorMessage>(*this, &SliceViewerWidget::...)); | 390 // currently ignore errors layer->RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::GeometryErrorMessage>(*this, &SliceViewerWidget::...)); |
391 layer.RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::SliceContentChangedMessage> | 391 layer.RegisterObserverCallback(new OrthancStone::Callable<SliceViewerWidget, IVolumeSlicer::SliceContentChangedMessage> |
392 (*this, &SliceViewerWidget::OnSliceChanged)); | 392 (*this, &SliceViewerWidget::OnSliceChanged)); |
393 layer.RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::ContentChangedMessage> | 393 layer.RegisterObserverCallback(new OrthancStone::Callable<SliceViewerWidget, IVolumeSlicer::ContentChangedMessage> |
394 (*this, &SliceViewerWidget::OnContentChanged)); | 394 (*this, &SliceViewerWidget::OnContentChanged)); |
395 layer.RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::LayerReadyMessage> | 395 layer.RegisterObserverCallback(new OrthancStone::Callable<SliceViewerWidget, IVolumeSlicer::LayerReadyMessage> |
396 (*this, &SliceViewerWidget::OnLayerReady)); | 396 (*this, &SliceViewerWidget::OnLayerReady)); |
397 layer.RegisterObserverCallback(new Callable<SliceViewerWidget, IVolumeSlicer::LayerErrorMessage> | 397 layer.RegisterObserverCallback(new OrthancStone::Callable<SliceViewerWidget, IVolumeSlicer::LayerErrorMessage> |
398 (*this, &SliceViewerWidget::OnLayerError)); | 398 (*this, &SliceViewerWidget::OnLayerError)); |
399 } | 399 } |
400 | 400 |
401 | 401 |
402 size_t SliceViewerWidget::AddLayer(IVolumeSlicer* layer) // Takes ownership | 402 size_t SliceViewerWidget::AddLayer(IVolumeSlicer* layer) // Takes ownership |
502 | 502 |
503 NotifyContentChanged(); | 503 NotifyContentChanged(); |
504 } | 504 } |
505 | 505 |
506 | 506 |
507 void SliceViewerWidget::SetSlice(const CoordinateSystem3D& plane) | 507 void SliceViewerWidget::SetSlice(const OrthancStone::CoordinateSystem3D& plane) |
508 { | 508 { |
509 LOG(INFO) << "Setting slice origin: (" << plane.GetOrigin()[0] | 509 LOG(INFO) << "Setting slice origin: (" << plane.GetOrigin()[0] |
510 << "," << plane.GetOrigin()[1] | 510 << "," << plane.GetOrigin()[1] |
511 << "," << plane.GetOrigin()[2] << ")"; | 511 << "," << plane.GetOrigin()[2] << ")"; |
512 | 512 |
513 Slice displayedSlice(plane_, THIN_SLICE_THICKNESS); | 513 Deprecated::Slice displayedSlice(plane_, THIN_SLICE_THICKNESS); |
514 | 514 |
515 //if (!displayedSlice.ContainsPlane(slice)) | 515 //if (!displayedSlice.ContainsPlane(slice)) |
516 { | 516 { |
517 if (currentScene_.get() == NULL || | 517 if (currentScene_.get() == NULL || |
518 (pendingScene_.get() != NULL && | 518 (pendingScene_.get() != NULL && |